Add checkpointing for MdModules
authorChristian Blau <cblau@gwdg.de>
Mon, 26 Aug 2019 15:17:59 +0000 (17:17 +0200)
committerMark Abraham <mark.j.abraham@gmail.com>
Sun, 1 Sep 2019 13:44:30 +0000 (15:44 +0200)
Adds the possiblity to write and read from checkpoint files for MdModules.

refs #2282

Change-Id: Id3ab57d1c9a40b6e1fb0193430e5b66ffa87d787

19 files changed:
src/gromacs/applied_forces/densityfitting.cpp
src/gromacs/applied_forces/tests/densityfitting.cpp
src/gromacs/fileio/checkpoint.cpp
src/gromacs/fileio/checkpoint.h
src/gromacs/gmxpreprocess/grompp.cpp
src/gromacs/gmxpreprocess/readir.cpp
src/gromacs/mdlib/mdoutf.cpp
src/gromacs/mdlib/mdoutf.h
src/gromacs/mdrun/isimulator.h
src/gromacs/mdrun/md.cpp
src/gromacs/mdrun/mdmodules.cpp
src/gromacs/mdrun/mimic.cpp
src/gromacs/mdrun/minimize.cpp
src/gromacs/mdrun/rerun.cpp
src/gromacs/mdrun/runner.cpp
src/gromacs/modularsimulator/trajectoryelement.cpp
src/gromacs/modularsimulator/trajectoryelement.h
src/gromacs/utility/mdmodulenotification.h [moved from src/gromacs/mdrunutility/mdmodulenotification.h with 95% similarity]
src/programs/mdrun/tests/mdmodulenotification.cpp

index f40fef3111121bcf1457178b80bf614599127117..357e8ddfa610fb739d20a455b54d4451ab4ebabb 100644 (file)
 #include <memory>
 
 #include "gromacs/domdec/localatomsetmanager.h"
-#include "gromacs/mdrunutility/mdmodulenotification.h"
 #include "gromacs/mdtypes/imdmodule.h"
 #include "gromacs/utility/classhelpers.h"
 #include "gromacs/utility/exceptions.h"
 #include "gromacs/utility/keyvaluetreebuilder.h"
+#include "gromacs/utility/mdmodulenotification.h"
 
 #include "densityfittingforceprovider.h"
 #include "densityfittingoptions.h"
index e19a00b04261008069fb2bd2e3c323f02199baf6..0bbe272400ce8dffac688bee6a66ce885ba9e433 100644 (file)
@@ -48,7 +48,6 @@
 #include "gromacs/gmxlib/network.h"
 #include "gromacs/math/paddedvector.h"
 #include "gromacs/math/vec.h"
-#include "gromacs/mdrunutility/mdmodulenotification.h"
 #include "gromacs/mdtypes/enerdata.h"
 #include "gromacs/mdtypes/forceoutput.h"
 #include "gromacs/mdtypes/iforceprovider.h"
@@ -59,6 +58,7 @@
 #include "gromacs/options/treesupport.h"
 #include "gromacs/utility/keyvaluetreebuilder.h"
 #include "gromacs/utility/keyvaluetreetransform.h"
+#include "gromacs/utility/mdmodulenotification.h"
 #include "gromacs/utility/real.h"
 #include "gromacs/utility/smalloc.h"
 #include "gromacs/utility/stringcompare.h"
index 83d661c219a80164adbbe0a71c9a8b46979dbbb1..6250e76ba0f4fb518e21f2f1b5e7a1afc920de5a 100644 (file)
 #include "gromacs/utility/futil.h"
 #include "gromacs/utility/gmxassert.h"
 #include "gromacs/utility/int64_to_int.h"
+#include "gromacs/utility/keyvaluetree.h"
+#include "gromacs/utility/keyvaluetreebuilder.h"
+#include "gromacs/utility/keyvaluetreeserializer.h"
+#include "gromacs/utility/mdmodulenotification.h"
 #include "gromacs/utility/programcontext.h"
 #include "gromacs/utility/smalloc.h"
 #include "gromacs/utility/sysinfo.h"
