Remove redundant shell-code fatal errors
[gromacs.git] / src / gromacs / mdrun / md.cpp
blob02f29de5c70220bfa25d6b8a5f4853f8c7c0cf58
1 /*
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.
37 /*! \internal \file
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
44 #include "gmxpre.h"
46 #include "config.h"
48 #include <stdio.h>
49 #include <stdlib.h>
51 #include <cmath>
53 #include <algorithm>
54 #include <memory>
56 #include "thread_mpi/threads.h"
58 #include "gromacs/awh/awh.h"
59 #include "gromacs/commandline/filenm.h"
60 #include "gromacs/compat/make_unique.h"
61 #include "gromacs/domdec/collect.h"
62 #include "gromacs/domdec/domdec.h"
63 #include "gromacs/domdec/domdec_network.h"
64 #include "gromacs/domdec/domdec_struct.h"
65 #include "gromacs/essentialdynamics/edsam.h"
66 #include "gromacs/ewald/pme.h"
67 #include "gromacs/ewald/pme-load-balancing.h"
68 #include "gromacs/fileio/trxio.h"
69 #include "gromacs/gmxlib/network.h"
70 #include "gromacs/gmxlib/nrnb.h"
71 #include "gromacs/gpu_utils/gpu_utils.h"
72 #include "gromacs/imd/imd.h"
73 #include "gromacs/listed-forces/manage-threading.h"
74 #include "gromacs/math/functions.h"
75 #include "gromacs/math/utilities.h"
76 #include "gromacs/math/vec.h"
77 #include "gromacs/math/vectypes.h"
78 #include "gromacs/mdlib/compute_io.h"
79 #include "gromacs/mdlib/constr.h"
80 #include "gromacs/mdlib/deform.h"
81 #include "gromacs/mdlib/ebin.h"
82 #include "gromacs/mdlib/expanded.h"
83 #include "gromacs/mdlib/force.h"
84 #include "gromacs/mdlib/force_flags.h"
85 #include "gromacs/mdlib/forcerec.h"
86 #include "gromacs/mdlib/md_support.h"
87 #include "gromacs/mdlib/mdatoms.h"
88 #include "gromacs/mdlib/mdebin.h"
89 #include "gromacs/mdlib/mdoutf.h"
90 #include "gromacs/mdlib/mdrun.h"
91 #include "gromacs/mdlib/mdsetup.h"
92 #include "gromacs/mdlib/membed.h"
93 #include "gromacs/mdlib/nb_verlet.h"
94 #include "gromacs/mdlib/nbnxn_gpu_data_mgmt.h"
95 #include "gromacs/mdlib/ns.h"
96 #include "gromacs/mdlib/repl_ex.h"
97 #include "gromacs/mdlib/shellfc.h"
98 #include "gromacs/mdlib/sighandler.h"
99 #include "gromacs/mdlib/sim_util.h"
100 #include "gromacs/mdlib/simulationsignal.h"
101 #include "gromacs/mdlib/tgroup.h"
102 #include "gromacs/mdlib/trajectory_writing.h"
103 #include "gromacs/mdlib/update.h"
104 #include "gromacs/mdlib/vcm.h"
105 #include "gromacs/mdlib/vsite.h"
106 #include "gromacs/mdtypes/awh-history.h"
107 #include "gromacs/mdtypes/awh-params.h"
108 #include "gromacs/mdtypes/commrec.h"
109 #include "gromacs/mdtypes/df_history.h"
110 #include "gromacs/mdtypes/energyhistory.h"
111 #include "gromacs/mdtypes/fcdata.h"
112 #include "gromacs/mdtypes/forcerec.h"
113 #include "gromacs/mdtypes/group.h"
114 #include "gromacs/mdtypes/inputrec.h"
115 #include "gromacs/mdtypes/interaction_const.h"
116 #include "gromacs/mdtypes/md_enums.h"
117 #include "gromacs/mdtypes/mdatom.h"
118 #include "gromacs/mdtypes/observableshistory.h"
119 #include "gromacs/mdtypes/state.h"
120 #include "gromacs/pbcutil/mshift.h"
121 #include "gromacs/pbcutil/pbc.h"
122 #include "gromacs/pulling/pull.h"
123 #include "gromacs/swap/swapcoords.h"
124 #include "gromacs/timing/wallcycle.h"
125 #include "gromacs/timing/walltime_accounting.h"
126 #include "gromacs/topology/atoms.h"
127 #include "gromacs/topology/idef.h"
128 #include "gromacs/topology/mtop_util.h"
129 #include "gromacs/topology/topology.h"
130 #include "gromacs/trajectory/trajectoryframe.h"
131 #include "gromacs/utility/basedefinitions.h"
132 #include "gromacs/utility/cstringutil.h"
133 #include "gromacs/utility/fatalerror.h"
134 #include "gromacs/utility/logger.h"
135 #include "gromacs/utility/real.h"
136 #include "gromacs/utility/smalloc.h"
138 #include "integrator.h"
140 #ifdef GMX_FAHCORE
141 #include "corewrap.h"
142 #endif
144 using gmx::SimulationSignaller;
146 //! Resets all the counters.
147 static void reset_all_counters(FILE *fplog, const gmx::MDLogger &mdlog, t_commrec *cr,
148 gmx_int64_t step,
149 gmx_int64_t *step_rel, t_inputrec *ir,
150 gmx_wallcycle_t wcycle, t_nrnb *nrnb,
151 gmx_walltime_accounting_t walltime_accounting,
152 struct nonbonded_verlet_t *nbv,
153 struct gmx_pme_t *pme)
155 char sbuf[STEPSTRSIZE];
157 /* Reset all the counters related to performance over the run */
158 GMX_LOG(mdlog.warning).asParagraph().appendTextFormatted(
159 "step %s: resetting all time and cycle counters",
160 gmx_step_str(step, sbuf));
162 if (use_GPU(nbv))
164 nbnxn_gpu_reset_timings(nbv);
167 if (pme_gpu_task_enabled(pme))
169 pme_gpu_reset_timings(pme);
172 if (use_GPU(nbv) || pme_gpu_task_enabled(pme))
174 resetGpuProfiler();
177 wallcycle_stop(wcycle, ewcRUN);
178 wallcycle_reset_all(wcycle);
179 if (DOMAINDECOMP(cr))
181 reset_dd_statistics_counters(cr->dd);
183 init_nrnb(nrnb);
184 ir->init_step += *step_rel;
185 ir->nsteps -= *step_rel;
186 *step_rel = 0;
187 wallcycle_start(wcycle, ewcRUN);
188 walltime_accounting_start(walltime_accounting);
189 print_date_and_time(fplog, cr->nodeid, "Restarted time", gmx_gettime());
192 /*! \brief Copy the state from \p rerunFrame to \p globalState and, if requested, construct vsites
194 * \param[in] rerunFrame The trajectory frame to compute energy/forces for
195 * \param[in,out] globalState The global state container
196 * \param[in] constructVsites When true, vsite coordinates are constructed
197 * \param[in] vsite Vsite setup, can be nullptr when \p constructVsites = false
198 * \param[in] idef Topology parameters, used for constructing vsites
199 * \param[in] timeStep Time step, used for constructing vsites
200 * \param[in] forceRec Force record, used for constructing vsites
201 * \param[in,out] graph The molecular graph, used for constructing vsites when != nullptr
202 * \param[in,out] warnWhenNoV When true, issue a warning when no velocities are present in \p rerunFrame; is set to false when a warning was issued
204 static void prepareRerunState(const t_trxframe &rerunFrame,
205 t_state *globalState,
206 bool constructVsites,
207 const gmx_vsite_t *vsite,
208 const t_idef &idef,
209 double timeStep,
210 const t_forcerec &forceRec,
211 t_graph *graph,
212 gmx_bool *warnWhenNoV)
214 for (int i = 0; i < globalState->natoms; i++)
216 copy_rvec(rerunFrame.x[i], globalState->x[i]);
218 if (rerunFrame.bV)
220 for (int i = 0; i < globalState->natoms; i++)
222 copy_rvec(rerunFrame.v[i], globalState->v[i]);
225 else
227 for (int i = 0; i < globalState->natoms; i++)
229 clear_rvec(globalState->v[i]);
231 if (*warnWhenNoV)
233 fprintf(stderr, "\nWARNING: Some frames do not contain velocities.\n"
234 " Ekin, temperature and pressure are incorrect,\n"
235 " the virial will be incorrect when constraints are present.\n"
236 "\n");
237 *warnWhenNoV = FALSE;
240 copy_mat(rerunFrame.box, globalState->box);
242 if (constructVsites)
244 GMX_ASSERT(vsite, "Need valid vsite for constructing vsites");
246 if (graph)
248 /* Following is necessary because the graph may get out of sync
249 * with the coordinates if we only have every N'th coordinate set
251 mk_mshift(nullptr, graph, forceRec.ePBC, globalState->box, as_rvec_array(globalState->x.data()));
252 shift_self(graph, globalState->box, as_rvec_array(globalState->x.data()));
254 construct_vsites(vsite, as_rvec_array(globalState->x.data()), timeStep, as_rvec_array(globalState->v.data()),
255 idef.iparams, idef.il,
256 forceRec.ePBC, forceRec.bMolPBC, nullptr, globalState->box);
257 if (graph)
259 unshift_self(graph, globalState->box, as_rvec_array(globalState->x.data()));
264 void gmx::Integrator::do_md()
266 // TODO Historically, the EM and MD "integrators" used different
267 // names for the t_inputrec *parameter, but these must have the
268 // same name, now that it's a member of a struct. We use this ir
269 // alias to avoid a large ripple of nearly useless changes.
270 // t_inputrec is being replaced by IMdpOptionsProvider, so this
271 // will go away eventually.
272 t_inputrec *ir = inputrec;
273 gmx_mdoutf *outf = nullptr;
274 gmx_int64_t step, step_rel;
275 double elapsed_time;
276 double t, t0, lam0[efptNR];
277 gmx_bool bGStatEveryStep, bGStat, bCalcVir, bCalcEnerStep, bCalcEner;
278 gmx_bool bNS, bNStList, bSimAnn, bStopCM,
279 bFirstStep, bInitStep, bLastStep = FALSE;
280 gmx_bool bDoDHDL = FALSE, bDoFEP = FALSE, bDoExpanded = FALSE;
281 gmx_bool do_ene, do_log, do_verbose, bRerunWarnNoV = TRUE,
282 bForceUpdate = FALSE, bCPT;
283 gmx_bool bMasterState;
284 int force_flags, cglo_flags;
285 tensor force_vir, shake_vir, total_vir, tmp_vir, pres;
286 int i, m;
287 t_trxstatus *status;
288 rvec mu_tot;
289 t_vcm *vcm;
290 matrix parrinellorahmanMu, M;
291 t_trxframe rerun_fr;
292 gmx_repl_ex_t repl_ex = nullptr;
293 int nchkpt = 1;
294 gmx_localtop_t *top;
295 t_mdebin *mdebin = nullptr;
296 gmx_enerdata_t *enerd;
297 PaddedRVecVector f {};
298 gmx_global_stat_t gstat;
299 gmx_update_t *upd = nullptr;
300 t_graph *graph = nullptr;
301 gmx_groups_t *groups;
302 gmx_ekindata_t *ekind;
303 gmx_shellfc_t *shellfc;
304 gmx_bool bSumEkinhOld, bDoReplEx, bExchanged, bNeedRepartition;
305 gmx_bool bResetCountersHalfMaxH = FALSE;
306 gmx_bool bTemp, bPres, bTrotter;
307 real dvdl_constr;
308 rvec *cbuf = nullptr;
309 int cbuf_nalloc = 0;
310 matrix lastbox;
311 int lamnew = 0;
312 /* for FEP */
313 int nstfep = 0;
314 double cycles;
315 real saved_conserved_quantity = 0;
316 real last_ekin = 0;
317 t_extmass MassQ;
318 int **trotter_seq;
319 char sbuf[STEPSTRSIZE], sbuf2[STEPSTRSIZE];
320 int handled_stop_condition = gmx_stop_cond_none; /* compare to get_stop_condition*/
323 /* PME load balancing data for GPU kernels */
324 pme_load_balancing_t *pme_loadbal = nullptr;
325 gmx_bool bPMETune = FALSE;
326 gmx_bool bPMETunePrinting = FALSE;
328 /* Interactive MD */
329 gmx_bool bIMDstep = FALSE;
331 #ifdef GMX_FAHCORE
332 /* Temporary addition for FAHCORE checkpointing */
333 int chkpt_ret;
334 #endif
335 /* Domain decomposition could incorrectly miss a bonded
336 interaction, but checking for that requires a global
337 communication stage, which does not otherwise happen in DD
338 code. So we do that alongside the first global energy reduction
339 after a new DD is made. These variables handle whether the
340 check happens, and the result it returns. */
341 bool shouldCheckNumberOfBondedInteractions = false;
342 int totalNumberOfBondedInteractions = -1;
344 SimulationSignals signals;
345 // Most global communnication stages don't propagate mdrun
346 // signals, and will use this object to achieve that.
347 SimulationSignaller nullSignaller(nullptr, nullptr, nullptr, false, false);
349 if (!mdrunOptions.writeConfout)
351 // This is on by default, and the main known use case for
352 // turning it off is for convenience in benchmarking, which is
353 // something that should not show up in the general user
354 // interface.
355 GMX_LOG(mdlog.info).asParagraph().
356 appendText("The -noconfout functionality is deprecated, and may be removed in a future version.");
358 if (mdrunOptions.timingOptions.resetHalfway)
360 GMX_LOG(mdlog.info).asParagraph().
361 appendText("The -resethway functionality is deprecated, and may be removed in a future version.");
362 if (ir->nsteps > 0)
364 /* Signal to reset the counters half the simulation steps. */
365 wcycle_set_reset_counters(wcycle, ir->nsteps/2);
367 /* Signal to reset the counters halfway the simulation time. */
368 bResetCountersHalfMaxH = (mdrunOptions.maximumHoursToRun > 0);
371 /* md-vv uses averaged full step velocities for T-control
372 md-vv-avek uses averaged half step velocities for T-control (but full step ekin for P control)
373 md uses averaged half step kinetic energies to determine temperature unless defined otherwise by GMX_EKIN_AVE_VEL; */
374 bTrotter = (EI_VV(ir->eI) && (inputrecNptTrotter(ir) || inputrecNphTrotter(ir) || inputrecNvtTrotter(ir)));
376 const gmx_bool bRerunMD = mdrunOptions.rerun;
377 int nstglobalcomm = mdrunOptions.globalCommunicationInterval;
379 if (bRerunMD)
381 /* Since we don't know if the frames read are related in any way,
382 * rebuild the neighborlist at every step.
384 ir->nstlist = 1;
385 ir->nstcalcenergy = 1;
386 nstglobalcomm = 1;
389 nstglobalcomm = check_nstglobalcomm(mdlog, nstglobalcomm, ir);
390 bGStatEveryStep = (nstglobalcomm == 1);
392 if (bRerunMD)
394 ir->nstxout_compressed = 0;
396 groups = &top_global->groups;
398 gmx_edsam *ed = nullptr;
399 if (opt2bSet("-ei", nfile, fnm) || observablesHistory->edsamHistory != nullptr)
401 /* Initialize essential dynamics sampling */
402 ed = init_edsam(opt2fn_null("-ei", nfile, fnm), opt2fn("-eo", nfile, fnm),
403 top_global,
404 ir, cr, constr,
405 state_global, observablesHistory,
406 oenv, mdrunOptions.continuationOptions.appendFiles);
409 if (ir->eSwapCoords != eswapNO)
411 /* Initialize ion swapping code */
412 init_swapcoords(fplog, ir, opt2fn_master("-swap", nfile, fnm, cr),
413 top_global,
414 state_global, observablesHistory,
415 cr, oenv, mdrunOptions);
418 /* Initial values */
419 init_md(fplog, cr, outputProvider, ir, oenv, mdrunOptions,
420 &t, &t0, state_global, lam0,
421 nrnb, top_global, &upd,
422 nfile, fnm, &outf, &mdebin,
423 force_vir, shake_vir, mu_tot, &bSimAnn, &vcm, wcycle);
425 clear_mat(total_vir);
426 clear_mat(pres);
427 /* Energy terms and groups */
428 snew(enerd, 1);
429 init_enerdata(top_global->groups.grps[egcENER].nr, ir->fepvals->n_lambda,
430 enerd);
432 /* Kinetic energy data */
433 snew(ekind, 1);
434 init_ekindata(fplog, top_global, &(ir->opts), ekind);
435 /* Copy the cos acceleration to the groups struct */
436 ekind->cosacc.cos_accel = ir->cos_accel;
438 gstat = global_stat_init(ir);
440 /* Check for polarizable models and flexible constraints */
441 shellfc = init_shell_flexcon(fplog,
442 top_global, n_flexible_constraints(constr),
443 ir->nstcalcenergy, DOMAINDECOMP(cr));
445 if (shellfc && ir->bDoAwh)
447 gmx_fatal(FARGS, "AWH biasing does not support shell particles.");
450 if (inputrecDeform(ir))
452 tMPI_Thread_mutex_lock(&deform_init_box_mutex);
453 set_deform_reference_box(upd,
454 deform_init_init_step_tpx,
455 deform_init_box_tpx);
456 tMPI_Thread_mutex_unlock(&deform_init_box_mutex);
460 double io = compute_io(ir, top_global->natoms, groups, mdebin->ebin->nener, 1);
461 if ((io > 2000) && MASTER(cr))
463 fprintf(stderr,
464 "\nWARNING: This run will generate roughly %.0f Mb of data\n\n",
465 io);
469 // Local state only becomes valid now.
470 std::unique_ptr<t_state> stateInstance;
471 t_state * state;
473 if (DOMAINDECOMP(cr))
475 top = dd_init_local_top(top_global);
477 stateInstance = gmx::compat::make_unique<t_state>();
478 state = stateInstance.get();
479 dd_init_local_state(cr->dd, state_global, state);
481 else
483 state_change_natoms(state_global, state_global->natoms);
484 /* We need to allocate one element extra, since we might use
485 * (unaligned) 4-wide SIMD loads to access rvec entries.
487 f.resize(gmx::paddedRVecVectorSize(state_global->natoms));
488 /* Copy the pointer to the global state */
489 state = state_global;
491 snew(top, 1);
492 mdAlgorithmsSetupAtomData(cr, ir, top_global, top, fr,
493 &graph, mdAtoms, vsite, shellfc);
495 update_realloc(upd, state->natoms);
498 /* Set up interactive MD (IMD) */
499 init_IMD(ir, cr, ms, top_global, fplog, ir->nstcalcenergy,
500 MASTER(cr) ? as_rvec_array(state_global->x.data()) : nullptr,
501 nfile, fnm, oenv, mdrunOptions);
503 if (DOMAINDECOMP(cr))
505 /* Distribute the charge groups over the nodes from the master node */
506 dd_partition_system(fplog, ir->init_step, cr, TRUE, 1,
507 state_global, top_global, ir,
508 state, &f, mdAtoms, top, fr,
509 vsite, constr,
510 nrnb, nullptr, FALSE);
511 shouldCheckNumberOfBondedInteractions = true;
512 update_realloc(upd, state->natoms);
515 auto mdatoms = mdAtoms->mdatoms();
517 // NOTE: The global state is no longer used at this point.
518 // But state_global is still used as temporary storage space for writing
519 // the global state to file and potentially for replica exchange.
520 // (Global topology should persist.)
522 update_mdatoms(mdatoms, state->lambda[efptMASS]);
524 const ContinuationOptions &continuationOptions = mdrunOptions.continuationOptions;
525 bool startingFromCheckpoint = continuationOptions.startedFromCheckpoint;
527 if (ir->bExpanded)
529 init_expanded_ensemble(startingFromCheckpoint, ir, state->dfhist);
532 if (MASTER(cr))
534 if (startingFromCheckpoint)
536 /* Update mdebin with energy history if appending to output files */
537 if (continuationOptions.appendFiles)
539 restore_energyhistory_from_state(mdebin, observablesHistory->energyHistory.get());
541 else if (observablesHistory->energyHistory.get() != nullptr)
543 /* We might have read an energy history from checkpoint.
544 * As we are not appending, we want to restart the statistics.
545 * Free the allocated memory and reset the counts.
547 observablesHistory->energyHistory = {};
550 if (observablesHistory->energyHistory.get() == nullptr)
552 observablesHistory->energyHistory = std::unique_ptr<energyhistory_t>(new energyhistory_t {});
554 /* Set the initial energy history in state by updating once */
555 update_energyhistory(observablesHistory->energyHistory.get(), mdebin);
558 /* Initialize constraints */
559 if (constr && !DOMAINDECOMP(cr))
561 set_constraints(constr, top, ir, mdatoms, cr);
564 /* Initialize AWH and restore state from history in checkpoint if needed. */
565 if (ir->bDoAwh)
567 ir->awh = new gmx::Awh(fplog, *ir, cr, ms, *ir->awhParams, opt2fn("-awh", nfile, fnm), ir->pull_work);
569 if (startingFromCheckpoint)
571 /* Restore the AWH history read from checkpoint */
572 ir->awh->restoreStateFromHistory(MASTER(cr) ? state_global->awhHistory.get() : nullptr);
574 else if (MASTER(cr))
576 /* Initialize the AWH history here */
577 state_global->awhHistory = ir->awh->initHistoryFromState();
581 const bool useReplicaExchange = (replExParams.exchangeInterval > 0);
582 if (useReplicaExchange && MASTER(cr))
584 repl_ex = init_replica_exchange(fplog, ms, top_global->natoms, ir,
585 replExParams);
587 /* PME tuning is only supported in the Verlet scheme, with PME for
588 * Coulomb. It is not supported with only LJ PME, or for
589 * reruns. */
590 bPMETune = (mdrunOptions.tunePme && EEL_PME(fr->ic->eeltype) && !bRerunMD &&
591 !mdrunOptions.reproducible && ir->cutoff_scheme != ecutsGROUP);
592 if (bPMETune)
594 pme_loadbal_init(&pme_loadbal, cr, mdlog, ir, state->box,
595 fr->ic, fr->nbv->listParams.get(), fr->pmedata, use_GPU(fr->nbv),
596 &bPMETunePrinting);
599 if (!ir->bContinuation && !bRerunMD)
601 if (state->flags & (1 << estV))
603 /* Set the velocities of vsites, shells and frozen atoms to zero */
604 for (i = 0; i < mdatoms->homenr; i++)
606 if (mdatoms->ptype[i] == eptVSite ||
607 mdatoms->ptype[i] == eptShell)
609 clear_rvec(state->v[i]);
611 else if (mdatoms->cFREEZE)
613 for (m = 0; m < DIM; m++)
615 if (ir->opts.nFreeze[mdatoms->cFREEZE[i]][m])
617 state->v[i][m] = 0;
624 if (constr)
626 /* Constrain the initial coordinates and velocities */
627 do_constrain_first(fplog, constr, ir, mdatoms, state,
628 cr, ms, nrnb, fr, top);
630 if (vsite)
632 /* Construct the virtual sites for the initial configuration */
633 construct_vsites(vsite, as_rvec_array(state->x.data()), ir->delta_t, nullptr,
634 top->idef.iparams, top->idef.il,
635 fr->ePBC, fr->bMolPBC, cr, state->box);
639 if (ir->efep != efepNO)
641 /* Set free energy calculation frequency as the greatest common
642 * denominator of nstdhdl and repl_ex_nst. */
643 nstfep = ir->fepvals->nstdhdl;
644 if (ir->bExpanded)
646 nstfep = gmx_greatest_common_divisor(ir->expandedvals->nstexpanded, nstfep);
648 if (useReplicaExchange)
650 nstfep = gmx_greatest_common_divisor(replExParams.exchangeInterval, nstfep);
654 /* Be REALLY careful about what flags you set here. You CANNOT assume
655 * this is the first step, since we might be restarting from a checkpoint,
656 * and in that case we should not do any modifications to the state.
658 bStopCM = (ir->comm_mode != ecmNO && !ir->bContinuation);
660 if (continuationOptions.haveReadEkin)
662 restore_ekinstate_from_state(cr, ekind, &state_global->ekinstate);
665 cglo_flags = (CGLO_INITIALIZATION | CGLO_TEMPERATURE | CGLO_GSTAT
666 | (EI_VV(ir->eI) ? CGLO_PRESSURE : 0)
667 | (EI_VV(ir->eI) ? CGLO_CONSTRAINT : 0)
668 | (continuationOptions.haveReadEkin ? CGLO_READEKIN : 0));
670 bSumEkinhOld = FALSE;
671 /* To minimize communication, compute_globals computes the COM velocity
672 * and the kinetic energy for the velocities without COM motion removed.
673 * Thus to get the kinetic energy without the COM contribution, we need
674 * to call compute_globals twice.
676 for (int cgloIteration = 0; cgloIteration < (bStopCM ? 2 : 1); cgloIteration++)
678 int cglo_flags_iteration = cglo_flags;
679 if (bStopCM && cgloIteration == 0)
681 cglo_flags_iteration |= CGLO_STOPCM;
682 cglo_flags_iteration &= ~CGLO_TEMPERATURE;
684 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
685 nullptr, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
686 constr, &nullSignaller, state->box,
687 &totalNumberOfBondedInteractions, &bSumEkinhOld, cglo_flags_iteration
688 | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0));
690 checkNumberOfBondedInteractions(fplog, cr, totalNumberOfBondedInteractions,
691 top_global, top, state,
692 &shouldCheckNumberOfBondedInteractions);
693 if (ir->eI == eiVVAK)
695 /* a second call to get the half step temperature initialized as well */
696 /* we do the same call as above, but turn the pressure off -- internally to
697 compute_globals, this is recognized as a velocity verlet half-step
698 kinetic energy calculation. This minimized excess variables, but
699 perhaps loses some logic?*/
701 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
702 nullptr, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
703 constr, &nullSignaller, state->box,
704 nullptr, &bSumEkinhOld,
705 cglo_flags & ~CGLO_PRESSURE);
708 /* Calculate the initial half step temperature, and save the ekinh_old */
709 if (!continuationOptions.startedFromCheckpoint)
711 for (i = 0; (i < ir->opts.ngtc); i++)
713 copy_mat(ekind->tcstat[i].ekinh, ekind->tcstat[i].ekinh_old);
717 /* need to make an initiation call to get the Trotter variables set, as well as other constants for non-trotter
718 temperature control */
719 trotter_seq = init_npt_vars(ir, state, &MassQ, bTrotter);
721 if (MASTER(cr))
723 if (!ir->bContinuation)
725 if (constr && ir->eConstrAlg == econtLINCS)
727 fprintf(fplog,
728 "RMS relative constraint deviation after constraining: %.2e\n",
729 constr_rmsd(constr));
731 if (EI_STATE_VELOCITY(ir->eI))
733 real temp = enerd->term[F_TEMP];
734 if (ir->eI != eiVV)
736 /* Result of Ekin averaged over velocities of -half
737 * and +half step, while we only have -half step here.
739 temp *= 2;
741 fprintf(fplog, "Initial temperature: %g K\n", temp);
745 if (bRerunMD)
747 fprintf(stderr, "starting md rerun '%s', reading coordinates from"
748 " input trajectory '%s'\n\n",
749 *(top_global->name), opt2fn("-rerun", nfile, fnm));
750 if (mdrunOptions.verbose)
752 fprintf(stderr, "Calculated time to finish depends on nsteps from "
753 "run input file,\nwhich may not correspond to the time "
754 "needed to process input trajectory.\n\n");
757 else
759 char tbuf[20];
760 fprintf(stderr, "starting mdrun '%s'\n",
761 *(top_global->name));
762 if (ir->nsteps >= 0)
764 sprintf(tbuf, "%8.1f", (ir->init_step+ir->nsteps)*ir->delta_t);
766 else
768 sprintf(tbuf, "%s", "infinite");
770 if (ir->init_step > 0)
772 fprintf(stderr, "%s steps, %s ps (continuing from step %s, %8.1f ps).\n",
773 gmx_step_str(ir->init_step+ir->nsteps, sbuf), tbuf,
774 gmx_step_str(ir->init_step, sbuf2),
775 ir->init_step*ir->delta_t);
777 else
779 fprintf(stderr, "%s steps, %s ps.\n",
780 gmx_step_str(ir->nsteps, sbuf), tbuf);
783 fprintf(fplog, "\n");
786 walltime_accounting_start(walltime_accounting);
787 wallcycle_start(wcycle, ewcRUN);
788 print_start(fplog, cr, walltime_accounting, "mdrun");
790 /* safest point to do file checkpointing is here. More general point would be immediately before integrator call */
791 #ifdef GMX_FAHCORE
792 chkpt_ret = fcCheckPointParallel( cr->nodeid,
793 NULL, 0);
794 if (chkpt_ret == 0)
796 gmx_fatal( 3, __FILE__, __LINE__, "Checkpoint error on step %d\n", 0 );
798 #endif
800 /***********************************************************
802 * Loop over MD steps
804 ************************************************************/
806 /* if rerunMD then read coordinates and velocities from input trajectory */
807 if (bRerunMD)
809 if (getenv("GMX_FORCE_UPDATE"))
811 bForceUpdate = TRUE;
814 rerun_fr.natoms = 0;
815 if (MASTER(cr))
817 bLastStep = !read_first_frame(oenv, &status,
818 opt2fn("-rerun", nfile, fnm),
819 &rerun_fr, TRX_NEED_X | TRX_READ_V);
820 if (rerun_fr.natoms != top_global->natoms)
822 gmx_fatal(FARGS,
823 "Number of atoms in trajectory (%d) does not match the "
824 "run input file (%d)\n",
825 rerun_fr.natoms, top_global->natoms);
827 if (ir->ePBC != epbcNONE)
829 if (!rerun_fr.bBox)
831 gmx_fatal(FARGS, "Rerun trajectory frame step %d time %f does not contain a box, while pbc is used", rerun_fr.step, rerun_fr.time);
833 if (max_cutoff2(ir->ePBC, rerun_fr.box) < gmx::square(fr->rlist))
835 gmx_fatal(FARGS, "Rerun trajectory frame step %d time %f has too small box dimensions", rerun_fr.step, rerun_fr.time);
840 if (PAR(cr))
842 rerun_parallel_comm(cr, &rerun_fr, &bLastStep);
845 if (ir->ePBC != epbcNONE)
847 /* Set the shift vectors.
848 * Necessary here when have a static box different from the tpr box.
850 calc_shifts(rerun_fr.box, fr->shift_vec);
854 /* Loop over MD steps or if rerunMD to end of input trajectory,
855 * or, if max_hours>0, until max_hours is reached.
857 real max_hours = mdrunOptions.maximumHoursToRun;
858 bFirstStep = TRUE;
859 /* Skip the first Nose-Hoover integration when we get the state from tpx */
860 bInitStep = !startingFromCheckpoint || EI_VV(ir->eI);
861 bSumEkinhOld = FALSE;
862 bExchanged = FALSE;
863 bNeedRepartition = FALSE;
865 bool simulationsShareState = false;
866 int nstSignalComm = nstglobalcomm;
868 // TODO This implementation of ensemble orientation restraints is nasty because
869 // a user can't just do multi-sim with single-sim orientation restraints.
870 bool usingEnsembleRestraints = (fcd->disres.nsystems > 1) || (ms && fcd->orires.nr);
871 bool awhUsesMultiSim = (ir->bDoAwh && ir->awhParams->shareBiasMultisim && ms);
873 // Replica exchange, ensemble restraints and AWH need all
874 // simulations to remain synchronized, so they need
875 // checkpoints and stop conditions to act on the same step, so
876 // the propagation of such signals must take place between
877 // simulations, not just within simulations.
878 // TODO: Make algorithm initializers set these flags.
879 simulationsShareState = useReplicaExchange || usingEnsembleRestraints || awhUsesMultiSim;
880 bool resetCountersIsLocal = true;
881 signals[eglsCHKPT] = SimulationSignal(!simulationsShareState);
882 signals[eglsSTOPCOND] = SimulationSignal(!simulationsShareState);
883 signals[eglsRESETCOUNTERS] = SimulationSignal(resetCountersIsLocal);
885 if (simulationsShareState)
887 // Inter-simulation signal communication does not need to happen
888 // often, so we use a minimum of 200 steps to reduce overhead.
889 const int c_minimumInterSimulationSignallingInterval = 200;
890 nstSignalComm = ((c_minimumInterSimulationSignallingInterval + nstglobalcomm - 1)/nstglobalcomm)*nstglobalcomm;
894 DdOpenBalanceRegionBeforeForceComputation ddOpenBalanceRegion = (DOMAINDECOMP(cr) ? DdOpenBalanceRegionBeforeForceComputation::yes : DdOpenBalanceRegionBeforeForceComputation::no);
895 DdCloseBalanceRegionAfterForceComputation ddCloseBalanceRegion = (DOMAINDECOMP(cr) ? DdCloseBalanceRegionAfterForceComputation::yes : DdCloseBalanceRegionAfterForceComputation::no);
897 step = ir->init_step;
898 step_rel = 0;
900 // TODO extract this to new multi-simulation module
901 if (MASTER(cr) && isMultiSim(ms) && !useReplicaExchange)
903 if (!multisim_int_all_are_equal(ms, ir->nsteps))
905 GMX_LOG(mdlog.warning).appendText(
906 "Note: The number of steps is not consistent across multi simulations,\n"
907 "but we are proceeding anyway!");
909 if (!multisim_int_all_are_equal(ms, ir->init_step))
911 GMX_LOG(mdlog.warning).appendText(
912 "Note: The initial step is not consistent across multi simulations,\n"
913 "but we are proceeding anyway!");
917 /* and stop now if we should */
918 bLastStep = (bLastStep || (ir->nsteps >= 0 && step_rel > ir->nsteps));
919 while (!bLastStep)
922 /* Determine if this is a neighbor search step */
923 bNStList = (ir->nstlist > 0 && step % ir->nstlist == 0);
925 if (bPMETune && bNStList)
927 /* PME grid + cut-off optimization with GPUs or PME nodes */
928 pme_loadbal_do(pme_loadbal, cr,
929 (mdrunOptions.verbose && MASTER(cr)) ? stderr : nullptr,
930 fplog, mdlog,
931 ir, fr, state,
932 wcycle,
933 step, step_rel,
934 &bPMETunePrinting);
937 wallcycle_start(wcycle, ewcSTEP);
939 if (bRerunMD)
941 if (rerun_fr.bStep)
943 step = rerun_fr.step;
944 step_rel = step - ir->init_step;
946 if (rerun_fr.bTime)
948 t = rerun_fr.time;
950 else
952 t = step;
955 else
957 bLastStep = (step_rel == ir->nsteps);
958 t = t0 + step*ir->delta_t;
961 // TODO Refactor this, so that nstfep does not need a default value of zero
962 if (ir->efep != efepNO || ir->bSimTemp)
964 /* find and set the current lambdas. If rerunning, we either read in a state, or a lambda value,
965 requiring different logic. */
966 if (bRerunMD)
968 if (MASTER(cr))
970 setCurrentLambdasRerun(step, ir->fepvals, &rerun_fr, lam0, state_global);
973 else
975 setCurrentLambdasLocal(step, ir->fepvals, lam0, state);
977 bDoDHDL = do_per_step(step, ir->fepvals->nstdhdl);
978 bDoFEP = ((ir->efep != efepNO) && do_per_step(step, nstfep));
979 bDoExpanded = (do_per_step(step, ir->expandedvals->nstexpanded)
980 && (ir->bExpanded) && (step > 0) && (!startingFromCheckpoint));
983 bDoReplEx = (useReplicaExchange && (step > 0) && !bLastStep &&
984 do_per_step(step, replExParams.exchangeInterval));
986 if (bSimAnn)
988 update_annealing_target_temp(ir, t, upd);
991 if (bRerunMD && MASTER(cr))
993 const bool constructVsites = (vsite && mdrunOptions.rerunConstructVsites);
994 if (constructVsites && DOMAINDECOMP(cr))
996 gmx_fatal(FARGS, "Vsite recalculation with -rerun is not implemented with domain decomposition, use a single rank");
998 prepareRerunState(rerun_fr, state_global, constructVsites, vsite, top->idef, ir->delta_t, *fr, graph, &bRerunWarnNoV);
1001 /* Stop Center of Mass motion */
1002 bStopCM = (ir->comm_mode != ecmNO && do_per_step(step, ir->nstcomm));
1004 if (bRerunMD)
1006 /* for rerun MD always do Neighbour Searching */
1007 bNS = (bFirstStep || ir->nstlist != 0);
1009 else
1011 /* Determine whether or not to do Neighbour Searching */
1012 bNS = (bFirstStep || bNStList || bExchanged || bNeedRepartition);
1015 /* < 0 means stop at next step, > 0 means stop at next NS step */
1016 if ( (signals[eglsSTOPCOND].set < 0) ||
1017 ( (signals[eglsSTOPCOND].set > 0 ) && ( bNS || ir->nstlist == 0)))
1019 bLastStep = TRUE;
1022 /* do_log triggers energy and virial calculation. Because this leads
1023 * to different code paths, forces can be different. Thus for exact
1024 * continuation we should avoid extra log output.
1025 * Note that the || bLastStep can result in non-exact continuation
1026 * beyond the last step. But we don't consider that to be an issue.
1028 do_log = do_per_step(step, ir->nstlog) || (bFirstStep && !startingFromCheckpoint) || bLastStep || bRerunMD;
1029 do_verbose = mdrunOptions.verbose &&
1030 (step % mdrunOptions.verboseStepPrintInterval == 0 || bFirstStep || bLastStep || bRerunMD);
1032 if (bNS && !(bFirstStep && ir->bContinuation && !bRerunMD))
1034 if (bRerunMD)
1036 bMasterState = TRUE;
1038 else
1040 bMasterState = FALSE;
1041 /* Correct the new box if it is too skewed */
1042 if (inputrecDynamicBox(ir))
1044 if (correct_box(fplog, step, state->box, graph))
1046 bMasterState = TRUE;
1049 if (DOMAINDECOMP(cr) && bMasterState)
1051 dd_collect_state(cr->dd, state, state_global);
1055 if (DOMAINDECOMP(cr))
1057 /* Repartition the domain decomposition */
1058 dd_partition_system(fplog, step, cr,
1059 bMasterState, nstglobalcomm,
1060 state_global, top_global, ir,
1061 state, &f, mdAtoms, top, fr,
1062 vsite, constr,
1063 nrnb, wcycle,
1064 do_verbose && !bPMETunePrinting);
1065 shouldCheckNumberOfBondedInteractions = true;
1066 update_realloc(upd, state->natoms);
1070 if (MASTER(cr) && do_log)
1072 print_ebin_header(fplog, step, t); /* can we improve the information printed here? */
1075 if (ir->efep != efepNO)
1077 update_mdatoms(mdatoms, state->lambda[efptMASS]);
1080 if ((bRerunMD && rerun_fr.bV) || bExchanged)
1083 /* We need the kinetic energy at minus the half step for determining
1084 * the full step kinetic energy and possibly for T-coupling.*/
1085 /* This may not be quite working correctly yet . . . . */
1086 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
1087 wcycle, enerd, nullptr, nullptr, nullptr, nullptr, mu_tot,
1088 constr, &nullSignaller, state->box,
1089 &totalNumberOfBondedInteractions, &bSumEkinhOld,
1090 CGLO_GSTAT | CGLO_TEMPERATURE | CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS);
1091 checkNumberOfBondedInteractions(fplog, cr, totalNumberOfBondedInteractions,
1092 top_global, top, state,
1093 &shouldCheckNumberOfBondedInteractions);
1095 clear_mat(force_vir);
1097 /* We write a checkpoint at this MD step when:
1098 * either at an NS step when we signalled through gs,
1099 * or at the last step (but not when we do not want confout),
1100 * but never at the first step or with rerun.
1102 bCPT = (((signals[eglsCHKPT].set && (bNS || ir->nstlist == 0)) ||
1103 (bLastStep && mdrunOptions.writeConfout)) &&
1104 step > ir->init_step && !bRerunMD);
1105 if (bCPT)
1107 signals[eglsCHKPT].set = 0;
1110 /* Determine the energy and pressure:
1111 * at nstcalcenergy steps and at energy output steps (set below).
1113 if (EI_VV(ir->eI) && (!bInitStep))
1115 /* for vv, the first half of the integration actually corresponds
1116 to the previous step. bCalcEner is only required to be evaluated on the 'next' step,
1117 but the virial needs to be calculated on both the current step and the 'next' step. Future
1118 reorganization may be able to get rid of one of the bCalcVir=TRUE steps. */
1120 /* TODO: This is probably not what we want, we will write to energy file one step after nstcalcenergy steps. */
1121 bCalcEnerStep = do_per_step(step - 1, ir->nstcalcenergy);
1122 bCalcVir = bCalcEnerStep ||
1123 (ir->epc != epcNO && (do_per_step(step, ir->nstpcouple) || do_per_step(step-1, ir->nstpcouple)));
1125 else
1127 bCalcEnerStep = do_per_step(step, ir->nstcalcenergy);
1128 bCalcVir = bCalcEnerStep ||
1129 (ir->epc != epcNO && do_per_step(step, ir->nstpcouple));
1131 bCalcEner = bCalcEnerStep;
1133 do_ene = (do_per_step(step, ir->nstenergy) || bLastStep || bRerunMD);
1135 if (do_ene || do_log || bDoReplEx)
1137 bCalcVir = TRUE;
1138 bCalcEner = TRUE;
1141 /* Do we need global communication ? */
1142 bGStat = (bCalcVir || bCalcEner || bStopCM ||
1143 do_per_step(step, nstglobalcomm) ||
1144 (EI_VV(ir->eI) && inputrecNvtTrotter(ir) && do_per_step(step-1, nstglobalcomm)));
1146 force_flags = (GMX_FORCE_STATECHANGED |
1147 ((inputrecDynamicBox(ir) || bRerunMD) ? GMX_FORCE_DYNAMICBOX : 0) |
1148 GMX_FORCE_ALLFORCES |
1149 (bCalcVir ? GMX_FORCE_VIRIAL : 0) |
1150 (bCalcEner ? GMX_FORCE_ENERGY : 0) |
1151 (bDoFEP ? GMX_FORCE_DHDL : 0)
1154 if (shellfc)
1156 /* Now is the time to relax the shells */
1157 relax_shell_flexcon(fplog, cr, ms, mdrunOptions.verbose, step,
1158 ir, bNS, force_flags, top,
1159 constr, enerd, fcd,
1160 state, f, force_vir, mdatoms,
1161 nrnb, wcycle, graph, groups,
1162 shellfc, fr, t, mu_tot,
1163 vsite,
1164 ddOpenBalanceRegion, ddCloseBalanceRegion);
1166 else
1168 /* The AWH history need to be saved _before_ doing force calculations where the AWH bias is updated
1169 (or the AWH update will be performed twice for one step when continuing). It would be best to
1170 call this update function from do_md_trajectory_writing but that would occur after do_force.
1171 One would have to divide the update_awh function into one function applying the AWH force
1172 and one doing the AWH bias update. The update AWH bias function could then be called after
1173 do_md_trajectory_writing (then containing update_awh_history).
1174 The checkpointing will in the future probably moved to the start of the md loop which will
1175 rid of this issue. */
1176 if (ir->bDoAwh && bCPT && MASTER(cr))
1178 ir->awh->updateHistory(state_global->awhHistory.get());
1181 /* The coordinates (x) are shifted (to get whole molecules)
1182 * in do_force.
1183 * This is parallellized as well, and does communication too.
1184 * Check comments in sim_util.c
1186 do_force(fplog, cr, ms, ir, step, nrnb, wcycle, top, groups,
1187 state->box, state->x, &state->hist,
1188 f, force_vir, mdatoms, enerd, fcd,
1189 state->lambda, graph,
1190 fr, vsite, mu_tot, t, ed,
1191 (bNS ? GMX_FORCE_NS : 0) | force_flags,
1192 ddOpenBalanceRegion, ddCloseBalanceRegion);
1195 if (EI_VV(ir->eI) && !startingFromCheckpoint && !bRerunMD)
1196 /* ############### START FIRST UPDATE HALF-STEP FOR VV METHODS############### */
1198 rvec *vbuf = nullptr;
1200 wallcycle_start(wcycle, ewcUPDATE);
1201 if (ir->eI == eiVV && bInitStep)
1203 /* if using velocity verlet with full time step Ekin,
1204 * take the first half step only to compute the
1205 * virial for the first step. From there,
1206 * revert back to the initial coordinates
1207 * so that the input is actually the initial step.
1209 snew(vbuf, state->natoms);
1210 copy_rvecn(as_rvec_array(state->v.data()), vbuf, 0, state->natoms); /* should make this better for parallelizing? */
1212 else
1214 /* this is for NHC in the Ekin(t+dt/2) version of vv */
1215 trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ1);
1218 update_coords(step, ir, mdatoms, state, f, fcd,
1219 ekind, M, upd, etrtVELOCITY1,
1220 cr, constr);
1222 if (!bRerunMD || rerun_fr.bV || bForceUpdate) /* Why is rerun_fr.bV here? Unclear. */
1224 wallcycle_stop(wcycle, ewcUPDATE);
1225 constrain_velocities(step, nullptr, ir, mdatoms,
1226 state, fr->bMolPBC,
1227 &top->idef, shake_vir,
1228 cr, ms, nrnb, wcycle, constr,
1229 bCalcVir, do_log, do_ene);
1230 wallcycle_start(wcycle, ewcUPDATE);
1232 else if (graph)
1234 /* Need to unshift here if a do_force has been
1235 called in the previous step */
1236 unshift_self(graph, state->box, as_rvec_array(state->x.data()));
1238 /* if VV, compute the pressure and constraints */
1239 /* For VV2, we strictly only need this if using pressure
1240 * control, but we really would like to have accurate pressures
1241 * printed out.
1242 * Think about ways around this in the future?
1243 * For now, keep this choice in comments.
1245 /*bPres = (ir->eI==eiVV || inputrecNptTrotter(ir)); */
1246 /*bTemp = ((ir->eI==eiVV &&(!bInitStep)) || (ir->eI==eiVVAK && inputrecNptTrotter(ir)));*/
1247 bPres = TRUE;
1248 bTemp = ((ir->eI == eiVV && (!bInitStep)) || (ir->eI == eiVVAK));
1249 if (bCalcEner && ir->eI == eiVVAK)
1251 bSumEkinhOld = TRUE;
1253 /* for vv, the first half of the integration actually corresponds to the previous step.
1254 So we need information from the last step in the first half of the integration */
1255 if (bGStat || do_per_step(step-1, nstglobalcomm))
1257 wallcycle_stop(wcycle, ewcUPDATE);
1258 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
1259 wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
1260 constr, &nullSignaller, state->box,
1261 &totalNumberOfBondedInteractions, &bSumEkinhOld,
1262 (bGStat ? CGLO_GSTAT : 0)
1263 | CGLO_ENERGY
1264 | (bTemp ? CGLO_TEMPERATURE : 0)
1265 | (bPres ? CGLO_PRESSURE : 0)
1266 | (bPres ? CGLO_CONSTRAINT : 0)
1267 | (bStopCM ? CGLO_STOPCM : 0)
1268 | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)
1269 | CGLO_SCALEEKIN
1271 /* explanation of above:
1272 a) We compute Ekin at the full time step
1273 if 1) we are using the AveVel Ekin, and it's not the
1274 initial step, or 2) if we are using AveEkin, but need the full
1275 time step kinetic energy for the pressure (always true now, since we want accurate statistics).
1276 b) If we are using EkinAveEkin for the kinetic energy for the temperature control, we still feed in
1277 EkinAveVel because it's needed for the pressure */
1278 checkNumberOfBondedInteractions(fplog, cr, totalNumberOfBondedInteractions,
1279 top_global, top, state,
1280 &shouldCheckNumberOfBondedInteractions);
1281 wallcycle_start(wcycle, ewcUPDATE);
1283 /* temperature scaling and pressure scaling to produce the extended variables at t+dt */
1284 if (!bInitStep)
1286 if (bTrotter)
1288 m_add(force_vir, shake_vir, total_vir); /* we need the un-dispersion corrected total vir here */
1289 trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ2);
1291 /* TODO This is only needed when we're about to write
1292 * a checkpoint, because we use it after the restart
1293 * (in a kludge?). But what should we be doing if
1294 * startingFromCheckpoint or bInitStep are true? */
1295 if (inputrecNptTrotter(ir) || inputrecNphTrotter(ir))
1297 copy_mat(shake_vir, state->svir_prev);
1298 copy_mat(force_vir, state->fvir_prev);
1300 if (inputrecNvtTrotter(ir) && ir->eI == eiVV)
1302 /* update temperature and kinetic energy now that step is over - this is the v(t+dt) point */
1303 enerd->term[F_TEMP] = sum_ekin(&(ir->opts), ekind, nullptr, (ir->eI == eiVV), FALSE);
1304 enerd->term[F_EKIN] = trace(ekind->ekin);
1307 else if (bExchanged)
1309 wallcycle_stop(wcycle, ewcUPDATE);
1310 /* We need the kinetic energy at minus the half step for determining
1311 * the full step kinetic energy and possibly for T-coupling.*/
1312 /* This may not be quite working correctly yet . . . . */
1313 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
1314 wcycle, enerd, nullptr, nullptr, nullptr, nullptr, mu_tot,
1315 constr, &nullSignaller, state->box,
1316 nullptr, &bSumEkinhOld,
1317 CGLO_GSTAT | CGLO_TEMPERATURE);
1318 wallcycle_start(wcycle, ewcUPDATE);
1321 /* if it's the initial step, we performed this first step just to get the constraint virial */
1322 if (ir->eI == eiVV && bInitStep)
1324 copy_rvecn(vbuf, as_rvec_array(state->v.data()), 0, state->natoms);
1325 sfree(vbuf);
1327 wallcycle_stop(wcycle, ewcUPDATE);
1330 /* compute the conserved quantity */
1331 if (EI_VV(ir->eI))
1333 saved_conserved_quantity = NPT_energy(ir, state, &MassQ);
1334 if (ir->eI == eiVV)
1336 last_ekin = enerd->term[F_EKIN];
1338 if ((ir->eDispCorr != edispcEnerPres) && (ir->eDispCorr != edispcAllEnerPres))
1340 saved_conserved_quantity -= enerd->term[F_DISPCORR];
1342 /* sum up the foreign energy and dhdl terms for vv. currently done every step so that dhdl is correct in the .edr */
1343 if (ir->efep != efepNO && !bRerunMD)
1345 sum_dhdl(enerd, state->lambda, ir->fepvals);
1349 /* ######## END FIRST UPDATE STEP ############## */
1350 /* ######## If doing VV, we now have v(dt) ###### */
1351 if (bDoExpanded)
1353 /* perform extended ensemble sampling in lambda - we don't
1354 actually move to the new state before outputting
1355 statistics, but if performing simulated tempering, we
1356 do update the velocities and the tau_t. */
1358 lamnew = ExpandedEnsembleDynamics(fplog, ir, enerd, state, &MassQ, state->fep_state, state->dfhist, step, as_rvec_array(state->v.data()), mdatoms);
1359 /* history is maintained in state->dfhist, but state_global is what is sent to trajectory and log output */
1360 if (MASTER(cr))
1362 copy_df_history(state_global->dfhist, state->dfhist);
1366 /* Now we have the energies and forces corresponding to the
1367 * coordinates at time t. We must output all of this before
1368 * the update.
1370 do_md_trajectory_writing(fplog, cr, nfile, fnm, step, step_rel, t,
1371 ir, state, state_global, observablesHistory,
1372 top_global, fr,
1373 outf, mdebin, ekind, f,
1374 &nchkpt,
1375 bCPT, bRerunMD, bLastStep,
1376 mdrunOptions.writeConfout,
1377 bSumEkinhOld);
1378 /* Check if IMD step and do IMD communication, if bIMD is TRUE. */
1379 bIMDstep = do_IMD(ir->bIMD, step, cr, bNS, state->box, as_rvec_array(state->x.data()), ir, t, wcycle);
1381 /* kludge -- virial is lost with restart for MTTK NPT control. Must reload (saved earlier). */
1382 if (startingFromCheckpoint && (inputrecNptTrotter(ir) || inputrecNphTrotter(ir)))
1384 copy_mat(state->svir_prev, shake_vir);
1385 copy_mat(state->fvir_prev, force_vir);
1388 elapsed_time = walltime_accounting_get_current_elapsed_time(walltime_accounting);
1390 /* Check whether everything is still allright */
1391 if (((int)gmx_get_stop_condition() > handled_stop_condition)
1392 #if GMX_THREAD_MPI
1393 && MASTER(cr)
1394 #endif
1397 int nsteps_stop = -1;
1399 /* this just makes signals[].sig compatible with the hack
1400 of sending signals around by MPI_Reduce together with
1401 other floats */
1402 if ((gmx_get_stop_condition() == gmx_stop_cond_next_ns) ||
1403 (mdrunOptions.reproducible &&
1404 gmx_get_stop_condition() == gmx_stop_cond_next))
1406 /* We need at least two global communication steps to pass
1407 * around the signal. We stop at a pair-list creation step
1408 * to allow for exact continuation, when possible.
1410 signals[eglsSTOPCOND].sig = 1;
1411 nsteps_stop = std::max(ir->nstlist, 2*nstSignalComm);
1413 else if (gmx_get_stop_condition() == gmx_stop_cond_next)
1415 /* Stop directly after the next global communication step.
1416 * This breaks exact continuation.
1418 signals[eglsSTOPCOND].sig = -1;
1419 nsteps_stop = nstSignalComm + 1;
1421 if (fplog)
1423 fprintf(fplog,
1424 "\n\nReceived the %s signal, stopping within %d steps\n\n",
1425 gmx_get_signal_name(), nsteps_stop);
1426 fflush(fplog);
1428 fprintf(stderr,
1429 "\n\nReceived the %s signal, stopping within %d steps\n\n",
1430 gmx_get_signal_name(), nsteps_stop);
1431 fflush(stderr);
1432 handled_stop_condition = (int)gmx_get_stop_condition();
1434 else if (MASTER(cr) && (bNS || ir->nstlist <= 0) &&
1435 (max_hours > 0 && elapsed_time > max_hours*60.0*60.0*0.99) &&
1436 signals[eglsSTOPCOND].sig == 0 && signals[eglsSTOPCOND].set == 0)
1438 /* Signal to terminate the run */
1439 signals[eglsSTOPCOND].sig = 1;
1440 if (fplog)
1442 fprintf(fplog, "\nStep %s: Run time exceeded %.3f hours, will terminate the run\n", gmx_step_str(step, sbuf), max_hours*0.99);
1444 fprintf(stderr, "\nStep %s: Run time exceeded %.3f hours, will terminate the run\n", gmx_step_str(step, sbuf), max_hours*0.99);
1447 if (bResetCountersHalfMaxH && MASTER(cr) &&
1448 elapsed_time > max_hours*60.0*60.0*0.495)
1450 /* Set flag that will communicate the signal to all ranks in the simulation */
1451 signals[eglsRESETCOUNTERS].sig = 1;
1454 /* In parallel we only have to check for checkpointing in steps
1455 * where we do global communication,
1456 * otherwise the other nodes don't know.
1458 const real cpt_period = mdrunOptions.checkpointOptions.period;
1459 if (MASTER(cr) && ((bGStat || !PAR(cr)) &&
1460 cpt_period >= 0 &&
1461 (cpt_period == 0 ||
1462 elapsed_time >= nchkpt*cpt_period*60.0)) &&
1463 signals[eglsCHKPT].set == 0)
1465 signals[eglsCHKPT].sig = 1;
1468 /* ######### START SECOND UPDATE STEP ################# */
1470 /* at the start of step, randomize or scale the velocities ((if vv. Restriction of Andersen controlled
1471 in preprocessing */
1473 if (ETC_ANDERSEN(ir->etc)) /* keep this outside of update_tcouple because of the extra info required to pass */
1475 gmx_bool bIfRandomize;
1476 bIfRandomize = update_randomize_velocities(ir, step, cr, mdatoms, state, upd, constr);
1477 /* if we have constraints, we have to remove the kinetic energy parallel to the bonds */
1478 if (constr && bIfRandomize)
1480 constrain_velocities(step, nullptr, ir, mdatoms,
1481 state, fr->bMolPBC,
1482 &top->idef, tmp_vir,
1483 cr, ms, nrnb, wcycle, constr,
1484 bCalcVir, do_log, do_ene);
1487 /* Box is changed in update() when we do pressure coupling,
1488 * but we should still use the old box for energy corrections and when
1489 * writing it to the energy file, so it matches the trajectory files for
1490 * the same timestep above. Make a copy in a separate array.
1492 copy_mat(state->box, lastbox);
1494 dvdl_constr = 0;
1496 if (!bRerunMD || rerun_fr.bV || bForceUpdate)
1498 wallcycle_start(wcycle, ewcUPDATE);
1499 /* UPDATE PRESSURE VARIABLES IN TROTTER FORMULATION WITH CONSTRAINTS */
1500 if (bTrotter)
1502 trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ3);
1503 /* We can only do Berendsen coupling after we have summed
1504 * the kinetic energy or virial. Since the happens
1505 * in global_state after update, we should only do it at
1506 * step % nstlist = 1 with bGStatEveryStep=FALSE.
1509 else
1511 update_tcouple(step, ir, state, ekind, &MassQ, mdatoms);
1512 update_pcouple_before_coordinates(fplog, step, ir, state,
1513 parrinellorahmanMu, M,
1514 bInitStep);
1517 if (EI_VV(ir->eI))
1519 /* velocity half-step update */
1520 update_coords(step, ir, mdatoms, state, f, fcd,
1521 ekind, M, upd, etrtVELOCITY2,
1522 cr, constr);
1525 /* Above, initialize just copies ekinh into ekin,
1526 * it doesn't copy position (for VV),
1527 * and entire integrator for MD.
1530 if (ir->eI == eiVVAK)
1532 /* We probably only need md->homenr, not state->natoms */
1533 if (state->natoms > cbuf_nalloc)
1535 cbuf_nalloc = state->natoms;
1536 srenew(cbuf, cbuf_nalloc);
1538 copy_rvecn(as_rvec_array(state->x.data()), cbuf, 0, state->natoms);
1541 update_coords(step, ir, mdatoms, state, f, fcd,
1542 ekind, M, upd, etrtPOSITION, cr, constr);
1543 wallcycle_stop(wcycle, ewcUPDATE);
1545 constrain_coordinates(step, &dvdl_constr, ir, mdatoms, state,
1546 fr->bMolPBC,
1547 &top->idef, shake_vir,
1548 cr, ms, nrnb, wcycle, upd, constr,
1549 bCalcVir, do_log, do_ene);
1550 update_sd_second_half(step, &dvdl_constr, ir, mdatoms, state,
1551 fr->bMolPBC, &top->idef, cr, ms,
1552 nrnb, wcycle, upd, constr, do_log, do_ene);
1553 finish_update(ir, mdatoms,
1554 state, graph,
1555 nrnb, wcycle, upd, constr);
1557 if (ir->eI == eiVVAK)
1559 /* erase F_EKIN and F_TEMP here? */
1560 /* just compute the kinetic energy at the half step to perform a trotter step */
1561 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
1562 wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
1563 constr, &nullSignaller, lastbox,
1564 nullptr, &bSumEkinhOld,
1565 (bGStat ? CGLO_GSTAT : 0) | CGLO_TEMPERATURE
1567 wallcycle_start(wcycle, ewcUPDATE);
1568 trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ4);
1569 /* now we know the scaling, we can compute the positions again again */
1570 copy_rvecn(cbuf, as_rvec_array(state->x.data()), 0, state->natoms);
1572 update_coords(step, ir, mdatoms, state, f, fcd,
1573 ekind, M, upd, etrtPOSITION, cr, constr);
1574 wallcycle_stop(wcycle, ewcUPDATE);
1576 /* do we need an extra constraint here? just need to copy out of as_rvec_array(state->v.data()) to upd->xp? */
1577 /* are the small terms in the shake_vir here due
1578 * to numerical errors, or are they important
1579 * physically? I'm thinking they are just errors, but not completely sure.
1580 * For now, will call without actually constraining, constr=NULL*/
1581 finish_update(ir, mdatoms,
1582 state, graph,
1583 nrnb, wcycle, upd, nullptr);
1585 if (EI_VV(ir->eI))
1587 /* this factor or 2 correction is necessary
1588 because half of the constraint force is removed
1589 in the vv step, so we have to double it. See
1590 the Redmine issue #1255. It is not yet clear
1591 if the factor of 2 is exact, or just a very
1592 good approximation, and this will be
1593 investigated. The next step is to see if this
1594 can be done adding a dhdl contribution from the
1595 rattle step, but this is somewhat more
1596 complicated with the current code. Will be
1597 investigated, hopefully for 4.6.3. However,
1598 this current solution is much better than
1599 having it completely wrong.
1601 enerd->term[F_DVDL_CONSTR] += 2*dvdl_constr;
1603 else
1605 enerd->term[F_DVDL_CONSTR] += dvdl_constr;
1608 else if (graph)
1610 /* Need to unshift here */
1611 unshift_self(graph, state->box, as_rvec_array(state->x.data()));
1614 if (vsite != nullptr)
1616 wallcycle_start(wcycle, ewcVSITECONSTR);
1617 if (graph != nullptr)
1619 shift_self(graph, state->box, as_rvec_array(state->x.data()));
1621 construct_vsites(vsite, as_rvec_array(state->x.data()), ir->delta_t, as_rvec_array(state->v.data()),
1622 top->idef.iparams, top->idef.il,
1623 fr->ePBC, fr->bMolPBC, cr, state->box);
1625 if (graph != nullptr)
1627 unshift_self(graph, state->box, as_rvec_array(state->x.data()));
1629 wallcycle_stop(wcycle, ewcVSITECONSTR);
1632 /* ############## IF NOT VV, Calculate globals HERE ############ */
1633 /* With Leap-Frog we can skip compute_globals at
1634 * non-communication steps, but we need to calculate
1635 * the kinetic energy one step before communication.
1638 // Organize to do inter-simulation signalling on steps if
1639 // and when algorithms require it.
1640 bool doInterSimSignal = (simulationsShareState && do_per_step(step, nstSignalComm));
1642 if (bGStat || (!EI_VV(ir->eI) && do_per_step(step+1, nstglobalcomm)) || doInterSimSignal)
1644 // Since we're already communicating at this step, we
1645 // can propagate intra-simulation signals. Note that
1646 // check_nstglobalcomm has the responsibility for
1647 // choosing the value of nstglobalcomm that is one way
1648 // bGStat becomes true, so we can't get into a
1649 // situation where e.g. checkpointing can't be
1650 // signalled.
1651 bool doIntraSimSignal = true;
1652 SimulationSignaller signaller(&signals, cr, ms, doInterSimSignal, doIntraSimSignal);
1654 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
1655 wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
1656 constr, &signaller,
1657 lastbox,
1658 &totalNumberOfBondedInteractions, &bSumEkinhOld,
1659 (bGStat ? CGLO_GSTAT : 0)
1660 | (!EI_VV(ir->eI) || bRerunMD ? CGLO_ENERGY : 0)
1661 | (!EI_VV(ir->eI) && bStopCM ? CGLO_STOPCM : 0)
1662 | (!EI_VV(ir->eI) ? CGLO_TEMPERATURE : 0)
1663 | (!EI_VV(ir->eI) || bRerunMD ? CGLO_PRESSURE : 0)
1664 | CGLO_CONSTRAINT
1665 | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)
1667 checkNumberOfBondedInteractions(fplog, cr, totalNumberOfBondedInteractions,
1668 top_global, top, state,
1669 &shouldCheckNumberOfBondedInteractions);
1673 /* ############# END CALC EKIN AND PRESSURE ################# */
1675 /* Note: this is OK, but there are some numerical precision issues with using the convergence of
1676 the virial that should probably be addressed eventually. state->veta has better properies,
1677 but what we actually need entering the new cycle is the new shake_vir value. Ideally, we could
1678 generate the new shake_vir, but test the veta value for convergence. This will take some thought. */
1680 if (ir->efep != efepNO && (!EI_VV(ir->eI) || bRerunMD))
1682 /* Sum up the foreign energy and dhdl terms for md and sd.
1683 Currently done every step so that dhdl is correct in the .edr */
1684 sum_dhdl(enerd, state->lambda, ir->fepvals);
1687 update_pcouple_after_coordinates(fplog, step, ir, mdatoms,
1688 pres, force_vir, shake_vir,
1689 parrinellorahmanMu,
1690 state, nrnb, upd);
1692 /* ################# END UPDATE STEP 2 ################# */
1693 /* #### We now have r(t+dt) and v(t+dt/2) ############# */
1695 /* The coordinates (x) were unshifted in update */
1696 if (!bGStat)
1698 /* We will not sum ekinh_old,
1699 * so signal that we still have to do it.
1701 bSumEkinhOld = TRUE;
1704 if (bCalcEner)
1706 /* ######### BEGIN PREPARING EDR OUTPUT ########### */
1708 /* use the directly determined last velocity, not actually the averaged half steps */
1709 if (bTrotter && ir->eI == eiVV)
1711 enerd->term[F_EKIN] = last_ekin;
1713 enerd->term[F_ETOT] = enerd->term[F_EPOT] + enerd->term[F_EKIN];
1715 if (integratorHasConservedEnergyQuantity(ir))
1717 if (EI_VV(ir->eI))
1719 enerd->term[F_ECONSERVED] = enerd->term[F_ETOT] + saved_conserved_quantity;
1721 else
1723 enerd->term[F_ECONSERVED] = enerd->term[F_ETOT] + NPT_energy(ir, state, &MassQ);
1726 /* ######### END PREPARING EDR OUTPUT ########### */
1729 /* Output stuff */
1730 if (MASTER(cr))
1732 if (fplog && do_log && bDoExpanded)
1734 /* only needed if doing expanded ensemble */
1735 PrintFreeEnergyInfoToFile(fplog, ir->fepvals, ir->expandedvals, ir->bSimTemp ? ir->simtempvals : nullptr,
1736 state_global->dfhist, state->fep_state, ir->nstlog, step);
1738 if (bCalcEner)
1740 upd_mdebin(mdebin, bDoDHDL, bCalcEnerStep,
1741 t, mdatoms->tmass, enerd, state,
1742 ir->fepvals, ir->expandedvals, lastbox,
1743 shake_vir, force_vir, total_vir, pres,
1744 ekind, mu_tot, constr);
1746 else
1748 upd_mdebin_step(mdebin);
1751 gmx_bool do_dr = do_per_step(step, ir->nstdisreout);
1752 gmx_bool do_or = do_per_step(step, ir->nstorireout);
1754 print_ebin(mdoutf_get_fp_ene(outf), do_ene, do_dr, do_or, do_log ? fplog : nullptr,
1755 step, t,
1756 eprNORMAL, mdebin, fcd, groups, &(ir->opts), ir->awh);
1758 if (ir->bPull)
1760 pull_print_output(ir->pull_work, step, t);
1763 if (do_per_step(step, ir->nstlog))
1765 if (fflush(fplog) != 0)
1767 gmx_fatal(FARGS, "Cannot flush logfile - maybe you are out of disk space?");
1771 if (bDoExpanded)
1773 /* Have to do this part _after_ outputting the logfile and the edr file */
1774 /* Gets written into the state at the beginning of next loop*/
1775 state->fep_state = lamnew;
1777 /* Print the remaining wall clock time for the run */
1778 if (isMasterSimMasterRank(ms, cr) &&
1779 (do_verbose || gmx_got_usr_signal()) &&
1780 !bPMETunePrinting)
1782 if (shellfc)
1784 fprintf(stderr, "\n");
1786 print_time(stderr, walltime_accounting, step, ir, cr);
1789 /* Ion/water position swapping.
1790 * Not done in last step since trajectory writing happens before this call
1791 * in the MD loop and exchanges would be lost anyway. */
1792 bNeedRepartition = FALSE;
1793 if ((ir->eSwapCoords != eswapNO) && (step > 0) && !bLastStep &&
1794 do_per_step(step, ir->swap->nstswap))
1796 bNeedRepartition = do_swapcoords(cr, step, t, ir, wcycle,
1797 bRerunMD ? rerun_fr.x : as_rvec_array(state->x.data()),
1798 bRerunMD ? rerun_fr.box : state->box,
1799 MASTER(cr) && mdrunOptions.verbose,
1800 bRerunMD);
1802 if (bNeedRepartition && DOMAINDECOMP(cr))
1804 dd_collect_state(cr->dd, state, state_global);
1808 /* Replica exchange */
1809 bExchanged = FALSE;
1810 if (bDoReplEx)
1812 bExchanged = replica_exchange(fplog, cr, ms, repl_ex,
1813 state_global, enerd,
1814 state, step, t);
1817 if ( (bExchanged || bNeedRepartition) && DOMAINDECOMP(cr) )
1819 dd_partition_system(fplog, step, cr, TRUE, 1,
1820 state_global, top_global, ir,
1821 state, &f, mdAtoms, top, fr,
1822 vsite, constr,
1823 nrnb, wcycle, FALSE);
1824 shouldCheckNumberOfBondedInteractions = true;
1825 update_realloc(upd, state->natoms);
1828 bFirstStep = FALSE;
1829 bInitStep = FALSE;
1830 startingFromCheckpoint = false;
1832 /* ####### SET VARIABLES FOR NEXT ITERATION IF THEY STILL NEED IT ###### */
1833 /* With all integrators, except VV, we need to retain the pressure
1834 * at the current step for coupling at the next step.
1836 if ((state->flags & (1<<estPRES_PREV)) &&
1837 (bGStatEveryStep ||
1838 (ir->nstpcouple > 0 && step % ir->nstpcouple == 0)))
1840 /* Store the pressure in t_state for pressure coupling
1841 * at the next MD step.
1843 copy_mat(pres, state->pres_prev);
1846 /* ####### END SET VARIABLES FOR NEXT ITERATION ###### */
1848 if ( (membed != nullptr) && (!bLastStep) )
1850 rescale_membed(step_rel, membed, as_rvec_array(state_global->x.data()));
1853 if (bRerunMD)
1855 if (MASTER(cr))
1857 /* read next frame from input trajectory */
1858 bLastStep = !read_next_frame(oenv, status, &rerun_fr);
1861 if (PAR(cr))
1863 rerun_parallel_comm(cr, &rerun_fr, &bLastStep);
1867 cycles = wallcycle_stop(wcycle, ewcSTEP);
1868 if (DOMAINDECOMP(cr) && wcycle)
1870 dd_cycles_add(cr->dd, cycles, ddCyclStep);
1873 if (!bRerunMD || !rerun_fr.bStep)
1875 /* increase the MD step number */
1876 step++;
1877 step_rel++;
1880 /* TODO make a counter-reset module */
1881 /* If it is time to reset counters, set a flag that remains
1882 true until counters actually get reset */
1883 if (step_rel == wcycle_get_reset_counters(wcycle) ||
1884 signals[eglsRESETCOUNTERS].set != 0)
1886 if (pme_loadbal_is_active(pme_loadbal))
1888 /* Do not permit counter reset while PME load
1889 * balancing is active. The only purpose for resetting
1890 * counters is to measure reliable performance data,
1891 * and that can't be done before balancing
1892 * completes.
1894 * TODO consider fixing this by delaying the reset
1895 * until after load balancing completes,
1896 * e.g. https://gerrit.gromacs.org/#/c/4964/2 */
1897 gmx_fatal(FARGS, "PME tuning was still active when attempting to "
1898 "reset mdrun counters at step %" GMX_PRId64 ". Try "
1899 "resetting counters later in the run, e.g. with gmx "
1900 "mdrun -resetstep.", step);
1902 reset_all_counters(fplog, mdlog, cr, step, &step_rel, ir, wcycle, nrnb, walltime_accounting,
1903 use_GPU(fr->nbv) ? fr->nbv : nullptr, fr->pmedata);
1904 wcycle_set_reset_counters(wcycle, -1);
1905 if (!thisRankHasDuty(cr, DUTY_PME))
1907 /* Tell our PME node to reset its counters */
1908 gmx_pme_send_resetcounters(cr, step);
1910 /* Correct max_hours for the elapsed time */
1911 max_hours -= elapsed_time/(60.0*60.0);
1912 /* If mdrun -maxh -resethway was active, it can only trigger once */
1913 bResetCountersHalfMaxH = FALSE; /* TODO move this to where signals[eglsRESETCOUNTERS].sig is set */
1914 /* Reset can only happen once, so clear the triggering flag. */
1915 signals[eglsRESETCOUNTERS].set = 0;
1918 /* If bIMD is TRUE, the master updates the IMD energy record and sends positions to VMD client */
1919 IMD_prep_energies_send_positions(ir->bIMD && MASTER(cr), bIMDstep, ir->imd, enerd, step, bCalcEner, wcycle);
1922 /* End of main MD loop */
1924 /* Closing TNG files can include compressing data. Therefore it is good to do that
1925 * before stopping the time measurements. */
1926 mdoutf_tng_close(outf);
1928 /* Stop measuring walltime */
1929 walltime_accounting_end(walltime_accounting);
1931 if (bRerunMD && MASTER(cr))
1933 close_trx(status);
1936 if (!thisRankHasDuty(cr, DUTY_PME))
1938 /* Tell the PME only node to finish */
1939 gmx_pme_send_finish(cr);
1942 if (MASTER(cr))
1944 if (ir->nstcalcenergy > 0 && !bRerunMD)
1946 print_ebin(mdoutf_get_fp_ene(outf), FALSE, FALSE, FALSE, fplog, step, t,
1947 eprAVER, mdebin, fcd, groups, &(ir->opts), ir->awh);
1950 done_mdebin(mdebin);
1951 done_mdoutf(outf);
1953 if (bPMETune)
1955 pme_loadbal_done(pme_loadbal, fplog, mdlog, use_GPU(fr->nbv));
1958 done_shellfc(fplog, shellfc, step_rel);
1960 if (useReplicaExchange && MASTER(cr))
1962 print_replica_exchange_statistics(fplog, repl_ex);
1965 if (ir->bDoAwh)
1967 delete ir->awh;
1970 // Clean up swapcoords
1971 if (ir->eSwapCoords != eswapNO)
1973 finish_swapcoords(ir->swap);
1976 /* Do essential dynamics cleanup if needed. Close .edo file */
1977 done_ed(&ed);
1979 /* IMD cleanup, if bIMD is TRUE. */
1980 IMD_finalize(ir->bIMD, ir->imd);
1982 walltime_accounting_set_nsteps_done(walltime_accounting, step_rel);
1983 if (step_rel >= wcycle_get_reset_counters(wcycle) &&
1984 signals[eglsRESETCOUNTERS].set == 0 &&
1985 !bResetCountersHalfMaxH)
1987 walltime_accounting_set_valid_finish(walltime_accounting);
1990 destroy_enerdata(enerd);
1991 sfree(enerd);
1992 sfree(top);