2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2004, The GROMACS development team.
6 * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
7 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8 * and including many others, as listed in the AUTHORS file in the
9 * top-level source directory and at http://www.gromacs.org.
11 * GROMACS is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public License
13 * as published by the Free Software Foundation; either version 2.1
14 * of the License, or (at your option) any later version.
16 * GROMACS is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with GROMACS; if not, see
23 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 * If you want to redistribute modifications to GROMACS, please
27 * consider that scientific software is very special. Version
28 * control is crucial - bugs must be traceable. We will be happy to
29 * consider code for inclusion in the official distribution, but
30 * derived work must not be called official GROMACS. Details are found
31 * in the README & COPYING files - if they are missing, get the
32 * official version at http://www.gromacs.org.
34 * To help us fund GROMACS development, we humbly ask that you cite
35 * the research papers on the package. Check out http://www.gromacs.org.
39 * \brief Implements the integrator for normal molecular dynamics simulations
41 * \author David van der Spoel <david.vanderspoel@icm.uu.se>
42 * \ingroup module_mdrun
54 #include "gromacs/awh/awh.h"
55 #include "gromacs/commandline/filenm.h"
56 #include "gromacs/compat/make_unique.h"
57 #include "gromacs/domdec/collect.h"
58 #include "gromacs/domdec/domdec.h"
59 #include "gromacs/domdec/domdec_network.h"
60 #include "gromacs/domdec/domdec_struct.h"
61 #include "gromacs/domdec/partition.h"
62 #include "gromacs/essentialdynamics/edsam.h"
63 #include "gromacs/ewald/pme.h"
64 #include "gromacs/ewald/pme-load-balancing.h"
65 #include "gromacs/fileio/trxio.h"
66 #include "gromacs/gmxlib/network.h"
67 #include "gromacs/gmxlib/nrnb.h"
68 #include "gromacs/gpu_utils/gpu_utils.h"
69 #include "gromacs/imd/imd.h"
70 #include "gromacs/listed-forces/manage-threading.h"
71 #include "gromacs/math/functions.h"
72 #include "gromacs/math/utilities.h"
73 #include "gromacs/math/vec.h"
74 #include "gromacs/math/vectypes.h"
75 #include "gromacs/mdlib/checkpointhandler.h"
76 #include "gromacs/mdlib/compute_io.h"
77 #include "gromacs/mdlib/constr.h"
78 #include "gromacs/mdlib/ebin.h"
79 #include "gromacs/mdlib/expanded.h"
80 #include "gromacs/mdlib/force.h"
81 #include "gromacs/mdlib/force_flags.h"
82 #include "gromacs/mdlib/forcerec.h"
83 #include "gromacs/mdlib/md_support.h"
84 #include "gromacs/mdlib/mdatoms.h"
85 #include "gromacs/mdlib/mdebin.h"
86 #include "gromacs/mdlib/mdoutf.h"
87 #include "gromacs/mdlib/mdrun.h"
88 #include "gromacs/mdlib/mdsetup.h"
89 #include "gromacs/mdlib/membed.h"
90 #include "gromacs/mdlib/nb_verlet.h"
91 #include "gromacs/mdlib/nbnxn_gpu_data_mgmt.h"
92 #include "gromacs/mdlib/ns.h"
93 #include "gromacs/mdlib/resethandler.h"
94 #include "gromacs/mdlib/shellfc.h"
95 #include "gromacs/mdlib/sighandler.h"
96 #include "gromacs/mdlib/sim_util.h"
97 #include "gromacs/mdlib/simulationsignal.h"
98 #include "gromacs/mdlib/stophandler.h"
99 #include "gromacs/mdlib/tgroup.h"
100 #include "gromacs/mdlib/trajectory_writing.h"
101 #include "gromacs/mdlib/update.h"
102 #include "gromacs/mdlib/vcm.h"
103 #include "gromacs/mdlib/vsite.h"
104 #include "gromacs/mdtypes/awh-history.h"
105 #include "gromacs/mdtypes/awh-params.h"
106 #include "gromacs/mdtypes/commrec.h"
107 #include "gromacs/mdtypes/df_history.h"
108 #include "gromacs/mdtypes/energyhistory.h"
109 #include "gromacs/mdtypes/fcdata.h"
110 #include "gromacs/mdtypes/forcerec.h"
111 #include "gromacs/mdtypes/group.h"
112 #include "gromacs/mdtypes/inputrec.h"
113 #include "gromacs/mdtypes/interaction_const.h"
114 #include "gromacs/mdtypes/md_enums.h"
115 #include "gromacs/mdtypes/mdatom.h"
116 #include "gromacs/mdtypes/observableshistory.h"
117 #include "gromacs/mdtypes/state.h"
118 #include "gromacs/pbcutil/mshift.h"
119 #include "gromacs/pbcutil/pbc.h"
120 #include "gromacs/pulling/pull.h"
121 #include "gromacs/swap/swapcoords.h"
122 #include "gromacs/timing/wallcycle.h"
123 #include "gromacs/timing/walltime_accounting.h"
124 #include "gromacs/topology/atoms.h"
125 #include "gromacs/topology/idef.h"
126 #include "gromacs/topology/mtop_util.h"
127 #include "gromacs/topology/topology.h"
128 #include "gromacs/trajectory/trajectoryframe.h"
129 #include "gromacs/utility/basedefinitions.h"
130 #include "gromacs/utility/cstringutil.h"
131 #include "gromacs/utility/fatalerror.h"
132 #include "gromacs/utility/logger.h"
133 #include "gromacs/utility/real.h"
134 #include "gromacs/utility/smalloc.h"
136 #include "integrator.h"
137 #include "replicaexchange.h"
140 #include "corewrap.h"
143 using gmx::SimulationSignaller;
145 void gmx::Integrator::do_md()
147 // TODO Historically, the EM and MD "integrators" used different
148 // names for the t_inputrec *parameter, but these must have the
149 // same name, now that it's a member of a struct. We use this ir
150 // alias to avoid a large ripple of nearly useless changes.
151 // t_inputrec is being replaced by IMdpOptionsProvider, so this
152 // will go away eventually.
153 t_inputrec *ir = inputrec;
154 gmx_mdoutf *outf = nullptr;
155 int64_t step, step_rel;
156 double t, t0, lam0[efptNR];
157 gmx_bool bGStatEveryStep, bGStat, bCalcVir, bCalcEnerStep, bCalcEner;
158 gmx_bool bNS, bNStList, bSimAnn, bStopCM,
159 bFirstStep, bInitStep, bLastStep = FALSE;
160 gmx_bool bDoDHDL = FALSE, bDoFEP = FALSE, bDoExpanded = FALSE;
161 gmx_bool do_ene, do_log, do_verbose;
162 gmx_bool bMasterState;
163 int force_flags, cglo_flags;
164 tensor force_vir, shake_vir, total_vir, tmp_vir, pres;
168 matrix parrinellorahmanMu, M;
169 gmx_repl_ex_t repl_ex = nullptr;
171 t_mdebin *mdebin = nullptr;
172 gmx_enerdata_t *enerd;
173 PaddedRVecVector f {};
174 gmx_global_stat_t gstat;
175 gmx_update_t *upd = nullptr;
176 t_graph *graph = nullptr;
177 gmx_groups_t *groups;
178 gmx_ekindata_t *ekind;
179 gmx_shellfc_t *shellfc;
180 gmx_bool bSumEkinhOld, bDoReplEx, bExchanged, bNeedRepartition;
181 gmx_bool bTemp, bPres, bTrotter;
183 rvec *cbuf = nullptr;
190 real saved_conserved_quantity = 0;
194 char sbuf[STEPSTRSIZE], sbuf2[STEPSTRSIZE];
196 /* PME load balancing data for GPU kernels */
197 pme_load_balancing_t *pme_loadbal = nullptr;
198 gmx_bool bPMETune = FALSE;
199 gmx_bool bPMETunePrinting = FALSE;
202 gmx_bool bIMDstep = FALSE;
204 /* Domain decomposition could incorrectly miss a bonded
205 interaction, but checking for that requires a global
206 communication stage, which does not otherwise happen in DD
207 code. So we do that alongside the first global energy reduction
208 after a new DD is made. These variables handle whether the
209 check happens, and the result it returns. */
210 bool shouldCheckNumberOfBondedInteractions = false;
211 int totalNumberOfBondedInteractions = -1;
213 SimulationSignals signals;
214 // Most global communnication stages don't propagate mdrun
215 // signals, and will use this object to achieve that.
216 SimulationSignaller nullSignaller(nullptr, nullptr, nullptr, false, false);
218 if (!mdrunOptions.writeConfout)
220 // This is on by default, and the main known use case for
221 // turning it off is for convenience in benchmarking, which is
222 // something that should not show up in the general user
224 GMX_LOG(mdlog.info).asParagraph().
225 appendText("The -noconfout functionality is deprecated, and may be removed in a future version.");
228 /* md-vv uses averaged full step velocities for T-control
229 md-vv-avek uses averaged half step velocities for T-control (but full step ekin for P control)
230 md uses averaged half step kinetic energies to determine temperature unless defined otherwise by GMX_EKIN_AVE_VEL; */
231 bTrotter = (EI_VV(ir->eI) && (inputrecNptTrotter(ir) || inputrecNphTrotter(ir) || inputrecNvtTrotter(ir)));
233 const bool bRerunMD = false;
234 int nstglobalcomm = mdrunOptions.globalCommunicationInterval;
236 nstglobalcomm = check_nstglobalcomm(mdlog, nstglobalcomm, ir);
237 bGStatEveryStep = (nstglobalcomm == 1);
239 groups = &top_global->groups;
241 std::unique_ptr<EssentialDynamics> ed = nullptr;
242 if (opt2bSet("-ei", nfile, fnm) || observablesHistory->edsamHistory != nullptr)
244 /* Initialize essential dynamics sampling */
245 ed = init_edsam(opt2fn_null("-ei", nfile, fnm), opt2fn("-eo", nfile, fnm),
248 state_global, observablesHistory,
249 oenv, mdrunOptions.continuationOptions.appendFiles);
253 init_md(fplog, cr, outputProvider, ir, oenv, mdrunOptions,
254 &t, &t0, state_global, lam0,
255 nrnb, top_global, &upd, deform,
256 nfile, fnm, &outf, &mdebin,
257 force_vir, shake_vir, total_vir, pres, mu_tot, &bSimAnn, &vcm, wcycle);
259 /* Energy terms and groups */
261 init_enerdata(top_global->groups.grps[egcENER].nr, ir->fepvals->n_lambda,
264 /* Kinetic energy data */
266 init_ekindata(fplog, top_global, &(ir->opts), ekind);
267 /* Copy the cos acceleration to the groups struct */
268 ekind->cosacc.cos_accel = ir->cos_accel;
270 gstat = global_stat_init(ir);
272 /* Check for polarizable models and flexible constraints */
273 shellfc = init_shell_flexcon(fplog,
274 top_global, constr ? constr->numFlexibleConstraints() : 0,
275 ir->nstcalcenergy, DOMAINDECOMP(cr));
278 double io = compute_io(ir, top_global->natoms, groups, mdebin->ebin->nener, 1);
279 if ((io > 2000) && MASTER(cr))
282 "\nWARNING: This run will generate roughly %.0f Mb of data\n\n",
287 /* Set up interactive MD (IMD) */
288 init_IMD(ir, cr, ms, top_global, fplog, ir->nstcalcenergy,
289 MASTER(cr) ? as_rvec_array(state_global->x.data()) : nullptr,
290 nfile, fnm, oenv, mdrunOptions);
292 // Local state only becomes valid now.
293 std::unique_ptr<t_state> stateInstance;
296 if (DOMAINDECOMP(cr))
298 top = dd_init_local_top(top_global);
300 stateInstance = compat::make_unique<t_state>();
301 state = stateInstance.get();
302 dd_init_local_state(cr->dd, state_global, state);
304 /* Distribute the charge groups over the nodes from the master node */
305 dd_partition_system(fplog, mdlog, ir->init_step, cr, TRUE, 1,
306 state_global, top_global, ir,
307 state, &f, mdAtoms, top, fr,
309 nrnb, nullptr, FALSE);
310 shouldCheckNumberOfBondedInteractions = true;
311 update_realloc(upd, state->natoms);
315 state_change_natoms(state_global, state_global->natoms);
316 /* We need to allocate one element extra, since we might use
317 * (unaligned) 4-wide SIMD loads to access rvec entries.
319 f.resize(gmx::paddedRVecVectorSize(state_global->natoms));
320 /* Copy the pointer to the global state */
321 state = state_global;
324 mdAlgorithmsSetupAtomData(cr, ir, top_global, top, fr,
325 &graph, mdAtoms, constr, vsite, shellfc);
327 update_realloc(upd, state->natoms);
330 auto mdatoms = mdAtoms->mdatoms();
332 // NOTE: The global state is no longer used at this point.
333 // But state_global is still used as temporary storage space for writing
334 // the global state to file and potentially for replica exchange.
335 // (Global topology should persist.)
337 update_mdatoms(mdatoms, state->lambda[efptMASS]);
339 const ContinuationOptions &continuationOptions = mdrunOptions.continuationOptions;
340 bool startingFromCheckpoint = continuationOptions.startedFromCheckpoint;
344 init_expanded_ensemble(startingFromCheckpoint, ir, state->dfhist);
349 if (startingFromCheckpoint)
351 /* Update mdebin with energy history if appending to output files */
352 if (continuationOptions.appendFiles)
354 restore_energyhistory_from_state(mdebin, observablesHistory->energyHistory.get());
356 else if (observablesHistory->energyHistory != nullptr)
358 /* We might have read an energy history from checkpoint.
359 * As we are not appending, we want to restart the statistics.
360 * Free the allocated memory and reset the counts.
362 observablesHistory->energyHistory = {};
364 if (ir->pull && ir->pull->bSetPbcRefToPrevStepCOM)
366 /* Copy the pull group COM of the previous step from the checkpoint state to the pull state */
367 setPrevStepPullComFromState(ir->pull_work, state);
370 else if (ir->pull && ir->pull->bSetPbcRefToPrevStepCOM)
372 allocStatePrevStepPullCom(state, ir->pull_work);
374 set_pbc(&pbc, ir->ePBC, state->box);
375 initPullComFromPrevStep(cr, ir->pull_work, mdatoms, &pbc, as_rvec_array(state->x.data()));
376 updatePrevStepCom(ir->pull_work);
377 setStatePrevStepPullCom(ir->pull_work, state);
379 if (observablesHistory->energyHistory == nullptr)
381 observablesHistory->energyHistory = compat::make_unique<energyhistory_t>();
383 /* Set the initial energy history in state by updating once */
384 update_energyhistory(observablesHistory->energyHistory.get(), mdebin);
387 // TODO: Remove this by converting AWH into a ForceProvider
388 auto awh = prepareAwhModule(fplog, *ir, state_global, cr, ms, startingFromCheckpoint,
390 opt2fn("-awh", nfile, fnm), ir->pull_work);
392 const bool useReplicaExchange = (replExParams.exchangeInterval > 0);
393 if (useReplicaExchange && MASTER(cr))
395 repl_ex = init_replica_exchange(fplog, ms, top_global->natoms, ir,
398 /* PME tuning is only supported in the Verlet scheme, with PME for
399 * Coulomb. It is not supported with only LJ PME. */
400 bPMETune = (mdrunOptions.tunePme && EEL_PME(fr->ic->eeltype) &&
401 !mdrunOptions.reproducible && ir->cutoff_scheme != ecutsGROUP);
404 pme_loadbal_init(&pme_loadbal, cr, mdlog, *ir, state->box,
405 *fr->ic, *fr->nbv->listParams, fr->pmedata, use_GPU(fr->nbv),
409 if (!ir->bContinuation)
411 if (state->flags & (1 << estV))
413 /* Set the velocities of vsites, shells and frozen atoms to zero */
414 for (i = 0; i < mdatoms->homenr; i++)
416 if (mdatoms->ptype[i] == eptVSite ||
417 mdatoms->ptype[i] == eptShell)
419 clear_rvec(state->v[i]);
421 else if (mdatoms->cFREEZE)
423 for (m = 0; m < DIM; m++)
425 if (ir->opts.nFreeze[mdatoms->cFREEZE[i]][m])
436 /* Constrain the initial coordinates and velocities */
437 do_constrain_first(fplog, constr, ir, mdatoms, state);
441 /* Construct the virtual sites for the initial configuration */
442 construct_vsites(vsite, as_rvec_array(state->x.data()), ir->delta_t, nullptr,
443 top->idef.iparams, top->idef.il,
444 fr->ePBC, fr->bMolPBC, cr, state->box);
448 if (ir->efep != efepNO)
450 /* Set free energy calculation frequency as the greatest common
451 * denominator of nstdhdl and repl_ex_nst. */
452 nstfep = ir->fepvals->nstdhdl;
455 nstfep = gmx_greatest_common_divisor(ir->expandedvals->nstexpanded, nstfep);
457 if (useReplicaExchange)
459 nstfep = gmx_greatest_common_divisor(replExParams.exchangeInterval, nstfep);
463 /* Be REALLY careful about what flags you set here. You CANNOT assume
464 * this is the first step, since we might be restarting from a checkpoint,
465 * and in that case we should not do any modifications to the state.
467 bStopCM = (ir->comm_mode != ecmNO && !ir->bContinuation);
469 if (continuationOptions.haveReadEkin)
471 restore_ekinstate_from_state(cr, ekind, &state_global->ekinstate);
474 cglo_flags = (CGLO_INITIALIZATION | CGLO_TEMPERATURE | CGLO_GSTAT
475 | (EI_VV(ir->eI) ? CGLO_PRESSURE : 0)
476 | (EI_VV(ir->eI) ? CGLO_CONSTRAINT : 0)
477 | (continuationOptions.haveReadEkin ? CGLO_READEKIN : 0));
479 bSumEkinhOld = FALSE;
480 /* To minimize communication, compute_globals computes the COM velocity
481 * and the kinetic energy for the velocities without COM motion removed.
482 * Thus to get the kinetic energy without the COM contribution, we need
483 * to call compute_globals twice.
485 for (int cgloIteration = 0; cgloIteration < (bStopCM ? 2 : 1); cgloIteration++)
487 int cglo_flags_iteration = cglo_flags;
488 if (bStopCM && cgloIteration == 0)
490 cglo_flags_iteration |= CGLO_STOPCM;
491 cglo_flags_iteration &= ~CGLO_TEMPERATURE;
493 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
494 nullptr, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
495 constr, &nullSignaller, state->box,
496 &totalNumberOfBondedInteractions, &bSumEkinhOld, cglo_flags_iteration
497 | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0));
499 checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
500 top_global, top, state,
501 &shouldCheckNumberOfBondedInteractions);
502 if (ir->eI == eiVVAK)
504 /* a second call to get the half step temperature initialized as well */
505 /* we do the same call as above, but turn the pressure off -- internally to
506 compute_globals, this is recognized as a velocity verlet half-step
507 kinetic energy calculation. This minimized excess variables, but
508 perhaps loses some logic?*/
510 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
511 nullptr, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
512 constr, &nullSignaller, state->box,
513 nullptr, &bSumEkinhOld,
514 cglo_flags & ~CGLO_PRESSURE);
517 /* Calculate the initial half step temperature, and save the ekinh_old */
518 if (!continuationOptions.startedFromCheckpoint)
520 for (i = 0; (i < ir->opts.ngtc); i++)
522 copy_mat(ekind->tcstat[i].ekinh, ekind->tcstat[i].ekinh_old);
526 /* need to make an initiation call to get the Trotter variables set, as well as other constants for non-trotter
527 temperature control */
528 trotter_seq = init_npt_vars(ir, state, &MassQ, bTrotter);
532 if (!ir->bContinuation)
534 if (constr && ir->eConstrAlg == econtLINCS)
537 "RMS relative constraint deviation after constraining: %.2e\n",
540 if (EI_STATE_VELOCITY(ir->eI))
542 real temp = enerd->term[F_TEMP];
545 /* Result of Ekin averaged over velocities of -half
546 * and +half step, while we only have -half step here.
550 fprintf(fplog, "Initial temperature: %g K\n", temp);
555 fprintf(stderr, "starting mdrun '%s'\n",
556 *(top_global->name));
559 sprintf(tbuf, "%8.1f", (ir->init_step+ir->nsteps)*ir->delta_t);
563 sprintf(tbuf, "%s", "infinite");
565 if (ir->init_step > 0)
567 fprintf(stderr, "%s steps, %s ps (continuing from step %s, %8.1f ps).\n",
568 gmx_step_str(ir->init_step+ir->nsteps, sbuf), tbuf,
569 gmx_step_str(ir->init_step, sbuf2),
570 ir->init_step*ir->delta_t);
574 fprintf(stderr, "%s steps, %s ps.\n",
575 gmx_step_str(ir->nsteps, sbuf), tbuf);
577 fprintf(fplog, "\n");
580 walltime_accounting_start_time(walltime_accounting);
581 wallcycle_start(wcycle, ewcRUN);
582 print_start(fplog, cr, walltime_accounting, "mdrun");
585 /* safest point to do file checkpointing is here. More general point would be immediately before integrator call */
586 int chkpt_ret = fcCheckPointParallel( cr->nodeid,
590 gmx_fatal( 3, __FILE__, __LINE__, "Checkpoint error on step %d\n", 0 );
594 /***********************************************************
598 ************************************************************/
601 /* Skip the first Nose-Hoover integration when we get the state from tpx */
602 bInitStep = !startingFromCheckpoint || EI_VV(ir->eI);
603 bSumEkinhOld = FALSE;
605 bNeedRepartition = FALSE;
607 bool simulationsShareState = false;
608 int nstSignalComm = nstglobalcomm;
610 // TODO This implementation of ensemble orientation restraints is nasty because
611 // a user can't just do multi-sim with single-sim orientation restraints.
612 bool usingEnsembleRestraints = (fcd->disres.nsystems > 1) || ((ms != nullptr) && (fcd->orires.nr != 0));
613 bool awhUsesMultiSim = (ir->bDoAwh && ir->awhParams->shareBiasMultisim && (ms != nullptr));
615 // Replica exchange, ensemble restraints and AWH need all
616 // simulations to remain synchronized, so they need
617 // checkpoints and stop conditions to act on the same step, so
618 // the propagation of such signals must take place between
619 // simulations, not just within simulations.
620 // TODO: Make algorithm initializers set these flags.
621 simulationsShareState = useReplicaExchange || usingEnsembleRestraints || awhUsesMultiSim;
623 if (simulationsShareState)
625 // Inter-simulation signal communication does not need to happen
626 // often, so we use a minimum of 200 steps to reduce overhead.
627 const int c_minimumInterSimulationSignallingInterval = 200;
628 nstSignalComm = ((c_minimumInterSimulationSignallingInterval + nstglobalcomm - 1)/nstglobalcomm)*nstglobalcomm;
632 auto stopHandler = stopHandlerBuilder->getStopHandlerMD(
633 compat::not_null<SimulationSignal*>(&signals[eglsSTOPCOND]), simulationsShareState,
634 MASTER(cr), ir->nstlist, mdrunOptions.reproducible, nstSignalComm,
635 mdrunOptions.maximumHoursToRun, ir->nstlist == 0, fplog, step, bNS, walltime_accounting);
637 auto checkpointHandler = compat::make_unique<CheckpointHandler>(
638 compat::make_not_null<SimulationSignal*>(&signals[eglsCHKPT]),
639 simulationsShareState, ir->nstlist == 0, MASTER(cr),
640 mdrunOptions.writeConfout, mdrunOptions.checkpointOptions.period);
642 const bool resetCountersIsLocal = true;
643 auto resetHandler = compat::make_unique<ResetHandler>(
644 compat::make_not_null<SimulationSignal*>(&signals[eglsRESETCOUNTERS]), !resetCountersIsLocal,
645 ir->nsteps, MASTER(cr), mdrunOptions.timingOptions.resetHalfway,
646 mdrunOptions.maximumHoursToRun, mdlog, wcycle, walltime_accounting);
648 DdOpenBalanceRegionBeforeForceComputation ddOpenBalanceRegion = (DOMAINDECOMP(cr) ? DdOpenBalanceRegionBeforeForceComputation::yes : DdOpenBalanceRegionBeforeForceComputation::no);
649 DdCloseBalanceRegionAfterForceComputation ddCloseBalanceRegion = (DOMAINDECOMP(cr) ? DdCloseBalanceRegionAfterForceComputation::yes : DdCloseBalanceRegionAfterForceComputation::no);
651 step = ir->init_step;
654 // TODO extract this to new multi-simulation module
655 if (MASTER(cr) && isMultiSim(ms) && !useReplicaExchange)
657 if (!multisim_int_all_are_equal(ms, ir->nsteps))
659 GMX_LOG(mdlog.warning).appendText(
660 "Note: The number of steps is not consistent across multi simulations,\n"
661 "but we are proceeding anyway!");
663 if (!multisim_int_all_are_equal(ms, ir->init_step))
665 GMX_LOG(mdlog.warning).appendText(
666 "Note: The initial step is not consistent across multi simulations,\n"
667 "but we are proceeding anyway!");
671 /* and stop now if we should */
672 bLastStep = (bLastStep || (ir->nsteps >= 0 && step_rel > ir->nsteps));
676 /* Determine if this is a neighbor search step */
677 bNStList = (ir->nstlist > 0 && step % ir->nstlist == 0);
679 if (bPMETune && bNStList)
681 /* PME grid + cut-off optimization with GPUs or PME nodes */
682 pme_loadbal_do(pme_loadbal, cr,
683 (mdrunOptions.verbose && MASTER(cr)) ? stderr : nullptr,
691 wallcycle_start(wcycle, ewcSTEP);
693 bLastStep = (step_rel == ir->nsteps);
694 t = t0 + step*ir->delta_t;
696 // TODO Refactor this, so that nstfep does not need a default value of zero
697 if (ir->efep != efepNO || ir->bSimTemp)
699 /* find and set the current lambdas */
700 setCurrentLambdasLocal(step, ir->fepvals, lam0, state);
702 bDoDHDL = do_per_step(step, ir->fepvals->nstdhdl);
703 bDoFEP = ((ir->efep != efepNO) && do_per_step(step, nstfep));
704 bDoExpanded = (do_per_step(step, ir->expandedvals->nstexpanded)
705 && (ir->bExpanded) && (step > 0) && (!startingFromCheckpoint));
708 bDoReplEx = (useReplicaExchange && (step > 0) && !bLastStep &&
709 do_per_step(step, replExParams.exchangeInterval));
713 update_annealing_target_temp(ir, t, upd);
716 /* Stop Center of Mass motion */
717 bStopCM = (ir->comm_mode != ecmNO && do_per_step(step, ir->nstcomm));
719 /* Determine whether or not to do Neighbour Searching */
720 bNS = (bFirstStep || bNStList || bExchanged || bNeedRepartition);
722 bLastStep = bLastStep || stopHandler->stoppingAfterCurrentStep(bNS);
724 /* do_log triggers energy and virial calculation. Because this leads
725 * to different code paths, forces can be different. Thus for exact
726 * continuation we should avoid extra log output.
727 * Note that the || bLastStep can result in non-exact continuation
728 * beyond the last step. But we don't consider that to be an issue.
730 do_log = do_per_step(step, ir->nstlog) || (bFirstStep && !startingFromCheckpoint) || bLastStep;
731 do_verbose = mdrunOptions.verbose &&
732 (step % mdrunOptions.verboseStepPrintInterval == 0 || bFirstStep || bLastStep);
734 if (bNS && !(bFirstStep && ir->bContinuation))
736 bMasterState = FALSE;
737 /* Correct the new box if it is too skewed */
738 if (inputrecDynamicBox(ir))
740 if (correct_box(fplog, step, state->box, graph))
745 if (DOMAINDECOMP(cr) && bMasterState)
747 dd_collect_state(cr->dd, state, state_global);
750 if (DOMAINDECOMP(cr))
752 /* Repartition the domain decomposition */
753 dd_partition_system(fplog, mdlog, step, cr,
754 bMasterState, nstglobalcomm,
755 state_global, top_global, ir,
756 state, &f, mdAtoms, top, fr,
759 do_verbose && !bPMETunePrinting);
760 shouldCheckNumberOfBondedInteractions = true;
761 update_realloc(upd, state->natoms);
765 if (MASTER(cr) && do_log)
767 print_ebin_header(fplog, step, t); /* can we improve the information printed here? */
770 if (ir->efep != efepNO)
772 update_mdatoms(mdatoms, state->lambda[efptMASS]);
778 /* We need the kinetic energy at minus the half step for determining
779 * the full step kinetic energy and possibly for T-coupling.*/
780 /* This may not be quite working correctly yet . . . . */
781 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
782 wcycle, enerd, nullptr, nullptr, nullptr, nullptr, mu_tot,
783 constr, &nullSignaller, state->box,
784 &totalNumberOfBondedInteractions, &bSumEkinhOld,
785 CGLO_GSTAT | CGLO_TEMPERATURE | CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS);
786 checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
787 top_global, top, state,
788 &shouldCheckNumberOfBondedInteractions);
790 clear_mat(force_vir);
792 checkpointHandler->decideIfCheckpointingThisStep(bNS, bFirstStep, bLastStep);
794 /* Determine the energy and pressure:
795 * at nstcalcenergy steps and at energy output steps (set below).
797 if (EI_VV(ir->eI) && (!bInitStep))
799 /* for vv, the first half of the integration actually corresponds
800 to the previous step. bCalcEner is only required to be evaluated on the 'next' step,
801 but the virial needs to be calculated on both the current step and the 'next' step. Future
802 reorganization may be able to get rid of one of the bCalcVir=TRUE steps. */
804 /* TODO: This is probably not what we want, we will write to energy file one step after nstcalcenergy steps. */
805 bCalcEnerStep = do_per_step(step - 1, ir->nstcalcenergy);
806 bCalcVir = bCalcEnerStep ||
807 (ir->epc != epcNO && (do_per_step(step, ir->nstpcouple) || do_per_step(step-1, ir->nstpcouple)));
811 bCalcEnerStep = do_per_step(step, ir->nstcalcenergy);
812 bCalcVir = bCalcEnerStep ||
813 (ir->epc != epcNO && do_per_step(step, ir->nstpcouple));
815 bCalcEner = bCalcEnerStep;
817 do_ene = (do_per_step(step, ir->nstenergy) || bLastStep);
819 if (do_ene || do_log || bDoReplEx)
825 /* Do we need global communication ? */
826 bGStat = (bCalcVir || bCalcEner || bStopCM ||
827 do_per_step(step, nstglobalcomm) ||
828 (EI_VV(ir->eI) && inputrecNvtTrotter(ir) && do_per_step(step-1, nstglobalcomm)));
830 force_flags = (GMX_FORCE_STATECHANGED |
831 ((inputrecDynamicBox(ir)) ? GMX_FORCE_DYNAMICBOX : 0) |
832 GMX_FORCE_ALLFORCES |
833 (bCalcVir ? GMX_FORCE_VIRIAL : 0) |
834 (bCalcEner ? GMX_FORCE_ENERGY : 0) |
835 (bDoFEP ? GMX_FORCE_DHDL : 0)
840 /* Now is the time to relax the shells */
841 relax_shell_flexcon(fplog, cr, ms, mdrunOptions.verbose,
842 enforcedRotation, step,
843 ir, bNS, force_flags, top,
845 state, f, force_vir, mdatoms,
846 nrnb, wcycle, graph, groups,
847 shellfc, fr, t, mu_tot,
849 ddOpenBalanceRegion, ddCloseBalanceRegion);
853 /* The AWH history need to be saved _before_ doing force calculations where the AWH bias is updated
854 (or the AWH update will be performed twice for one step when continuing). It would be best to
855 call this update function from do_md_trajectory_writing but that would occur after do_force.
856 One would have to divide the update_awh function into one function applying the AWH force
857 and one doing the AWH bias update. The update AWH bias function could then be called after
858 do_md_trajectory_writing (then containing update_awh_history).
859 The checkpointing will in the future probably moved to the start of the md loop which will
860 rid of this issue. */
861 if (awh && checkpointHandler->isCheckpointingStep() && MASTER(cr))
863 awh->updateHistory(state_global->awhHistory.get());
866 /* The coordinates (x) are shifted (to get whole molecules)
868 * This is parallellized as well, and does communication too.
869 * Check comments in sim_util.c
871 do_force(fplog, cr, ms, ir, awh.get(), enforcedRotation,
872 step, nrnb, wcycle, top, groups,
873 state->box, state->x, &state->hist,
874 f, force_vir, mdatoms, enerd, fcd,
875 state->lambda, graph,
876 fr, vsite, mu_tot, t, ed ? ed->getLegacyED() : nullptr,
877 (bNS ? GMX_FORCE_NS : 0) | force_flags,
878 ddOpenBalanceRegion, ddCloseBalanceRegion);
881 if (EI_VV(ir->eI) && !startingFromCheckpoint)
882 /* ############### START FIRST UPDATE HALF-STEP FOR VV METHODS############### */
884 rvec *vbuf = nullptr;
886 wallcycle_start(wcycle, ewcUPDATE);
887 if (ir->eI == eiVV && bInitStep)
889 /* if using velocity verlet with full time step Ekin,
890 * take the first half step only to compute the
891 * virial for the first step. From there,
892 * revert back to the initial coordinates
893 * so that the input is actually the initial step.
895 snew(vbuf, state->natoms);
896 copy_rvecn(as_rvec_array(state->v.data()), vbuf, 0, state->natoms); /* should make this better for parallelizing? */
900 /* this is for NHC in the Ekin(t+dt/2) version of vv */
901 trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ1);
904 update_coords(step, ir, mdatoms, state, f, fcd,
905 ekind, M, upd, etrtVELOCITY1,
908 wallcycle_stop(wcycle, ewcUPDATE);
909 constrain_velocities(step, nullptr,
913 bCalcVir, do_log, do_ene);
914 wallcycle_start(wcycle, ewcUPDATE);
915 /* if VV, compute the pressure and constraints */
916 /* For VV2, we strictly only need this if using pressure
917 * control, but we really would like to have accurate pressures
919 * Think about ways around this in the future?
920 * For now, keep this choice in comments.
922 /*bPres = (ir->eI==eiVV || inputrecNptTrotter(ir)); */
923 /*bTemp = ((ir->eI==eiVV &&(!bInitStep)) || (ir->eI==eiVVAK && inputrecNptTrotter(ir)));*/
925 bTemp = ((ir->eI == eiVV && (!bInitStep)) || (ir->eI == eiVVAK));
926 if (bCalcEner && ir->eI == eiVVAK)
930 /* for vv, the first half of the integration actually corresponds to the previous step.
931 So we need information from the last step in the first half of the integration */
932 if (bGStat || do_per_step(step-1, nstglobalcomm))
934 wallcycle_stop(wcycle, ewcUPDATE);
935 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
936 wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
937 constr, &nullSignaller, state->box,
938 &totalNumberOfBondedInteractions, &bSumEkinhOld,
939 (bGStat ? CGLO_GSTAT : 0)
941 | (bTemp ? CGLO_TEMPERATURE : 0)
942 | (bPres ? CGLO_PRESSURE : 0)
943 | (bPres ? CGLO_CONSTRAINT : 0)
944 | (bStopCM ? CGLO_STOPCM : 0)
945 | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)
948 /* explanation of above:
949 a) We compute Ekin at the full time step
950 if 1) we are using the AveVel Ekin, and it's not the
951 initial step, or 2) if we are using AveEkin, but need the full
952 time step kinetic energy for the pressure (always true now, since we want accurate statistics).
953 b) If we are using EkinAveEkin for the kinetic energy for the temperature control, we still feed in
954 EkinAveVel because it's needed for the pressure */
955 checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
956 top_global, top, state,
957 &shouldCheckNumberOfBondedInteractions);
958 wallcycle_start(wcycle, ewcUPDATE);
960 /* temperature scaling and pressure scaling to produce the extended variables at t+dt */
965 m_add(force_vir, shake_vir, total_vir); /* we need the un-dispersion corrected total vir here */
966 trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ2);
968 /* TODO This is only needed when we're about to write
969 * a checkpoint, because we use it after the restart
970 * (in a kludge?). But what should we be doing if
971 * startingFromCheckpoint or bInitStep are true? */
972 if (inputrecNptTrotter(ir) || inputrecNphTrotter(ir))
974 copy_mat(shake_vir, state->svir_prev);
975 copy_mat(force_vir, state->fvir_prev);
977 if (inputrecNvtTrotter(ir) && ir->eI == eiVV)
979 /* update temperature and kinetic energy now that step is over - this is the v(t+dt) point */
980 enerd->term[F_TEMP] = sum_ekin(&(ir->opts), ekind, nullptr, (ir->eI == eiVV), FALSE);
981 enerd->term[F_EKIN] = trace(ekind->ekin);
986 wallcycle_stop(wcycle, ewcUPDATE);
987 /* We need the kinetic energy at minus the half step for determining
988 * the full step kinetic energy and possibly for T-coupling.*/
989 /* This may not be quite working correctly yet . . . . */
990 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
991 wcycle, enerd, nullptr, nullptr, nullptr, nullptr, mu_tot,
992 constr, &nullSignaller, state->box,
993 nullptr, &bSumEkinhOld,
994 CGLO_GSTAT | CGLO_TEMPERATURE);
995 wallcycle_start(wcycle, ewcUPDATE);
998 /* if it's the initial step, we performed this first step just to get the constraint virial */
999 if (ir->eI == eiVV && bInitStep)
1001 copy_rvecn(vbuf, as_rvec_array(state->v.data()), 0, state->natoms);
1004 wallcycle_stop(wcycle, ewcUPDATE);
1007 /* compute the conserved quantity */
1010 saved_conserved_quantity = NPT_energy(ir, state, &MassQ);
1013 last_ekin = enerd->term[F_EKIN];
1015 if ((ir->eDispCorr != edispcEnerPres) && (ir->eDispCorr != edispcAllEnerPres))
1017 saved_conserved_quantity -= enerd->term[F_DISPCORR];
1019 /* sum up the foreign energy and dhdl terms for vv. currently done every step so that dhdl is correct in the .edr */
1020 if (ir->efep != efepNO)
1022 sum_dhdl(enerd, state->lambda, ir->fepvals);
1026 /* ######## END FIRST UPDATE STEP ############## */
1027 /* ######## If doing VV, we now have v(dt) ###### */
1030 /* perform extended ensemble sampling in lambda - we don't
1031 actually move to the new state before outputting
1032 statistics, but if performing simulated tempering, we
1033 do update the velocities and the tau_t. */
1035 lamnew = ExpandedEnsembleDynamics(fplog, ir, enerd, state, &MassQ, state->fep_state, state->dfhist, step, as_rvec_array(state->v.data()), mdatoms);
1036 /* history is maintained in state->dfhist, but state_global is what is sent to trajectory and log output */
1039 copy_df_history(state_global->dfhist, state->dfhist);
1043 /* Now we have the energies and forces corresponding to the
1044 * coordinates at time t. We must output all of this before
1047 do_md_trajectory_writing(fplog, cr, nfile, fnm, step, step_rel, t,
1048 ir, state, state_global, observablesHistory,
1050 outf, mdebin, ekind, f,
1051 checkpointHandler->isCheckpointingStep(),
1052 bRerunMD, bLastStep,
1053 mdrunOptions.writeConfout,
1055 /* Check if IMD step and do IMD communication, if bIMD is TRUE. */
1056 bIMDstep = do_IMD(ir->bIMD, step, cr, bNS, state->box, as_rvec_array(state->x.data()), ir, t, wcycle);
1058 /* kludge -- virial is lost with restart for MTTK NPT control. Must reload (saved earlier). */
1059 if (startingFromCheckpoint && (inputrecNptTrotter(ir) || inputrecNphTrotter(ir)))
1061 copy_mat(state->svir_prev, shake_vir);
1062 copy_mat(state->fvir_prev, force_vir);
1065 stopHandler->setSignal();
1066 resetHandler->setSignal(walltime_accounting);
1068 if (bGStat || !PAR(cr))
1070 /* In parallel we only have to check for checkpointing in steps
1071 * where we do global communication,
1072 * otherwise the other nodes don't know.
1074 checkpointHandler->setSignal(walltime_accounting);
1077 /* ######### START SECOND UPDATE STEP ################# */
1079 /* at the start of step, randomize or scale the velocities ((if vv. Restriction of Andersen controlled
1082 if (ETC_ANDERSEN(ir->etc)) /* keep this outside of update_tcouple because of the extra info required to pass */
1084 gmx_bool bIfRandomize;
1085 bIfRandomize = update_randomize_velocities(ir, step, cr, mdatoms, state, upd, constr);
1086 /* if we have constraints, we have to remove the kinetic energy parallel to the bonds */
1087 if (constr && bIfRandomize)
1089 constrain_velocities(step, nullptr,
1093 bCalcVir, do_log, do_ene);
1096 /* Box is changed in update() when we do pressure coupling,
1097 * but we should still use the old box for energy corrections and when
1098 * writing it to the energy file, so it matches the trajectory files for
1099 * the same timestep above. Make a copy in a separate array.
1101 copy_mat(state->box, lastbox);
1105 wallcycle_start(wcycle, ewcUPDATE);
1106 /* UPDATE PRESSURE VARIABLES IN TROTTER FORMULATION WITH CONSTRAINTS */
1109 trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ3);
1110 /* We can only do Berendsen coupling after we have summed
1111 * the kinetic energy or virial. Since the happens
1112 * in global_state after update, we should only do it at
1113 * step % nstlist = 1 with bGStatEveryStep=FALSE.
1118 update_tcouple(step, ir, state, ekind, &MassQ, mdatoms);
1119 update_pcouple_before_coordinates(fplog, step, ir, state,
1120 parrinellorahmanMu, M,
1126 /* velocity half-step update */
1127 update_coords(step, ir, mdatoms, state, f, fcd,
1128 ekind, M, upd, etrtVELOCITY2,
1132 /* Above, initialize just copies ekinh into ekin,
1133 * it doesn't copy position (for VV),
1134 * and entire integrator for MD.
1137 if (ir->eI == eiVVAK)
1139 /* We probably only need md->homenr, not state->natoms */
1140 if (state->natoms > cbuf_nalloc)
1142 cbuf_nalloc = state->natoms;
1143 srenew(cbuf, cbuf_nalloc);
1145 copy_rvecn(as_rvec_array(state->x.data()), cbuf, 0, state->natoms);
1148 update_coords(step, ir, mdatoms, state, f, fcd,
1149 ekind, M, upd, etrtPOSITION, cr, constr);
1150 wallcycle_stop(wcycle, ewcUPDATE);
1152 constrain_coordinates(step, &dvdl_constr, state,
1155 bCalcVir, do_log, do_ene);
1156 update_sd_second_half(step, &dvdl_constr, ir, mdatoms, state,
1157 cr, nrnb, wcycle, upd, constr, do_log, do_ene);
1158 finish_update(ir, mdatoms,
1160 nrnb, wcycle, upd, constr);
1162 if (MASTER(cr) && ir->bPull && ir->pull->bSetPbcRefToPrevStepCOM)
1164 updatePrevStepCom(ir->pull_work);
1165 setStatePrevStepPullCom(ir->pull_work, state);
1168 if (ir->eI == eiVVAK)
1170 /* erase F_EKIN and F_TEMP here? */
1171 /* just compute the kinetic energy at the half step to perform a trotter step */
1172 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
1173 wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
1174 constr, &nullSignaller, lastbox,
1175 nullptr, &bSumEkinhOld,
1176 (bGStat ? CGLO_GSTAT : 0) | CGLO_TEMPERATURE
1178 wallcycle_start(wcycle, ewcUPDATE);
1179 trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ4);
1180 /* now we know the scaling, we can compute the positions again again */
1181 copy_rvecn(cbuf, as_rvec_array(state->x.data()), 0, state->natoms);
1183 update_coords(step, ir, mdatoms, state, f, fcd,
1184 ekind, M, upd, etrtPOSITION, cr, constr);
1185 wallcycle_stop(wcycle, ewcUPDATE);
1187 /* do we need an extra constraint here? just need to copy out of as_rvec_array(state->v.data()) to upd->xp? */
1188 /* are the small terms in the shake_vir here due
1189 * to numerical errors, or are they important
1190 * physically? I'm thinking they are just errors, but not completely sure.
1191 * For now, will call without actually constraining, constr=NULL*/
1192 finish_update(ir, mdatoms,
1194 nrnb, wcycle, upd, nullptr);
1198 /* this factor or 2 correction is necessary
1199 because half of the constraint force is removed
1200 in the vv step, so we have to double it. See
1201 the Redmine issue #1255. It is not yet clear
1202 if the factor of 2 is exact, or just a very
1203 good approximation, and this will be
1204 investigated. The next step is to see if this
1205 can be done adding a dhdl contribution from the
1206 rattle step, but this is somewhat more
1207 complicated with the current code. Will be
1208 investigated, hopefully for 4.6.3. However,
1209 this current solution is much better than
1210 having it completely wrong.
1212 enerd->term[F_DVDL_CONSTR] += 2*dvdl_constr;
1216 enerd->term[F_DVDL_CONSTR] += dvdl_constr;
1219 if (vsite != nullptr)
1221 wallcycle_start(wcycle, ewcVSITECONSTR);
1222 if (graph != nullptr)
1224 shift_self(graph, state->box, as_rvec_array(state->x.data()));
1226 construct_vsites(vsite, as_rvec_array(state->x.data()), ir->delta_t, as_rvec_array(state->v.data()),
1227 top->idef.iparams, top->idef.il,
1228 fr->ePBC, fr->bMolPBC, cr, state->box);
1230 if (graph != nullptr)
1232 unshift_self(graph, state->box, as_rvec_array(state->x.data()));
1234 wallcycle_stop(wcycle, ewcVSITECONSTR);
1237 /* ############## IF NOT VV, Calculate globals HERE ############ */
1238 /* With Leap-Frog we can skip compute_globals at
1239 * non-communication steps, but we need to calculate
1240 * the kinetic energy one step before communication.
1243 // Organize to do inter-simulation signalling on steps if
1244 // and when algorithms require it.
1245 bool doInterSimSignal = (simulationsShareState && do_per_step(step, nstSignalComm));
1247 if (bGStat || (!EI_VV(ir->eI) && do_per_step(step+1, nstglobalcomm)) || doInterSimSignal)
1249 // Since we're already communicating at this step, we
1250 // can propagate intra-simulation signals. Note that
1251 // check_nstglobalcomm has the responsibility for
1252 // choosing the value of nstglobalcomm that is one way
1253 // bGStat becomes true, so we can't get into a
1254 // situation where e.g. checkpointing can't be
1256 bool doIntraSimSignal = true;
1257 SimulationSignaller signaller(&signals, cr, ms, doInterSimSignal, doIntraSimSignal);
1259 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
1260 wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
1263 &totalNumberOfBondedInteractions, &bSumEkinhOld,
1264 (bGStat ? CGLO_GSTAT : 0)
1265 | (!EI_VV(ir->eI) ? CGLO_ENERGY : 0)
1266 | (!EI_VV(ir->eI) && bStopCM ? CGLO_STOPCM : 0)
1267 | (!EI_VV(ir->eI) ? CGLO_TEMPERATURE : 0)
1268 | (!EI_VV(ir->eI) ? CGLO_PRESSURE : 0)
1270 | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)
1272 checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
1273 top_global, top, state,
1274 &shouldCheckNumberOfBondedInteractions);
1278 /* ############# END CALC EKIN AND PRESSURE ################# */
1280 /* Note: this is OK, but there are some numerical precision issues with using the convergence of
1281 the virial that should probably be addressed eventually. state->veta has better properies,
1282 but what we actually need entering the new cycle is the new shake_vir value. Ideally, we could
1283 generate the new shake_vir, but test the veta value for convergence. This will take some thought. */
1285 if (ir->efep != efepNO && !EI_VV(ir->eI))
1287 /* Sum up the foreign energy and dhdl terms for md and sd.
1288 Currently done every step so that dhdl is correct in the .edr */
1289 sum_dhdl(enerd, state->lambda, ir->fepvals);
1292 update_pcouple_after_coordinates(fplog, step, ir, mdatoms,
1293 pres, force_vir, shake_vir,
1297 /* ################# END UPDATE STEP 2 ################# */
1298 /* #### We now have r(t+dt) and v(t+dt/2) ############# */
1300 /* The coordinates (x) were unshifted in update */
1303 /* We will not sum ekinh_old,
1304 * so signal that we still have to do it.
1306 bSumEkinhOld = TRUE;
1311 /* ######### BEGIN PREPARING EDR OUTPUT ########### */
1313 /* use the directly determined last velocity, not actually the averaged half steps */
1314 if (bTrotter && ir->eI == eiVV)
1316 enerd->term[F_EKIN] = last_ekin;
1318 enerd->term[F_ETOT] = enerd->term[F_EPOT] + enerd->term[F_EKIN];
1320 if (integratorHasConservedEnergyQuantity(ir))
1324 enerd->term[F_ECONSERVED] = enerd->term[F_ETOT] + saved_conserved_quantity;
1328 enerd->term[F_ECONSERVED] = enerd->term[F_ETOT] + NPT_energy(ir, state, &MassQ);
1331 /* ######### END PREPARING EDR OUTPUT ########### */
1337 if (fplog && do_log && bDoExpanded)
1339 /* only needed if doing expanded ensemble */
1340 PrintFreeEnergyInfoToFile(fplog, ir->fepvals, ir->expandedvals, ir->bSimTemp ? ir->simtempvals : nullptr,
1341 state_global->dfhist, state->fep_state, ir->nstlog, step);
1345 upd_mdebin(mdebin, bDoDHDL, bCalcEnerStep,
1346 t, mdatoms->tmass, enerd, state,
1347 ir->fepvals, ir->expandedvals, lastbox,
1348 shake_vir, force_vir, total_vir, pres,
1349 ekind, mu_tot, constr);
1353 upd_mdebin_step(mdebin);
1356 gmx_bool do_dr = do_per_step(step, ir->nstdisreout);
1357 gmx_bool do_or = do_per_step(step, ir->nstorireout);
1359 print_ebin(mdoutf_get_fp_ene(outf), do_ene, do_dr, do_or, do_log ? fplog : nullptr,
1361 eprNORMAL, mdebin, fcd, groups, &(ir->opts), awh.get());
1365 pull_print_output(ir->pull_work, step, t);
1368 if (do_per_step(step, ir->nstlog))
1370 if (fflush(fplog) != 0)
1372 gmx_fatal(FARGS, "Cannot flush logfile - maybe you are out of disk space?");
1378 /* Have to do this part _after_ outputting the logfile and the edr file */
1379 /* Gets written into the state at the beginning of next loop*/
1380 state->fep_state = lamnew;
1382 /* Print the remaining wall clock time for the run */
1383 if (isMasterSimMasterRank(ms, cr) &&
1384 (do_verbose || gmx_got_usr_signal()) &&
1389 fprintf(stderr, "\n");
1391 print_time(stderr, walltime_accounting, step, ir, cr);
1394 /* Ion/water position swapping.
1395 * Not done in last step since trajectory writing happens before this call
1396 * in the MD loop and exchanges would be lost anyway. */
1397 bNeedRepartition = FALSE;
1398 if ((ir->eSwapCoords != eswapNO) && (step > 0) && !bLastStep &&
1399 do_per_step(step, ir->swap->nstswap))
1401 bNeedRepartition = do_swapcoords(cr, step, t, ir, wcycle,
1402 as_rvec_array(state->x.data()),
1404 MASTER(cr) && mdrunOptions.verbose,
1407 if (bNeedRepartition && DOMAINDECOMP(cr))
1409 dd_collect_state(cr->dd, state, state_global);
1413 /* Replica exchange */
1417 bExchanged = replica_exchange(fplog, cr, ms, repl_ex,
1418 state_global, enerd,
1422 if ( (bExchanged || bNeedRepartition) && DOMAINDECOMP(cr) )
1424 dd_partition_system(fplog, mdlog, step, cr, TRUE, 1,
1425 state_global, top_global, ir,
1426 state, &f, mdAtoms, top, fr,
1428 nrnb, wcycle, FALSE);
1429 shouldCheckNumberOfBondedInteractions = true;
1430 update_realloc(upd, state->natoms);
1435 startingFromCheckpoint = false;
1437 /* ####### SET VARIABLES FOR NEXT ITERATION IF THEY STILL NEED IT ###### */
1438 /* With all integrators, except VV, we need to retain the pressure
1439 * at the current step for coupling at the next step.
1441 if ((state->flags & (1<<estPRES_PREV)) &&
1443 (ir->nstpcouple > 0 && step % ir->nstpcouple == 0)))
1445 /* Store the pressure in t_state for pressure coupling
1446 * at the next MD step.
1448 copy_mat(pres, state->pres_prev);
1451 /* ####### END SET VARIABLES FOR NEXT ITERATION ###### */
1453 if ( (membed != nullptr) && (!bLastStep) )
1455 rescale_membed(step_rel, membed, as_rvec_array(state_global->x.data()));
1458 cycles = wallcycle_stop(wcycle, ewcSTEP);
1459 if (DOMAINDECOMP(cr) && wcycle)
1461 dd_cycles_add(cr->dd, cycles, ddCyclStep);
1464 /* increase the MD step number */
1468 resetHandler->resetCounters(
1469 step, step_rel, mdlog, fplog, cr, (use_GPU(fr->nbv) ? fr->nbv : nullptr),
1470 nrnb, fr->pmedata, pme_loadbal, wcycle, walltime_accounting);
1472 /* If bIMD is TRUE, the master updates the IMD energy record and sends positions to VMD client */
1473 IMD_prep_energies_send_positions(ir->bIMD && MASTER(cr), bIMDstep, ir->imd, enerd, step, bCalcEner, wcycle);
1476 /* End of main MD loop */
1478 /* Closing TNG files can include compressing data. Therefore it is good to do that
1479 * before stopping the time measurements. */
1480 mdoutf_tng_close(outf);
1482 /* Stop measuring walltime */
1483 walltime_accounting_end_time(walltime_accounting);
1485 if (!thisRankHasDuty(cr, DUTY_PME))
1487 /* Tell the PME only node to finish */
1488 gmx_pme_send_finish(cr);
1493 if (ir->nstcalcenergy > 0)
1495 print_ebin(mdoutf_get_fp_ene(outf), FALSE, FALSE, FALSE, fplog, step, t,
1496 eprAVER, mdebin, fcd, groups, &(ir->opts), awh.get());
1499 done_mdebin(mdebin);
1504 pme_loadbal_done(pme_loadbal, fplog, mdlog, use_GPU(fr->nbv));
1507 done_shellfc(fplog, shellfc, step_rel);
1509 if (useReplicaExchange && MASTER(cr))
1511 print_replica_exchange_statistics(fplog, repl_ex);
1514 // Clean up swapcoords
1515 if (ir->eSwapCoords != eswapNO)
1517 finish_swapcoords(ir->swap);
1520 /* IMD cleanup, if bIMD is TRUE. */
1521 IMD_finalize(ir->bIMD, ir->imd);
1523 walltime_accounting_set_nsteps_done(walltime_accounting, step_rel);
1525 destroy_enerdata(enerd);