@@ -105,6 +109,7 @@ enum cptv {
     cptv_RemoveBuildMachineInformation,                      /**< remove functionality that makes mdrun builds non-reproducible */
     cptv_ComPrevStepAsPullGroupReference,                    /**< Allow using COM of previous step as pull group PBC reference */
     cptv_PullAverage,                                        /**< Added possibility to output average pull force and position */
+    cptv_MdModules,                                          /**< Added checkpointing for MdModules */
     cptv_Count                                               /**< the total number of cptv versions */
 };
 
@@ -262,6 +267,39 @@ enum class StatePart
     pullHistory         //!< Pull history statistics (sums since last written output)
 };
 
+namespace gmx
+{
+
+struct MdModulesCheckpointReadingDataOnMaster
+{
+    //! The data of the MdModules that is stored in the checkpoint file
+    const KeyValueTreeObject &checkpointedData;
+    //! The version of the read ceckpoint file
+    int                       checkpointFileVersion_;
+};
+
+/*! \libinternal
+ * \brief Provides the MdModules with the communication record to broadcast.
+ */
+struct MdModulesCheckpointReadingBroadcast
+{
+    //! The communication record
+    const t_commrec &cr;
+    //! The version of the read file version
+    int              checkpointFileVersion_;
+};
+
+/*! \libinternal \brief Writing the MdModules data to a checkpoint file.
+ */
+struct MdModulesWriteCheckpointData
+{
+    //! Builder for the Key-Value-Tree to store the MdModule checkpoint data
+    KeyValueTreeObjectBuilder builder;
+    //! The version of the read file version
+    int                       checkpointFileVersion_;
+};
+} // namespace gmx
+
 //! \brief Return the name of a checkpoint entry based on part and part entry
 static const char *entryName(StatePart part, int ecpt)
 {
@@ -1865,6 +1903,18 @@ static int do_cpt_awh(XDR *xd, gmx_bool bRead,
     return ret;
 }
 
+static void do_cpt_mdmodules(int fileVersion, t_fileio *checkpointFileHandle, const gmx::MdModulesNotifier &mdModulesNotifier)
+{
+    if (fileVersion >= cptv_MdModules)
+    {
+        gmx::FileIOXdrSerializer                    serializer(checkpointFileHandle);
+        gmx::KeyValueTreeObject                     mdModuleCheckpointParameterTree = gmx::deserializeKeyValueTree(&serializer);
+        gmx::MdModulesCheckpointReadingDataOnMaster mdModuleCheckpointReadingDataOnMaster
+            = { mdModuleCheckpointParameterTree, fileVersion };
+        mdModulesNotifier.notifier_.notify(mdModuleCheckpointReadingDataOnMaster);
+    }
+}
+
 static int do_cpt_files(XDR *xd, gmx_bool bRead,
                         std::vector<gmx_file_position_t> *outputfiles,
                         FILE *list, int file_version)
@@ -1956,7 +2006,8 @@ void write_checkpoint(const char *fn, gmx_bool bNumberAndKeep,
                       int eIntegrator, int simulation_part,
                       gmx_bool bExpanded, int elamstats,
                       int64_t step, double t,
-                      t_state *state, ObservablesHistory *observablesHistory)
+                      t_state *state, ObservablesHistory *observablesHistory,
+                      const gmx::MdModulesNotifier &mdModulesNotifier)
 {
     t_fileio            *fp;
     char                *fntemp; /* the temporary checkpoint file name */
@@ -2127,6 +2178,16 @@ void write_checkpoint(const char *fn, gmx_bool bNumberAndKeep,
         gmx_file("Cannot read/write checkpoint; corrupt file, or maybe you are out of disk space?");
     }
 
+    // Checkpointing MdModules
+    {
+        gmx::KeyValueTreeBuilder          builder;
+        gmx::MdModulesWriteCheckpointData mdModulesWriteCheckpoint = {builder.rootObject(), headerContents.file_version};
+        mdModulesNotifier.notifier_.notify(mdModulesWriteCheckpoint);
+        auto                              tree = builder.build();
+        gmx::FileIOXdrSerializer          serializer(fp);
+        gmx::serializeKeyValueTree(tree, &serializer);
+    }
+
     do_cpt_footer(gmx_fio_getxdr(fp), headerContents.file_version);
 
     /* we really, REALLY, want to make sure to physically write the checkpoint,
@@ -2347,7 +2408,8 @@ static void read_checkpoint(const char *fn, t_fileio *logfio,
                             CheckpointHeaderContents *headerContents,
                             t_state *state,
                             ObservablesHistory *observablesHistory,
-                            gmx_bool reproducibilityRequested)
+                            gmx_bool reproducibilityRequested,
+                            const gmx::MdModulesNotifier &mdModulesNotifier)
 {
     t_fileio            *fp;
     char                 buf[STEPSTRSIZE];
@@ -2505,7 +2567,7 @@ static void read_checkpoint(const char *fn, t_fileio *logfio,
     {
         cp_error();
     }
-
+    do_cpt_mdmodules(headerContents->file_version, fp, mdModulesNotifier);
     ret = do_cpt_footer(gmx_fio_getxdr(fp), headerContents->file_version);
     if (ret)
     {
@@ -2522,7 +2584,8 @@ void load_checkpoint(const char *fn, t_fileio *logfio,
                      const t_commrec *cr, const ivec dd_nc,
                      t_inputrec *ir, t_state *state,
                      ObservablesHistory *observablesHistory,
-                     gmx_bool reproducibilityRequested)
+                     gmx_bool reproducibilityRequested,
+                     const gmx::MdModulesNotifier &mdModulesNotifier)
 {
     CheckpointHeaderContents headerContents;
     if (SIMMASTER(cr))
@@ -2533,11 +2596,13 @@ void load_checkpoint(const char *fn, t_fileio *logfio,
                         ir->eI, &(ir->fepvals->init_fep_state),
                         &headerContents,
                         state, observablesHistory,
-                        reproducibilityRequested);
+                        reproducibilityRequested, mdModulesNotifier);
     }
     if (PAR(cr))
     {
         gmx_bcast(sizeof(headerContents.step), &headerContents.step, cr);
+        gmx::MdModulesCheckpointReadingBroadcast broadcastCheckPointData = {*cr, headerContents.file_version};
+        mdModulesNotifier.notifier_.notify(broadcastCheckPointData);
     }
     ir->bContinuation    = TRUE;
     // TODO Should the following condition be <=? Currently if you
@@ -2661,7 +2726,8 @@ read_checkpoint_data(t_fileio                         *fp,
     {
         cp_error();
     }
-
+    gmx::MdModulesNotifier mdModuleNotifier;
+    do_cpt_mdmodules(headerContents.file_version, fp, mdModuleNotifier);
     ret = do_cpt_footer(gmx_fio_getxdr(fp), headerContents.file_version);
     if (ret)
     {
index 97e1fa47157e4099eeaa3a5d8083e2785a86cef5..a99aff3e33e304ad84c4123ed559cd2403069f15 100644 (file)
@@ -53,6 +53,10 @@ struct t_fileio;
 struct t_inputrec;
 class t_state;
 struct t_trxframe;
+namespace gmx
+{
+struct MdModulesNotifier;
+}
 
 /* the name of the environment variable to disable fsync failure checks with */
 #define GMX_IGNORE_FSYNC_FAILURE_ENV "GMX_IGNORE_FSYNC_FAILURE"
@@ -114,7 +118,8 @@ void write_checkpoint(const char *fn, gmx_bool bNumberAndKeep,
                       int eIntegrator, int simulation_part,
                       gmx_bool bExpanded, int elamstats,
                       int64_t step, double t,
-                      t_state *state, ObservablesHistory *observablesHistory);
+                      t_state *state, ObservablesHistory *observablesHistory,
+                      const gmx::MdModulesNotifier &notifier);
 
 /* Loads a checkpoint from fn for run continuation.
  * Generates a fatal error on system size mismatch.
@@ -127,7 +132,8 @@ void load_checkpoint(const char *fn, t_fileio *logfio,
                      const t_commrec *cr, const ivec dd_nc,
                      t_inputrec *ir, t_state *state,
                      ObservablesHistory *observablesHistory,
-                     gmx_bool reproducibilityRequested);
+                     gmx_bool reproducibilityRequested,
+                     const gmx::MdModulesNotifier &mdModulesNotifier);
 
 /* Read everything that can be stored in t_trxframe from a checkpoint file */
 void read_checkpoint_trxframe(struct t_fileio *fp, t_trxframe *fr);
