Adds the possiblity to write and read from checkpoint files for MdModules.
refs #2282
Change-Id: Id3ab57d1c9a40b6e1fb0193430e5b66ffa87d787
#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"
#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"
#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"
#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"
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 */
};
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)
{
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)
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 */
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,
CheckpointHeaderContents *headerContents,
t_state *state,
ObservablesHistory *observablesHistory,
- gmx_bool reproducibilityRequested)
+ gmx_bool reproducibilityRequested,
+ const gmx::MdModulesNotifier &mdModulesNotifier)
{
t_fileio *fp;
char buf[STEPSTRSIZE];
{
cp_error();
}
-
+ do_cpt_mdmodules(headerContents->file_version, fp, mdModulesNotifier);
ret = do_cpt_footer(gmx_fio_getxdr(fp), headerContents->file_version);
if (ret)
{
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))
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
{
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)
{
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"
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.
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);
#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"
#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"
#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"
gmx_wallcycle_t wcycle;
rvec *f_global;
gmx::IMDOutputProvider *outputProvider;
+ const gmx::MdModulesNotifier *mdModulesNotifier;
};
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)
}
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
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))
{
enum class StartingBehavior;
class IMDOutputProvider;
+struct MdModulesNotifier;
struct MdrunOptions;
}
* 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);
class Constraints;
class PpForceWorkload;
class IMDOutputProvider;
+struct MdModulesNotifier;
class ImdSession;
class MDLogger;
class MDAtoms;
gmx_enfrot *enforcedRotation,
BoxDeformation *deform,
IMDOutputProvider *outputProvider,
+ const MdModulesNotifier &mdModulesNotifier,
t_inputrec *inputrec,
ImdSession *imdSession,
pull_t *pull_work,
enforcedRotation(enforcedRotation),
deform(deform),
outputProvider(outputProvider),
+ mdModulesNotifier(mdModulesNotifier),
inputrec(inputrec),
imdSession(imdSession),
pull_work(pull_work),
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.
{
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);
#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"
#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
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);
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);
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);
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);
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);
}
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);
#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"
cr, domdecOptions.numCells,
inputrec, globalState.get(),
&observablesHistory,
- mdrunOptions.reproducible);
+ mdrunOptions.reproducible, mdModules_->notifier());
if (startingBehavior == StartingBehavior::RestartWithAppending && logFileHandle)
{
enforcedRotation ? enforcedRotation->getLegacyEnfrot() : nullptr,
deform.get(),
mdModules_->outputProvider(),
+ mdModules_->notifier(),
inputrec, imdSession.get(), pull_work, swap, &mtop,
fcd,
globalState.get(),
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) :
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),
namespace gmx
{
class IMDOutputProvider;
+struct MdModulesNotifier;
struct MdrunOptions;
enum class StartingBehavior;
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);
*
* \author Christian Blau <blau@kth.se>
* \inlibraryapi
- * \ingroup module_mdrunutility
+ * \ingroup module_utility
*/
#ifndef GMX_MDRUNUTILITY_MDMODULENOTIFICATION_H
#include <functional>
#include <vector>
-#include "gromacs/utility/basedefinitions.h"
-
struct t_commrec;
namespace gmx
class KeyValueTreeObjectBuilder;
class LocalAtomSetManager;
class IndexGroupsAndNames;
+struct MdModulesCheckpointReadingDataOnMaster;
+struct MdModulesCheckpointReadingBroadcast;
+struct MdModulesWriteCheckpointData;
struct MdModulesNotifier
{
IndexGroupsAndNames,
KeyValueTreeObjectBuilder,
const KeyValueTreeObject &,
- LocalAtomSetManager *>::type notifier_;
+ LocalAtomSetManager *,
+ MdModulesCheckpointReadingDataOnMaster,
+ MdModulesCheckpointReadingBroadcast,
+ MdModulesWriteCheckpointData>::type notifier_;
};
} // namespace gmx
#include <gmock/gmock.h>
-#include "gromacs/mdrunutility/mdmodulenotification.h"
+#include "gromacs/utility/mdmodulenotification.h"
namespace gmx
{