From: Mark Abraham Date: Tue, 7 Sep 2021 17:38:29 +0000 (+0000) Subject: Introduce plumbing for ObservablesReducer X-Git-Url: http://biod.pnpi.spb.ru/gitweb/?a=commitdiff_plain;h=aff557e07c009e9ebd236f96d93466289c481139;p=alexxy%2Fgromacs.git Introduce plumbing for ObservablesReducer --- diff --git a/src/gromacs/mdlib/md_support.cpp b/src/gromacs/mdlib/md_support.cpp index 31ba183021..46ebb11617 100644 --- a/src/gromacs/mdlib/md_support.cpp +++ b/src/gromacs/mdlib/md_support.cpp @@ -67,6 +67,7 @@ #include "gromacs/mdtypes/inputrec.h" #include "gromacs/mdtypes/md_enums.h" #include "gromacs/mdtypes/mdatom.h" +#include "gromacs/mdtypes/observablesreducer.h" #include "gromacs/mdtypes/state.h" #include "gromacs/pbcutil/pbc.h" #include "gromacs/pulling/pull.h" @@ -302,7 +303,9 @@ void compute_globals(gmx_global_stat* gstat, gmx::SimulationSignaller* signalCoordinator, const matrix lastbox, gmx_bool* bSumEkinhOld, - const int flags) + const int flags, + int64_t step, + gmx::ObservablesReducer* observablesReducer) { gmx_bool bEner, bPres, bTemp; gmx_bool bStopCM, bGStat, bReadEkin, bEkinAveVel, bScaleEkin, bConstrain; @@ -345,7 +348,8 @@ void compute_globals(gmx_global_stat* gstat, calc_vcm_grp(*mdatoms, x, v, vcm); } - if (bTemp || bStopCM || bPres || bEner || bConstrain || bCheckNumberOfBondedInteractions) + if (bTemp || bStopCM || bPres || bEner || bConstrain || bCheckNumberOfBondedInteractions + || !observablesReducer->communicationBuffer().empty()) { if (!bGStat) { @@ -371,7 +375,9 @@ void compute_globals(gmx_global_stat* gstat, bStopCM ? vcm : nullptr, signalBuffer, *bSumEkinhOld, - flags); + flags, + step, + observablesReducer); wallcycle_stop(wcycle, WallCycleCounter::MoveE); } signalCoordinator->finalizeSignals(); diff --git a/src/gromacs/mdlib/md_support.h b/src/gromacs/mdlib/md_support.h index da949e10d1..e43260a5cf 100644 --- a/src/gromacs/mdlib/md_support.h +++ b/src/gromacs/mdlib/md_support.h @@ -38,6 +38,8 @@ #ifndef GMX_MDLIB_MD_SUPPORT_H #define GMX_MDLIB_MD_SUPPORT_H +#include + #include "gromacs/mdlib/vcm.h" #include "gromacs/mdtypes/md_enums.h" #include "gromacs/timing/wallcycle.h" @@ -60,6 +62,7 @@ template class ArrayRef; class Constraints; class MDLogger; +class ObservablesReducer; class SimulationSignaller; } // namespace gmx @@ -133,6 +136,8 @@ void compute_globals(gmx_global_stat* gstat, gmx::SimulationSignaller* signalCoordinator, const matrix lastbox, gmx_bool* bSumEkinhOld, - int flags); + int flags, + int64_t step, + gmx::ObservablesReducer* observablesReducer); #endif diff --git a/src/gromacs/mdlib/stat.cpp b/src/gromacs/mdlib/stat.cpp index c7e47c267f..6be1c9d2cf 100644 --- a/src/gromacs/mdlib/stat.cpp +++ b/src/gromacs/mdlib/stat.cpp @@ -59,6 +59,7 @@ #include "gromacs/mdtypes/group.h" #include "gromacs/mdtypes/inputrec.h" #include "gromacs/mdtypes/md_enums.h" +#include "gromacs/mdtypes/observablesreducer.h" #include "gromacs/utility/fatalerror.h" #include "gromacs/utility/futil.h" #include "gromacs/utility/smalloc.h" @@ -141,18 +142,20 @@ static int filter_enerdterm(const real* afrom, gmx_bool bToBuffer, real* ato, gm return to; } -void global_stat(const gmx_global_stat& gs, - const t_commrec* cr, - gmx_enerdata_t* enerd, - tensor fvir, - tensor svir, - const t_inputrec& inputrec, - gmx_ekindata_t* ekind, - gmx::ArrayRef constraintsRmsdData, - t_vcm* vcm, - gmx::ArrayRef sig, - bool bSumEkinhOld, - int flags) +void global_stat(const gmx_global_stat& gs, + const t_commrec* cr, + gmx_enerdata_t* enerd, + tensor fvir, + tensor svir, + const t_inputrec& inputrec, + gmx_ekindata_t* ekind, + gmx::ArrayRef constraintsRmsdData, + t_vcm* vcm, + gmx::ArrayRef sig, + bool bSumEkinhOld, + int flags, + int64_t step, + gmx::ObservablesReducer* observablesReducer) /* instead of current system, gmx_booleans for summing virial, kinetic energy, and other terms */ { int ie = 0, ifv = 0, isv = 0, irmsd = 0; @@ -170,6 +173,12 @@ void global_stat(const gmx_global_stat& gs, || (inputrec.eI == IntegrationAlgorithm::VVAK && bPres)); bool bReadEkin = ((flags & CGLO_READEKIN) != 0); + // This structure implements something akin to a vector. As + // modules add their data into it with add_bin[rd], they save the + // index it returns, which allows them to look up their data later + // after the reduction with extract_bin[rd]. The various index + // variables are mostly named following the pattern + // "i". t_bin* rb = gs.rb; int* itc0 = gs.itc0; int* itc1 = gs.itc1; @@ -284,6 +293,14 @@ void global_stat(const gmx_global_stat& gs, isig = add_binr(rb, sig); } + gmx::ArrayRef observablesReducerBuffer = observablesReducer->communicationBuffer(); + int tbinIndexForObservablesReducer = 0; + if (!observablesReducerBuffer.empty()) + { + tbinIndexForObservablesReducer = + add_bind(rb, observablesReducerBuffer.ssize(), observablesReducerBuffer.data()); + } + sum_bin(rb, cr); /* Extract all the data locally */ @@ -381,4 +398,13 @@ void global_stat(const gmx_global_stat& gs, { extract_binr(rb, isig, sig); } + + if (!observablesReducerBuffer.empty()) + { + extract_bind(rb, + tbinIndexForObservablesReducer, + observablesReducerBuffer.ssize(), + observablesReducerBuffer.data()); + observablesReducer->reductionComplete(step); + } } diff --git a/src/gromacs/mdlib/stat.h b/src/gromacs/mdlib/stat.h index 8001bf0d39..eb48f9d665 100644 --- a/src/gromacs/mdlib/stat.h +++ b/src/gromacs/mdlib/stat.h @@ -54,6 +54,7 @@ namespace gmx template class ArrayRef; class Constraints; +class ObservablesReducer; } // namespace gmx typedef struct gmx_global_stat* gmx_global_stat_t; @@ -63,18 +64,20 @@ gmx_global_stat_t global_stat_init(const t_inputrec* ir); void global_stat_destroy(gmx_global_stat_t gs); /*! \brief All-reduce energy-like quantities over cr->mpi_comm_mysim */ -void global_stat(const gmx_global_stat& gs, - const t_commrec* cr, - gmx_enerdata_t* enerd, - tensor fvir, - tensor svir, - const t_inputrec& inputrec, - gmx_ekindata_t* ekind, - gmx::ArrayRef constraintsRmsdData, - t_vcm* vcm, - gmx::ArrayRef sig, - bool bSumEkinhOld, - int flags); +void global_stat(const gmx_global_stat& gs, + const t_commrec* cr, + gmx_enerdata_t* enerd, + tensor fvir, + tensor svir, + const t_inputrec& inputrec, + gmx_ekindata_t* ekind, + gmx::ArrayRef constraintsRmsdData, + t_vcm* vcm, + gmx::ArrayRef sig, + bool bSumEkinhOld, + int flags, + int64_t step, + gmx::ObservablesReducer* observablesReducer); /*! \brief Returns TRUE if io should be done */ inline bool do_per_step(int64_t step, int64_t nstep) diff --git a/src/gromacs/mdlib/update_vv.cpp b/src/gromacs/mdlib/update_vv.cpp index a5a9797a60..279e77c895 100644 --- a/src/gromacs/mdlib/update_vv.cpp +++ b/src/gromacs/mdlib/update_vv.cpp @@ -84,6 +84,7 @@ void integrateVVFirstStep(int64_t step, t_vcm* vcm, const gmx_localtop_t& top, gmx_enerdata_t* enerd, + gmx::ObservablesReducer* observablesReducer, gmx_ekindata_t* ekind, gmx_global_stat* gstat, real* last_ekin, @@ -215,7 +216,9 @@ void integrateVVFirstStep(int64_t step, nullSignaller, state->box, bSumEkinhOld, - cglo_flags); + cglo_flags, + step, + observablesReducer); /* explanation of above: a) We compute Ekin at the full time step if 1) we are using the AveVel Ekin, and it's not the @@ -300,7 +303,9 @@ void integrateVVFirstStep(int64_t step, nullSignaller, state->box, bSumEkinhOld, - CGLO_GSTAT | CGLO_TEMPERATURE); + CGLO_GSTAT | CGLO_TEMPERATURE, + step, + observablesReducer); wallcycle_start(wcycle, WallCycleCounter::Update); } } @@ -331,36 +336,37 @@ void integrateVVFirstStep(int64_t step, } } -void integrateVVSecondStep(int64_t step, - const t_inputrec* ir, - t_forcerec* fr, - t_commrec* cr, - t_state* state, - t_mdatoms* mdatoms, - t_fcdata* fcdata, - t_extmass* MassQ, - t_vcm* vcm, - pull_t* pull_work, - gmx_enerdata_t* enerd, - gmx_ekindata_t* ekind, - gmx_global_stat* gstat, - real* dvdl_constr, - bool bCalcVir, - tensor total_vir, - tensor shake_vir, - tensor force_vir, - tensor pres, - matrix M, - matrix lastbox, - bool do_log, - bool do_ene, - bool bGStat, - bool* bSumEkinhOld, - gmx::ForceBuffers* f, - std::vector* cbuf, - gmx::Update* upd, - gmx::Constraints* constr, - gmx::SimulationSignaller* nullSignaller, +void integrateVVSecondStep(int64_t step, + const t_inputrec* ir, + t_forcerec* fr, + t_commrec* cr, + t_state* state, + t_mdatoms* mdatoms, + t_fcdata* fcdata, + t_extmass* MassQ, + t_vcm* vcm, + pull_t* pull_work, + gmx_enerdata_t* enerd, + gmx::ObservablesReducer* observablesReducer, + gmx_ekindata_t* ekind, + gmx_global_stat* gstat, + real* dvdl_constr, + bool bCalcVir, + tensor total_vir, + tensor shake_vir, + tensor force_vir, + tensor pres, + matrix M, + matrix lastbox, + bool do_log, + bool do_ene, + bool bGStat, + bool* bSumEkinhOld, + gmx::ForceBuffers* f, + std::vector* cbuf, + gmx::Update* upd, + gmx::Constraints* constr, + gmx::SimulationSignaller* nullSignaller, gmx::EnumerationArray> trotter_seq, t_nrnb* nrnb, gmx_wallcycle* wcycle) @@ -461,7 +467,9 @@ void integrateVVSecondStep(int64_t nullSignaller, lastbox, bSumEkinhOld, - (bGStat ? CGLO_GSTAT : 0) | CGLO_TEMPERATURE); + (bGStat ? CGLO_GSTAT : 0) | CGLO_TEMPERATURE, + step, + observablesReducer); wallcycle_start(wcycle, WallCycleCounter::Update); trotter_update(ir, step, diff --git a/src/gromacs/mdlib/update_vv.h b/src/gromacs/mdlib/update_vv.h index bc4307d681..9cc7bdb391 100644 --- a/src/gromacs/mdlib/update_vv.h +++ b/src/gromacs/mdlib/update_vv.h @@ -69,6 +69,7 @@ namespace gmx class Constraints; class ForceBuffers; class MDLogger; +class ObservablesReducer; class SimulationSignaller; class Update; enum class StartingBehavior : int; @@ -91,6 +92,7 @@ enum class StartingBehavior : int; * \param[in] vcm Center of mass motion removal. * \param[in] top Local topology. * \param[in] enerd Energy data. + * \param[in] observablesReducer Pointer to the \c ObservablesReducer object * \param[in] ekind Kinetic energy data. * \param[in] gstat Storage of thermodynamic parameters data. * \param[out] last_ekin Kinetic energies of the last step. @@ -133,6 +135,7 @@ void integrateVVFirstStep(int64_t step, t_vcm* vcm, const gmx_localtop_t& top, gmx_enerdata_t* enerd, + gmx::ObservablesReducer* observablesReducer, gmx_ekindata_t* ekind, gmx_global_stat* gstat, real* last_ekin, @@ -174,6 +177,7 @@ void integrateVVFirstStep(int64_t step, * \param[in] vcm Center of mass motion removal. * \param[in] pull_work Pulling data. * \param[in] enerd Energy data. + * \param[in] observablesReducer Pointer to the \c ObservablesReducer object * \param[in] ekind Kinetic energy data. * \param[in] gstat Storage of thermodynamic parameters data. * \param[out] dvdl_constr FEP data for constraints. @@ -197,36 +201,37 @@ void integrateVVFirstStep(int64_t step, * \param[in] nrnb Cycle counters. * \param[in] wcycle Wall-clock cycle counter. */ -void integrateVVSecondStep(int64_t step, - const t_inputrec* ir, - t_forcerec* fr, - t_commrec* cr, - t_state* state, - t_mdatoms* mdatoms, - t_fcdata* fcdata, - t_extmass* MassQ, - t_vcm* vcm, - pull_t* pull_work, - gmx_enerdata_t* enerd, - gmx_ekindata_t* ekind, - gmx_global_stat* gstat, - real* dvdl_constr, - bool bCalcVir, - tensor total_vir, - tensor shake_vir, - tensor force_vir, - tensor pres, - matrix M, - matrix lastbox, - bool do_log, - bool do_ene, - bool bGStat, - bool* bSumEkinhOld, - gmx::ForceBuffers* f, - std::vector* cbuf, - gmx::Update* upd, - gmx::Constraints* constr, - gmx::SimulationSignaller* nullSignaller, +void integrateVVSecondStep(int64_t step, + const t_inputrec* ir, + t_forcerec* fr, + t_commrec* cr, + t_state* state, + t_mdatoms* mdatoms, + t_fcdata* fcdata, + t_extmass* MassQ, + t_vcm* vcm, + pull_t* pull_work, + gmx_enerdata_t* enerd, + gmx::ObservablesReducer* observablesReducer, + gmx_ekindata_t* ekind, + gmx_global_stat* gstat, + real* dvdl_constr, + bool bCalcVir, + tensor total_vir, + tensor shake_vir, + tensor force_vir, + tensor pres, + matrix M, + matrix lastbox, + bool do_log, + bool do_ene, + bool bGStat, + bool* bSumEkinhOld, + gmx::ForceBuffers* f, + std::vector* cbuf, + gmx::Update* upd, + gmx::Constraints* constr, + gmx::SimulationSignaller* nullSignaller, gmx::EnumerationArray> trotter_seq, t_nrnb* nrnb, gmx_wallcycle* wcycle); diff --git a/src/gromacs/mdrun/isimulator.h b/src/gromacs/mdrun/isimulator.h index 37ffb33742..e7cf49b830 100644 --- a/src/gromacs/mdrun/isimulator.h +++ b/src/gromacs/mdrun/isimulator.h @@ -75,6 +75,7 @@ struct MDModulesNotifiers; class ImdSession; class MDLogger; class MDAtoms; +class ObservablesReducerBuilder; class StopHandlerBuilder; struct MdrunOptions; class VirtualSitesHandler; @@ -136,6 +137,7 @@ public: gmx_wallcycle* wcycle, t_forcerec* fr, gmx_enerdata_t* enerd, + ObservablesReducerBuilder* observablesReducerBuilder, gmx_ekindata_t* ekind, MdrunScheduleWorkload* runScheduleWork, const ReplicaExchangeParameters& replExParams, @@ -170,6 +172,7 @@ public: wcycle(wcycle), fr(fr), enerd(enerd), + observablesReducerBuilder(observablesReducerBuilder), ekind(ekind), runScheduleWork(runScheduleWork), replExParams(replExParams), @@ -234,6 +237,8 @@ public: t_forcerec* fr; //! Data for energy output. gmx_enerdata_t* enerd; + //! Builder for coordinator of reduction for observables + ObservablesReducerBuilder* observablesReducerBuilder; //! Kinetic energy data. gmx_ekindata_t* ekind; //! Schedule of work for each MD step for this task. diff --git a/src/gromacs/mdrun/md.cpp b/src/gromacs/mdrun/md.cpp index 11ae4fab7b..7caa1dc708 100644 --- a/src/gromacs/mdrun/md.cpp +++ b/src/gromacs/mdrun/md.cpp @@ -126,6 +126,7 @@ #include "gromacs/mdtypes/mdrunoptions.h" #include "gromacs/mdtypes/multipletimestepping.h" #include "gromacs/mdtypes/observableshistory.h" +#include "gromacs/mdtypes/observablesreducer.h" #include "gromacs/mdtypes/pullhistory.h" #include "gromacs/mdtypes/simulation_workload.h" #include "gromacs/mdtypes/state.h" @@ -360,7 +361,8 @@ void gmx::LegacySimulator::do_md() std::unique_ptr stateInstance; t_state* state; - gmx_localtop_t top(top_global.ffparams); + gmx_localtop_t top(top_global.ffparams); + ObservablesReducer observablesReducer = observablesReducerBuilder->build(); ForceBuffers f(simulationWork.useMts, ((useGpuForNonbonded && useGpuForBufferOps) || useGpuForUpdate) @@ -632,6 +634,9 @@ void gmx::LegacySimulator::do_md() t_vcm vcm(top_global.groups, *ir); reportComRemovalInfo(fplog, vcm); + int64_t step = ir->init_step; + int64_t step_rel = 0; + /* To minimize communication, compute_globals computes the COM velocity * and the kinetic energy for the velocities without COM motion removed. * Thus to get the kinetic energy without the COM contribution, we need @@ -671,7 +676,9 @@ void gmx::LegacySimulator::do_md() &nullSignaller, state->box, &bSumEkinhOld, - cglo_flags_iteration); + cglo_flags_iteration, + step, + &observablesReducer); if (cglo_flags_iteration & CGLO_STOPCM) { /* At initialization, do not pass x with acceleration-correction mode @@ -718,7 +725,9 @@ void gmx::LegacySimulator::do_md() &nullSignaller, state->box, &bSumEkinhOld, - cglo_flags & ~CGLO_PRESSURE); + cglo_flags & ~CGLO_PRESSURE, + step, + &observablesReducer); } /* Calculate the initial half step temperature, and save the ekinh_old */ @@ -801,9 +810,6 @@ void gmx::LegacySimulator::do_md() bExchanged = FALSE; bNeedRepartition = FALSE; - int64_t step = ir->init_step; - int64_t step_rel = 0; - auto stopHandler = stopHandlerBuilder->getStopHandlerMD( compat::not_null(&signals[eglsSTOPCOND]), simulationsShareState, @@ -1066,7 +1072,9 @@ void gmx::LegacySimulator::do_md() &nullSignaller, state->box, &bSumEkinhOld, - cglo_flags); + cglo_flags, + step, + &observablesReducer); if (DOMAINDECOMP(cr)) { dd_localTopologyChecker(cr->dd)->checkNumberOfBondedInteractions( @@ -1223,6 +1231,7 @@ void gmx::LegacySimulator::do_md() &vcm, top, enerd, + &observablesReducer, ekind, gstat, &last_ekin, @@ -1471,6 +1480,7 @@ void gmx::LegacySimulator::do_md() &vcm, pull_work, enerd, + &observablesReducer, ekind, gstat, &dvdl_constr, @@ -1700,7 +1710,9 @@ void gmx::LegacySimulator::do_md() | (!EI_VV(ir->eI) ? CGLO_PRESSURE : 0) | CGLO_CONSTRAINT | (DOMAINDECOMP(cr) && dd_localTopologyChecker(*cr->dd).shouldCheckNumberOfBondedInteractions() ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS - : 0)); + : 0), + step, + &observablesReducer); if (DOMAINDECOMP(cr)) { dd_localTopologyChecker(cr->dd)->checkNumberOfBondedInteractions( diff --git a/src/gromacs/mdrun/mimic.cpp b/src/gromacs/mdrun/mimic.cpp index ec45896922..29b74e0d8b 100644 --- a/src/gromacs/mdrun/mimic.cpp +++ b/src/gromacs/mdrun/mimic.cpp @@ -115,6 +115,7 @@ #include "gromacs/mdtypes/mdatom.h" #include "gromacs/mdtypes/mdrunoptions.h" #include "gromacs/mdtypes/observableshistory.h" +#include "gromacs/mdtypes/observablesreducer.h" #include "gromacs/mdtypes/simulation_workload.h" #include "gromacs/mdtypes/state.h" #include "gromacs/mimic/communicator.h" @@ -206,6 +207,8 @@ void gmx::LegacySimulator::do_mimic() int nstglobalcomm = 1; const bool bNS = true; + ObservablesReducer observablesReducer = observablesReducerBuilder->build(); + if (MASTER(cr)) { MimicCommunicator::init(); @@ -339,6 +342,9 @@ void gmx::LegacySimulator::do_mimic() doFreeEnergyPerturbation = true; } + int64_t step = ir->init_step; + int64_t step_rel = 0; + { int cglo_flags = CGLO_GSTAT; if (DOMAINDECOMP(cr) && dd_localTopologyChecker(*cr->dd).shouldCheckNumberOfBondedInteractions()) @@ -368,7 +374,9 @@ void gmx::LegacySimulator::do_mimic() &nullSignaller, state->box, &bSumEkinhOld, - cglo_flags); + cglo_flags, + step, + &observablesReducer); if (DOMAINDECOMP(cr)) { dd_localTopologyChecker(cr->dd)->checkNumberOfBondedInteractions( @@ -414,9 +422,6 @@ void gmx::LegacySimulator::do_mimic() "MiMiC does not report kinetic energy, total energy, temperature, virial and " "pressure."); - int64_t step = ir->init_step; - int64_t step_rel = 0; - auto stopHandler = stopHandlerBuilder->getStopHandlerMD( compat::not_null(&signals[eglsSTOPCOND]), false, @@ -655,7 +660,9 @@ void gmx::LegacySimulator::do_mimic() &signaller, state->box, &bSumEkinhOld, - cglo_flags); + cglo_flags, + step, + &observablesReducer); if (DOMAINDECOMP(cr)) { dd_localTopologyChecker(cr->dd)->checkNumberOfBondedInteractions( diff --git a/src/gromacs/mdrun/minimize.cpp b/src/gromacs/mdrun/minimize.cpp index 6784cfeb0b..d055c942e6 100644 --- a/src/gromacs/mdrun/minimize.cpp +++ b/src/gromacs/mdrun/minimize.cpp @@ -100,6 +100,7 @@ #include "gromacs/mdtypes/md_enums.h" #include "gromacs/mdtypes/mdatom.h" #include "gromacs/mdtypes/mdrunoptions.h" +#include "gromacs/mdtypes/observablesreducer.h" #include "gromacs/mdtypes/state.h" #include "gromacs/pbcutil/pbc.h" #include "gromacs/timing/wallcycle.h" @@ -901,7 +902,7 @@ public: * unsuited for aggregate initialization. When the types * improve, the call signature of this method can be reduced. */ - void run(em_state_t* ems, rvec mu_tot, tensor vir, tensor pres, int64_t count, gmx_bool bFirst); + void run(em_state_t* ems, rvec mu_tot, tensor vir, tensor pres, int64_t count, gmx_bool bFirst, int64_t step); //! Handles logging (deprecated). FILE* fplog; //! Handles logging. @@ -924,8 +925,10 @@ public: t_nrnb* nrnb; //! Manages wall cycle accounting. gmx_wallcycle* wcycle; - //! Coordinates global reduction. + //! Legacy coordinator of global reduction. gmx_global_stat_t gstat; + //! Coordinates reduction for observables + gmx::ObservablesReducer* observablesReducer; //! Handles virtual sites. VirtualSitesHandler* vsite; //! Handles constraints. @@ -944,7 +947,7 @@ public: std::vector pairSearchCoordinates; }; -void EnergyEvaluator::run(em_state_t* ems, rvec mu_tot, tensor vir, tensor pres, int64_t count, gmx_bool bFirst) +void EnergyEvaluator::run(em_state_t* ems, rvec mu_tot, tensor vir, tensor pres, int64_t count, gmx_bool bFirst, int64_t step) { real t; gmx_bool bNS; @@ -1047,7 +1050,9 @@ void EnergyEvaluator::run(em_state_t* ems, rvec mu_tot, tensor vir, tensor pres, nullptr, std::vector(1, terminate), FALSE, - CGLO_ENERGY | CGLO_PRESSURE | CGLO_CONSTRAINT); + CGLO_ENERGY | CGLO_PRESSURE | CGLO_CONSTRAINT, + step, + observablesReducer); wallcycle_stop(wcycle, WallCycleCounter::MoveE); } @@ -1285,6 +1290,8 @@ void LegacySimulator::do_cg() em_state_t* s_b = &s2; em_state_t* s_c = &s3; + ObservablesReducer observablesReducer = observablesReducerBuilder->build(); + /* Init em and store the local state in s_min */ init_em(fplog, mdlog, @@ -1344,15 +1351,32 @@ void LegacySimulator::do_cg() sp_header(fplog, CG, inputrec->em_tol, number_steps); } - EnergyEvaluator energyEvaluator{ fplog, mdlog, cr, ms, top_global, - &top, inputrec, imdSession, pull_work, nrnb, - wcycle, gstat, vsite, constr, mdAtoms, - fr, runScheduleWork, enerd, -1, {} }; + EnergyEvaluator energyEvaluator{ fplog, + mdlog, + cr, + ms, + top_global, + &top, + inputrec, + imdSession, + pull_work, + nrnb, + wcycle, + gstat, + &observablesReducer, + vsite, + constr, + mdAtoms, + fr, + runScheduleWork, + enerd, + -1, + {} }; /* Call the force routine and some auxiliary (neighboursearching etc.) */ /* do_force always puts the charge groups in the box and shifts again * We do not unshift, so molecules are always whole in congrad.c */ - energyEvaluator.run(s_min, mu_tot, vir, pres, -1, TRUE); + energyEvaluator.run(s_min, mu_tot, vir, pres, -1, TRUE, step); if (MASTER(cr)) { @@ -1545,7 +1569,7 @@ void LegacySimulator::do_cg() neval++; /* Calculate energy for the trial step */ - energyEvaluator.run(s_c, mu_tot, vir, pres, -1, FALSE); + energyEvaluator.run(s_c, mu_tot, vir, pres, -1, FALSE, step); /* Calc derivative along line */ const rvec* pc = s_c->s.cg_p.rvec_array(); @@ -1660,7 +1684,7 @@ void LegacySimulator::do_cg() neval++; /* Calculate energy for the trial step */ - energyEvaluator.run(s_b, mu_tot, vir, pres, -1, FALSE); + energyEvaluator.run(s_b, mu_tot, vir, pres, -1, FALSE, step); /* p does not change within a step, but since the domain decomposition * might change, we have to use cg_p of s_b here. @@ -1984,6 +2008,8 @@ void LegacySimulator::do_lbfgs() int step = 0; int neval = 0; + ObservablesReducer observablesReducer = observablesReducerBuilder->build(); + /* Init em */ init_em(fplog, mdlog, @@ -2081,13 +2107,29 @@ void LegacySimulator::do_lbfgs() * We do not unshift, so molecules are always whole */ neval++; - EnergyEvaluator energyEvaluator{ fplog, mdlog, cr, ms, top_global, &top, - inputrec, imdSession, pull_work, nrnb, wcycle, gstat, - vsite, constr, mdAtoms, fr, runScheduleWork, enerd }; + EnergyEvaluator energyEvaluator{ fplog, + mdlog, + cr, + ms, + top_global, + &top, + inputrec, + imdSession, + pull_work, + nrnb, + wcycle, + gstat, + &observablesReducer, + vsite, + constr, + mdAtoms, + fr, + runScheduleWork, + enerd }; rvec mu_tot; tensor vir; tensor pres; - energyEvaluator.run(&ems, mu_tot, vir, pres, -1, TRUE); + energyEvaluator.run(&ems, mu_tot, vir, pres, -1, TRUE, step); if (MASTER(cr)) { @@ -2317,7 +2359,7 @@ void LegacySimulator::do_lbfgs() neval++; // Calculate energy for the trial step in position C - energyEvaluator.run(sc, mu_tot, vir, pres, step, FALSE); + energyEvaluator.run(sc, mu_tot, vir, pres, step, FALSE, step); // Calc line gradient in position C real* fc = static_cast(sc->f.view().force()[0]); @@ -2401,7 +2443,7 @@ void LegacySimulator::do_lbfgs() neval++; // Calculate energy for the trial step in point B - energyEvaluator.run(sb, mu_tot, vir, pres, step, FALSE); + energyEvaluator.run(sb, mu_tot, vir, pres, step, FALSE, step); fnorm = sb->fnorm; // Calculate gradient in point B @@ -2761,6 +2803,8 @@ void LegacySimulator::do_steep() em_state_t* s_min = &s0; em_state_t* s_try = &s1; + ObservablesReducer observablesReducer = observablesReducerBuilder->build(); + /* Init em and store the local state in s_try */ init_em(fplog, mdlog, @@ -2826,9 +2870,25 @@ void LegacySimulator::do_steep() { sp_header(fplog, SD, inputrec->em_tol, nsteps); } - EnergyEvaluator energyEvaluator{ fplog, mdlog, cr, ms, top_global, &top, - inputrec, imdSession, pull_work, nrnb, wcycle, gstat, - vsite, constr, mdAtoms, fr, runScheduleWork, enerd }; + EnergyEvaluator energyEvaluator{ fplog, + mdlog, + cr, + ms, + top_global, + &top, + inputrec, + imdSession, + pull_work, + nrnb, + wcycle, + gstat, + &observablesReducer, + vsite, + constr, + mdAtoms, + fr, + runScheduleWork, + enerd }; /**** HERE STARTS THE LOOP **** * count is the counter for the number of steps @@ -2853,7 +2913,7 @@ void LegacySimulator::do_steep() if (validStep) { - energyEvaluator.run(s_try, mu_tot, vir, pres, count, count == 0); + energyEvaluator.run(s_try, mu_tot, vir, pres, count, count == 0, count); } else { @@ -3087,6 +3147,8 @@ void LegacySimulator::do_nm() em_state_t state_work{}; + ObservablesReducer observablesReducer = observablesReducerBuilder->build(); + /* Init em and store the local state in state_minimum */ init_em(fplog, mdlog, @@ -3199,10 +3261,26 @@ void LegacySimulator::do_nm() /* Make evaluate_energy do a single node force calculation */ cr->nnodes = 1; - EnergyEvaluator energyEvaluator{ fplog, mdlog, cr, ms, top_global, &top, - inputrec, imdSession, pull_work, nrnb, wcycle, gstat, - vsite, constr, mdAtoms, fr, runScheduleWork, enerd }; - energyEvaluator.run(&state_work, mu_tot, vir, pres, -1, TRUE); + EnergyEvaluator energyEvaluator{ fplog, + mdlog, + cr, + ms, + top_global, + &top, + inputrec, + imdSession, + pull_work, + nrnb, + wcycle, + gstat, + &observablesReducer, + vsite, + constr, + mdAtoms, + fr, + runScheduleWork, + enerd }; + energyEvaluator.run(&state_work, mu_tot, vir, pres, -1, TRUE, 0); cr->nnodes = nnodes; /* if forces are not small, warn user */ @@ -3296,7 +3374,7 @@ void LegacySimulator::do_nm() } else { - energyEvaluator.run(&state_work, mu_tot, vir, pres, aid * 2 + dx, FALSE); + energyEvaluator.run(&state_work, mu_tot, vir, pres, aid * 2 + dx, FALSE, step); } cr->nnodes = nnodes; diff --git a/src/gromacs/mdrun/rerun.cpp b/src/gromacs/mdrun/rerun.cpp index cd648a504e..877f73dddc 100644 --- a/src/gromacs/mdrun/rerun.cpp +++ b/src/gromacs/mdrun/rerun.cpp @@ -113,6 +113,7 @@ #include "gromacs/mdtypes/mdatom.h" #include "gromacs/mdtypes/mdrunoptions.h" #include "gromacs/mdtypes/observableshistory.h" +#include "gromacs/mdtypes/observablesreducer.h" #include "gromacs/mdtypes/simulation_workload.h" #include "gromacs/mdtypes/state.h" #include "gromacs/mimic/utilities.h" @@ -268,6 +269,8 @@ void gmx::LegacySimulator::do_rerun() int nstglobalcomm = 1; const bool bNS = true; + ObservablesReducer observablesReducer = observablesReducerBuilder->build(); + const SimulationGroups* groups = &top_global.groups; if (ir->eI == IntegrationAlgorithm::Mimic) { @@ -384,6 +387,9 @@ void gmx::LegacySimulator::do_rerun() doFreeEnergyPerturbation = true; } + int64_t step = ir->init_step; + int64_t step_rel = 0; + { int cglo_flags = CGLO_GSTAT; if (DOMAINDECOMP(cr) && dd_localTopologyChecker(*cr->dd).shouldCheckNumberOfBondedInteractions()) @@ -413,7 +419,9 @@ void gmx::LegacySimulator::do_rerun() &nullSignaller, state->box, &bSumEkinhOld, - cglo_flags); + cglo_flags, + step, + &observablesReducer); if (DOMAINDECOMP(cr)) { dd_localTopologyChecker(cr->dd)->checkNumberOfBondedInteractions( @@ -510,9 +518,6 @@ void gmx::LegacySimulator::do_rerun() calc_shifts(rerun_fr.box, fr->shift_vec); } - int64_t step = ir->init_step; - int64_t step_rel = 0; - auto stopHandler = stopHandlerBuilder->getStopHandlerMD( compat::not_null(&signals[eglsSTOPCOND]), false, @@ -766,7 +771,9 @@ void gmx::LegacySimulator::do_rerun() &signaller, state->box, &bSumEkinhOld, - cglo_flags); + cglo_flags, + step, + &observablesReducer); if (DOMAINDECOMP(cr)) { dd_localTopologyChecker(cr->dd)->checkNumberOfBondedInteractions( diff --git a/src/gromacs/mdrun/runner.cpp b/src/gromacs/mdrun/runner.cpp index 765398cca5..09964ee8b7 100644 --- a/src/gromacs/mdrun/runner.cpp +++ b/src/gromacs/mdrun/runner.cpp @@ -128,6 +128,7 @@ #include "gromacs/mdtypes/mdatom.h" #include "gromacs/mdtypes/mdrunoptions.h" #include "gromacs/mdtypes/observableshistory.h" +#include "gromacs/mdtypes/observablesreducer.h" #include "gromacs/mdtypes/simulation_workload.h" #include "gromacs/mdtypes/state.h" #include "gromacs/mdtypes/state_propagator_data_gpu.h" @@ -1034,6 +1035,8 @@ int Mdrunner::mdrunner() doEssentialDynamics, membedHolder.doMembed()); + ObservablesReducerBuilder observablesReducerBuilder; + // Build restraints. // TODO: hide restraint implementation details from Mdrunner. // There is nothing unique about restraints at this point as far as the @@ -2016,7 +2019,7 @@ int Mdrunner::mdrunner() simulatorBuilder.add(SimulatorConfig(mdrunOptions, startingBehavior, &runScheduleWork)); - simulatorBuilder.add(SimulatorEnv(fplog, cr, ms, mdlog, oenv)); + simulatorBuilder.add(SimulatorEnv(fplog, cr, ms, mdlog, oenv, &observablesReducerBuilder)); simulatorBuilder.add(Profiling(&nrnb, walltime_accounting, wcycle.get())); simulatorBuilder.add(ConstraintsParam( constr.get(), enforcedRotation ? enforcedRotation->getLegacyEnfrot() : nullptr, vsite.get())); diff --git a/src/gromacs/mdrun/simulatorbuilder.cpp b/src/gromacs/mdrun/simulatorbuilder.cpp index 90b87f703d..87cab10cfe 100644 --- a/src/gromacs/mdrun/simulatorbuilder.cpp +++ b/src/gromacs/mdrun/simulatorbuilder.cpp @@ -155,6 +155,7 @@ std::unique_ptr SimulatorBuilder::build(bool useModularSimulator) profiling_->wallCycle, legacyInput_->forceRec, simulatorStateData_->enerdata_p, + simulatorEnv_->observablesReducerBuilder_, simulatorStateData_->ekindata_p, simulatorConfig_->runScheduleWork_, *replicaExchangeParameters_, @@ -192,6 +193,7 @@ std::unique_ptr SimulatorBuilder::build(bool useModularSimulator) profiling_->wallCycle, legacyInput_->forceRec, simulatorStateData_->enerdata_p, + simulatorEnv_->observablesReducerBuilder_, simulatorStateData_->ekindata_p, simulatorConfig_->runScheduleWork_, *replicaExchangeParameters_, diff --git a/src/gromacs/mdrun/simulatorbuilder.h b/src/gromacs/mdrun/simulatorbuilder.h index 5d03dbb050..5ab848fa80 100644 --- a/src/gromacs/mdrun/simulatorbuilder.h +++ b/src/gromacs/mdrun/simulatorbuilder.h @@ -77,6 +77,7 @@ class MDAtoms; class MDLogger; struct MDModulesNotifiers; struct MdrunOptions; +class ObservablesReducerBuilder; class ReadCheckpointDataHolder; enum class StartingBehavior; class StopHandlerBuilder; @@ -148,12 +149,13 @@ class SimulatorEnv { public: //! Build from current simulation environment. - SimulatorEnv(FILE* fplog, - t_commrec* commRec, - gmx_multisim_t* multisimCommRec, - const MDLogger& logger, - gmx_output_env_t* outputEnv) : - fplog_{ fplog }, commRec_{ commRec }, multisimCommRec_{ multisimCommRec }, logger_{ logger }, outputEnv_{ outputEnv } + SimulatorEnv(FILE* fplog, + t_commrec* commRec, + gmx_multisim_t* multisimCommRec, + const MDLogger& logger, + gmx_output_env_t* outputEnv, + ObservablesReducerBuilder* observablesReducerBuilder) : + fplog_{ fplog }, commRec_{ commRec }, multisimCommRec_{ multisimCommRec }, logger_{ logger }, outputEnv_{ outputEnv }, observablesReducerBuilder_{ observablesReducerBuilder } { } @@ -167,6 +169,8 @@ public: const MDLogger& logger_; //! Handle to file output handling. const gmx_output_env_t* outputEnv_; + //! Builder for coordinator of reduction for observables + ObservablesReducerBuilder* observablesReducerBuilder_; }; /*! \brief diff --git a/src/gromacs/modularsimulator/andersentemperaturecoupling.cpp b/src/gromacs/modularsimulator/andersentemperaturecoupling.cpp index c404b03534..cf5743bc40 100644 --- a/src/gromacs/modularsimulator/andersentemperaturecoupling.cpp +++ b/src/gromacs/modularsimulator/andersentemperaturecoupling.cpp @@ -153,7 +153,8 @@ ISimulatorElement* AndersenTemperatureCoupling::getElementPointerImpl( StatePropagatorData* statePropagatorData, EnergyData* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, - GlobalCommunicationHelper gmx_unused* globalCommunicationHelper) + GlobalCommunicationHelper gmx_unused* globalCommunicationHelper, + ObservablesReducer gmx_unused* observablesReducer) { GMX_RELEASE_ASSERT(legacySimulatorData->inputrec->etc == TemperatureCoupling::Andersen || legacySimulatorData->inputrec->etc == TemperatureCoupling::AndersenMassive, diff --git a/src/gromacs/modularsimulator/andersentemperaturecoupling.h b/src/gromacs/modularsimulator/andersentemperaturecoupling.h index cba4b56f95..6cab2cad28 100644 --- a/src/gromacs/modularsimulator/andersentemperaturecoupling.h +++ b/src/gromacs/modularsimulator/andersentemperaturecoupling.h @@ -92,7 +92,8 @@ public: * \param statePropagatorData Pointer to the \c StatePropagatorData object * \param energyData Pointer to the \c EnergyData object * \param freeEnergyPerturbationData Pointer to the \c FreeEnergyPerturbationData object - * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param observablesReducer Pointer to the \c ObservablesReducer object * * \return Pointer to the element to be added. Element needs to have been stored using \c storeElement */ @@ -101,7 +102,8 @@ public: StatePropagatorData* statePropagatorData, EnergyData* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, - GlobalCommunicationHelper* globalCommunicationHelper); + GlobalCommunicationHelper* globalCommunicationHelper, + ObservablesReducer* observablesReducer); //! Returns the frequency at which temperature coupling is performed [[nodiscard]] int frequency() const; diff --git a/src/gromacs/modularsimulator/computeglobalselement.cpp b/src/gromacs/modularsimulator/computeglobalselement.cpp index 3bf736748d..f54747211f 100644 --- a/src/gromacs/modularsimulator/computeglobalselement.cpp +++ b/src/gromacs/modularsimulator/computeglobalselement.cpp @@ -70,18 +70,19 @@ template ComputeGlobalsElement::ComputeGlobalsElement(StatePropagatorData* statePropagatorData, EnergyData* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, - SimulationSignals* signals, - int nstglobalcomm, - FILE* fplog, - const MDLogger& mdlog, - t_commrec* cr, - const t_inputrec* inputrec, - const MDAtoms* mdAtoms, - t_nrnb* nrnb, - gmx_wallcycle* wcycle, - t_forcerec* fr, - const gmx_mtop_t& global_top, - Constraints* constr) : + SimulationSignals* signals, + int nstglobalcomm, + FILE* fplog, + const MDLogger& mdlog, + t_commrec* cr, + const t_inputrec* inputrec, + const MDAtoms* mdAtoms, + t_nrnb* nrnb, + gmx_wallcycle* wcycle, + t_forcerec* fr, + const gmx_mtop_t& global_top, + Constraints* constr, + ObservablesReducer* observablesReducer) : energyReductionStep_(-1), virialReductionStep_(-1), vvSchedulingStep_(-1), @@ -106,7 +107,8 @@ ComputeGlobalsElement::ComputeGlobalsElement(StatePropagatorData* sta constr_(constr), nrnb_(nrnb), wcycle_(wcycle), - fr_(fr) + fr_(fr), + observablesReducer_(observablesReducer) { reportComRemovalInfo(fplog, vcm_); gstat_ = global_stat_init(inputrec_); @@ -310,7 +312,9 @@ void ComputeGlobalsElement::compute(gmx::Step step, signaller, lastbox, energyData_->needToSumEkinhOld(), - flags); + flags, + step, + observablesReducer_); if (DOMAINDECOMP(cr_)) { dd_localTopologyChecker(cr_->dd)->checkNumberOfBondedInteractions(localTopology_, x, box); @@ -366,7 +370,8 @@ ISimulatorElement* ComputeGlobalsElement::get StatePropagatorData* statePropagatorData, EnergyData* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, - GlobalCommunicationHelper* globalCommunicationHelper) + GlobalCommunicationHelper* globalCommunicationHelper, + ObservablesReducer* observablesReducer) { auto* element = builderHelper->storeElement( std::make_unique>( @@ -384,7 +389,8 @@ ISimulatorElement* ComputeGlobalsElement::get legacySimulatorData->wcycle, legacySimulatorData->fr, legacySimulatorData->top_global, - legacySimulatorData->constr)); + legacySimulatorData->constr, + observablesReducer)); return element; } @@ -396,7 +402,8 @@ ISimulatorElement* ComputeGlobalsElementwcycle, simulator->fr, simulator->top_global, - simulator->constr)); + simulator->constr, + observablesReducer)); builderHelper->storeBuilderData(key, vvComputeGlobalsElement); return vvComputeGlobalsElement; } diff --git a/src/gromacs/modularsimulator/computeglobalselement.h b/src/gromacs/modularsimulator/computeglobalselement.h index 2ae60fa096..f6905f20c7 100644 --- a/src/gromacs/modularsimulator/computeglobalselement.h +++ b/src/gromacs/modularsimulator/computeglobalselement.h @@ -62,6 +62,7 @@ class FreeEnergyPerturbationData; class LegacySimulatorData; class MDAtoms; class MDLogger; +class ObservablesReducer; //! \addtogroup module_modularsimulator //! \{ @@ -119,7 +120,8 @@ public: gmx_wallcycle* wcycle, t_forcerec* fr, const gmx_mtop_t& global_top, - Constraints* constr); + Constraints* constr, + ObservablesReducer* observablesReducer); //! Destructor ~ComputeGlobalsElement() override; @@ -152,7 +154,8 @@ public: * \param statePropagatorData Pointer to the \c StatePropagatorData object * \param energyData Pointer to the \c EnergyData object * \param freeEnergyPerturbationData Pointer to the \c FreeEnergyPerturbationData object - * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param observablesReducer Pointer to the \c ObservablesReducer object * * \throws std::bad_any_cast on internal error in VelocityVerlet algorithm builder. * \throws std::bad_alloc when out of memory. @@ -164,7 +167,8 @@ public: StatePropagatorData* statePropagatorData, EnergyData* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, - GlobalCommunicationHelper* globalCommunicationHelper); + GlobalCommunicationHelper* globalCommunicationHelper, + ObservablesReducer* observablesReducer); private: //! ITopologyClient implementation @@ -263,6 +267,8 @@ private: gmx_wallcycle* wcycle_; //! Parameters for force calculations. t_forcerec* fr_; + //! Coordinates reduction for observables + ObservablesReducer* observablesReducer_; }; //! \} diff --git a/src/gromacs/modularsimulator/constraintelement.cpp b/src/gromacs/modularsimulator/constraintelement.cpp index cbf914d09c..5c5f881357 100644 --- a/src/gromacs/modularsimulator/constraintelement.cpp +++ b/src/gromacs/modularsimulator/constraintelement.cpp @@ -238,7 +238,8 @@ ISimulatorElement* ConstraintsElement::getElementPointerImpl( StatePropagatorData* statePropagatorData, EnergyData* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, - GlobalCommunicationHelper gmx_unused* globalCommunicationHelper) + GlobalCommunicationHelper gmx_unused* globalCommunicationHelper, + ObservablesReducer* /*observablesReducer*/) { return builderHelper->storeElement( std::make_unique>(legacySimulatorData->constr, diff --git a/src/gromacs/modularsimulator/constraintelement.h b/src/gromacs/modularsimulator/constraintelement.h index d5564ba1b5..c8600dd689 100644 --- a/src/gromacs/modularsimulator/constraintelement.h +++ b/src/gromacs/modularsimulator/constraintelement.h @@ -1,7 +1,7 @@ /* * This file is part of the GROMACS molecular simulation package. * - * Copyright (c) 2019,2020, by the GROMACS development team, led by + * Copyright (c) 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. @@ -56,6 +56,7 @@ class FreeEnergyPerturbationData; class GlobalCommunicationHelper; class LegacySimulatorData; class ModularSimulatorAlgorithmBuilderHelper; +class ObservablesReducer; class StatePropagatorData; /*! \internal @@ -115,7 +116,8 @@ public: * \param statePropagatorData Pointer to the \c StatePropagatorData object * \param energyData Pointer to the \c EnergyData object * \param freeEnergyPerturbationData Pointer to the \c FreeEnergyPerturbationData object - * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param observablesReducer Pointer to the \c ObservablesReducer object * * \return Pointer to the element to be added. Element needs to have been stored using \c storeElement */ @@ -124,7 +126,8 @@ public: StatePropagatorData* statePropagatorData, EnergyData* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, - GlobalCommunicationHelper* globalCommunicationHelper); + GlobalCommunicationHelper* globalCommunicationHelper, + ObservablesReducer* observablesReducer); private: //! The actual constraining computation diff --git a/src/gromacs/modularsimulator/energydata.cpp b/src/gromacs/modularsimulator/energydata.cpp index 5553ec2b8d..f2a58538cb 100644 --- a/src/gromacs/modularsimulator/energydata.cpp +++ b/src/gromacs/modularsimulator/energydata.cpp @@ -552,7 +552,8 @@ ISimulatorElement* EnergyData::Element::getElementPointerImpl( StatePropagatorData gmx_unused* statePropagatorData, EnergyData* energyData, FreeEnergyPerturbationData gmx_unused* freeEnergyPerturbationData, - GlobalCommunicationHelper gmx_unused* globalCommunicationHelper) + GlobalCommunicationHelper gmx_unused* globalCommunicationHelper, + ObservablesReducer* /*observablesReducer*/) { return energyData->element(); } diff --git a/src/gromacs/modularsimulator/energydata.h b/src/gromacs/modularsimulator/energydata.h index b4f2635acf..9f6411c1f0 100644 --- a/src/gromacs/modularsimulator/energydata.h +++ b/src/gromacs/modularsimulator/energydata.h @@ -66,6 +66,7 @@ class GlobalCommunicationHelper; class LegacySimulatorData; class MDAtoms; class ModularSimulatorAlgorithmBuilderHelper; +class ObservablesReducer; class ParrinelloRahmanBarostat; class StatePropagatorData; class VelocityScalingTemperatureCoupling; @@ -392,7 +393,8 @@ public: * \param statePropagatorData Pointer to the \c StatePropagatorData object * \param energyData Pointer to the \c EnergyData object * \param freeEnergyPerturbationData Pointer to the \c FreeEnergyPerturbationData object - * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param observablesReducer Pointer to the \c ObservablesReducer object * * \return Pointer to the element to be added. Element needs to have been stored using \c storeElement */ @@ -401,7 +403,8 @@ public: StatePropagatorData* statePropagatorData, EnergyData* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, - GlobalCommunicationHelper* globalCommunicationHelper); + GlobalCommunicationHelper* globalCommunicationHelper, + ObservablesReducer* observablesReducer); private: EnergyData* energyData_; diff --git a/src/gromacs/modularsimulator/firstorderpressurecoupling.cpp b/src/gromacs/modularsimulator/firstorderpressurecoupling.cpp index c1ecee52b9..ed9363d8ec 100644 --- a/src/gromacs/modularsimulator/firstorderpressurecoupling.cpp +++ b/src/gromacs/modularsimulator/firstorderpressurecoupling.cpp @@ -239,8 +239,9 @@ ISimulatorElement* FirstOrderPressureCoupling::getElementPointerImpl( EnergyData* energyData, FreeEnergyPerturbationData gmx_unused* freeEnergyPerturbationData, GlobalCommunicationHelper gmx_unused* globalCommunicationHelper, - int offset, - ReportPreviousStepConservedEnergy reportPreviousStepConservedEnergy) + ObservablesReducer* /*observablesReducer*/, + int offset, + ReportPreviousStepConservedEnergy reportPreviousStepConservedEnergy) { return builderHelper->storeElement(std::make_unique( legacySimulatorData->inputrec->nstpcouple, diff --git a/src/gromacs/modularsimulator/firstorderpressurecoupling.h b/src/gromacs/modularsimulator/firstorderpressurecoupling.h index 78c9e9a166..489c8a4cbd 100644 --- a/src/gromacs/modularsimulator/firstorderpressurecoupling.h +++ b/src/gromacs/modularsimulator/firstorderpressurecoupling.h @@ -59,6 +59,7 @@ class GlobalCommunicationHelper; class LegacySimulatorData; class MDAtoms; class ModularSimulatorAlgorithmBuilderHelper; +class ObservablesReducer; class StatePropagatorData; /*! \internal @@ -102,7 +103,8 @@ public: * \param statePropagatorData Pointer to the \c StatePropagatorData object * \param energyData Pointer to the \c EnergyData object * \param freeEnergyPerturbationData Pointer to the \c FreeEnergyPerturbationData object - * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param observablesReducer Pointer to the \c ObservablesReducer object * \param offset The step offset at which the barostat is applied * \param reportPreviousStepConservedEnergy Report the previous or the current step conserved energy * @@ -115,6 +117,7 @@ public: EnergyData* energyData, FreeEnergyPerturbationData gmx_unused* freeEnergyPerturbationData, GlobalCommunicationHelper gmx_unused* globalCommunicationHelper, + ObservablesReducer* observablesReducer, int offset, ReportPreviousStepConservedEnergy reportPreviousStepConservedEnergy); diff --git a/src/gromacs/modularsimulator/forceelement.cpp b/src/gromacs/modularsimulator/forceelement.cpp index 77565e161c..586e1bc2be 100644 --- a/src/gromacs/modularsimulator/forceelement.cpp +++ b/src/gromacs/modularsimulator/forceelement.cpp @@ -171,7 +171,7 @@ void ForceElement::run(Step step, Time time, unsigned int flags) { // TODO: Correcting the box is done in DomDecHelper (if using DD) or here (non-DD simulations). // Think about unifying this responsibility, could this be done in one place? - auto box = statePropagatorData_->box(); + auto* box = statePropagatorData_->box(); correct_box(fplog_, step, box); } @@ -180,10 +180,10 @@ void ForceElement::run(Step step, Time time, unsigned int flags) * This is parallelized as well, and does communication too. * Check comments in sim_util.c */ - auto x = statePropagatorData_->positionsView(); - auto& forces = statePropagatorData_->forcesView(); - auto box = statePropagatorData_->constBox(); - history_t* hist = nullptr; // disabled + auto x = statePropagatorData_->positionsView(); + auto& forces = statePropagatorData_->forcesView(); + const auto* box = statePropagatorData_->constBox(); + history_t* hist = nullptr; // disabled tensor force_vir = { { 0 } }; // TODO: Make lambda const (needs some adjustments in lower force routines) @@ -307,7 +307,8 @@ ForceElement::getElementPointerImpl(LegacySimulatorData* lega StatePropagatorData* statePropagatorData, EnergyData* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, - GlobalCommunicationHelper gmx_unused* globalCommunicationHelper) + GlobalCommunicationHelper gmx_unused* globalCommunicationHelper, + ObservablesReducer* /*observablesReducer*/) { const bool isVerbose = legacySimulatorData->mdrunOptions.verbose; const bool isDynamicBox = inputrecDynamicBox(legacySimulatorData->inputrec); diff --git a/src/gromacs/modularsimulator/forceelement.h b/src/gromacs/modularsimulator/forceelement.h index 27ba90a665..c778d37be9 100644 --- a/src/gromacs/modularsimulator/forceelement.h +++ b/src/gromacs/modularsimulator/forceelement.h @@ -74,6 +74,7 @@ class LegacySimulatorData; class MDAtoms; class MdrunScheduleWorkload; class ModularSimulatorAlgorithmBuilderHelper; +class ObservablesReducer; class StatePropagatorData; class VirtualSitesHandler; @@ -132,7 +133,8 @@ public: * \param statePropagatorData Pointer to the \c StatePropagatorData object * \param energyData Pointer to the \c EnergyData object * \param freeEnergyPerturbationData Pointer to the \c FreeEnergyPerturbationData object - * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param observablesReducer Pointer to the \c ObservablesReducer object * * \return Pointer to the element to be added. Element needs to have been stored using \c storeElement */ @@ -141,7 +143,8 @@ public: StatePropagatorData* statePropagatorData, EnergyData* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, - GlobalCommunicationHelper* globalCommunicationHelper); + GlobalCommunicationHelper* globalCommunicationHelper, + ObservablesReducer* observablesReducer); private: //! ITopologyHolderClient implementation diff --git a/src/gromacs/modularsimulator/modularsimulator.h b/src/gromacs/modularsimulator/modularsimulator.h index 42d170e2e7..82d6068a8f 100644 --- a/src/gromacs/modularsimulator/modularsimulator.h +++ b/src/gromacs/modularsimulator/modularsimulator.h @@ -1,7 +1,7 @@ /* * This file is part of the GROMACS molecular simulation package. * - * Copyright (c) 2019,2020, by the GROMACS development team, led by + * Copyright (c) 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. diff --git a/src/gromacs/modularsimulator/mttk.cpp b/src/gromacs/modularsimulator/mttk.cpp index 524519038d..22517e5238 100644 --- a/src/gromacs/modularsimulator/mttk.cpp +++ b/src/gromacs/modularsimulator/mttk.cpp @@ -594,7 +594,8 @@ ISimulatorElement* MttkElement::getElementPointerImpl( StatePropagatorData gmx_unused* statePropagatorData, EnergyData* energyData, FreeEnergyPerturbationData gmx_unused* freeEnergyPerturbationData, - GlobalCommunicationHelper gmx_unused* globalCommunicationHelper, + GlobalCommunicationHelper gmx_unused* globalCommunicationHelper, + ObservablesReducer gmx_unused* observablesReducer, Offset offset, ScheduleOnInitStep scheduleOnInitStep, const MttkPropagatorConnectionDetails& mttkPropagatorConnectionDetails) @@ -665,7 +666,8 @@ ISimulatorElement* MttkBoxScaling::getElementPointerImpl( StatePropagatorData* statePropagatorData, EnergyData* energyData, FreeEnergyPerturbationData gmx_unused* freeEnergyPerturbationData, - GlobalCommunicationHelper gmx_unused* globalCommunicationHelper, + GlobalCommunicationHelper gmx_unused* globalCommunicationHelper, + ObservablesReducer gmx_unused* observablesReducer, const MttkPropagatorConnectionDetails& mttkPropagatorConnectionDetails) { // Data is now owned by the caller of this method, who will handle lifetime (see ModularSimulatorAlgorithm) diff --git a/src/gromacs/modularsimulator/mttk.h b/src/gromacs/modularsimulator/mttk.h index a9549fe3e5..fa03a8dde7 100644 --- a/src/gromacs/modularsimulator/mttk.h +++ b/src/gromacs/modularsimulator/mttk.h @@ -319,10 +319,10 @@ public: * \param energyData Pointer to the \c EnergyData object * \param freeEnergyPerturbationData Pointer to the \c FreeEnergyPerturbationData object * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param observablesReducer Pointer to the \c ObservablesReducer object * \param offset The step offset at which the thermostat is applied * \param scheduleOnInitStep Whether the element is scheduled on the initial step * \param mttkPropagatorConnectionDetails Reference to the \c MttkPropagatorConnectionDetails object containing propagator tags and offsets - * * \return Pointer to the element to be added. Element needs to have been stored using \c storeElement */ @@ -333,6 +333,7 @@ public: EnergyData* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, GlobalCommunicationHelper* globalCommunicationHelper, + ObservablesReducer* observablesReducer, Offset offset, ScheduleOnInitStep scheduleOnInitStep, const MttkPropagatorConnectionDetails& mttkPropagatorConnectionDetails); @@ -397,7 +398,8 @@ public: * \param statePropagatorData Pointer to the \c StatePropagatorData object * \param energyData Pointer to the \c EnergyData object * \param freeEnergyPerturbationData Pointer to the \c FreeEnergyPerturbationData object - * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param observablesReducer Pointer to the \c ObservablesReducer object * \param mttkPropagatorConnectionDetails Reference to the \c MttkPropagatorConnectionDetails object containing propagator tags and offsets * * \return Pointer to the element to be added. Element needs to have been stored using \c storeElement @@ -409,6 +411,7 @@ public: EnergyData* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, GlobalCommunicationHelper* globalCommunicationHelper, + ObservablesReducer* observablesReducer, const MttkPropagatorConnectionDetails& mttkPropagatorConnectionDetails); private: diff --git a/src/gromacs/modularsimulator/nosehooverchains.cpp b/src/gromacs/modularsimulator/nosehooverchains.cpp index da1ecbd2d7..60826edc88 100644 --- a/src/gromacs/modularsimulator/nosehooverchains.cpp +++ b/src/gromacs/modularsimulator/nosehooverchains.cpp @@ -712,6 +712,7 @@ ISimulatorElement* NoseHooverChainsElement::getElementPointerImpl( EnergyData* energyData, FreeEnergyPerturbationData gmx_unused* freeEnergyPerturbationData, GlobalCommunicationHelper gmx_unused* globalCommunicationHelper, + ObservablesReducer* observablesReducer, NhcUsage nhcUsage, Offset offset, UseFullStepKE useFullStepKE, @@ -729,6 +730,7 @@ ISimulatorElement* NoseHooverChainsElement::getElementPointerImpl( energyData, freeEnergyPerturbationData, globalCommunicationHelper, + observablesReducer, nhcUsage, offset, useFullStepKE, @@ -743,11 +745,12 @@ ISimulatorElement* NoseHooverChainsElement::getElementPointerImpl( EnergyData* energyData, FreeEnergyPerturbationData gmx_unused* freeEnergyPerturbationData, GlobalCommunicationHelper gmx_unused* globalCommunicationHelper, - NhcUsage nhcUsage, - Offset offset, - UseFullStepKE useFullStepKE, - ScheduleOnInitStep scheduleOnInitStep, - const PropagatorTag& propagatorTag) + ObservablesReducer gmx_unused* observablesReducer, + NhcUsage nhcUsage, + Offset offset, + UseFullStepKE useFullStepKE, + ScheduleOnInitStep scheduleOnInitStep, + const PropagatorTag& propagatorTag) { if (!builderHelper->simulationData(NoseHooverChainsData::dataID(nhcUsage))) { diff --git a/src/gromacs/modularsimulator/nosehooverchains.h b/src/gromacs/modularsimulator/nosehooverchains.h index 75c97b7f77..0abf32d0c2 100644 --- a/src/gromacs/modularsimulator/nosehooverchains.h +++ b/src/gromacs/modularsimulator/nosehooverchains.h @@ -60,6 +60,7 @@ class ModularSimulatorAlgorithmBuilderHelper; struct MttkPropagatorConnectionDetails; class MttkData; class NoseHooverGroup; +class ObservablesReducer; class StatePropagatorData; enum class UseFullStepKE; @@ -207,7 +208,8 @@ public: * \param statePropagatorData Pointer to the \c StatePropagatorData object * \param energyData Pointer to the \c EnergyData object * \param freeEnergyPerturbationData Pointer to the \c FreeEnergyPerturbationData object - * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param observablesReducer Pointer to the \c ObservablesReducer object * \param nhcUsage What the NHC is connected to - system or barostat * \param offset The step offset at which the thermostat is applied * \param useFullStepKE Whether full step or half step KE is used @@ -223,6 +225,7 @@ public: EnergyData* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, GlobalCommunicationHelper* globalCommunicationHelper, + ObservablesReducer* observablesReducer, NhcUsage nhcUsage, Offset offset, UseFullStepKE useFullStepKE, @@ -236,7 +239,8 @@ public: * \param statePropagatorData Pointer to the \c StatePropagatorData object * \param energyData Pointer to the \c EnergyData object * \param freeEnergyPerturbationData Pointer to the \c FreeEnergyPerturbationData object - * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param observablesReducer Pointer to the \c ObservablesReducer object * \param nhcUsage What the NHC is connected to - system or barostat * \param offset The step offset at which the thermostat is applied * \param useFullStepKE Whether full step or half step KE is used @@ -251,6 +255,7 @@ public: EnergyData* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, GlobalCommunicationHelper* globalCommunicationHelper, + ObservablesReducer* observablesReducer, NhcUsage nhcUsage, Offset offset, UseFullStepKE useFullStepKE, diff --git a/src/gromacs/modularsimulator/parrinellorahmanbarostat.cpp b/src/gromacs/modularsimulator/parrinellorahmanbarostat.cpp index 95a6150088..d38f669fb5 100644 --- a/src/gromacs/modularsimulator/parrinellorahmanbarostat.cpp +++ b/src/gromacs/modularsimulator/parrinellorahmanbarostat.cpp @@ -331,8 +331,9 @@ ISimulatorElement* ParrinelloRahmanBarostat::getElementPointerImpl( EnergyData* energyData, FreeEnergyPerturbationData gmx_unused* freeEnergyPerturbationData, GlobalCommunicationHelper gmx_unused* globalCommunicationHelper, - Offset offset, - const PropagatorTag& propagatorTag) + ObservablesReducer* /*observablesReducer*/, + Offset offset, + const PropagatorTag& propagatorTag) { auto* element = builderHelper->storeElement(std::make_unique( legacySimulatorData->inputrec->nstpcouple, diff --git a/src/gromacs/modularsimulator/parrinellorahmanbarostat.h b/src/gromacs/modularsimulator/parrinellorahmanbarostat.h index b49ba6de17..0e08fb5406 100644 --- a/src/gromacs/modularsimulator/parrinellorahmanbarostat.h +++ b/src/gromacs/modularsimulator/parrinellorahmanbarostat.h @@ -58,6 +58,7 @@ enum class CheckpointDataOperation; class EnergyData; class LegacySimulatorData; class MDAtoms; +class ObservablesReducer; class StatePropagatorData; /*! \internal @@ -118,7 +119,8 @@ public: * \param statePropagatorData Pointer to the \c StatePropagatorData object * \param energyData Pointer to the \c EnergyData object * \param freeEnergyPerturbationData Pointer to the \c FreeEnergyPerturbationData object - * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param observablesReducer Pointer to the \c ObservablesReducer object * \param propagatorTag Tag of the propagator to connect to * \param offset The step offset at which the barostat is applied * @@ -131,6 +133,7 @@ public: EnergyData* energyData, FreeEnergyPerturbationData gmx_unused* freeEnergyPerturbationData, GlobalCommunicationHelper gmx_unused* globalCommunicationHelper, + ObservablesReducer* observablesReducer, Offset offset, const PropagatorTag& propagatorTag); diff --git a/src/gromacs/modularsimulator/propagator.cpp b/src/gromacs/modularsimulator/propagator.cpp index bf819fb323..5b2e020889 100644 --- a/src/gromacs/modularsimulator/propagator.cpp +++ b/src/gromacs/modularsimulator/propagator.cpp @@ -915,19 +915,19 @@ static PropagatorConnection getConnection(Propagator gmx_unuse return propagator->velocityScalingCallback(); }; } - if constexpr (hasStartVelocityScaling()) + if constexpr (hasStartVelocityScaling()) // NOLINT(readability-misleading-indentation) { propagatorConnection.getViewOnStartVelocityScaling = [propagator]() { return propagator->viewOnStartVelocityScaling(); }; } - if constexpr (hasEndVelocityScaling()) + if constexpr (hasEndVelocityScaling()) // NOLINT(readability-misleading-indentation) { propagatorConnection.getViewOnEndVelocityScaling = [propagator]() { return propagator->viewOnEndVelocityScaling(); }; } - if constexpr (hasPositionScaling()) + if constexpr (hasPositionScaling()) // NOLINT(readability-misleading-indentation) { propagatorConnection.setNumPositionScalingVariables = [propagator](int num) { propagator->setNumPositionScalingVariables(num); @@ -939,7 +939,7 @@ static PropagatorConnection getConnection(Propagator gmx_unuse return propagator->positionScalingCallback(); }; } - if constexpr (hasParrinelloRahmanScaling()) + if constexpr (hasParrinelloRahmanScaling()) // NOLINT(readability-misleading-indentation) { propagatorConnection.getViewOnPRScalingMatrix = [propagator]() { return propagator->viewOnPRScalingMatrix(); @@ -949,7 +949,7 @@ static PropagatorConnection getConnection(Propagator gmx_unuse }; } - return propagatorConnection; + return propagatorConnection; // NOLINT(readability-misleading-indentation) } // doxygen is confused by the two definitions @@ -962,8 +962,9 @@ ISimulatorElement* Propagator::getElementPointerImpl( EnergyData gmx_unused* energyData, FreeEnergyPerturbationData gmx_unused* freeEnergyPerturbationData, GlobalCommunicationHelper gmx_unused* globalCommunicationHelper, - const PropagatorTag& propagatorTag, - TimeStep timestep) + ObservablesReducer* /* observablesReducer */, + const PropagatorTag& propagatorTag, + TimeStep timestep) { GMX_RELEASE_ASSERT(!(integrationStage == IntegrationStage::ScaleVelocities || integrationStage == IntegrationStage::ScalePositions) @@ -984,6 +985,7 @@ ISimulatorElement* Propagator::getElementPointerImpl( EnergyData* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, GlobalCommunicationHelper* globalCommunicationHelper, + ObservablesReducer* observablesReducer, const PropagatorTag& propagatorTag) { GMX_RELEASE_ASSERT( @@ -996,6 +998,7 @@ ISimulatorElement* Propagator::getElementPointerImpl( energyData, freeEnergyPerturbationData, globalCommunicationHelper, + observablesReducer, propagatorTag, TimeStep(0.0)); } diff --git a/src/gromacs/modularsimulator/propagator.h b/src/gromacs/modularsimulator/propagator.h index 631a98f133..02c32ede83 100644 --- a/src/gromacs/modularsimulator/propagator.h +++ b/src/gromacs/modularsimulator/propagator.h @@ -62,6 +62,7 @@ class GlobalCommunicationHelper; class LegacySimulatorData; class MDAtoms; class ModularSimulatorAlgorithmBuilderHelper; +class ObservablesReducer; class StatePropagatorData; //! \addtogroup module_modularsimulator @@ -178,7 +179,8 @@ public: * \param statePropagatorData Pointer to the \c StatePropagatorData object * \param energyData Pointer to the \c EnergyData object * \param freeEnergyPerturbationData Pointer to the \c FreeEnergyPerturbationData object - * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param observablesReducer Pointer to the \c ObservablesReducer object * \param propagatorTag The name of the propagator to simplify connection * \param timestep The time step the propagator uses * @@ -190,6 +192,7 @@ public: EnergyData* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, GlobalCommunicationHelper* globalCommunicationHelper, + ObservablesReducer* observablesReducer, const PropagatorTag& propagatorTag, TimeStep timestep); @@ -202,7 +205,8 @@ public: * \param statePropagatorData Pointer to the \c StatePropagatorData object * \param energyData Pointer to the \c EnergyData object * \param freeEnergyPerturbationData Pointer to the \c FreeEnergyPerturbationData object - * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param observablesReducer Pointer to the \c ObservablesReducer object * \param propagatorTag The name of the propagator to simplify connection * * \return Pointer to the element to be added. Element needs to have been stored using \c storeElement @@ -213,6 +217,7 @@ public: EnergyData* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, GlobalCommunicationHelper* globalCommunicationHelper, + ObservablesReducer* observablesReducer, const PropagatorTag& propagatorTag); private: diff --git a/src/gromacs/modularsimulator/simulatoralgorithm.cpp b/src/gromacs/modularsimulator/simulatoralgorithm.cpp index f4abbf7add..4b035d12ae 100644 --- a/src/gromacs/modularsimulator/simulatoralgorithm.cpp +++ b/src/gromacs/modularsimulator/simulatoralgorithm.cpp @@ -411,6 +411,7 @@ ModularSimulatorAlgorithmBuilder::ModularSimulatorAlgorithmBuilder( legacySimulatorData->inputrec, legacySimulatorData->cr), signals_.get()), + observablesReducer_(legacySimulatorData->observablesReducerBuilder->build()), checkpointHelperBuilder_(std::move(checkpointDataHolder), legacySimulatorData->startingBehavior, legacySimulatorData->cr) diff --git a/src/gromacs/modularsimulator/simulatoralgorithm.h b/src/gromacs/modularsimulator/simulatoralgorithm.h index eb559245a4..1c6daaa0be 100644 --- a/src/gromacs/modularsimulator/simulatoralgorithm.h +++ b/src/gromacs/modularsimulator/simulatoralgorithm.h @@ -55,6 +55,7 @@ #include #include "gromacs/mdrun/isimulator.h" +#include "gromacs/mdtypes/observablesreducer.h" #include "gromacs/mdtypes/state.h" #include "gromacs/utility/exceptions.h" @@ -287,7 +288,7 @@ private: * * This includes data that needs to be shared between elements involved in * global communication. This will become obsolete as soon as global - * communication is moved to a client system (#3421). + * communication is moved to a client system (#3421 and #3887). */ class GlobalCommunicationHelper { @@ -438,8 +439,10 @@ private: std::unique_ptr signals_; //! Helper object passed to element factory functions ModularSimulatorAlgorithmBuilderHelper elementAdditionHelper_; - //! Container for global computation data + //! Container for minor aspects of global computation data GlobalCommunicationHelper globalCommunicationHelper_; + //! Coordinates reduction for observables + ObservablesReducer observablesReducer_; /*! \brief Set arbitrary data in the ModularSimulatorAlgorithm * @@ -565,7 +568,8 @@ private: * StatePropagatorData* statePropagatorData, * EnergyData* energyData, * FreeEnergyPerturbationData* freeEnergyPerturbationData, - * GlobalCommunicationHelper* globalCommunicationHelper) + * GlobalCommunicationHelper* globalCommunicationHelper, + * ObservablesReducer* observablesReducer) * * This function may also accept additional parameters which are passed using the variadic * template parameter pack forwarded in getElementPointer. @@ -595,7 +599,8 @@ private: * \param statePropagatorData Pointer to the \c StatePropagatorData object * \param energyData Pointer to the \c EnergyData object * \param freeEnergyPerturbationData Pointer to the \c FreeEnergyPerturbationData object - * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param observablesReducer Pointer to the \c ObservablesReducer object * \param args Variable number of additional parameters to be forwarded * * \return Pointer to the element to be added. Element needs to have been stored using \c storeElement @@ -607,6 +612,7 @@ ISimulatorElement* getElementPointer(LegacySimulatorData* leg EnergyData* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, GlobalCommunicationHelper* globalCommunicationHelper, + ObservablesReducer* observablesReducer, Args&&... args) { return Element::getElementPointerImpl(legacySimulatorData, @@ -615,6 +621,7 @@ ISimulatorElement* getElementPointer(LegacySimulatorData* leg energyData, freeEnergyPerturbationData, globalCommunicationHelper, + observablesReducer, std::forward(args)...); } @@ -634,6 +641,7 @@ void ModularSimulatorAlgorithmBuilder::add(Args&&... args) energyData_.get(), freeEnergyPerturbationData_.get(), &globalCommunicationHelper_, + &observablesReducer_, std::forward(args)...)); // Make sure returned element pointer is owned by *this diff --git a/src/gromacs/modularsimulator/statepropagatordata.cpp b/src/gromacs/modularsimulator/statepropagatordata.cpp index c9f7296409..a0177f43c9 100644 --- a/src/gromacs/modularsimulator/statepropagatordata.cpp +++ b/src/gromacs/modularsimulator/statepropagatordata.cpp @@ -796,7 +796,8 @@ ISimulatorElement* StatePropagatorData::Element::getElementPointerImpl( StatePropagatorData* statePropagatorData, EnergyData gmx_unused* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, - GlobalCommunicationHelper gmx_unused* globalCommunicationHelper) + GlobalCommunicationHelper gmx_unused* globalCommunicationHelper, + ObservablesReducer* /*observablesReducer*/) { statePropagatorData->element()->setFreeEnergyPerturbationData(freeEnergyPerturbationData); return statePropagatorData->element(); diff --git a/src/gromacs/modularsimulator/statepropagatordata.h b/src/gromacs/modularsimulator/statepropagatordata.h index 78007403d5..d0f4902765 100644 --- a/src/gromacs/modularsimulator/statepropagatordata.h +++ b/src/gromacs/modularsimulator/statepropagatordata.h @@ -71,6 +71,7 @@ class FreeEnergyPerturbationData; class GlobalCommunicationHelper; class LegacySimulatorData; class ModularSimulatorAlgorithmBuilderHelper; +class ObservablesReducer; /*! \internal * \ingroup module_modularsimulator @@ -333,7 +334,8 @@ public: * \param statePropagatorData Pointer to the \c StatePropagatorData object * \param energyData Pointer to the \c EnergyData object * \param freeEnergyPerturbationData Pointer to the \c FreeEnergyPerturbationData object - * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param observablesReducer Pointer to the \c ObservablesReducer object * * \return Pointer to the element to be added. Element needs to have been stored using \c storeElement */ @@ -342,7 +344,8 @@ public: StatePropagatorData* statePropagatorData, EnergyData* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, - GlobalCommunicationHelper* globalCommunicationHelper); + GlobalCommunicationHelper* globalCommunicationHelper, + ObservablesReducer* observablesReducer); private: //! Pointer to the associated StatePropagatorData diff --git a/src/gromacs/modularsimulator/velocityscalingtemperaturecoupling.cpp b/src/gromacs/modularsimulator/velocityscalingtemperaturecoupling.cpp index 847bb15a8f..47df3fc82a 100644 --- a/src/gromacs/modularsimulator/velocityscalingtemperaturecoupling.cpp +++ b/src/gromacs/modularsimulator/velocityscalingtemperaturecoupling.cpp @@ -741,10 +741,11 @@ ISimulatorElement* VelocityScalingTemperatureCoupling::getElementPointerImpl( EnergyData* energyData, FreeEnergyPerturbationData gmx_unused* freeEnergyPerturbationData, GlobalCommunicationHelper gmx_unused* globalCommunicationHelper, - Offset offset, - UseFullStepKE useFullStepKE, - ReportPreviousStepConservedEnergy reportPreviousStepConservedEnergy, - const PropagatorTag& propagatorTag) + ObservablesReducer* /*observablesReducer*/, + Offset offset, + UseFullStepKE useFullStepKE, + ReportPreviousStepConservedEnergy reportPreviousStepConservedEnergy, + const PropagatorTag& propagatorTag) { // Element is now owned by the caller of this method, who will handle lifetime (see ModularSimulatorAlgorithm) auto* element = builderHelper->storeElement(std::make_unique( diff --git a/src/gromacs/modularsimulator/velocityscalingtemperaturecoupling.h b/src/gromacs/modularsimulator/velocityscalingtemperaturecoupling.h index 9bd04b9e46..6054ae71da 100644 --- a/src/gromacs/modularsimulator/velocityscalingtemperaturecoupling.h +++ b/src/gromacs/modularsimulator/velocityscalingtemperaturecoupling.h @@ -57,6 +57,7 @@ namespace gmx { class ITemperatureCouplingImpl; class LegacySimulatorData; +class ObservablesReducer; struct TemperatureCouplingData; //! Enum describing whether the thermostat is using full or half step kinetic energy @@ -129,7 +130,8 @@ public: * \param statePropagatorData Pointer to the \c StatePropagatorData object * \param energyData Pointer to the \c EnergyData object * \param freeEnergyPerturbationData Pointer to the \c FreeEnergyPerturbationData object - * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object + * \param observablesReducer Pointer to the \c ObservablesReducer object * \param propagatorTag Tag of the propagator to connect to * \param offset The step offset at which the thermostat is applied * \param useFullStepKE Whether full step or half step KE is used @@ -144,6 +146,7 @@ public: EnergyData* energyData, FreeEnergyPerturbationData* freeEnergyPerturbationData, GlobalCommunicationHelper* globalCommunicationHelper, + ObservablesReducer* observablesReducer, Offset offset, UseFullStepKE useFullStepKE, ReportPreviousStepConservedEnergy reportPreviousStepConservedEnergy,