index 6cedcc344100cd74d6f95480a357cea8788cc603..bd32aca846b26246bf76f45ad1074cb109443843 100644 (file)
@@ -82,7 +82,6 @@
 #include "gromacs/mdlib/qmmm.h"
 #include "gromacs/mdlib/vsite.h"
 #include "gromacs/mdrun/mdmodules.h"
-#include "gromacs/mdrunutility/mdmodulenotification.h"
 #include "gromacs/mdtypes/inputrec.h"
 #include "gromacs/mdtypes/md_enums.h"
 #include "gromacs/mdtypes/nblist.h"
 #include "gromacs/utility/futil.h"
 #include "gromacs/utility/gmxassert.h"
 #include "gromacs/utility/keyvaluetreebuilder.h"
+#include "gromacs/utility/mdmodulenotification.h"
 #include "gromacs/utility/smalloc.h"
 #include "gromacs/utility/snprintf.h"
 
index 954dcffaa924527a5030201b89ee218f3695d83d..8f92c0cacd775fc82a98f4f30ef4b0c906cc24cd 100644 (file)
@@ -57,7 +57,6 @@
 #include "gromacs/math/vec.h"
 #include "gromacs/mdlib/calc_verletbuf.h"
 #include "gromacs/mdrun/mdmodules.h"
