diff --git a/README-versions.md b/README-versions.md index 4c845aaa3..c9ed19665 100644 --- a/README-versions.md +++ b/README-versions.md @@ -1,12 +1,21 @@ +[Versions included in GROMACS](#versions-included-in-GROMACS) + [Versions included in LAMMPS](#versions-included-in-LAMMPS) [Versions included in NAMD](#versions-included-in-NAMD) [Versions included in VMD](#versions-included-in-VMD) +### Versions included in GROMACS +GROMACS version | Colvars version +-------------- | --------------- +2024 | [2023-12-05](https://github.com/Colvars/colvars/tree/gromacs-2024) + ### Versions included in LAMMPS LAMMPS version | Colvars version -------------- | --------------- +stable_29Aug2024 | [2024-06-04](https://github.com/Colvars/colvars/releases/tag/lammps-stable_29Aug2024) +stable_2Aug2023 | [2023-05-01](https://github.com/Colvars/colvars/releases/tag/lammps-stable_2Aug2023) stable_23Jun2022 | [2022-05-24](https://github.com/Colvars/colvars/releases/tag/lammps-stable_23Jun2022) stable_29Sep2021 | [2021-09-13](https://github.com/Colvars/colvars/releases/tag/lammps-stable_29Sep2021) stable_29Oct2020 | [2020-09-17](https://github.com/Colvars/colvars/releases/tag/lammps-stable_29Oct2020) @@ -27,6 +36,7 @@ stable_4Nov2016 | [2016-10-21](https://github.com/Colvars/colvars/releases/tag/l NAMD version | Colvars version -------------- | --------------- +3.0 | [2024-06-04](https://github.com/Colvars/colvars/tree/namd-3.0) 2.14 | [2020-07-07](https://github.com/Colvars/colvars/releases/tag/namd-2.14) 2.13b2 | [2018-10-12](https://github.com/Colvars/colvars/releases/tag/namd-2.13b2) 2.13b1 | [2018-09-07](https://github.com/Colvars/colvars/releases/tag/namd-2.13b1) @@ -40,6 +50,7 @@ VMD version | Colvars version -------------- | --------------- 1.9.4a58 | [2022-04-14](https://github.com/Colvars/colvars/releases/tag/vmd-1.9.4a58) 1.9.4a49 | [2020-10-22](https://github.com/Colvars/colvars/releases/tag/vmd-1.9.4a49) +1.9.4a12 | [2017-10-11](https://github.com/Colvars/colvars/releases/tag/vmd-1.9.4a12) 1.9.3 | [2016-10-26](https://github.com/Colvars/colvars/releases/tag/vmd-1.9.3) 1.9.2 | [2014-10-13](https://github.com/Colvars/colvars/releases/tag/vmd-1.9.2) diff --git a/README.md b/README.md index cf8f8ed3d..874d278c4 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,7 @@ All of the above MD engine versions are automatically tested as part of GitHub A ## Legacy GROMACS-Colvars patched releases -Versions GROMACS prior to 2024 are supported through the use of a customized `mdrun` command line; source code of these patched releases is available [here](https://github.com/Colvars/gromacs). When posting a message to the [Gromacs forum](https://gromacs.bioexcel.eu/) regarding the use of these patched releases, please specify "GROMACS modification: **Yes**". +Versions GROMACS prior to 2024 are no longer supported by the current version of Colvars: please use GROMACS 2024 or later. ## Which version of Colvars is recommended? diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 3162bf8dc..7ae06cc9e 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -90,6 +90,25 @@ endif() include(buildColvarsLepton) + +option(COLVARS_MPI "Link against a MPI library" OFF) + +if(COLVARS_MPI) + find_package(MPI) + if(${MPI_FOUND}) + include_directories(SYSTEM ${MPI_CXX_INCLUDE_PATH}) + target_compile_options(colvars PRIVATE -DCOLVARS_MPI) + add_compile_options(-DCOLVARS_MPI) + target_link_libraries(colvars ${MPI_CXX_LIBRARIES}) + set(COLVARS_MPI ON) + else() + if(NOT ${MPI_FOUND}) + message(FATAL_ERROR "MPI not found.") + endif() + endif() +endif() + + option(COLVARS_TCL "Link against the Tcl library" OFF) if(COLVARS_TCL) diff --git a/doc/Makefile b/doc/Makefile index c78c7a1cc..4b16c2ae3 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,6 +1,6 @@ .PHONY: all pdf html doxygen webpage webpage-legacy images \ install clean clean-all \ - update-code-refs update-cvscript-cmdline-doc updates + update-code-refs update-cvscript-cmdline-doc updates update-version-list ifeq ($(COLVARS_RELEASE),) # Unless defined otherwise, the release label is the name of the branch @@ -90,7 +90,7 @@ clean-all: clean @echo @echo "Note: only removed files that this branch is set to build." -version-list: +update-version-list: ./print_engine_versions.sh > ../README-versions.md update-code-refs: diff --git a/doc/cv_version.tex b/doc/cv_version.tex index c89f44592..1adc138b4 100644 --- a/doc/cv_version.tex +++ b/doc/cv_version.tex @@ -1 +1 @@ -\newcommand{\cvversion}{2024-09-17} +\newcommand{\cvversion}{2024-10-05} diff --git a/doc/print_engine_versions.sh b/doc/print_engine_versions.sh index b4df3529f..39510d36f 100755 --- a/doc/print_engine_versions.sh +++ b/doc/print_engine_versions.sh @@ -1,6 +1,12 @@ #!/bin/bash -source ../devel-tools/version_functions.sh +TOPDIR=$(git rev-parse --show-toplevel) +if [ ! -d ${TOPDIR} ] ; then + echo "Error: cannot identify top project directory." >& 2 + exit 1 +fi + +source ${TOPDIR}/devel-tools/version_functions.sh reformat_lammps_version() { @@ -18,20 +24,32 @@ print_tag_versions() { local tag local colvars_version local lammps_version="" - for tag in $(git tag -l|grep ^${tag_prefix}); do + + for tag in $(git tag -l | grep ^${tag_prefix}) ; do local package_version=${tag#${tag_prefix}} colvars_version=$(get_colvarmodule_version ${tag}) - if [ ${package} = LAMMPS ] ; then + if [ ${package} == LAMMPS ] ; then lammps_version=$(reformat_lammps_version ${package_version#*_})" " fi echo "${lammps_version}${package_version} | [${colvars_version}](https://github.com/Colvars/colvars/releases/tag/${tag})" done + + for branch in $(git branch -l --format='%(refname)' | sed -s 's/refs\/heads\///' | grep ^${tag_prefix}) ; do + local package_version=${branch#${tag_prefix}} + colvars_version=$(get_colvarmodule_version ${branch}) + if [ ${package} == LAMMPS ] ; then + lammps_version=$(reformat_lammps_version ${package_version#*_})" " + fi + if [ ${package} == GROMACS ] ; then + if [ ${branch} == gromacs-2023 ] || [ ${branch} == gromacs-2022 ] ; then + # These branches do not reflect GROMACS standard releases + continue + fi + fi + echo "${lammps_version}${package_version} | [${colvars_version}](https://github.com/Colvars/colvars/tree/${branch})" + done } -for package in LAMMPS NAMD VMD ; do - echo "[Versions included in ${package}](#versions-included-in-${package})" - echo -done sort_versions(){ sort -r @@ -43,18 +61,24 @@ sort_lammps_versions(){ } -for package in LAMMPS NAMD VMD ; do +for package in GROMACS LAMMPS NAMD VMD ; do + echo "[Versions included in ${package}](#versions-included-in-${package})" + echo +done + + +for package in GROMACS LAMMPS NAMD VMD ; do echo "### Versions included in ${package}" - if [ ${package} = NAMD ] ; then + if [ ${package} == NAMD ] ; then echo "(Note: the Colvars version included in NAMD 2.12 is the same as the one included in 2.12b1 with only bugfixes applied: therefore, NAMD 2.12 does not correspond to a specific version of the Colvars source tree)" echo fi echo "${package} version | Colvars version" echo "-------------- | ---------------" sort_command=sort_versions - if [ ${package} = LAMMPS ] ; then + if [ ${package} == LAMMPS ] ; then sort_command=sort_lammps_versions fi - print_tag_versions ${package} $(echo ${package}- | tr '[:upper:]' '[:lower:]') | ${sort_command} + print_tag_versions ${package} ${package,,}- | ${sort_command} echo done diff --git a/gromacs/gromacs-mdmodules/.clang-format b/gromacs/.clang-format similarity index 100% rename from gromacs/gromacs-mdmodules/.clang-format rename to gromacs/.clang-format diff --git a/gromacs/gromacs-mdmodules/CMakeLists.txt.Lepton.diff b/gromacs/CMakeLists.txt.Lepton.diff similarity index 100% rename from gromacs/gromacs-mdmodules/CMakeLists.txt.Lepton.diff rename to gromacs/CMakeLists.txt.Lepton.diff diff --git a/gromacs/CMakeLists.txt.diff b/gromacs/CMakeLists.txt.diff index bcfa2b1dc..e69de29bb 100644 --- a/gromacs/CMakeLists.txt.diff +++ b/gromacs/CMakeLists.txt.diff @@ -1,13 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 70b0369bed..cccfe2aa1b 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -678,6 +678,8 @@ include(gmxManageLmfit) - - include(gmxManageMuparser) - -+include(gmxManageLepton) -+ - include(gmxManageColvars) - - ################################################## diff --git a/gromacs/cmake/gmxManageColvars.cmake b/gromacs/cmake/gmxManageColvars.cmake index 3cd697075..509d56e11 100644 --- a/gromacs/cmake/gmxManageColvars.cmake +++ b/gromacs/cmake/gmxManageColvars.cmake @@ -38,25 +38,25 @@ gmx_option_multichoice(GMX_USE_COLVARS INTERNAL NONE) mark_as_advanced(GMX_USE_COLVARS) -function(gmx_set_colvars_torch) - find_package(Torch) - if (Torch_FOUND) - message(STATUS "Torch found, enabling for Colvars") - set_property(TARGET colvars_objlib PROPERTY CXX_STANDARD 17) - target_compile_definitions(colvars_objlib PRIVATE -DTORCH) - target_compile_options(colvars_objlib PRIVATE ${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}) - target_include_directories(colvars_objlib PRIVATE ${TORCH_INCLUDE_DIRS}) - target_link_libraries(libgromacs PRIVATE "${TORCH_LIBRARIES}") - endif() -endfunction() - - function(gmx_manage_colvars) if(GMX_USE_COLVARS STREQUAL "INTERNAL") + # Create an object library for the colvars sources set(COLVARS_DIR "${CMAKE_SOURCE_DIR}/src/external/colvars") file(GLOB COLVARS_SOURCES ${COLVARS_DIR}/*.cpp) add_library(colvars_objlib OBJECT ${COLVARS_SOURCES}) + if(GMX_LIB_MPI) + target_compile_definitions(colvars_objlib PRIVATE -DCOLVARS_MPI) + endif() + if(GMX_OPENMP) + target_link_libraries(colvars_objlib PRIVATE OpenMP::OpenMP_CXX) + endif() + if(GMX_TORCH) + target_compile_options(colvars_objlib PRIVATE ${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}) + target_include_directories(colvars_objlib PRIVATE ${TORCH_INCLUDE_DIRS}) + target_compile_definitions(colvars_objlib PRIVATE -DCOLVARS_TORCH) + endif() + # Set correctly the value of __cplusplus, which MSVC doesn't do by default target_compile_options(colvars_objlib PRIVATE $<$:/Zc:__cplusplus>) # Ensure that colvars_objlib can be used in both STATIC and SHARED libraries. @@ -66,10 +66,11 @@ function(gmx_manage_colvars) add_library(colvars INTERFACE) target_sources(colvars INTERFACE $) target_include_directories(colvars SYSTEM INTERFACE $) - - if(GMX_OPENMP) - target_compile_options(colvars_objlib PRIVATE ${OpenMP_CXX_FLAGS}) - target_link_libraries(colvars_objlib PRIVATE OpenMP::OpenMP_CXX) + if(GMX_LIB_MPI) + target_compile_definitions(colvars INTERFACE -DCOLVARS_MPI) + endif() + if(GMX_TORCH) + target_compile_definitions(colvars INTERFACE -DCOLVARS_TORCH) endif() set(GMX_HAVE_COLVARS 1 CACHE INTERNAL "Is colvars found?") @@ -81,7 +82,5 @@ function(gmx_manage_colvars) set(GMX_HAVE_COLVARS 0 CACHE INTERNAL "Is colvars found?") endif() - - gmx_set_colvars_torch() mark_as_advanced(GMX_HAVE_COLVARS) endfunction() diff --git a/gromacs/gmxManageColvars.cmake.diff b/gromacs/gmxManageColvars.cmake.diff new file mode 100644 index 000000000..e69de29bb diff --git a/gromacs/gromacs-mdmodules.patch b/gromacs/gromacs-mdmodules.patch new file mode 100644 index 000000000..e69de29bb diff --git a/gromacs/gromacs-mdmodules/gmxManageColvars.cmake.diff b/gromacs/gromacs-mdmodules/gmxManageColvars.cmake.diff deleted file mode 100644 index 8b1378917..000000000 --- a/gromacs/gromacs-mdmodules/gmxManageColvars.cmake.diff +++ /dev/null @@ -1 +0,0 @@ - diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/CMakeLists.txt b/gromacs/src/applied_forces/colvars/CMakeLists.txt similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/CMakeLists.txt rename to gromacs/src/applied_forces/colvars/CMakeLists.txt diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/colvarproxygromacs.cpp b/gromacs/src/applied_forces/colvars/colvarproxygromacs.cpp similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/colvarproxygromacs.cpp rename to gromacs/src/applied_forces/colvars/colvarproxygromacs.cpp diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/colvarproxygromacs.h b/gromacs/src/applied_forces/colvars/colvarproxygromacs.h similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/colvarproxygromacs.h rename to gromacs/src/applied_forces/colvars/colvarproxygromacs.h diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/colvarsMDModule.cpp b/gromacs/src/applied_forces/colvars/colvarsMDModule.cpp similarity index 96% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/colvarsMDModule.cpp rename to gromacs/src/applied_forces/colvars/colvarsMDModule.cpp index 8d0625289..ad876b602 100644 --- a/gromacs/gromacs-mdmodules/applied_forces/colvars/colvarsMDModule.cpp +++ b/gromacs/src/applied_forces/colvars/colvarsMDModule.cpp @@ -49,6 +49,7 @@ #include "gromacs/domdec/localatomsetmanager.h" #include "gromacs/fileio/checkpoint.h" #include "gromacs/mdrunutility/mdmodulesnotifiers.h" +#include "gromacs/mdrunutility/multisim.h" #include "gromacs/mdtypes/commrec.h" #include "gromacs/mdtypes/iforceprovider.h" #include "gromacs/mdtypes/imdmodule.h" @@ -97,7 +98,7 @@ class ColvarsMDModule final : public IMDModule * KeyValueTreeObjectBuilder as parameter * - Acess topology using gmx_mtop_t notification * - Access MDLogger for notifications output - * - Access warninp for for grompp warnings output + * - Access warning for for grompp warnings output * - Coordinates, PBC and box for setting up the proxy */ void subscribeToPreProcessingNotifications(MDModulesNotifiers* notifier) override @@ -192,6 +193,12 @@ class ColvarsMDModule final : public IMDModule }; notifier->simulationSetupNotifier_.subscribe(setCommFunction); + // Retrieve the Multisim Record during simulations setup + const auto setMultisimFunction = [this](const gmx_multisim_t* ms) { + this->ColvarsSimulationsParameters_.setMultisim(ms); + }; + notifier->simulationSetupNotifier_.subscribe(setMultisimFunction); + // setting the simulation time step const auto setSimulationTimeStepFunction = [this](const SimulationTimeStep& simulationTimeStep) { this->ColvarsSimulationsParameters_.setSimulationTimeStep(simulationTimeStep.delta_t); @@ -251,6 +258,7 @@ class ColvarsMDModule final : public IMDModule colvarsOptions_.colvarsSeed(), ColvarsSimulationsParameters_.localAtomSetManager(), ColvarsSimulationsParameters_.comm(), + ColvarsSimulationsParameters_.ms(), ColvarsSimulationsParameters_.simulationTimeStep(), colvarsOptions_.colvarsAtomCoords(), colvarsOptions_.colvarsOutputPrefix(), diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/colvarsMDModule.h b/gromacs/src/applied_forces/colvars/colvarsMDModule.h similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/colvarsMDModule.h rename to gromacs/src/applied_forces/colvars/colvarsMDModule.h diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/colvarsMDModule_stub.cpp b/gromacs/src/applied_forces/colvars/colvarsMDModule_stub.cpp similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/colvarsMDModule_stub.cpp rename to gromacs/src/applied_forces/colvars/colvarsMDModule_stub.cpp diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/colvarsforceprovider.cpp b/gromacs/src/applied_forces/colvars/colvarsforceprovider.cpp similarity index 97% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/colvarsforceprovider.cpp rename to gromacs/src/applied_forces/colvars/colvarsforceprovider.cpp index be8434572..6b94d9a43 100644 --- a/gromacs/gromacs-mdmodules/applied_forces/colvars/colvarsforceprovider.cpp +++ b/gromacs/src/applied_forces/colvars/colvarsforceprovider.cpp @@ -57,6 +57,7 @@ #include "gromacs/math/vec.h" #include "gromacs/mdlib/broadcaststructs.h" #include "gromacs/mdlib/groupcoord.h" +#include "gromacs/mdrunutility/multisim.h" #include "gromacs/mdtypes/commrec.h" #include "gromacs/mdtypes/enerdata.h" #include "gromacs/mdtypes/forceoutput.h" @@ -65,6 +66,7 @@ #include "gromacs/utility/arrayref.h" #include "gromacs/utility/basedefinitions.h" #include "gromacs/utility/exceptions.h" +#include "gromacs/utility/gmxmpi.h" #include "gromacs/utility/keyvaluetree.h" #include "gromacs/utility/keyvaluetreebuilder.h" #include "gromacs/utility/smalloc.h" @@ -173,6 +175,7 @@ ColvarsForceProvider::ColvarsForceProvider(const std::string& colvarsConfigStrin int seed, LocalAtomSetManager* localAtomSetManager, const t_commrec* cr, + const gmx_multisim_t* ms, double simulationTimeStep, const std::vector& colvarsCoords, const std::string& outputPrefix, @@ -236,6 +239,17 @@ ColvarsForceProvider::ColvarsForceProvider(const std::string& colvarsConfigStrin snew(fColvars, nColvarsAtoms); snew(xColvarsOldWhole, nColvarsAtoms); +#if GMX_MPI + if (MAIN(cr)) + { + if (isMultiSim(ms)) + { + colvarproxy::set_replicas_mpi_communicator(ms->mainRanksComm_); + } + } +#else + GMX_UNUSED_VALUE(ms); +#endif // Check state status (did we read a cpt file?) if (MAIN(cr)) diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/colvarsforceprovider.h b/gromacs/src/applied_forces/colvars/colvarsforceprovider.h similarity index 98% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/colvarsforceprovider.h rename to gromacs/src/applied_forces/colvars/colvarsforceprovider.h index eb7666cba..028c17764 100644 --- a/gromacs/gromacs-mdmodules/applied_forces/colvars/colvarsforceprovider.h +++ b/gromacs/src/applied_forces/colvars/colvarsforceprovider.h @@ -61,6 +61,7 @@ enum class PbcType : int; struct t_commrec; +struct gmx_multisim_t; namespace gmx @@ -182,6 +183,7 @@ class ColvarsForceProvider final : public ColvarProxyGromacs, public IForceProvi * \param[in] seed The colvars seed for random number generator * \param[in] localAtomSetManager Atom Manager to retrieve Colvars index atoms * \param[in] cr Communication Record + * \param[in] ms Multi-simulation record * \param[in] simulationTimeStep The simulation time step * \param[in] colvarsCoords The colvars atoms coordinates retrived from the TPR's KVT * \param[in] outputPrefix The prefix for output colvars files @@ -196,6 +198,7 @@ class ColvarsForceProvider final : public ColvarProxyGromacs, public IForceProvi int seed, LocalAtomSetManager* localAtomSetManager, const t_commrec* cr, + const gmx_multisim_t* ms, double simulationTimeStep, const std::vector& colvarsCoords, const std::string& outputPrefix, diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/colvarsoptions.cpp b/gromacs/src/applied_forces/colvars/colvarsoptions.cpp similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/colvarsoptions.cpp rename to gromacs/src/applied_forces/colvars/colvarsoptions.cpp diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/colvarsoptions.h b/gromacs/src/applied_forces/colvars/colvarsoptions.h similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/colvarsoptions.h rename to gromacs/src/applied_forces/colvars/colvarsoptions.h diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/colvarspreprocessor.cpp b/gromacs/src/applied_forces/colvars/colvarspreprocessor.cpp similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/colvarspreprocessor.cpp rename to gromacs/src/applied_forces/colvars/colvarspreprocessor.cpp diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/colvarspreprocessor.h b/gromacs/src/applied_forces/colvars/colvarspreprocessor.h similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/colvarspreprocessor.h rename to gromacs/src/applied_forces/colvars/colvarspreprocessor.h diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/colvarssimulationsparameters.cpp b/gromacs/src/applied_forces/colvars/colvarssimulationsparameters.cpp similarity index 95% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/colvarssimulationsparameters.cpp rename to gromacs/src/applied_forces/colvars/colvarssimulationsparameters.cpp index f0e5e825a..52ec1a104 100644 --- a/gromacs/gromacs-mdmodules/applied_forces/colvars/colvarssimulationsparameters.cpp +++ b/gromacs/src/applied_forces/colvars/colvarssimulationsparameters.cpp @@ -114,6 +114,16 @@ const t_commrec* ColvarsSimulationsParameters::comm() const return cr_; } +void ColvarsSimulationsParameters::setMultisim(const gmx_multisim_t* ms) +{ + ms_ = ms; +} + +const gmx_multisim_t* ColvarsSimulationsParameters::ms() const +{ + return ms_; +} + void ColvarsSimulationsParameters::setLogger(const MDLogger& logger) { diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/colvarssimulationsparameters.h b/gromacs/src/applied_forces/colvars/colvarssimulationsparameters.h similarity index 94% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/colvarssimulationsparameters.h rename to gromacs/src/applied_forces/colvars/colvarssimulationsparameters.h index 8d6a227d7..8ae9823b0 100644 --- a/gromacs/gromacs-mdmodules/applied_forces/colvars/colvarssimulationsparameters.h +++ b/gromacs/src/applied_forces/colvars/colvarssimulationsparameters.h @@ -50,6 +50,7 @@ #include "gromacs/pbcutil/pbc.h" #include "gromacs/topology/atoms.h" #include "gromacs/utility/logger.h" +struct gmx_multisim_t; struct gmx_mtop_t; @@ -109,7 +110,12 @@ class ColvarsSimulationsParameters //! Return the communicator const t_commrec* comm() const; - /*! \brief Set the logger for QMMM during mdrun + //! Set the Multisim record + void setMultisim(const gmx_multisim_t* ms); + //! Return Multisim record + const gmx_multisim_t* ms() const; + + /*! \brief Set the logger for Colvars during mdrun * \param[in] logger Logger instance to be used for output */ void setLogger(const MDLogger& logger); @@ -128,6 +134,8 @@ class ColvarsSimulationsParameters t_atoms gmxAtoms_; //! The communicator const t_commrec* cr_; + //! The multisim record + const gmx_multisim_t* ms_; //! MDLogger for notifications during mdrun const MDLogger* logger_ = nullptr; diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/tests/.clang-tidy b/gromacs/src/applied_forces/colvars/tests/.clang-tidy similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/tests/.clang-tidy rename to gromacs/src/applied_forces/colvars/tests/.clang-tidy diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/tests/CMakeLists.txt b/gromacs/src/applied_forces/colvars/tests/CMakeLists.txt similarity index 92% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/tests/CMakeLists.txt rename to gromacs/src/applied_forces/colvars/tests/CMakeLists.txt index c47edb16e..1d7198d79 100644 --- a/gromacs/gromacs-mdmodules/applied_forces/colvars/tests/CMakeLists.txt +++ b/gromacs/src/applied_forces/colvars/tests/CMakeLists.txt @@ -48,6 +48,11 @@ else() ) endif() +if(GMX_LIB_MPI) + # THis target does not link the library directly, must add the flag again + target_compile_definitions(colvars_applied_forces-test PRIVATE -DCOLVARS_MPI) +endif() + target_link_libraries(colvars_applied_forces-test PRIVATE applied_forces math topology mdlib mdtypes) diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/tests/colvars.cpp b/gromacs/src/applied_forces/colvars/tests/colvars.cpp similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/tests/colvars.cpp rename to gromacs/src/applied_forces/colvars/tests/colvars.cpp diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/tests/colvars_sample.dat b/gromacs/src/applied_forces/colvars/tests/colvars_sample.dat similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/tests/colvars_sample.dat rename to gromacs/src/applied_forces/colvars/tests/colvars_sample.dat diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/tests/colvars_sample_alanine.dat b/gromacs/src/applied_forces/colvars/tests/colvars_sample_alanine.dat similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/tests/colvars_sample_alanine.dat rename to gromacs/src/applied_forces/colvars/tests/colvars_sample_alanine.dat diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/tests/colvarsforceprovider.cpp b/gromacs/src/applied_forces/colvars/tests/colvarsforceprovider.cpp similarity index 97% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/tests/colvarsforceprovider.cpp rename to gromacs/src/applied_forces/colvars/tests/colvarsforceprovider.cpp index fbf3452d2..f51684413 100644 --- a/gromacs/gromacs-mdmodules/applied_forces/colvars/tests/colvarsforceprovider.cpp +++ b/gromacs/src/applied_forces/colvars/tests/colvarsforceprovider.cpp @@ -58,6 +58,7 @@ #include "gromacs/math/vec.h" #include "gromacs/math/vectypes.h" #include "gromacs/mdlib/forcerec.h" +#include "gromacs/mdrunutility/multisim.h" #include "gromacs/mdtypes/commrec.h" #include "gromacs/mdtypes/enerdata.h" #include "gromacs/mdtypes/forceoutput.h" @@ -202,6 +203,7 @@ TEST_F(ColvarsForceProviderTest, CanConstructOrNot) seed_, &atomSetManager_, &cr_, + nullptr, simulationTimeStep_, atomCoords_, prefixOutput_, @@ -227,6 +229,7 @@ TEST_F(ColvarsForceProviderTest, SimpleInputs) seed_, &atomSetManager_, &cr_, + nullptr, simulationTimeStep_, atomCoords_, prefixOutput_, @@ -289,6 +292,7 @@ TEST_F(ColvarsForceProviderTest, WrongColvarsInput) seed_, &atomSetManager_, &cr_, + nullptr, simulationTimeStep_, atomCoords_, prefixOutput_, @@ -328,6 +332,7 @@ TEST_F(ColvarsForceProviderTest, CalculateForces4water) seed_, &atomSetManager_, &cr_, + nullptr, simulationTimeStep_, atomCoords_, prefixOutput_, @@ -372,6 +377,7 @@ TEST_F(ColvarsForceProviderTest, CalculateForcesAlanine) seed_, &atomSetManager_, &cr_, + nullptr, simulationTimeStep_, atomCoords_, prefixOutput_, diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/tests/colvarsoptions.cpp b/gromacs/src/applied_forces/colvars/tests/colvarsoptions.cpp similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/tests/colvarsoptions.cpp rename to gromacs/src/applied_forces/colvars/tests/colvarsoptions.cpp diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/tests/colvarspreprocessor.cpp b/gromacs/src/applied_forces/colvars/tests/colvarspreprocessor.cpp similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/tests/colvarspreprocessor.cpp rename to gromacs/src/applied_forces/colvars/tests/colvarspreprocessor.cpp diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/tests/index.ndx b/gromacs/src/applied_forces/colvars/tests/index.ndx similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/tests/index.ndx rename to gromacs/src/applied_forces/colvars/tests/index.ndx diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/tests/refdata/ColvarsForceProviderTest_CalculateForces4water.xml b/gromacs/src/applied_forces/colvars/tests/refdata/ColvarsForceProviderTest_CalculateForces4water.xml similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/tests/refdata/ColvarsForceProviderTest_CalculateForces4water.xml rename to gromacs/src/applied_forces/colvars/tests/refdata/ColvarsForceProviderTest_CalculateForces4water.xml diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/tests/refdata/ColvarsForceProviderTest_CalculateForcesAlanine.xml b/gromacs/src/applied_forces/colvars/tests/refdata/ColvarsForceProviderTest_CalculateForcesAlanine.xml similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/tests/refdata/ColvarsForceProviderTest_CalculateForcesAlanine.xml rename to gromacs/src/applied_forces/colvars/tests/refdata/ColvarsForceProviderTest_CalculateForcesAlanine.xml diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/tests/refdata/ColvarsOptionsTest_OutputDefaultValuesWhenActive.xml b/gromacs/src/applied_forces/colvars/tests/refdata/ColvarsOptionsTest_OutputDefaultValuesWhenActive.xml similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/tests/refdata/ColvarsOptionsTest_OutputDefaultValuesWhenActive.xml rename to gromacs/src/applied_forces/colvars/tests/refdata/ColvarsOptionsTest_OutputDefaultValuesWhenActive.xml diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/tests/refdata/ColvarsOptionsTest_OutputNoDefaultValuesWhenInactive.xml b/gromacs/src/applied_forces/colvars/tests/refdata/ColvarsOptionsTest_OutputNoDefaultValuesWhenInactive.xml similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/tests/refdata/ColvarsOptionsTest_OutputNoDefaultValuesWhenInactive.xml rename to gromacs/src/applied_forces/colvars/tests/refdata/ColvarsOptionsTest_OutputNoDefaultValuesWhenInactive.xml diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/tests/refdata/ColvarsOptionsTest_OutputValuesWhenActive.xml b/gromacs/src/applied_forces/colvars/tests/refdata/ColvarsOptionsTest_OutputValuesWhenActive.xml similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/tests/refdata/ColvarsOptionsTest_OutputValuesWhenActive.xml rename to gromacs/src/applied_forces/colvars/tests/refdata/ColvarsOptionsTest_OutputValuesWhenActive.xml diff --git a/gromacs/gromacs-mdmodules/applied_forces/colvars/tests/refdata/ColvarsPreProcessorTest_CheckValuesFourWaters.xml b/gromacs/src/applied_forces/colvars/tests/refdata/ColvarsPreProcessorTest_CheckValuesFourWaters.xml similarity index 100% rename from gromacs/gromacs-mdmodules/applied_forces/colvars/tests/refdata/ColvarsPreProcessorTest_CheckValuesFourWaters.xml rename to gromacs/src/applied_forces/colvars/tests/refdata/ColvarsPreProcessorTest_CheckValuesFourWaters.xml diff --git a/gromacs/src/colvarproxy_gromacs_version.h b/gromacs/src/colvarproxy_gromacs_version.h index 55ca42208..98fd8f2b4 100644 --- a/gromacs/src/colvarproxy_gromacs_version.h +++ b/gromacs/src/colvarproxy_gromacs_version.h @@ -1,43 +1,3 @@ -/* - * This file is part of the GROMACS molecular simulation package. - * - * Copyright 2023- The GROMACS Authors - * and the project initiators Erik Lindahl, Berk Hess and David van der Spoel. - * Consult the AUTHORS/COPYING files and https://www.gromacs.org for details. - * - * GROMACS is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 - * of the License, or (at your option) any later version. - * - * GROMACS is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with GROMACS; if not, see - * https://www.gnu.org/licenses, or write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * If you want to redistribute modifications to GROMACS, please - * consider that scientific software is very special. Version - * control is crucial - bugs must be traceable. We will be happy to - * consider code for inclusion in the official distribution, but - * derived work must not be called official GROMACS. Details are found - * in the README & COPYING files - if they are missing, get the - * official version at https://www.gromacs.org. - * - * To help us fund GROMACS development, we humbly ask that you cite - * the research papers on the package. Check out https://www.gromacs.org. - */ -/*! \internal \file - * \brief - * Tracks the Colvars GROMACS interface version; see https://github.com/Colvars/colvars - - * \ingroup module_applied_forces - */ - #ifndef COLVARPROXY_VERSION -#define COLVARPROXY_VERSION "2023-12-05" +#define COLVARPROXY_VERSION "2024-10-05" #endif diff --git a/gromacs/tests/interface/010_MPI_multi-sim/run.sh b/gromacs/tests/interface/010_MPI_multi-sim/run.sh index 680354eb1..261f1eb0f 100755 --- a/gromacs/tests/interface/010_MPI_multi-sim/run.sh +++ b/gromacs/tests/interface/010_MPI_multi-sim/run.sh @@ -5,17 +5,42 @@ # It's best to have Gromacs compiled in double precision # Reference files have been generated with Gromacs version 2024-dev +echo -n "Running $(basename $PWD)..." + +set -e + # if script called from `run_tests.sh` in the parent folder, retrieve the correct command binary from the argument -if [ "$1" ] +if [ -x "$1" ] then BINARY=$1 else BINARY="gmx_mpi_d" fi -mpirun -np 16 -oversubscribe $BINARY mdrun -multidir a b c d -s test.tpr -deffnm test -replex 10 -reseed 376 2>&1 | tee test.out +mpirun -np 16 -oversubscribe $BINARY mdrun -multidir a b c d -s test.tpr -deffnm test -replex 10 -reseed 376 >& test.out + +labels=(a b c d) +for number in $(seq 1 ${#labels[@]}) ; do + index=$((${number} - 1)) + label=${labels[${index}]} + replica_msg=$(grep -s "colvars: Enabling multiple replicas: this is replica number" ${label}/test.log) + if [ -z "${replica_msg}" ] ; then + echo "Error: missing replica initialization message." >& 2 + exit 1 + fi + replica_num=$(echo ${replica_msg} | cut -d' ' -f 9) + replicas_count=$(echo ${replica_msg} | cut -d' ' -f 11) + replicas_count=${replicas_count%.} + if [ ${replicas_count} != 4 ] || [ ${replica_num} != ${number} ] ; then + echo -e "Error: wrong initialization for replica number ${number}; got the following message:\n\n${replica_msg}\n" >& 2 + exit 1 + fi +done + +# # TODO actually test these against the reference +# # Copy result files to be tested in the main folder +# cp -f a/test.colvars.traj a/test.colvars.state . +# cp -f a/test.log ./test.out -# Copy result files to be tested in the main folder -cp a/test.colvars.traj a/test.colvars.state . -cp a/test.log ./test.out +echo " Success!" diff --git a/gromacs/tests/interface/run_tests.sh b/gromacs/tests/interface/run_tests.sh index 5988dae79..913ec3d2e 100755 --- a/gromacs/tests/interface/run_tests.sh +++ b/gromacs/tests/interface/run_tests.sh @@ -20,13 +20,13 @@ fi # Run tests that depend on an MPI build if source ${TOPDIR}/devel-tools/load-openmpi.sh ; then - if cd 010_MPI_multi-sim ; then + if pushd 010_MPI_multi-sim > /dev/null ; then ./run.sh $1 if [ $? -ne 0 ] then ALL_SUCCESS=0 fi - cd - + popd > /dev/null fi fi diff --git a/gromacs/tests/library/Common/test.mdp b/gromacs/tests/library/Common/test.mdp index 693f18d42..c3953c389 100644 --- a/gromacs/tests/library/Common/test.mdp +++ b/gromacs/tests/library/Common/test.mdp @@ -53,6 +53,5 @@ tcoupl = no gen_vel = no ; Colvars configuration -colvars-active = yes +colvars-active = Yes colvars-configfile = test.in -colvars-seed = 12345 diff --git a/gromacs/tests/library/run_tests.sh b/gromacs/tests/library/run_tests.sh index 86fb1243d..d08e90bb1 100755 --- a/gromacs/tests/library/run_tests.sh +++ b/gromacs/tests/library/run_tests.sh @@ -109,21 +109,12 @@ else MDMODULES_INTERFACE=no fi -TORCH_LINKED=false -# Need readlink because ldd can give wrong results when run on symlinks to binaries -if { ldd $(readlink -f $(which $BINARY)) | grep -q libtorch[_a-zA-Z]*.so ; } then TORCH_LINKED=true ; fi - for dir in ${DIRLIST} ; do if [ -f ${dir}/disabled ] ; then continue fi - if echo ${dir} | grep -q torchann && [ ${TORCH_LINKED} != "true" ] ; then - echo "Binary is not libtorch-enabled; directory ${dir} skipped." - continue - fi - echo -ne "Entering $(${TPUT_BLUE})${dir}$(${TPUT_CLEAR}) ..." cd $dir diff --git a/lammps/COLVARS.cmake.diff b/lammps/COLVARS.cmake.diff index 7b989d4bf..daea8d459 100644 --- a/lammps/COLVARS.cmake.diff +++ b/lammps/COLVARS.cmake.diff @@ -1,15 +1,14 @@ diff --git a/cmake/Modules/Packages/COLVARS.cmake b/cmake/Modules/Packages/COLVARS.cmake -index 745c1de026..b943a0345e 100644 +index b943a0345e..ebee306f43 100644 --- a/cmake/Modules/Packages/COLVARS.cmake +++ b/cmake/Modules/Packages/COLVARS.cmake -@@ -24,6 +24,12 @@ target_include_directories(colvars PUBLIC ${LAMMPS_LIB_SOURCE_DIR}/colvars) - target_include_directories(colvars PRIVATE ${LAMMPS_SOURCE_DIR}) - target_link_libraries(lammps PRIVATE colvars) +@@ -30,6 +30,11 @@ if(BUILD_OMP) + target_link_libraries(colvars PRIVATE OpenMP::OpenMP_CXX) + endif() -+if(BUILD_OMP) -+ # Enable OpenMP for Colvars as well -+ target_compile_options(colvars PRIVATE ${OpenMP_CXX_FLAGS}) -+ target_link_libraries(colvars PRIVATE OpenMP::OpenMP_CXX) ++if(BUILD_MPI) ++ target_compile_definitions(colvars PUBLIC -DCOLVARS_MPI) ++ target_link_libraries(colvars PUBLIC MPI::MPI_CXX) +endif() + if(COLVARS_DEBUG) diff --git a/lammps/src/COLVARS/colvarproxy_lammps.cpp b/lammps/src/COLVARS/colvarproxy_lammps.cpp index 37fe4ab0a..c34e2e0fd 100644 --- a/lammps/src/COLVARS/colvarproxy_lammps.cpp +++ b/lammps/src/COLVARS/colvarproxy_lammps.cpp @@ -41,9 +41,6 @@ colvarproxy_lammps::colvarproxy_lammps(LAMMPS_NS::LAMMPS *lmp) previous_step = -1; do_exit = false; - inter_me = 0; - inter_num = 1; - engine_ready_ = false; } @@ -91,17 +88,6 @@ void colvarproxy_lammps::set_random_seed(int seed) } -void colvarproxy_lammps::set_replicas_communicator(MPI_Comm root2root) -{ - inter_comm = root2root; - // initialize multi-replica support, if available - if (replica_enabled() == COLVARS_OK) { - MPI_Comm_rank(inter_comm, &inter_me); - MPI_Comm_size(inter_comm, &inter_num); - } -} - - // re-initialize data where needed int colvarproxy_lammps::setup() { @@ -260,58 +246,6 @@ int colvarproxy_lammps::set_unit_system(std::string const &units_in, bool /*chec } -// multi-replica support - -int colvarproxy_lammps::replica_enabled() -{ - return (inter_comm != MPI_COMM_NULL) ? COLVARS_OK : COLVARS_NOT_IMPLEMENTED; -} - - -int colvarproxy_lammps::replica_index() -{ - return inter_me; -} - - -int colvarproxy_lammps::num_replicas() -{ - return inter_num; -} - - -void colvarproxy_lammps::replica_comm_barrier() -{ - MPI_Barrier(inter_comm); -} - - -int colvarproxy_lammps::replica_comm_recv(char* msg_data, - int buf_len, int src_rep) -{ - MPI_Status status; - int retval; - - retval = MPI_Recv(msg_data,buf_len,MPI_CHAR,src_rep,0,inter_comm,&status); - if (retval == MPI_SUCCESS) { - MPI_Get_count(&status, MPI_CHAR, &retval); - } else retval = 0; - return retval; -} - - -int colvarproxy_lammps::replica_comm_send(char* msg_data, - int msg_len, int dest_rep) -{ - int retval; - retval = MPI_Send(msg_data,msg_len,MPI_CHAR,dest_rep,0,inter_comm); - if (retval == MPI_SUCCESS) { - retval = msg_len; - } else retval = 0; - return retval; -} - - int colvarproxy_lammps::check_atom_id(int atom_number) { diff --git a/lammps/src/COLVARS/colvarproxy_lammps.h b/lammps/src/COLVARS/colvarproxy_lammps.h index 80939a1c1..7ed469baa 100644 --- a/lammps/src/COLVARS/colvarproxy_lammps.h +++ b/lammps/src/COLVARS/colvarproxy_lammps.h @@ -41,9 +41,6 @@ class colvarproxy_lammps : public colvarproxy { std::vector atoms_types; - MPI_Comm inter_comm; // MPI comm with 1 root proc from each world - int inter_me, inter_num; // rank for the inter replica comm - public: friend class cvm::atom; @@ -56,9 +53,6 @@ class colvarproxy_lammps : public colvarproxy { /// Set the internal seed used by \link rand_gaussian() \endlink void set_random_seed(int seed); - /// Set the multiple replicas communicator - void set_replicas_communicator(MPI_Comm root2root); - int setup() override; // disable default and copy constructor @@ -99,14 +93,6 @@ class colvarproxy_lammps : public colvarproxy { int check_atom_id(int atom_number) override; inline std::vector *modify_atom_types() { return &atoms_types; } - - int replica_enabled() override; - int replica_index() override; - int num_replicas() override; - - void replica_comm_barrier() override; - int replica_comm_recv(char *msg_data, int buf_len, int src_rep) override; - int replica_comm_send(char *msg_data, int msg_len, int dest_rep) override; }; #endif diff --git a/lammps/src/COLVARS/colvarproxy_lammps_version.h b/lammps/src/COLVARS/colvarproxy_lammps_version.h index 5901044b1..98fd8f2b4 100644 --- a/lammps/src/COLVARS/colvarproxy_lammps_version.h +++ b/lammps/src/COLVARS/colvarproxy_lammps_version.h @@ -1,3 +1,3 @@ #ifndef COLVARPROXY_VERSION -#define COLVARPROXY_VERSION "2024-07-05" +#define COLVARPROXY_VERSION "2024-10-05" #endif diff --git a/lammps/src/COLVARS/fix_colvars.cpp b/lammps/src/COLVARS/fix_colvars.cpp index d2da1416d..b1ee0cbac 100644 --- a/lammps/src/COLVARS/fix_colvars.cpp +++ b/lammps/src/COLVARS/fix_colvars.cpp @@ -286,7 +286,7 @@ void FixColvars::init() } MPI_Comm_split(universe->uworld, color, universe->iworld, &root2root); if (me == 0) { - proxy->set_replicas_communicator(root2root); + proxy->set_replicas_mpi_communicator(root2root); } } } diff --git a/namd/src/colvarproxy_namd.C b/namd/src/colvarproxy_namd.C index 2cbc0a59e..57036261b 100644 --- a/namd/src/colvarproxy_namd.C +++ b/namd/src/colvarproxy_namd.C @@ -1605,7 +1605,7 @@ int colvarproxy_namd::smp_biases_script_loop() #endif // #if CMK_SMP && USE_CKLOOP -int colvarproxy_namd::replica_enabled() { +int colvarproxy_namd::check_replicas_enabled() { #if CMK_HAS_PARTITION return COLVARS_OK; #else diff --git a/namd/src/colvarproxy_namd.h b/namd/src/colvarproxy_namd.h index dd7d88ffb..3aff50295 100644 --- a/namd/src/colvarproxy_namd.h +++ b/namd/src/colvarproxy_namd.h @@ -167,7 +167,7 @@ class colvarproxy_namd : public colvarproxy, public GlobalMaster { #endif // #if CMK_SMP && USE_CKLOOP - int replica_enabled() override; + int check_replicas_enabled() override; int replica_index() override; int num_replicas() override; void replica_comm_barrier() override; diff --git a/namd/src/colvarproxy_namd_version.h b/namd/src/colvarproxy_namd_version.h index 21077698c..98fd8f2b4 100644 --- a/namd/src/colvarproxy_namd_version.h +++ b/namd/src/colvarproxy_namd_version.h @@ -1,3 +1,3 @@ #ifndef COLVARPROXY_VERSION -#define COLVARPROXY_VERSION "2023-12-05" +#define COLVARPROXY_VERSION "2024-10-05" #endif diff --git a/src/colvarbias_abf.cpp b/src/colvarbias_abf.cpp index 632765086..6744d6a8f 100644 --- a/src/colvarbias_abf.cpp +++ b/src/colvarbias_abf.cpp @@ -87,7 +87,7 @@ int colvarbias_abf::init(std::string const &conf) get_keyval(conf, "shared", shared_on, false); if (shared_on) { cvm::main()->cite_feature("Multiple-walker ABF implementation"); - if ((proxy->replica_enabled() != COLVARS_OK) || + if ((proxy->check_replicas_enabled() != COLVARS_OK) || (proxy->num_replicas() <= 1)) { return cvm::error("Error: shared ABF requires more than one replica.", COLVARS_INPUT_ERROR); @@ -525,7 +525,7 @@ int colvarbias_abf::replica_share() { colvarproxy *proxy = cvm::main()->proxy; - if (proxy->replica_enabled() != COLVARS_OK) { + if (proxy->check_replicas_enabled() != COLVARS_OK) { cvm::error("Error: shared ABF: No replicas.\n"); return COLVARS_ERROR; } diff --git a/src/colvarbias_meta.cpp b/src/colvarbias_meta.cpp index 637bfa820..e95352fbe 100644 --- a/src/colvarbias_meta.cpp +++ b/src/colvarbias_meta.cpp @@ -209,7 +209,7 @@ int colvarbias_meta::init_replicas_params(std::string const &conf) get_keyval(conf, "replicaID", replica_id, replica_id); if (!replica_id.size()) { - if (proxy->replica_enabled() == COLVARS_OK) { + if (proxy->check_replicas_enabled() == COLVARS_OK) { // Obtain replicaID from the communicator replica_id = cvm::to_str(proxy->replica_index()); cvm::log("Setting replicaID from communication layer: replicaID = "+ diff --git a/src/colvarmodule.cpp b/src/colvarmodule.cpp index 25b1efe20..5681660c0 100644 --- a/src/colvarmodule.cpp +++ b/src/colvarmodule.cpp @@ -129,6 +129,17 @@ colvarmodule::colvarmodule(colvarproxy *proxy_in) } } + if (proxy->check_replicas_enabled() == COLVARS_NOT_IMPLEMENTED) { + cvm::log(" - Multiple replicas: not available\n"); + } else { + if (proxy->check_replicas_enabled() == COLVARS_OK) { + cvm::log(" - Multiple replicas: enabled (replica number " + + to_str(proxy->replica_index() + 1) + " of " + to_str(proxy->num_replicas()) + ")\n"); + } else { + cvm::log(" - Multiple replicas: available, but not (yet) enabled\n"); + } + } + #if defined(LEPTON) cvm::log(" - Lepton custom functions: available\n"); #else diff --git a/src/colvarproxy.h b/src/colvarproxy.h index 91db6011e..6f3fd1b28 100644 --- a/src/colvarproxy.h +++ b/src/colvarproxy.h @@ -13,6 +13,7 @@ #include "colvarmodule.h" #include "colvartypes.h" #include "colvarproxy_io.h" +#include "colvarproxy_replicas.h" #include "colvarproxy_system.h" #include "colvarproxy_tcl.h" #include "colvarproxy_volmaps.h" @@ -491,38 +492,6 @@ class colvarproxy_smp { }; -/// \brief Methods for multiple-replica communication -class colvarproxy_replicas { - -public: - - /// Constructor - colvarproxy_replicas(); - - /// Destructor - virtual ~colvarproxy_replicas(); - - /// \brief Indicate if multi-replica support is available and active - virtual int replica_enabled(); - - /// \brief Index of this replica - virtual int replica_index(); - - /// \brief Total number of replicas - virtual int num_replicas(); - - /// \brief Synchronize replica with others - virtual void replica_comm_barrier(); - - /// \brief Receive data from other replica - virtual int replica_comm_recv(char* msg_data, int buf_len, int src_rep); - - /// \brief Send data to other replica - virtual int replica_comm_send(char* msg_data, int msg_len, int dest_rep); - -}; - - /// Methods for scripting language interface (Tcl or Python) class colvarproxy_script { diff --git a/src/colvarproxy_replicas.cpp b/src/colvarproxy_replicas.cpp index 1f336d3e4..ec7ffdd8d 100644 --- a/src/colvarproxy_replicas.cpp +++ b/src/colvarproxy_replicas.cpp @@ -7,50 +7,103 @@ // If you wish to distribute your changes, please submit them to the // Colvars repository at GitHub. + #include "colvarmodule.h" -#include "colvarproxy.h" +#include "colvarproxy_replicas.h" -colvarproxy_replicas::colvarproxy_replicas() {} +colvarproxy_replicas::colvarproxy_replicas() +{ +#ifdef COLVARS_MPI + replicas_mpi_comm = MPI_COMM_NULL; +#endif +} colvarproxy_replicas::~colvarproxy_replicas() {} -int colvarproxy_replicas::replica_enabled() +void colvarproxy_replicas::set_replicas_mpi_communicator(replicas_mpi_comm_t comm) { + replicas_mpi_comm = comm; +#ifdef COLVARS_MPI + if (comm != MPI_COMM_NULL) { + MPI_Comm_rank(comm, &replicas_mpi_rank); + MPI_Comm_size(comm, &replicas_mpi_num); + cvm::log("Enabling multiple replicas: this is replica number " + + cvm::to_str(replica_index() + 1) + " of " + cvm::to_str(num_replicas()) + ".\n"); + } +#endif +} + + +int colvarproxy_replicas::check_replicas_enabled() +{ +#ifdef COLVARS_MPI + if (replicas_mpi_comm != MPI_COMM_NULL) { + return num_replicas() > 1 ? COLVARS_OK : COLVARS_ERROR; + } + return COLVARS_ERROR; +#else return COLVARS_NOT_IMPLEMENTED; +#endif } int colvarproxy_replicas::replica_index() { - return 0; + return replicas_mpi_rank; } int colvarproxy_replicas::num_replicas() { - return 1; + return replicas_mpi_num; } -void colvarproxy_replicas::replica_comm_barrier() {} +void colvarproxy_replicas::replica_comm_barrier() +{ +#ifdef COLVARS_MPI + MPI_Barrier(replicas_mpi_comm); +#endif +} -int colvarproxy_replicas::replica_comm_recv(char* /* msg_data */, - int /* buf_len */, - int /* src_rep */) +int colvarproxy_replicas::replica_comm_recv(char *buffer, int buffer_length, int source_rank) { +#ifdef COLVARS_MPI + MPI_Status status; + int retval = MPI_Recv(buffer, buffer_length, MPI_CHAR, source_rank, 0, replicas_mpi_comm, &status); + if (retval == MPI_SUCCESS) { + MPI_Get_count(&status, MPI_CHAR, &retval); + } else { + retval = 0; + } + return retval; +#else + (void)buffer; + (void)buffer_length; + (void)source_rank; return COLVARS_NOT_IMPLEMENTED; +#endif } -int colvarproxy_replicas::replica_comm_send(char* /* msg_data */, - int /* msg_len */, - int /* dest_rep */) +int colvarproxy_replicas::replica_comm_send(char *buffer, int buffer_length, int destination_rank) { +#ifdef COLVARS_MPI + int retval = MPI_Send(buffer, buffer_length, MPI_CHAR, destination_rank, 0, replicas_mpi_comm); + if (retval == MPI_SUCCESS) { + retval = buffer_length; + } else { + retval = 0; + } + return retval; +#else + (void)buffer; + (void)buffer_length; + (void)destination_rank; return COLVARS_NOT_IMPLEMENTED; +#endif } - - diff --git a/src/colvarproxy_replicas.h b/src/colvarproxy_replicas.h new file mode 100644 index 000000000..b58c80bf5 --- /dev/null +++ b/src/colvarproxy_replicas.h @@ -0,0 +1,66 @@ +// -*- c++ -*- + +// This file is part of the Collective Variables module (Colvars). +// The original version of Colvars and its updates are located at: +// https://github.com/Colvars/colvars +// Please update all Colvars source files before making any changes. +// If you wish to distribute your changes, please submit them to the +// Colvars repository at GitHub. + +#ifndef COLVARPROXY_REPLICAS_H +#define COLVARPROXY_REPLICAS_H + + +#ifdef COLVARS_MPI +#include +typedef MPI_Comm replicas_mpi_comm_t; +#else +typedef void * replicas_mpi_comm_t; +#endif + + +/// \brief Methods for multiple-replica communication +class colvarproxy_replicas { + +public: + + /// Constructor + colvarproxy_replicas(); + + /// Destructor + virtual ~colvarproxy_replicas(); + + /// Set the multiple replicas communicator + virtual void set_replicas_mpi_communicator(replicas_mpi_comm_t comm); + + /// Indicate if multi-replica support is available and active + virtual int check_replicas_enabled(); + + /// Index of this replica + virtual int replica_index(); + + /// Total number of replicas + virtual int num_replicas(); + + /// Synchronize replica with others + virtual void replica_comm_barrier(); + + /// Receive data from other replica + virtual int replica_comm_recv(char* msg_data, int buf_len, int src_rep); + + /// Send data to other replica + virtual int replica_comm_send(char* msg_data, int msg_len, int dest_rep); + +protected: + + /// MPI communicator containint 1 root proc from each world + replicas_mpi_comm_t replicas_mpi_comm; + + /// Index (rank) of this replica in the MPI implementation + int replicas_mpi_rank = 0; + + /// Number of replicas in the MPI implementation + int replicas_mpi_num = 1; +}; + +#endif diff --git a/src/colvars_version.h b/src/colvars_version.h index 02d8cd4f9..5db618e80 100644 --- a/src/colvars_version.h +++ b/src/colvars_version.h @@ -1,3 +1,3 @@ #ifndef COLVARS_VERSION -#define COLVARS_VERSION "2024-09-17" +#define COLVARS_VERSION "2024-10-05" #endif diff --git a/update-colvars-code.sh b/update-colvars-code.sh index 319eb0921..447c3aa1b 100755 --- a/update-colvars-code.sh +++ b/update-colvars-code.sh @@ -109,9 +109,9 @@ else fi if [ ${code} == "GROMACS" ] ; then - if [ -f ${target}/src/gromacs/mdrunutility/mdmodulesnotifiers.cpp ] ; then - # Code after https://gitlab.com/gromacs/gromacs/-/merge_requests/3566 - code=GROMACS-DEV + if [ ! -f ${target}/src/gromacs/applied_forces/colvars/colvarsMDModule.cpp ] ; then + echo "ERROR: Versions of GROMACS prior to 2024 are no longer supported." + exit 1 fi fi @@ -184,46 +184,15 @@ then exit 3 fi - GMX_MAJOR_VERSION=`get_gromacs_major_version_cmake ${GMX_VERSION_INFO}` - GMX_MINOR_VERSION=`get_gromacs_minor_version_cmake ${GMX_VERSION_INFO}` - - GMX_VERSION=${GMX_MAJOR_VERSION}.${GMX_MINOR_VERSION} - - # Since 2022, version info is in CMakeLists.txt - if [ ${GMX_MAJOR_VERSION} = "\${Gromacs_VERSION_MAJOR}" ] ; then - CMAKE_LISTS=${target}/CMakeLists.txt - if [ ! -f ${CMAKE_LISTS} ] ; then - echo "ERROR: Cannot find file ${CMAKE_LISTS}." - exit 3 - fi - GMX_VERSION=$(cat ${CMAKE_LISTS} | grep '^project(' | \ - sed -e 's/project(Gromacs VERSION //' -e 's/)//') + CMAKE_LISTS=${target}/CMakeLists.txt + if [ ! -f ${CMAKE_LISTS} ] ; then + echo "ERROR: Cannot find file ${CMAKE_LISTS}." + exit 3 fi + GMX_VERSION=$(cat ${CMAKE_LISTS} | grep '^project(' | sed -e 's/project(Gromacs VERSION //' -e 's/)//') echo "Detected GROMACS version ${GMX_VERSION}." - case ${GMX_VERSION} in - 2023*) - GMX_VERSION='2023.x' - ;; - *) - if [ $force_update = 0 ] ; then - echo " ******************************************************************************" - echo " ERROR: GROMACS version ${GMX_VERSION} is unsupported." - echo " You may override with -f, but be mindful of compilation or runtime problems." - echo " Alternatively, you may also download legacy code versions at https://github.com/Colvars/gromacs" - echo " ******************************************************************************" - exit 3 - else - echo " ******************************************************************************" - echo " WARNING: Unsupported GROMACS ${GMX_VERSION} version will be patched." - echo " Using GROMACS 2023.x files for patching." - echo " ******************************************************************************" - GMX_VERSION='2023.x' - fi - ;; - esac - if [ -z "${GITHUB_ACTION}" ] ; then # Only set version outside CI to avoid invalidating the compiler cache if grep -q 'set(GMX_VERSION_STRING_OF_FORK ""' ${GMX_VERSION_INFO} ; then @@ -232,6 +201,7 @@ then fi fi + echo -n "Updating ..." @@ -312,11 +282,6 @@ then condcopy "${src}" "${target}/lib/colvars/${tgt}" done - # Update cmake file - src=${source}/lammps/COLVARS.cmake - tgt=$(basename ${src}) - condcopy "${source}/lammps/COLVARS.cmake" "${target}/cmake/Modules/Packages/${tgt}" - for src in \ ${source}/lammps/src/COLVARS/colvarproxy_lammps{.cpp,.h,_version.h} \ ${source}/lammps/src/COLVARS/fix_colvars.{cpp,h} \ @@ -393,10 +358,6 @@ then fi fi - # For torchann - patch -F 12 -p1 -N -d ${target} < namd/config.patch - sed -i '/^COLVARSCXXFLAGS =*/s/$/ $(EXTRACOLVARSFLAGS)/' ${target}/Makefile - # Copy library files to the "colvars" folder for src in ${source}/src/*.h ${source}/src/*.cpp do \ @@ -528,107 +489,9 @@ then echo ' done.' fi -# Update GROMACS tree (legacy versions) -if [ ${code} = "GROMACS" ] -then - - if [ "x${UPDATE_LEPTON}" == "xyes" ] ; then - echo -n "(note: adding/updating Lepton)" - copy_lepton ${target}/src/external/ || exit 1 - fi - - target_folder=${target}/src/external/colvars - patch_opts="-p1 --forward -s" - - echo "" - if [ -d ${target_folder} ] - then - echo "${target} source tree seems to have already been patched." - echo "Updating to the current Colvars sources." - else - mkdir ${target_folder} - fi - - if [ ${GMX_VERSION} == '2020.x' ] || [ ${GMX_VERSION} == '2021.x' ] ; then - # Copy library files and proxy files to the "src/external/colvars" folder - for src in ${source}/src/*.h ${source}/src/*.cpp ${source}/gromacs/src/*.h ${source}/gromacs/gromacs-${GMX_VERSION}/*{cpp,h} - do \ - tgt=$(basename ${src}) - condcopy "${src}" "${target_folder}/${tgt}" - done - else - # Starting from GROMACS 2022, the Colvars library is under `external` and proxy files are in `src/gromacs/applied_forces/colvarproxy` - # Library files - for src in ${source}/src/*.h ${source}/src/*.cpp - do \ - tgt=$(basename ${src}) - condcopy "${src}" "${target_folder}/${tgt}" - done - # Proxy files - target_folder=${target}/src/gromacs/applied_forces/colvars - if [ -d ${target_folder} ] - then - echo "${target} source tree seems to have already been patched." - echo "Updating to the current Colvars sources." - else - mkdir ${target_folder} - fi - for src in ${source}/gromacs/src/*.h ${source}/gromacs/gromacs-${GMX_VERSION}/*{cpp,h,txt} - do \ - tgt=$(basename ${src}) - condcopy "${src}" "${target_folder}/${tgt}" - done - - fi - echo "" - - # Copy CMake files - condcopy "${source}/gromacs/cmake/gmxManageColvars.cmake" \ - "${target}/cmake/gmxManageColvars.cmake" - if [ "x${UPDATE_LEPTON}" == "xyes" ] ; then - echo -n "(note: adding/updating Lepton)" - condcopy "${source}/gromacs/cmake/gmxManageLepton.cmake" \ - "${target}/cmake/gmxManageLepton.cmake" - fi - - # Apply patch for Gromacs files - patch ${patch_opts} -d ${target} < ${source}/gromacs/gromacs-${GMX_VERSION}.patch - ret_val=$? - if [ $ret_val -ne 0 ] - then - echo " ************************************************************************* " - echo " Patch fails. It seems the Gromacs source files have been already patched. " - echo " ************************************************************************* " - else - echo ' done.' - echo "" - echo " *******************************************" - echo " Please create your build with cmake now." - echo " *******************************************" - fi - - if [ ${GMX_VERSION} == '2021.x' ] ; then - if [ -f "${target}/.github/workflows/build_cmake.yml" ] ; then - # Ad-hoc fix for CI build until 2021.6 is released - sed -i -e 's/windows-latest/windows-2019/' "${target}/.github/workflows/build_cmake.yml" - fi - fi - - # Update the proxy version if needed - shared_gmx_proxy_version=$(grep '^#define' "${source}/gromacs/src/colvarproxy_gromacs_version.h" | cut -d' ' -f 3) - - patch_gmx_proxy_version=$(grep '^#define' "${target_folder}/colvarproxy_gromacs_version.h" | cut -d' ' -f 3) - - if [ ${shared_gmx_proxy_version} \> ${patch_gmx_proxy_version} ] ; then - condcopy ${source}/gromacs/src/colvarproxy_gromacs_version.h \ - "${target}/src/gromacs/colvars/colvarproxy_gromacs_version.h" - fi - - exit 0 -fi # Update GROMACS tree (MDModules interface-ready version) -if [ ${code} = "GROMACS-DEV" ] +if [ ${code} = "GROMACS" ] then target_folder=${target}/src/external/colvars @@ -645,11 +508,11 @@ then echo "" # Patch CMake build recipes when applicable - if [ -s ${source}/gromacs/gromacs-mdmodules/gmxManageColvars.cmake.diff ] ; then - patch ${patch_opts} -d ${target} < ${source}/gromacs/gromacs-mdmodules/gmxManageColvars.cmake.diff || true + if [ -s ${source}/gromacs/gmxManageColvars.cmake.diff ] ; then + patch ${patch_opts} -d ${target} < ${source}/gromacs/gmxManageColvars.cmake.diff || true fi - if [ -s ${source}/gromacs/gromacs-mdmodules/CMakeLists.txt.diff ] ; then - patch ${patch_opts} -d ${target} < ${source}/gromacs/gromacs-mdmodules/CMakeLists.txt.diff || true + if [ -s ${source}/gromacs/CMakeLists.txt.diff ] ; then + patch ${patch_opts} -d ${target} < ${source}/gromacs/CMakeLists.txt.diff || true fi if [ -s ${source}/gromacs/CMakeLists.txt.diff ] ; then patch ${patch_opts} -d ${target} < ${source}/gromacs/CMakeLists.txt.diff || true @@ -658,15 +521,15 @@ then if [ "x${UPDATE_LEPTON}" == "xyes" ] ; then echo -n "(note: adding/updating Lepton)" copy_lepton ${target}/src/external/ || exit 1 - if [ -s ${source}/gromacs/gromacs-mdmodules/CMakeLists.txt.Lepton.diff ] ; then - patch ${patch_opts} -d ${target} < ${source}/gromacs/gromacs-mdmodules/CMakeLists.txt.Lepton.diff || true + if [ -s ${source}/gromacs/CMakeLists.txt.Lepton.diff ] ; then + patch ${patch_opts} -d ${target} < ${source}/gromacs/CMakeLists.txt.Lepton.diff || true fi condcopy ${source}/gromacs/cmake/gmxManageLepton.cmake "${target}/cmake/gmxManageLepton.cmake" fi echo - # Copy MDModules files to the "src/gromacs/applied_forces/colvars" folder + # Copy MDModules files to the "src/gromacs/src/applied_forces/colvars" folder target_folder=${target}/src/gromacs/applied_forces/colvars if [ -d ${target_folder} ] then @@ -677,15 +540,15 @@ then mkdir -p ${target_folder}/tests/refdata fi condcopy gromacs/src/colvarproxy_gromacs_version.h "${target_folder}/colvarproxy_gromacs_version.h" - for src in ${source}/gromacs/gromacs-mdmodules/applied_forces/colvars/*.* ; do + for src in ${source}/gromacs/src/applied_forces/colvars/*.* ; do tgt=$(basename ${src}) condcopy "${src}" "${target_folder}/${tgt}" done - for src in ${source}/gromacs/gromacs-mdmodules/applied_forces/colvars/tests/*.* ; do + for src in ${source}/gromacs/src/applied_forces/colvars/tests/*.* ; do tgt=$(basename ${src}) condcopy "${src}" "${target_folder}/tests/${tgt}" done - for src in ${source}/gromacs/gromacs-mdmodules/applied_forces/colvars/tests/refdata/*.* ; do + for src in ${source}/gromacs/src/applied_forces/colvars/tests/refdata/*.* ; do tgt=$(basename ${src}) condcopy "${src}" "${target_folder}/tests/refdata/${tgt}" done diff --git a/vmd/src/colvarproxy_vmd_version.h b/vmd/src/colvarproxy_vmd_version.h index 21077698c..98fd8f2b4 100644 --- a/vmd/src/colvarproxy_vmd_version.h +++ b/vmd/src/colvarproxy_vmd_version.h @@ -1,3 +1,3 @@ #ifndef COLVARPROXY_VERSION -#define COLVARPROXY_VERSION "2023-12-05" +#define COLVARPROXY_VERSION "2024-10-05" #endif diff --git a/vmd/src/colvars_files.pl b/vmd/src/colvars_files.pl index 10a6dab12..4482724da 100644 --- a/vmd/src/colvars_files.pl +++ b/vmd/src/colvars_files.pl @@ -43,10 +43,10 @@ 'colvarproxy.C', 'colvarproxy_io.C', 'colvarproxy_replicas.C', - 'colvarproxy_volmaps.C', 'colvarproxy_system.C', 'colvarproxy_tcl.C', 'colvarproxy_vmd.C', + 'colvarproxy_volmaps.C', 'colvarscript.C', 'colvarscript_commands.C', 'colvarscript_commands_bias.C', @@ -81,6 +81,7 @@ 'colvarparse.h', 'colvarproxy.h', 'colvarproxy_io.h', + 'colvarproxy_replicas.h', 'colvarproxy_system.h', 'colvarproxy_tcl.h', 'colvarproxy_vmd.h',