if (NOT GMX_USE_RELATIVE_INSTALL_PATH)
set(CPACK_SET_DESTDIR "ON")
endif()
-set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0)
set(CPACK_RESOURCE_FILE_WELCOME "${CMAKE_SOURCE_DIR}/admin/InstallWelcome.txt")
# Its GPL/LGPL, so they do not have to agree to a license for mere usage, but some installers require this...
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/admin/InstallLicense.txt")
mark_as_advanced(GMX_EXTERNAL_BLAS)
set(GMX_USE_PLUGINS OFF CACHE INTERNAL "Whether GROMACS will really try to compile support for VMD plugins")
-set(GMX_VMD_PLUGIN_PATH)
-mark_as_advanced(GMX_VMD_PLUGIN_PATH)
if(GMX_LOAD_PLUGINS)
if(CYGWIN OR NOT WIN32)
gmx_test_dlopen(HAVE_DLOPEN)
endif()
- find_package(VMD)
-
- # Test for unsuitable versions of VMD
-
- if(VMD_FOUND AND NOT GMX_VMD_PLUGIN_PATH)
- message(STATUS "Checking for suitable VMD version")
- exec_program(${VMD_EXECUTABLE}
- ARGS --help
- OUTPUT_VARIABLE VMD_HELP
- RETURN_VALUE VMD_EXEC_RETURN)
-
- if(VMD_EXEC_RETURN EQUAL 0)
- # This is the accepted idiom for subexpression matching, unfortunately
- string(REGEX REPLACE ".*VMD for .*, version ([0-9]+\\.[0-9]*\\.?[0-9]*).*" "\\1" VMD_VERSION ${VMD_HELP})
- string(REGEX REPLACE ".*VMD for (.*), version .*" "\\1" VMD_ARCH ${VMD_HELP})
-
- if(VMD_VERSION VERSION_LESS "1.8")
- MESSAGE(WARNING "Found VMD version ${VMD_VERSION}, but GROMACS needs at least 1.8")
- unset(VMD_EXECUTABLE)
- set(VMD_FOUND FALSE)
- else()
- message(STATUS "VMD version ${VMD_VERSION} is suitable")
- if(DEFINED ENV{VMDDIR})
- # This permits GROMACS to avoid hard-coding a fall-back
- # path that it can tell right now would be useless.
- set(GMX_VMD_PLUGIN_PATH "$ENV{VMDDIR}/plugins/${VMD_ARCH}/molfile" CACHE PATH "Path to VMD plugins for molfile I/O")
- else()
- set(GMX_VMD_PLUGIN_PATH "/usr/local/lib/vmd/plugins/*/molfile" CACHE PATH "Path to VMD plugins for molfile I/O")
- endif()
- endif()
-
- # clean up
- unset(VMD_HELP)
- unset(VMD_VERSION)
- unset(VMD_ARCH)
- endif()
- endif()
-
# so, should we use plug-ins?
if((WIN32 AND NOT CYGWIN) OR (HAVE_DLOPEN AND BUILD_SHARED_LIBS))
- if (NOT VMD_QUIETLY)
- MESSAGE(STATUS "Found the ability to use plug-ins when building shared libaries, so will compile to use plug-ins (e.g. to read VMD-supported file formats).")
- endif(NOT VMD_QUIETLY)
+ if(NOT VMD_QUIETLY)
+ MESSAGE(STATUS
+ "Found the ability to use plug-ins when building shared libaries, "
+ "so will compile to use plug-ins (e.g. to read VMD-supported file "
+ "formats).")
+ endif()
+ if(NOT GMX_VMD_PLUGIN_PATH)
+ find_package(VMD)
+ endif()
set(GMX_USE_PLUGINS ON)
list(APPEND GMX_EXTRA_LIBRARIES ${CMAKE_DL_LIBS}) # magic cross-platform pre-set variable for dlopen library
set(PKG_DL_LIBS "-l${CMAKE_DL_LIBS}")
endif()
add_subdirectory(share)
-add_subdirectory(man)
add_subdirectory(src)
add_subdirectory(scripts)
message(FATAL_ERROR
"To generate correct source package all man pages need to be generated. "
"The man pages are automatically build together with the binaries. "
- "Make sure to build all binaries (e.g. GMX_X11=on). ${CMAKE_SOURCE_DIR}/man/man1/ngmx.1")
+ "Make sure to build all binaries (e.g. GMX_X11=on).")
endif()
configure_file(${CMAKE_SOURCE_DIR}/man/man7/gromacs.7.cmakein ${CMAKE_BINARY_DIR}/man/man7/gromacs.7)
install(FILES ${CMAKE_BINARY_DIR}/man/man7/gromacs.7 DESTINATION
${MAN_INSTALL_DIR}/man7)
+#man-pages are only avalaible if they are either build or this is a source archive
+elseif(NOT EXISTS "${CMAKE_SOURCE_DIR}/admin/.isreposource")
+ install(FILES ${CMAKE_SOURCE_DIR}/man/man7/gromacs.7 DESTINATION
+ ${MAN_INSTALL_DIR}/man7)
endif()
function (gmx_add_man_page EXENAME)
-P ${CMAKE_SOURCE_DIR}/cmake/Filter.cmake)
install(FILES ${MAN1_PATH}/${EXENAME}.1 DESTINATION
${MAN_INSTALL_DIR}/man1)
+ elseif(NOT EXISTS "${CMAKE_SOURCE_DIR}/admin/.isreposource")
+ install(FILES ${CMAKE_SOURCE_DIR}/man/man1/${EXENAME}.1 DESTINATION
+ ${MAN_INSTALL_DIR}/man1)
endif()
endfunction ()
if(FFTW_LIBRARY)
set(FFTW_LIBRARY_${FFTW_PKG} "${FFTW_LIBRARY}" CACHE INTERNAL "Path to ${FFTW_PKG} library" FORCE)
+else(FFTW_LIBRARY)
+ set(FFTW_LIBRARY "" CACHE FILEPATH "Path to ${FFTW_PKG} library")
endif(FFTW_LIBRARY)
if(FFTW_INCLUDE_DIR)
set(FFTW_INCLUDE_DIR_${FFTW_PKG} "${FFTW_INCLUDE_DIR}" CACHE INTERNAL "Path to ${FFTW_HEADER}" FORCE)
+else(FFTW_INCLUDE_DIR)
+ set(FFTW_INCLUDE_DIR "" CACHE DIRECTORY "Path to ${FFTW_HEADER}")
endif(FFTW_INCLUDE_DIR)
#we use _${FFTW_PKG} variables to have different cache entries for fftw3 and ffw3f
set(FFTW_LIBRARY_${FFTW_PKG} ${FFTW_LIBRARY_${FFTW_PKG}} CACHE INTERNAL "Path to ${FFTW_PKG} library" FORCE)
set(FFTW_INCLUDE_DIR_${FFTW_PKG} ${FFTW_INCLUDE_DIR_${FFTW_PKG}} CACHE INTERNAL "Path to ${FFTW_HEADER}" FORCE)
-set(FFTW_LIBRARY "${FFTW_LIBRARY_${FFTW_PKG}}" CACHE FILEPATH "Path to ${FFTW_PKG} library" FORCE)
-set(FFTW_INCLUDE_DIR "${FFTW_INCLUDE_DIR_${FFTW_PKG}}" CACHE DIRECTORY "Path to ${FFTW_HEADER}" FORCE)
-
# set default find_package outcome variables
set(FFTW_LIBRARIES "${FFTW_LIBRARY_${FFTW_PKG}}")
set(FFTW_INCLUDE_DIRS "${FFTW_INCLUDE_DIR_${FFTW_PKG}}")
# To help us fund GROMACS development, we humbly ask that you cite
# the research papers on the package. Check out http://www.gromacs.org
-# ================================================================
-
-# This file is adapted from FindGit.cmake from CMake 2.8.5
-# That file is copyright and redistribution outside
-# CMake requires the following license statement.
-
-# ================================================================
-
-# CMake - Cross Platform Makefile Generator
-# Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
-# All rights reserved.
-
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-
-# * Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-
-# * Neither the names of Kitware, Inc., the Insight Software Consortium,
-# nor the names of their contributors may be used to endorse or promote
-# products derived from this software without specific prior written
-# permission.
-
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# ------------------------------------------------------------------------------
-
-# The above copyright and license notice applies to distributions of
-# CMake in source and binary form. Some source files contain additional
-# notices of original copyright by their contributors; see each source
-# for details. Third-party software packages supplied with CMake under
-# compatible licenses provide their own copyright notices documented in
-# corresponding subdirectories.
-
-# ------------------------------------------------------------------------------
-
-# CMake was initially developed by Kitware with the following sponsorship:
-
-# * National Library of Medicine at the National Institutes of Health
-# as part of the Insight Segmentation and Registration Toolkit (ITK).
-
-# * US National Labs (Los Alamos, Livermore, Sandia) ASC Parallel
-# Visualization Initiative.
-
-# * National Alliance for Medical Image Computing (NAMIC) is funded by the
-# National Institutes of Health through the NIH Roadmap for Medical Research,
-# Grant U54 EB005149.
-
-# * Kitware, Inc.
-
-# ================================================================
# The module defines the following variables:
# VMD_EXECUTABLE - path to vmd command
-# VMD_FOUND - true if the command was found
-# Example usage:
-# find_package(VMD)
-# if(VMD_FOUND)
-# message("vmd found: ${VMD_EXECUTABLE}")
-# endif()
-
-set(vmd_names vmd)
-
-find_program(VMD_EXECUTABLE
- NAMES ${vmd_names}
- PATHS ENV VMDDIR
- PATH_SUFFIXES bin # I guess this allows for OS-independence
- DOC "VMD command"
- )
-mark_as_advanced(VMD_EXECUTABLE)
-
-# Handle the QUIETLY and REQUIRED arguments and set VMD_FOUND to TRUE if
-# all listed variables are TRUE
-
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(VMD DEFAULT_MSG VMD_EXECUTABLE)
+# GMX_VMD_PLUGIN_PATH - path to vmd plugins
+
+message(STATUS "Checking for suitable VMD version")
+find_program(VMD_EXECUTABLE NAMES vmd PATH_SUFFIXES bin
+ DOC "VMD command")
+
+#set search path in increasing priority:
+# default path, vmd binary path, enviroment variable
+set(VMD_PATHS "/usr/local/lib/vmd/plugins/*/molfile/")
+if(VMD_EXECUTABLE)
+ file(STRINGS "${VMD_EXECUTABLE}" VMDDIR REGEX "^defaultvmddir=.*$")
+ string(REGEX REPLACE "(^.*=\"?|\"$)" "" VMDDIR "${VMDDIR}")
+ list(INSERT VMD_PATHS 0 "${VMDDIR}/plugins/*/molfile/")
+endif()
+if(NOT "$ENV{VMDDIR}" STREQUAL "")
+ list(INSERT VMD_PATHS 0 "$ENV{VMDDIR}/plugins/*/molfile/")
+endif()
+
+#xyz is just an example. Any other molfile plugin could be used.
+#But some require extra link flags.
+find_library(VMDXYZPLUGIN NAME "xyzplugin${CMAKE_SHARED_LIBRARY_SUFFIX}"
+ PATHS ${VMD_PATHS})
+
+if (VMDXYZPLUGIN)
+ try_run(TESTVMD TESTVMD_COMPILED ${CMAKE_BINARY_DIR}
+ "${CMAKE_SOURCE_DIR}/cmake/TestVMD.c"
+ CMAKE_FLAGS "-DLINK_LIBRARIES=${CMAKE_DL_LIBS}"
+ "-DINCLUDE_DIRECTORIES=${CMAKE_SOURCE_DIR}/src/gmxlib"
+ COMPILE_DEFINITIONS "-DGMX_USE_PLUGINS"
+ RUN_OUTPUT_VARIABLE TESTVMD_OUTPUT ARGS ${VMDXYZPLUGIN})
+endif()
+
+if(NOT TESTVMD EQUAL 0)
+ if (NOT VMDXYZPLUGIN)
+ message(STATUS "VMD plugins not found. Path to VMD can be set with VMDDIR.")
+ elseif(NOT TESTVMD_COMPILED)
+ message(STATUS "Could not compile VMD version check")
+ elseif(TESTVMD EQUAL 1)
+ message(STATUS "Could not load VMD plugin ${VMDXYZPLUGIN}: ${TESTVMD_OUTPUT}")
+ elseif(TESTVMD EQUAL 5)
+ message(STATUS "VMD plugin ${VMDXYZPLUGIN} too old. VMD 1.8.6 required.")
+ else()
+ message(STATUS "Could not identify VMD version of ${VMDXYZPLUGIN}. Error: ${TESTVMD}")
+ endif()
+ # This permits GROMACS to avoid hard-coding a fall-back path.
+ # Fall-back is useful in case VMD is installed later.
+ set(GMX_VMD_PLUGIN_PATH "/usr/local/lib/vmd/plugins/*/molfile"
+ CACHE PATH "Path to VMD plugins for molfile I/O" FORCE)
+else()
+ get_filename_component(VMD_PLUGIN_PATH ${VMDXYZPLUGIN} PATH)
+ message(STATUS "VMD version of ${VMD_PLUGIN_PATH} is suitable")
+ set(GMX_VMD_PLUGIN_PATH ${VMD_PLUGIN_PATH}
+ CACHE PATH "Path to VMD plugins for molfile I/O" FORCE)
+endif()
+mark_as_advanced(GMX_VMD_PLUGIN_PATH)
+#Nothing is rerun unless GMX_VMD_PLUGIN_PATH is set to NO. Clean-up all.
+unset(VMDXYZPLUGIN CACHE)
+unset(VMD_EXECUTABLE CACHE)
+unset(TESTVMD CACHE)
+unset(TESTVMD_COMPILED CACHE)
+unset(VMD_PATHS)
+unset(VMD_PLUGIN_PATH)
+unset(VMDDIR)
--- /dev/null
+#include "molfile_plugin.h"
+#include "vmddlopen.c"
+#include "stdio.h"
+
+static int register_cb(void *v, vmdplugin_t *p) {
+ *(molfile_plugin_t**)v = (molfile_plugin_t *)p;
+ return VMDPLUGIN_SUCCESS;
+}
+
+typedef int (*initfunc)(void);
+typedef int (*regfunc)(void *, vmdplugin_register_cb);
+
+/*run: gcc TestVMD.c -DGMX_USE_PLUGINS -Wall -ldl src/gmxlib/vmddlopen.c -I src/gmxlib && ./a.out .../xyzplugin.so ; echo $?*/
+int main(int argc, char** argv)
+{
+ void *handle, *ifunc, *registerfunc;
+ molfile_plugin_t* api;
+ if (argc!=2) return -1;
+ handle = vmddlopen(argv[1]);
+ if (!handle)
+ {
+ fprintf(stderr,"%s\n",vmddlerror());
+ return 1;
+ }
+ ifunc = vmddlsym(handle, "vmdplugin_init");
+ if (!ifunc || ((initfunc)(ifunc))()) return 2;
+ registerfunc = vmddlsym(handle, "vmdplugin_register");
+ if (!registerfunc) return 3;
+ ((regfunc)registerfunc)(&api, register_cb);
+ if (!api) return 4;
+ if (api->abiversion<10) return 5;
+ return 0;
+}
+++ /dev/null
-# Man pages: Nothing to build, just installation
-install(DIRECTORY . DESTINATION ${MAN_INSTALL_DIR}
- COMPONENT data
- PATTERN "Makefile*" EXCLUDE
- PATTERN "CMake*" EXCLUDE
- PATTERN "cmake*" EXCLUDE
- PATTERN "*~" EXCLUDE
-)
bool list_tests_;
String output_;
bool print_time_;
- bool pretty_;
internal::Int32 random_seed_;
internal::Int32 repeat_;
bool shuffle_;
}
ifunc = vmddlsym(handle, "vmdplugin_init");
- if (ifunc && ((initfunc)(ifunc))()) {
+ if (!ifunc || ((initfunc)(ifunc))()) {
printf("\nvmdplugin_init() for %s returned an error; plugin(s) not loaded.\n", fullpath);
vmddlclose(handle);
return 0;
int pmegrid_start_ix,pmegrid_start_iy,pmegrid_start_iz;
/* Work data for spreading and gathering */
- pme_spline_work_t spline_work;
+ pme_spline_work_t *spline_work;
real *fftgridA; /* Grids for FFT. With 1D FFT decomposition this can be a pointer */
real *fftgridB; /* inside the interpolation grid, but separate for 2D PME decomp. */
pme_spline_work_t *work;
- work = &pme->spline_work;
+ work = pme->spline_work;
order = pme->pme_order;
thx = spline->theta[XX];
*fraction_shift = fsh;
}
-static void sse_mask_init(pme_spline_work_t *work,int order)
+static pme_spline_work_t *make_pme_spline_work(int order)
{
+ pme_spline_work_t *work;
+
#ifdef PME_SSE
float tmp[8];
__m128 zero_SSE;
int of,i;
+ snew_aligned(work,1,16);
+
zero_SSE = _mm_setzero_ps();
+ /* Generate bit masks to mask out the unused grid entries,
+ * as we only operate on order of the 8 grid entries that are
+ * load into 2 SSE float registers.
+ */
for(of=0; of<8-(order-1); of++)
{
for(i=0; i<8; i++)
work->mask_SSE0[of] = _mm_cmpgt_ps(work->mask_SSE0[of],zero_SSE);
work->mask_SSE1[of] = _mm_cmpgt_ps(work->mask_SSE1[of],zero_SSE);
}
+#else
+ work = NULL;
#endif
+
+ return work;
}
static void
pme->overlap[0].s2g1[pme->nodeid_major]-pme->overlap[0].s2g0[pme->nodeid_major+1],
pme->overlap[1].s2g1[pme->nodeid_minor]-pme->overlap[1].s2g0[pme->nodeid_minor+1]);
- sse_mask_init(&pme->spline_work,pme->pme_order);
+ pme->spline_work = make_pme_spline_work(pme->pme_order);
ndata[0] = pme->nkx;
ndata[1] = pme->nky;
#ifdef PME_TIME_SPREAD
ct1a = omp_cyc_start();
#endif
- spread_q_bsplines_thread(grid,atc,spline,&pme->spline_work);
+ spread_q_bsplines_thread(grid,atc,spline,pme->spline_work);
if (grids->nthread > 1)
{
{
gmx::Options options(NULL, NULL);
std::vector<std::string> values;
- MockOptionStorage *mock;
+ MockOptionStorage *mock = NULL;
ASSERT_NO_THROW(options.addOption(
MockOption("name").storageObject(&mock)
.storeVector(&values).multiValue()));
-
+ ASSERT_TRUE(mock != NULL);
{
::testing::InSequence dummy;
using ::testing::ElementsAre;
{
gmx::Options options(NULL, NULL);
std::vector<std::string> values;
- MockOptionStorage *mock=NULL;
+ MockOptionStorage *mock = NULL;
ASSERT_NO_THROW(options.addOption(
MockOption("name").storageObject(&mock)
.storeVector(&values).multiValue()));
{
gmx::Options options(NULL, NULL);
std::vector<std::string> values;
- MockOptionStorage *mock=NULL;
+ MockOptionStorage *mock = NULL;
ASSERT_NO_THROW(options.addOption(
MockOption("name").storageObject(&mock)
.storeVector(&values).valueCount(2)));
{
gmx::Options options(NULL, NULL);
std::vector<std::string> values;
- MockOptionStorage *mock;
+ MockOptionStorage *mock = NULL;
ASSERT_NO_THROW(options.addOption(
MockOption("name").storageObject(&mock)
.storeVector(&values).valueCount(0)));
-
+ ASSERT_TRUE(mock != NULL);
{
::testing::InSequence dummy;
using ::testing::DoAll;
{
FILE *fpin_ptr;
t_genalg *ga;
- double ff,cr;
+ double ff = 0.0, cr = 0.0;
int i,j;
/*------Initializations----------------------------*/
char *grpname, /* groupnames */
*micname;
int ngx, /* nr. of atomsin sol group */
- nmic; /* nr. of atoms in micelle */
+ nmic = 0; /* nr. of atoms in micelle */
t_topology *top; /* topology */
int ePBC;
atom_id *index, /* indices for solvent group */
- *micelle;
+ *micelle = NULL;
gmx_bool bMicel = FALSE; /* think we're a micel */
t_filenm fnm[] = { /* files for g_order */
{ efTRX, "-f", NULL, ffREAD }, /* trajectory file */
int gmx_sorient(int argc,char *argv[])
{
t_topology top;
- int ePBC;
+ int ePBC = -1;
char title[STRLEN];
t_trxstatus *status;
int natoms;