-#include "gromacs/mdrunutility/mdmodulenotification.h"
 #include "gromacs/mdtypes/inputrec.h"
 #include "gromacs/mdtypes/md_enums.h"
 #include "gromacs/mdtypes/pull_params.h"
@@ -81,6 +80,7 @@
 #include "gromacs/utility/keyvaluetreebuilder.h"
 #include "gromacs/utility/keyvaluetreemdpwriter.h"
 #include "gromacs/utility/keyvaluetreetransform.h"
+#include "gromacs/utility/mdmodulenotification.h"
 #include "gromacs/utility/smalloc.h"
 #include "gromacs/utility/strconvert.h"
 #include "gromacs/utility/stringcompare.h"
index 77e335e7ebf897485ad90028d3d55b656f1be146..206cf025645dca5b611baca0014c21cbd7b0f213 100644 (file)
@@ -80,6 +80,7 @@ struct gmx_mdoutf {
     gmx_wallcycle_t                wcycle;
     rvec                          *f_global;
     gmx::IMDOutputProvider        *outputProvider;
+    const gmx::MdModulesNotifier  *mdModulesNotifier;
 };
 
 
@@ -87,6 +88,7 @@ gmx_mdoutf_t init_mdoutf(FILE *fplog, int nfile, const t_filenm fnm[],
                          const gmx::MdrunOptions &mdrunOptions,
                          const t_commrec *cr,
                          gmx::IMDOutputProvider *outputProvider,
+                         const gmx::MdModulesNotifier &mdModulesNotifier,
                          const t_inputrec *ir, gmx_mtop_t *top_global,
                          const gmx_output_env_t *oenv, gmx_wallcycle_t wcycle,
                          const gmx::StartingBehavior startingBehavior)
@@ -200,6 +202,7 @@ gmx_mdoutf_t init_mdoutf(FILE *fplog, int nfile, const t_filenm fnm[],
         }
 
         outputProvider->initOutput(fplog, nfile, fnm, restartWithAppending, oenv);
