From e2c8bcc0691c2e081002eea7e7c0f9044782ccbb Mon Sep 17 00:00:00 2001 From: Pascal Merz Date: Tue, 8 Jun 2021 15:31:59 +0000 Subject: [PATCH] Unify FEP period setting --- src/gromacs/mdrun/md.cpp | 21 +---- src/gromacs/mdrunutility/CMakeLists.txt | 3 +- src/gromacs/mdrunutility/freeenergy.cpp | 82 +++++++++++++++++++ src/gromacs/mdrunutility/freeenergy.h | 66 +++++++++++++++ .../modularsimulator/simulatoralgorithm.cpp | 6 +- 5 files changed, 157 insertions(+), 21 deletions(-) create mode 100644 src/gromacs/mdrunutility/freeenergy.cpp create mode 100644 src/gromacs/mdrunutility/freeenergy.h diff --git a/src/gromacs/mdrun/md.cpp b/src/gromacs/mdrun/md.cpp index 80a820784d..c26f8f9684 100644 --- a/src/gromacs/mdrun/md.cpp +++ b/src/gromacs/mdrun/md.cpp @@ -106,6 +106,7 @@ #include "gromacs/mdlib/update_vv.h" #include "gromacs/mdlib/vcm.h" #include "gromacs/mdlib/vsite.h" +#include "gromacs/mdrunutility/freeenergy.h" #include "gromacs/mdrunutility/handlerestart.h" #include "gromacs/mdrunutility/multisim.h" #include "gromacs/mdrunutility/printtime.h" @@ -188,7 +189,6 @@ void gmx::LegacySimulator::do_md() matrix lastbox; int lamnew = 0; /* for FEP */ - int nstfep = 0; double cycles; real saved_conserved_quantity = 0; real last_ekin = 0; @@ -595,24 +595,7 @@ void gmx::LegacySimulator::do_md() } } - if (ir->efep != FreeEnergyPerturbationType::No) - { - /* Set free energy calculation frequency as the greatest common - * denominator of nstdhdl and repl_ex_nst. */ - nstfep = ir->fepvals->nstdhdl; - if (ir->bExpanded) - { - nstfep = std::gcd(ir->expandedvals->nstexpanded, nstfep); - } - if (useReplicaExchange) - { - nstfep = std::gcd(replExParams.exchangeInterval, nstfep); - } - if (ir->bDoAwh) - { - nstfep = std::gcd(ir->awhParams->nstSampleCoord(), nstfep); - } - } + const int nstfep = computeFepPeriod(*ir, replExParams); /* Be REALLY careful about what flags you set here. You CANNOT assume * this is the first step, since we might be restarting from a checkpoint, diff --git a/src/gromacs/mdrunutility/CMakeLists.txt b/src/gromacs/mdrunutility/CMakeLists.txt index 7ca19227bc..5f9d878df9 100644 --- a/src/gromacs/mdrunutility/CMakeLists.txt +++ b/src/gromacs/mdrunutility/CMakeLists.txt @@ -1,7 +1,7 @@ # # This file is part of the GROMACS molecular simulation package. # -# Copyright (c) 2015,2016,2019,2020, by the GROMACS development team, led by +# Copyright (c) 2015,2016,2019,2020,2021, by the GROMACS development team, led by # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, # and including many others, as listed in the AUTHORS file in the # top-level source directory and at http://www.gromacs.org. @@ -34,6 +34,7 @@ add_library(mdrunutility INTERFACE) gmx_add_libgromacs_sources( + freeenergy.cpp handlerestart.cpp logging.cpp multisim.cpp diff --git a/src/gromacs/mdrunutility/freeenergy.cpp b/src/gromacs/mdrunutility/freeenergy.cpp new file mode 100644 index 0000000000..61466cff4e --- /dev/null +++ b/src/gromacs/mdrunutility/freeenergy.cpp @@ -0,0 +1,82 @@ +/* + * This file is part of the GROMACS molecular simulation package. + * + * Copyright (c) 2021, by the GROMACS development team, led by + * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, + * and including many others, as listed in the AUTHORS file in the + * top-level source directory and at http://www.gromacs.org. + * + * 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 + * http://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 http://www.gromacs.org. + * + * To help us fund GROMACS development, we humbly ask that you cite + * the research papers on the package. Check out http://www.gromacs.org. + */ +/*! \libinternal \file + * \brief Defines helper functions for mdrun pertaining to free energy calculations. + * + * \author Pascal Merz + * \ingroup module_mdrunutility + * \inlibraryapi + */ + +#include "gmxpre.h" + +#include "freeenergy.h" + +#include + +#include "gromacs/mdrun/replicaexchange.h" +#include "gromacs/mdtypes/awh_params.h" +#include "gromacs/mdtypes/inputrec.h" + +namespace gmx +{ + +int computeFepPeriod(const t_inputrec& inputrec, const ReplicaExchangeParameters& replExParams) +{ + if (inputrec.efep == FreeEnergyPerturbationType::No) + { + return 0; + } + + // Set free energy calculation period as the greatest common + // denominator of nstdhdl, nstexpanded, replica exchange interval, + // and AWH nstSampleCoord. + int nstfep = inputrec.fepvals->nstdhdl; + if (inputrec.bExpanded) + { + nstfep = std::gcd(inputrec.expandedvals->nstexpanded, nstfep); + } + if (replExParams.exchangeInterval > 0) + { + nstfep = std::gcd(replExParams.exchangeInterval, nstfep); + } + if (inputrec.bDoAwh) + { + nstfep = std::gcd(inputrec.awhParams->nstSampleCoord(), nstfep); + } + return nstfep; +} + +} // namespace gmx diff --git a/src/gromacs/mdrunutility/freeenergy.h b/src/gromacs/mdrunutility/freeenergy.h new file mode 100644 index 0000000000..d7220125c2 --- /dev/null +++ b/src/gromacs/mdrunutility/freeenergy.h @@ -0,0 +1,66 @@ +/* + * This file is part of the GROMACS molecular simulation package. + * + * Copyright (c) 2021, by the GROMACS development team, led by + * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, + * and including many others, as listed in the AUTHORS file in the + * top-level source directory and at http://www.gromacs.org. + * + * 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 + * http://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 http://www.gromacs.org. + * + * To help us fund GROMACS development, we humbly ask that you cite + * the research papers on the package. Check out http://www.gromacs.org. + */ +/*! \libinternal \file + * \brief Declares helper functions for mdrun pertaining to free energy calculations. + * + * \author Pascal Merz + * \ingroup module_mdrunutility + * \inlibraryapi + */ + +#ifndef GMX_MDRUNUTILITY_FREEENERGY_H +#define GMX_MDRUNUTILITY_FREEENERGY_H + +struct ReplicaExchangeParameters; +struct t_inputrec; + +namespace gmx +{ + +/*! \brief Compute the period at which FEP calculation is performed + * + * This harmonizes the free energy calculation period specified by + * `nstdhdl` with the periods specified by expanded ensemble, + * replica exchange, and AWH. + * + * \param inputrec The input record + * \param replExParams The replica exchange parameters + * \return The period required by the involved algorithms + */ +int computeFepPeriod(const t_inputrec& inputrec, const ReplicaExchangeParameters& replExParams); + +} // namespace gmx + +#endif // GMX_MDRUNUTILITY_FREEENERGY_H diff --git a/src/gromacs/modularsimulator/simulatoralgorithm.cpp b/src/gromacs/modularsimulator/simulatoralgorithm.cpp index eac4ea170f..54667c5d86 100644 --- a/src/gromacs/modularsimulator/simulatoralgorithm.cpp +++ b/src/gromacs/modularsimulator/simulatoralgorithm.cpp @@ -59,6 +59,7 @@ #include "gromacs/mdlib/stat.h" #include "gromacs/mdrun/replicaexchange.h" #include "gromacs/mdrun/shellfc.h" +#include "gromacs/mdrunutility/freeenergy.h" #include "gromacs/mdrunutility/handlerestart.h" #include "gromacs/mdrunutility/printtime.h" #include "gromacs/mdtypes/commrec.h" @@ -635,7 +636,10 @@ ModularSimulatorAlgorithm ModularSimulatorAlgorithmBuilder::build() } } addSignaller(energySignallerBuilder_.build( - inputrec->nstcalcenergy, inputrec->fepvals->nstdhdl, inputrec->nstpcouple, virialMode)); + inputrec->nstcalcenergy, + computeFepPeriod(*inputrec, legacySimulatorData_->replExParams), + inputrec->nstpcouple, + virialMode)); addSignaller(trajectorySignallerBuilder_.build(inputrec->nstxout, inputrec->nstvout, inputrec->nstfout, -- 2.22.0