{
// Organize to do inter-simulation signalling on steps if
// and when algorithms require it.
- bool doInterSimSignal = (simulationsShareState && do_per_step(step, nstSignalComm));
+ const bool doInterSimSignal = (simulationsShareState && do_per_step(step, nstSignalComm));
+
+ // With leap-frog we also need to compute the half-step
+ // kinetic energy at the step before we need to write
+ // the full-step kinetic energy
+ const bool needEkinAtNextStep =
+ (!EI_VV(ir->eI) && (do_per_step(step + 1, nstglobalcomm) ||
+ step_rel + 1 == ir->nsteps));
- if (bGStat || needHalfStepKineticEnergy || doInterSimSignal)
+ if (bGStat || needEkinAtNextStep || doInterSimSignal)
{
+ // Copy coordinates when needed to stop the CM motion.
+ if (useGpuForUpdate && !EI_VV(ir->eI) && bStopCM)
+ {
+ stateGpu->copyCoordinatesFromGpu(state->x, AtomLocality::Local);
+ stateGpu->waitCoordinatesReadyOnHost(AtomLocality::Local);
+ }
// Since we're already communicating at this step, we
// can propagate intra-simulation signals. Note that
// check_nstglobalcomm has the responsibility for