+        of->mdModulesNotifier = &mdModulesNotifier;
 
         /* Set up atom counts so they can be passed to actual
            trajectory-writing routines later. Also, XTC writing needs
@@ -302,7 +305,7 @@ void mdoutf_write_to_trajectory_files(FILE *fplog, const t_commrec *cr,
                              DOMAINDECOMP(cr) ? cr->dd->nnodes : cr->nnodes,
                              of->eIntegrator, of->simulation_part,
                              of->bExpanded, of->elamstats, step, t,
-                             state_global, observablesHistory);
+                             state_global, observablesHistory, *(of->mdModulesNotifier));
         }
 
         if (mdof_flags & (MDOF_X | MDOF_V | MDOF_F))
index acf44e50dd5a4ecec786739b34fb27e948f74c48..161bb6b30125813caa2eaa9dabfc22f1748771bc 100644 (file)
@@ -55,6 +55,7 @@ namespace gmx
 {
 enum class StartingBehavior;
 class IMDOutputProvider;
+struct MdModulesNotifier;
 struct MdrunOptions;
 }
 
@@ -65,17 +66,18 @@ typedef struct gmx_mdoutf *gmx_mdoutf_t;
  * Returns a pointer to a data structure with all output file pointers
  * and names required by mdrun.
  */
-gmx_mdoutf_t init_mdoutf(FILE                    *fplog,
-                         int                      nfile,
-                         const t_filenm           fnm[],
-                         const gmx::MdrunOptions &mdrunOptions,
-                         const t_commrec         *cr,
-                         gmx::IMDOutputProvider  *outputProvider,
-                         const t_inputrec        *ir,
-                         gmx_mtop_t              *mtop,
-                         const gmx_output_env_t  *oenv,
-                         gmx_wallcycle_t          wcycle,
-                         gmx::StartingBehavior    startingBehavior);
+gmx_mdoutf_t init_mdoutf(FILE                         *fplog,
+                         int                           nfile,
+                         const t_filenm                fnm[],
+                         const gmx::MdrunOptions      &mdrunOptions,
+                         const t_commrec              *cr,
+                         gmx::IMDOutputProvider       *outputProvider,
+                         const gmx::MdModulesNotifier &mdModulesNotifier,
+                         const t_inputrec             *ir,
+                         gmx_mtop_t                   *mtop,
+                         const gmx_output_env_t       *oenv,
+                         gmx_wallcycle_t               wcycle,
+                         gmx::StartingBehavior         startingBehavior);
 
 /*! \brief Getter for file pointer */
 ener_file_t mdoutf_get_fp_ene(gmx_mdoutf_t of);
index 9fbb343514b4571905283f7803cf4955148c39e4..a2b24a69df9060d96a105ffd7593c4304d8ea24a 100644 (file)
@@ -73,6 +73,7 @@ class BoxDeformation;
 class Constraints;
 class PpForceWorkload;
 class IMDOutputProvider;
+struct MdModulesNotifier;
 class ImdSession;
 class MDLogger;
 class MDAtoms;
@@ -113,6 +114,7 @@ class ISimulator
             gmx_enfrot                         *enforcedRotation,
             BoxDeformation                     *deform,
             IMDOutputProvider                  *outputProvider,
+            const MdModulesNotifier            &mdModulesNotifier,
             t_inputrec                         *inputrec,
             ImdSession                         *imdSession,
             pull_t                             *pull_work,
@@ -147,6 +149,7 @@ class ISimulator
             enforcedRotation(enforcedRotation),
             deform(deform),
             outputProvider(outputProvider),
+            mdModulesNotifier(mdModulesNotifier),
             inputrec(inputrec),
             imdSession(imdSession),
             pull_work(pull_work),
@@ -198,6 +201,8 @@ class ISimulator
         BoxDeformation                     *deform;
         //! Handles writing output files.
         IMDOutputProvider                  *outputProvider;
