#include "gromacs/domdec/domdec.h"
#include "gromacs/domdec/domdec_network.h"
#include "gromacs/domdec/domdec_struct.h"
+#include "gromacs/domdec/localtopologychecker.h"
#include "gromacs/domdec/mdsetup.h"
#include "gromacs/domdec/partition.h"
#include "gromacs/essentialdynamics/edsam.h"
#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"
void gmx::LegacySimulator::do_mimic()
{
const t_inputrec* ir = inputrec;
- int64_t step, step_rel;
double t;
bool isLastStep = false;
bool doFreeEnergyPerturbation = false;
int nstglobalcomm = 1;
const bool bNS = true;
+ ObservablesReducer observablesReducer = observablesReducerBuilder->build();
+
if (MASTER(cr))
{
MimicCommunicator::init();
- auto nonConstGlobalTopology = const_cast<gmx_mtop_t*>(&top_global);
+ auto* nonConstGlobalTopology = const_cast<gmx_mtop_t*>(&top_global);
MimicCommunicator::sendInitData(nonConstGlobalTopology, state_global->x);
// TODO: Avoid changing inputrec (#3854)
auto* nonConstInputrec = const_cast<t_inputrec*>(inputrec);
nonConstInputrec->nsteps = MimicCommunicator::getStepNumber();
}
- if (DOMAINDECOMP(cr))
+ if (haveDDAtomOrdering(*cr))
{
// TODO: Avoid changing inputrec (#3854)
auto* nonConstInputrec = const_cast<t_inputrec*>(inputrec);
const SimulationGroups* groups = &top_global.groups;
{
- auto nonConstGlobalTopology = const_cast<gmx_mtop_t*>(&top_global);
+ auto* nonConstGlobalTopology = const_cast<gmx_mtop_t*>(&top_global);
nonConstGlobalTopology->intermolecularExclusionGroup = genQmmmIndices(top_global);
}
initialize_lambdas(fplog,
- *ir,
+ ir->efep,
+ ir->bSimTemp,
+ *ir->fepvals,
+ ir->simtempvals->temperatures,
gmx::arrayRefFromArray(ir->opts.ref_t, ir->opts.ngtc),
MASTER(cr),
&state_global->fep_state,
mdrunOptions,
cr,
outputProvider,
- mdModulesNotifier,
+ mdModulesNotifiers,
ir,
top_global,
oenv,
true,
StartingBehavior::NewSimulation,
simulationsShareState,
- mdModulesNotifier);
+ mdModulesNotifiers);
gstat = global_stat_init(ir);
top_global,
constr ? constr->numFlexibleConstraints() : 0,
ir->nstcalcenergy,
- DOMAINDECOMP(cr),
+ haveDDAtomOrdering(*cr),
runScheduleWork->simulationWork.useGpuPme);
{
}
}
- // Local state only becomes valid now.
- std::unique_ptr<t_state> stateInstance;
- t_state* state;
-
- gmx_localtop_t top(top_global.ffparams);
-
- if (DOMAINDECOMP(cr))
+ if (haveDDAtomOrdering(*cr))
{
- stateInstance = std::make_unique<t_state>();
- state = stateInstance.get();
+ // Local state only becomes valid now.
dd_init_local_state(*cr->dd, state_global, state);
/* Distribute the charge groups over the nodes from the master node */
state,
&f,
mdAtoms,
- &top,
+ top,
fr,
vsite,
constr,
else
{
state_change_natoms(state_global, state_global->natoms);
- /* Copy the pointer to the global state */
- state = state_global;
-
- mdAlgorithmsSetupAtomData(cr, *ir, top_global, &top, fr, &f, mdAtoms, constr, vsite, shellfc);
+ mdAlgorithmsSetupAtomData(cr, *ir, top_global, top, fr, &f, mdAtoms, constr, vsite, shellfc);
}
- auto mdatoms = mdAtoms->mdatoms();
+ auto* mdatoms = mdAtoms->mdatoms();
// NOTE: The global state is no longer used at this point.
// But state_global is still used as temporary storage space for writing
// (Global topology should persist.)
update_mdatoms(mdatoms, state->lambda[FreeEnergyPerturbationCouplingType::Mass]);
+ fr->longRangeNonbondeds->updateAfterPartition(*mdatoms);
if (ir->efep != FreeEnergyPerturbationType::No && ir->fepvals->nstdhdl != 0)
{
doFreeEnergyPerturbation = true;
}
+ int64_t step = ir->init_step;
+ int64_t step_rel = 0;
+
{
- int cglo_flags = CGLO_GSTAT;
- if (DOMAINDECOMP(cr) && shouldCheckNumberOfBondedInteractions(*cr->dd))
- {
- cglo_flags |= CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS;
- }
+ int cglo_flags = CGLO_GSTAT;
bool bSumEkinhOld = false;
t_vcm* vcm = nullptr;
compute_globals(gstat,
shake_vir,
total_vir,
pres,
- gmx::ArrayRef<real>{},
&nullSignaller,
state->box,
&bSumEkinhOld,
- cglo_flags);
- if (DOMAINDECOMP(cr))
- {
- checkNumberOfBondedInteractions(
- mdlog, cr, top_global, &top, makeConstArrayRef(state->x), state->box);
- }
+ cglo_flags,
+ step,
+ &observablesReducer);
+ // Clean up after pre-step use of compute_globals()
+ observablesReducer.markAsReadyToReduce();
}
if (MASTER(cr))
}
walltime_accounting_start_time(walltime_accounting);
- wallcycle_start(wcycle, ewcRUN);
+ wallcycle_start(wcycle, WallCycleCounter::Run);
print_start(fplog, cr, walltime_accounting, "mdrun");
/***********************************************************
"MiMiC does not report kinetic energy, total energy, temperature, virial and "
"pressure.");
- step = ir->init_step;
- step_rel = 0;
-
auto stopHandler = stopHandlerBuilder->getStopHandlerMD(
compat::not_null<SimulationSignal*>(&signals[eglsSTOPCOND]),
false,
while (!isLastStep)
{
isLastStep = (isLastStep || (ir->nsteps >= 0 && step_rel == ir->nsteps));
- wallcycle_start(wcycle, ewcSTEP);
+ wallcycle_start(wcycle, WallCycleCounter::Step);
t = step;
if (MASTER(cr))
{
- MimicCommunicator::getCoords(&state_global->x, state_global->natoms);
+ MimicCommunicator::getCoords(state_global->x, state_global->natoms);
}
if (ir->efep != FreeEnergyPerturbationType::No)
if (MASTER(cr))
{
const bool constructVsites = ((vsite != nullptr) && mdrunOptions.rerunConstructVsites);
- if (constructVsites && DOMAINDECOMP(cr))
+ if (constructVsites && haveDDAtomOrdering(*cr))
{
gmx_fatal(FARGS,
"Vsite recalculation with -rerun is not implemented with domain "
}
if (constructVsites)
{
- wallcycle_start(wcycle, ewcVSITECONSTR);
+ wallcycle_start(wcycle, WallCycleCounter::VsiteConstr);
vsite->construct(state->x, state->v, state->box, VSiteOperation::PositionsAndVelocities);
- wallcycle_stop(wcycle, ewcVSITECONSTR);
+ wallcycle_stop(wcycle, WallCycleCounter::VsiteConstr);
}
}
- if (DOMAINDECOMP(cr))
+ if (haveDDAtomOrdering(*cr))
{
/* Repartition the domain decomposition */
const bool bMasterState = true;
state,
&f,
mdAtoms,
- &top,
+ top,
fr,
vsite,
constr,
update_mdatoms(mdatoms, state->lambda[FreeEnergyPerturbationCouplingType::Mass]);
}
+ fr->longRangeNonbondeds->updateAfterPartition(*mdatoms);
+
force_flags = (GMX_FORCE_STATECHANGED | GMX_FORCE_DYNAMICBOX | GMX_FORCE_ALLFORCES
| GMX_FORCE_VIRIAL | // TODO: Get rid of this once #2649 is solved
GMX_FORCE_ENERGY | (doFreeEnergyPerturbation ? GMX_FORCE_DHDL : 0));
pull_work,
bNS,
force_flags,
- &top,
+ top,
constr,
enerd,
state->natoms,
&f.view(),
force_vir,
*mdatoms,
+ fr->longRangeNonbondeds.get(),
nrnb,
wcycle,
shellfc,
step,
nrnb,
wcycle,
- &top,
+ top,
state->box,
state->x.arrayRefWithPadding(),
&state->hist,
mu_tot,
t,
ed,
+ fr->longRangeNonbondeds.get(),
GMX_FORCE_NS | force_flags,
ddBalanceRegionHandler);
}
SimulationSignaller signaller(&signals, cr, ms, doInterSimSignal, doIntraSimSignal);
int cglo_flags = CGLO_GSTAT | CGLO_ENERGY;
- if (DOMAINDECOMP(cr) && shouldCheckNumberOfBondedInteractions(*cr->dd))
- {
- cglo_flags |= CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS;
- }
compute_globals(gstat,
cr,
ir,
nullptr,
nullptr,
nullptr,
- constr != nullptr ? constr->rmsdData() : gmx::ArrayRef<real>{},
&signaller,
state->box,
&bSumEkinhOld,
- cglo_flags);
- if (DOMAINDECOMP(cr))
- {
- checkNumberOfBondedInteractions(
- mdlog, cr, top_global, &top, makeConstArrayRef(state->x), state->box);
- }
+ cglo_flags,
+ step,
+ &observablesReducer);
}
{
gmx::HostVector<gmx::RVec> fglobal(top_global.natoms);
gmx::ArrayRef<gmx::RVec> ftemp;
gmx::ArrayRef<const gmx::RVec> flocal = f.view().force();
- if (DOMAINDECOMP(cr))
+ if (haveDDAtomOrdering(*cr))
{
ftemp = gmx::makeArrayRef(fglobal);
dd_collect_vec(cr->dd, state->ddp_count, state->ddp_count_cg_gl, state->cg_gl, flocal, ftemp);
mdatoms->tmass,
enerd,
ir->fepvals.get(),
- ir->expandedvals.get(),
state->box,
PTCouplingArrays({ state->boxv,
state->nosehoover_xi,
state->nhpres_xi,
state->nhpres_vxi }),
state->fep_state,
- shake_vir,
- force_vir,
total_vir,
pres,
ekind,
print_time(stderr, walltime_accounting, step, ir, cr);
}
- cycles = wallcycle_stop(wcycle, ewcSTEP);
- if (DOMAINDECOMP(cr) && wcycle)
+ cycles = wallcycle_stop(wcycle, WallCycleCounter::Step);
+ if (haveDDAtomOrdering(*cr) && wcycle)
{
dd_cycles_add(cr->dd, cycles, ddCyclStep);
}
/* increase the MD step number */
step++;
step_rel++;
+ observablesReducer.markAsReadyToReduce();
}
/* End of main MD loop */