Unify FEP period setting
authorPascal Merz <pascal.merz@me.com>
Tue, 8 Jun 2021 15:31:59 +0000 (15:31 +0000)
committerPascal Merz <pascal.merz@me.com>
Tue, 8 Jun 2021 15:31:59 +0000 (15:31 +0000)
src/gromacs/mdrun/md.cpp
src/gromacs/mdrunutility/CMakeLists.txt
src/gromacs/mdrunutility/freeenergy.cpp [new file with mode: 0644]
src/gromacs/mdrunutility/freeenergy.h [new file with mode: 0644]
src/gromacs/modularsimulator/simulatoralgorithm.cpp

index 80a820784d720b296678b3e88201f2c6e5daad6f..c26f8f96847d15469aad0d7655d13e39ea5ddd0f 100644 (file)
 #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,
index 7ca19227bc37f2f5fad8741ccdec19bb47acf115..5f9d878df990f9f944263ec56820408689563c2d 100644 (file)
@@ -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 (file)
index 0000000..61466cf
--- /dev/null
@@ -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 <pascal.merz@me.com>
+ * \ingroup module_mdrunutility
+ * \inlibraryapi
+ */
+
+#include "gmxpre.h"
+
+#include "freeenergy.h"
+
+#include <numeric>
+
+#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 (file)
index 0000000..d722012
--- /dev/null
@@ -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 <pascal.merz@me.com>
+ * \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
index eac4ea170f16deca4ba96c97c3630ce5ad0a0fd6..54667c5d86896d93fdee44e1352c59b89ce5bd23 100644 (file)
@@ -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,