+        //! Handles notifications to MdModules for checkpoint writing
+        const MdModulesNotifier            &mdModulesNotifier;
         //! Contains user input mdp options.
         t_inputrec                         *inputrec;
         //! The Interactive Molecular Dynamics session.
index 7bf96f6292db6a42f6055bdb655e5c1cb93466a2..e55203646d13b4e7d767d992a43f1275e83f5a19 100644 (file)
@@ -255,7 +255,7 @@ void gmx::LegacySimulator::do_md()
     {
         pleaseCiteCouplingAlgorithms(fplog, *ir);
     }
-    gmx_mdoutf       *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, ir, top_global, oenv, wcycle,
+    gmx_mdoutf       *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, mdModulesNotifier, ir, top_global, oenv, wcycle,
                                          StartingBehavior::NewSimulation);
     gmx::EnergyOutput energyOutput(mdoutf_get_fp_ene(outf), top_global, ir, pull_work, mdoutf_get_fp_dhdl(outf), false);
 
index 1e1104b2e649e7872caf8fb1e387dfd84bea92e9..727fb5c26feeb57bff6092f2dc142f6ddc5d062f 100644 (file)
@@ -41,7 +41,6 @@
 #include "gromacs/applied_forces/densityfitting.h"
 #include "gromacs/applied_forces/electricfield.h"
 #include "gromacs/imd/imd.h"
-#include "gromacs/mdrunutility/mdmodulenotification.h"
 #include "gromacs/mdtypes/iforceprovider.h"
 #include "gromacs/mdtypes/imdmodule.h"
 #include "gromacs/mdtypes/imdoutputprovider.h"
@@ -54,6 +53,7 @@
 #include "gromacs/utility/keyvaluetree.h"
 #include "gromacs/utility/keyvaluetreebuilder.h"
 #include "gromacs/utility/keyvaluetreetransform.h"
+#include "gromacs/utility/mdmodulenotification.h"
 #include "gromacs/utility/smalloc.h"
 
 namespace gmx
index 703e1e792464fbf9e3dc1e130c398496318094bc..bc106870ba2bb524d42f2b30f3476a647778e481 100644 (file)
@@ -226,7 +226,7 @@ void gmx::LegacySimulator::do_mimic()
 
     initialize_lambdas(fplog, *ir, MASTER(cr), &state_global->fep_state, state_global->lambda, lam0);
 
-    gmx_mdoutf        *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, ir, top_global, oenv, wcycle,
+    gmx_mdoutf        *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, mdModulesNotifier, ir, top_global, oenv, wcycle,
                                           StartingBehavior::NewSimulation);
     gmx::EnergyOutput  energyOutput(mdoutf_get_fp_ene(outf), top_global, ir, pull_work, mdoutf_get_fp_dhdl(outf), true);
 
index 46afcb94efe48cce6a35f8b8dba1157d0bcb74aa..e6d9148121f5df6cf41f328c341939be57e473a4 100644 (file)
@@ -1113,7 +1113,7 @@ LegacySimulator::do_cg()
             state_global, top_global, s_min, &top,
             nrnb, fr, &graph, mdAtoms, &gstat,
             vsite, constr, nullptr);
-    gmx_mdoutf       *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, inputrec, top_global, nullptr, wcycle,
+    gmx_mdoutf       *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, mdModulesNotifier, inputrec, top_global, nullptr, wcycle,
                                          StartingBehavior::NewSimulation);
     gmx::EnergyOutput energyOutput(mdoutf_get_fp_ene(outf), top_global, inputrec, pull_work, nullptr, false);
 
@@ -1752,7 +1752,7 @@ LegacySimulator::do_lbfgs()
             state_global, top_global, &ems, &top,
             nrnb, fr, &graph, mdAtoms, &gstat,
             vsite, constr, nullptr);
-    gmx_mdoutf       *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, inputrec, top_global, nullptr, wcycle,
+    gmx_mdoutf       *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, mdModulesNotifier, inputrec, top_global, nullptr, wcycle,
                                          StartingBehavior::NewSimulation);
     gmx::EnergyOutput energyOutput(mdoutf_get_fp_ene(outf), top_global, inputrec, pull_work, nullptr, false);
 
