From b2c7e34915beec552273c6c0b93cb2a7e2e3f407 Mon Sep 17 00:00:00 2001 From: Christian Blau Date: Mon, 26 Aug 2019 17:17:59 +0200 Subject: [PATCH] Add checkpointing for MdModules Adds the possiblity to write and read from checkpoint files for MdModules. refs #2282 Change-Id: Id3ab57d1c9a40b6e1fb0193430e5b66ffa87d787 --- src/gromacs/applied_forces/densityfitting.cpp | 2 +- .../applied_forces/tests/densityfitting.cpp | 2 +- src/gromacs/fileio/checkpoint.cpp | 78 +++++++++++++++++-- src/gromacs/fileio/checkpoint.h | 10 ++- src/gromacs/gmxpreprocess/grompp.cpp | 2 +- src/gromacs/gmxpreprocess/readir.cpp | 2 +- src/gromacs/mdlib/mdoutf.cpp | 5 +- src/gromacs/mdlib/mdoutf.h | 24 +++--- src/gromacs/mdrun/isimulator.h | 5 ++ src/gromacs/mdrun/md.cpp | 2 +- src/gromacs/mdrun/mdmodules.cpp | 2 +- src/gromacs/mdrun/mimic.cpp | 2 +- src/gromacs/mdrun/minimize.cpp | 8 +- src/gromacs/mdrun/rerun.cpp | 2 +- src/gromacs/mdrun/runner.cpp | 5 +- .../modularsimulator/trajectoryelement.cpp | 3 +- .../modularsimulator/trajectoryelement.h | 2 + .../mdmodulenotification.h | 12 ++- .../mdrun/tests/mdmodulenotification.cpp | 2 +- 19 files changed, 130 insertions(+), 40 deletions(-) rename src/gromacs/{mdrunutility => utility}/mdmodulenotification.h (95%) diff --git a/src/gromacs/applied_forces/densityfitting.cpp b/src/gromacs/applied_forces/densityfitting.cpp index f40fef3111..357e8ddfa6 100644 --- a/src/gromacs/applied_forces/densityfitting.cpp +++ b/src/gromacs/applied_forces/densityfitting.cpp @@ -46,11 +46,11 @@ #include #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" diff --git a/src/gromacs/applied_forces/tests/densityfitting.cpp b/src/gromacs/applied_forces/tests/densityfitting.cpp index e19a00b042..0bbe272400 100644 --- a/src/gromacs/applied_forces/tests/densityfitting.cpp +++ b/src/gromacs/applied_forces/tests/densityfitting.cpp @@ -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" diff --git a/src/gromacs/fileio/checkpoint.cpp b/src/gromacs/fileio/checkpoint.cpp index 83d661c219..6250e76ba0 100644 --- a/src/gromacs/fileio/checkpoint.cpp +++ b/src/gromacs/fileio/checkpoint.cpp @@ -79,6 +79,10 @@ #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 *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) { diff --git a/src/gromacs/fileio/checkpoint.h b/src/gromacs/fileio/checkpoint.h index 97e1fa4715..a99aff3e33 100644 --- a/src/gromacs/fileio/checkpoint.h +++ b/src/gromacs/fileio/checkpoint.h @@ -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 ¬ifier); /* 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); diff --git a/src/gromacs/gmxpreprocess/grompp.cpp b/src/gromacs/gmxpreprocess/grompp.cpp index 6cedcc3441..bd32aca846 100644 --- a/src/gromacs/gmxpreprocess/grompp.cpp +++ b/src/gromacs/gmxpreprocess/grompp.cpp @@ -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" @@ -103,6 +102,7 @@ #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" diff --git a/src/gromacs/gmxpreprocess/readir.cpp b/src/gromacs/gmxpreprocess/readir.cpp index 954dcffaa9..8f92c0cacd 100644 --- a/src/gromacs/gmxpreprocess/readir.cpp +++ b/src/gromacs/gmxpreprocess/readir.cpp @@ -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" diff --git a/src/gromacs/mdlib/mdoutf.cpp b/src/gromacs/mdlib/mdoutf.cpp index 77e335e7eb..206cf02564 100644 --- a/src/gromacs/mdlib/mdoutf.cpp +++ b/src/gromacs/mdlib/mdoutf.cpp @@ -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)) diff --git a/src/gromacs/mdlib/mdoutf.h b/src/gromacs/mdlib/mdoutf.h index acf44e50dd..161bb6b301 100644 --- a/src/gromacs/mdlib/mdoutf.h +++ b/src/gromacs/mdlib/mdoutf.h @@ -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); diff --git a/src/gromacs/mdrun/isimulator.h b/src/gromacs/mdrun/isimulator.h index 9fbb343514..a2b24a69df 100644 --- a/src/gromacs/mdrun/isimulator.h +++ b/src/gromacs/mdrun/isimulator.h @@ -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. diff --git a/src/gromacs/mdrun/md.cpp b/src/gromacs/mdrun/md.cpp index 7bf96f6292..e55203646d 100644 --- a/src/gromacs/mdrun/md.cpp +++ b/src/gromacs/mdrun/md.cpp @@ -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); diff --git a/src/gromacs/mdrun/mdmodules.cpp b/src/gromacs/mdrun/mdmodules.cpp index 1e1104b2e6..727fb5c26f 100644 --- a/src/gromacs/mdrun/mdmodules.cpp +++ b/src/gromacs/mdrun/mdmodules.cpp @@ -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 diff --git a/src/gromacs/mdrun/mimic.cpp b/src/gromacs/mdrun/mimic.cpp index 703e1e7924..bc106870ba 100644 --- a/src/gromacs/mdrun/mimic.cpp +++ b/src/gromacs/mdrun/mimic.cpp @@ -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); diff --git a/src/gromacs/mdrun/minimize.cpp b/src/gromacs/mdrun/minimize.cpp index 46afcb94ef..e6d9148121 100644 --- a/src/gromacs/mdrun/minimize.cpp +++ b/src/gromacs/mdrun/minimize.cpp @@ -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 atom_index = get_atom_index(top_global); diff --git a/src/gromacs/mdrun/rerun.cpp b/src/gromacs/mdrun/rerun.cpp index b55e456eba..a4b40f4585 100644 --- a/src/gromacs/mdrun/rerun.cpp +++ b/src/gromacs/mdrun/rerun.cpp @@ -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); diff --git a/src/gromacs/mdrun/runner.cpp b/src/gromacs/mdrun/runner.cpp index 7155d71228..a35c67c4f7 100644 --- a/src/gromacs/mdrun/runner.cpp +++ b/src/gromacs/mdrun/runner.cpp @@ -102,7 +102,6 @@ #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" @@ -145,6 +144,7 @@ #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(), diff --git a/src/gromacs/modularsimulator/trajectoryelement.cpp b/src/gromacs/modularsimulator/trajectoryelement.cpp index cd3742bffc..daa9f1cbce 100644 --- a/src/gromacs/modularsimulator/trajectoryelement.cpp +++ b/src/gromacs/modularsimulator/trajectoryelement.cpp @@ -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), diff --git a/src/gromacs/modularsimulator/trajectoryelement.h b/src/gromacs/modularsimulator/trajectoryelement.h index ddb6086ddc..be1c975789 100644 --- a/src/gromacs/modularsimulator/trajectoryelement.h +++ b/src/gromacs/modularsimulator/trajectoryelement.h @@ -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); diff --git a/src/gromacs/mdrunutility/mdmodulenotification.h b/src/gromacs/utility/mdmodulenotification.h similarity index 95% rename from src/gromacs/mdrunutility/mdmodulenotification.h rename to src/gromacs/utility/mdmodulenotification.h index d7851fdd5b..c4d58d4154 100644 --- a/src/gromacs/mdrunutility/mdmodulenotification.h +++ b/src/gromacs/utility/mdmodulenotification.h @@ -38,7 +38,7 @@ * * \author Christian Blau * \inlibraryapi - * \ingroup module_mdrunutility + * \ingroup module_utility */ #ifndef GMX_MDRUNUTILITY_MDMODULENOTIFICATION_H @@ -47,8 +47,6 @@ #include #include -#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 diff --git a/src/programs/mdrun/tests/mdmodulenotification.cpp b/src/programs/mdrun/tests/mdmodulenotification.cpp index c7356f1a19..325a8e76a5 100644 --- a/src/programs/mdrun/tests/mdmodulenotification.cpp +++ b/src/programs/mdrun/tests/mdmodulenotification.cpp @@ -43,7 +43,7 @@ #include -#include "gromacs/mdrunutility/mdmodulenotification.h" +#include "gromacs/utility/mdmodulenotification.h" namespace gmx { -- 2.22.0