@@ -2447,7 +2447,7 @@ LegacySimulator::do_steep()
             state_global, top_global, s_try, &top,
             nrnb, fr, &graph, mdAtoms, &gstat,
             vsite, constr, nullptr);
-    gmx_mdoutf       *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, inputrec, top_global, nullptr, wcycle,
+    gmx_mdoutf       *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, mdModulesNotifier, inputrec, top_global, nullptr, wcycle,
                                          StartingBehavior::NewSimulation);
     gmx::EnergyOutput energyOutput(mdoutf_get_fp_ene(outf), top_global, inputrec, pull_work, nullptr, false);
 
@@ -2705,7 +2705,7 @@ LegacySimulator::do_nm()
             state_global, top_global, &state_work, &top,
             nrnb, fr, &graph, mdAtoms, &gstat,
             vsite, constr, &shellfc);
-    gmx_mdoutf            *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, inputrec, top_global, nullptr, wcycle,
+    gmx_mdoutf            *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, mdModulesNotifier, inputrec, top_global, nullptr, wcycle,
                                               StartingBehavior::NewSimulation);
 
     std::vector<int>       atom_index = get_atom_index(top_global);
index b55e456eba5dd31217940b892885a48d8e96087e..a4b40f4585c565af690330f568c27a80a18c3768 100644 (file)
@@ -298,7 +298,7 @@ void gmx::LegacySimulator::do_rerun()
     }
 
     initialize_lambdas(fplog, *ir, MASTER(cr), &state_global->fep_state, state_global->lambda, lam0);
-    gmx_mdoutf       *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, ir, top_global, oenv, wcycle,
+    gmx_mdoutf       *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, mdModulesNotifier, ir, top_global, oenv, wcycle,
                                          StartingBehavior::NewSimulation);
     gmx::EnergyOutput energyOutput(mdoutf_get_fp_ene(outf), top_global, ir, pull_work, mdoutf_get_fp_dhdl(outf), true);
 
index 7155d712281a177d01c7f411a12107b123f4ec33..a35c67c4f7ba96948578ee3184a50babda676197 100644 (file)
 #include "gromacs/mdrun/simulationcontext.h"
 #include "gromacs/mdrunutility/handlerestart.h"
 #include "gromacs/mdrunutility/logging.h"
-#include "gromacs/mdrunutility/mdmodulenotification.h"
 #include "gromacs/mdrunutility/multisim.h"
 #include "gromacs/mdrunutility/printtime.h"
 #include "gromacs/mdrunutility/threadaffinity.h"
 #include "gromacs/utility/keyvaluetree.h"
 #include "gromacs/utility/logger.h"
 #include "gromacs/utility/loggerbuilder.h"
+#include "gromacs/utility/mdmodulenotification.h"
 #include "gromacs/utility/physicalnodecommunicator.h"
 #include "gromacs/utility/pleasecite.h"
 #include "gromacs/utility/programcontext.h"
@@ -946,7 +946,7 @@ int Mdrunner::mdrunner()
                         cr, domdecOptions.numCells,
                         inputrec, globalState.get(),
                         &observablesHistory,
-                        mdrunOptions.reproducible);
+                        mdrunOptions.reproducible, mdModules_->notifier());
 
         if (startingBehavior == StartingBehavior::RestartWithAppending && logFileHandle)
         {
@@ -1518,6 +1518,7 @@ int Mdrunner::mdrunner()
                     enforcedRotation ? enforcedRotation->getLegacyEnfrot() : nullptr,
                     deform.get(),
                     mdModules_->outputProvider(),
+                    mdModules_->notifier(),
                     inputrec, imdSession.get(), pull_work, swap, &mtop,
                     fcd,
                     globalState.get(),
index cd3742bffc0305437d17d29cb7576f625763912a..daa9f1cbce5a673df41fa431808ee2ea79e9395d 100644 (file)
@@ -57,6 +57,7 @@ TrajectoryElement::TrajectoryElement(
         const MdrunOptions &mdrunOptions,
         const t_commrec *cr,
         gmx::IMDOutputProvider *outputProvider,
+        const MdModulesNotifier &mdModulesNotifier,
         const t_inputrec *inputrec, gmx_mtop_t *top_global,
         const gmx_output_env_t *oenv, gmx_wallcycle *wcycle,
         StartingBehavior startingBehavior) :
@@ -64,7 +65,7 @@ TrajectoryElement::TrajectoryElement(
     writeStateStep_(-1),
     outf_(init_mdoutf(
                   fplog, nfile, fnm, mdrunOptions, cr,
-                  outputProvider, inputrec, top_global, oenv, wcycle,
+                  outputProvider, mdModulesNotifier, inputrec, top_global, oenv, wcycle,
                   startingBehavior)),
     nstxout_(inputrec->nstxout),
     nstvout_(inputrec->nstvout),
index ddb6086ddc1071e71ff78a0c52833dac8fede309..be1c9757898e85a1c10843a1c98414b734ad3660 100644 (file)
@@ -58,6 +58,7 @@ struct t_inputrec;
 namespace gmx
 {
 class IMDOutputProvider;
+struct MdModulesNotifier;
 struct MdrunOptions;
 enum class StartingBehavior;
 
@@ -149,6 +150,7 @@ class TrajectoryElement :
             const MdrunOptions &mdrunOptions,
             const t_commrec *cr,
             IMDOutputProvider *outputProvider,
+            const MdModulesNotifier &mdModulesNotifier,
             const t_inputrec *inputrec, gmx_mtop_t *top_global,
             const gmx_output_env_t *oenv, gmx_wallcycle *wcycle,
             StartingBehavior startingBehavior);
similarity index 95%
rename from src/gromacs/mdrunutility/mdmodulenotification.h
rename to src/gromacs/utility/mdmodulenotification.h
index d7851fdd5b873ee55ae1d476997c775e1789bbbd..c4d58d4154ffbb6dc97708cc66c88aa67cf0a81d 100644 (file)
@@ -38,7 +38,7 @@
  *
  * \author Christian Blau <blau@kth.se>
  * \inlibraryapi
- * \ingroup module_mdrunutility
+ * \ingroup module_utility
  */
 
 #ifndef GMX_MDRUNUTILITY_MDMODULENOTIFICATION_H
@@ -47,8 +47,6 @@
 #include <functional>
 #include <vector>
 
-#include "gromacs/utility/basedefinitions.h"
-
 struct t_commrec;
 
 namespace gmx
@@ -198,6 +196,9 @@ class KeyValueTreeObject;
 class KeyValueTreeObjectBuilder;
 class LocalAtomSetManager;
 class IndexGroupsAndNames;
+struct MdModulesCheckpointReadingDataOnMaster;
+struct MdModulesCheckpointReadingBroadcast;
+struct MdModulesWriteCheckpointData;
 
 struct MdModulesNotifier
 {
@@ -207,7 +208,10 @@ struct MdModulesNotifier
         IndexGroupsAndNames,
         KeyValueTreeObjectBuilder,
         const KeyValueTreeObject &,
-        LocalAtomSetManager *>::type notifier_;
+        LocalAtomSetManager *,
+        MdModulesCheckpointReadingDataOnMaster,
+        MdModulesCheckpointReadingBroadcast,
+        MdModulesWriteCheckpointData>::type notifier_;
 };
 
 } // namespace gmx
index c7356f1a19b1f13c14da98671b37520d6cdb141d..325a8e76a530aca1869cbb0d64d8f3d2925eb40e 100644 (file)
@@ -43,7 +43,7 @@
 
 #include <gmock/gmock.h>
 
-#include "gromacs/mdrunutility/mdmodulenotification.h"
+#include "gromacs/utility/mdmodulenotification.h"
 
 namespace gmx
 {