d853a25d75bc5cc5ae310d64c41c9b5aa3aff97a
[alexxy/gromacs.git] / src / gromacs / mdrun / md.cpp
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
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,2019, 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.
10  *
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.
15  *
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.
20  *
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.
25  *
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.
33  *
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.
36  */
37 /*! \internal \file
38  *
39  * \brief Implements the integrator for normal molecular dynamics simulations
40  *
41  * \author David van der Spoel <david.vanderspoel@icm.uu.se>
42  * \ingroup module_mdrun
43  */
44 #include "gmxpre.h"
45
46 #include <cinttypes>
47 #include <cmath>
48 #include <cstdio>
49 #include <cstdlib>
50
51 #include <algorithm>
52 #include <memory>
53
54 #include "gromacs/awh/awh.h"
55 #include "gromacs/commandline/filenm.h"
56 #include "gromacs/domdec/collect.h"
57 #include "gromacs/domdec/dlbtiming.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/energyoutput.h"
80 #include "gromacs/mdlib/expanded.h"
81 #include "gromacs/mdlib/force.h"
82 #include "gromacs/mdlib/force_flags.h"
83 #include "gromacs/mdlib/forcerec.h"
84 #include "gromacs/mdlib/md_support.h"
85 #include "gromacs/mdlib/mdatoms.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/ns.h"
91 #include "gromacs/mdlib/resethandler.h"
92 #include "gromacs/mdlib/shellfc.h"
93 #include "gromacs/mdlib/sighandler.h"
94 #include "gromacs/mdlib/sim_util.h"
95 #include "gromacs/mdlib/simulationsignal.h"
96 #include "gromacs/mdlib/stophandler.h"
97 #include "gromacs/mdlib/tgroup.h"
98 #include "gromacs/mdlib/trajectory_writing.h"
99 #include "gromacs/mdlib/update.h"
100 #include "gromacs/mdlib/vcm.h"
101 #include "gromacs/mdlib/vsite.h"
102 #include "gromacs/mdrunutility/printtime.h"
103 #include "gromacs/mdtypes/awh_history.h"
104 #include "gromacs/mdtypes/awh_params.h"
105 #include "gromacs/mdtypes/commrec.h"
106 #include "gromacs/mdtypes/df_history.h"
107 #include "gromacs/mdtypes/energyhistory.h"
108 #include "gromacs/mdtypes/fcdata.h"
109 #include "gromacs/mdtypes/forcerec.h"
110 #include "gromacs/mdtypes/group.h"
111 #include "gromacs/mdtypes/inputrec.h"
112 #include "gromacs/mdtypes/interaction_const.h"
113 #include "gromacs/mdtypes/md_enums.h"
114 #include "gromacs/mdtypes/mdatom.h"
115 #include "gromacs/mdtypes/observableshistory.h"
116 #include "gromacs/mdtypes/pullhistory.h"
117 #include "gromacs/mdtypes/state.h"
118 #include "gromacs/nbnxm/nbnxm.h"
119 #include "gromacs/pbcutil/mshift.h"
120 #include "gromacs/pbcutil/pbc.h"
121 #include "gromacs/pulling/output.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"
137
138 #include "integrator.h"
139 #include "replicaexchange.h"
140
141 #if GMX_FAHCORE
142 #include "corewrap.h"
143 #endif
144
145 using gmx::SimulationSignaller;
146
147 void gmx::Integrator::do_md()
148 {
149     // TODO Historically, the EM and MD "integrators" used different
150     // names for the t_inputrec *parameter, but these must have the
151     // same name, now that it's a member of a struct. We use this ir
152     // alias to avoid a large ripple of nearly useless changes.
153     // t_inputrec is being replaced by IMdpOptionsProvider, so this
154     // will go away eventually.
155     t_inputrec             *ir   = inputrec;
156     int64_t                 step, step_rel;
157     double                  t = ir->init_t, t0 = ir->init_t, lam0[efptNR];
158     gmx_bool                bGStatEveryStep, bGStat, bCalcVir, bCalcEnerStep, bCalcEner;
159     gmx_bool                bNS, bNStList, bStopCM,
160                             bFirstStep, bInitStep, bLastStep = FALSE;
161     gmx_bool                bDoDHDL = FALSE, bDoFEP = FALSE, bDoExpanded = FALSE;
162     gmx_bool                do_ene, do_log, do_verbose;
163     gmx_bool                bMasterState;
164     int                     force_flags, cglo_flags;
165     tensor                  force_vir = {{0}}, shake_vir = {{0}}, total_vir = {{0}},
166                             tmp_vir   = {{0}}, pres = {{0}};
167     int                     i, m;
168     rvec                    mu_tot;
169     matrix                  parrinellorahmanMu, M;
170     gmx_repl_ex_t           repl_ex = nullptr;
171     gmx_localtop_t          top;
172     gmx_enerdata_t         *enerd;
173     PaddedVector<gmx::RVec> f {};
174     gmx_global_stat_t       gstat;
175     t_graph                *graph = nullptr;
176     gmx_groups_t           *groups;
177     gmx_shellfc_t          *shellfc;
178     gmx_bool                bSumEkinhOld, bDoReplEx, bExchanged, bNeedRepartition;
179     gmx_bool                bTemp, bPres, bTrotter;
180     real                    dvdl_constr;
181     rvec                   *cbuf        = nullptr;
182     int                     cbuf_nalloc = 0;
183     matrix                  lastbox;
184     int                     lamnew  = 0;
185     /* for FEP */
186     int                     nstfep = 0;
187     double                  cycles;
188     real                    saved_conserved_quantity = 0;
189     real                    last_ekin                = 0;
190     t_extmass               MassQ;
191     char                    sbuf[STEPSTRSIZE], sbuf2[STEPSTRSIZE];
192
193     /* PME load balancing data for GPU kernels */
194     gmx_bool              bPMETune         = FALSE;
195     gmx_bool              bPMETunePrinting = FALSE;
196
197     /* Interactive MD */
198     gmx_bool          bIMDstep = FALSE;
199
200     /* Domain decomposition could incorrectly miss a bonded
201        interaction, but checking for that requires a global
202        communication stage, which does not otherwise happen in DD
203        code. So we do that alongside the first global energy reduction
204        after a new DD is made. These variables handle whether the
205        check happens, and the result it returns. */
206     bool              shouldCheckNumberOfBondedInteractions = false;
207     int               totalNumberOfBondedInteractions       = -1;
208
209     SimulationSignals signals;
210     // Most global communnication stages don't propagate mdrun
211     // signals, and will use this object to achieve that.
212     SimulationSignaller nullSignaller(nullptr, nullptr, nullptr, false, false);
213
214     if (!mdrunOptions.writeConfout)
215     {
216         // This is on by default, and the main known use case for
217         // turning it off is for convenience in benchmarking, which is
218         // something that should not show up in the general user
219         // interface.
220         GMX_LOG(mdlog.info).asParagraph().
221             appendText("The -noconfout functionality is deprecated, and may be removed in a future version.");
222     }
223
224     /* md-vv uses averaged full step velocities for T-control
225        md-vv-avek uses averaged half step velocities for T-control (but full step ekin for P control)
226        md uses averaged half step kinetic energies to determine temperature unless defined otherwise by GMX_EKIN_AVE_VEL; */
227     bTrotter = (EI_VV(ir->eI) && (inputrecNptTrotter(ir) || inputrecNphTrotter(ir) || inputrecNvtTrotter(ir)));
228
229     const bool bRerunMD      = false;
230     int        nstglobalcomm = mdrunOptions.globalCommunicationInterval;
231
232     nstglobalcomm   = check_nstglobalcomm(mdlog, nstglobalcomm, ir, cr);
233     bGStatEveryStep = (nstglobalcomm == 1);
234
235     groups = &top_global->groups;
236
237     std::unique_ptr<EssentialDynamics> ed = nullptr;
238     if (opt2bSet("-ei", nfile, fnm) || observablesHistory->edsamHistory != nullptr)
239     {
240         /* Initialize essential dynamics sampling */
241         ed = init_edsam(mdlog,
242                         opt2fn_null("-ei", nfile, fnm), opt2fn("-eo", nfile, fnm),
243                         top_global,
244                         ir, cr, constr,
245                         state_global, observablesHistory,
246                         oenv, mdrunOptions.continuationOptions.appendFiles);
247     }
248
249     initialize_lambdas(fplog, *ir, MASTER(cr), &state_global->fep_state, state_global->lambda, lam0);
250     Update upd(ir, deform);
251     bool   doSimulatedAnnealing = initSimulatedAnnealing(ir, &upd);
252     if (!mdrunOptions.continuationOptions.appendFiles)
253     {
254         pleaseCiteCouplingAlgorithms(fplog, *ir);
255     }
256     init_nrnb(nrnb);
257     gmx_mdoutf       *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, ir, top_global, oenv, wcycle);
258     gmx::EnergyOutput energyOutput;
259     energyOutput.prepare(mdoutf_get_fp_ene(outf), top_global, ir, mdoutf_get_fp_dhdl(outf));
260
261     /* Energy terms and groups */
262     snew(enerd, 1);
263     init_enerdata(top_global->groups.grps[egcENER].nr, ir->fepvals->n_lambda,
264                   enerd);
265
266     /* Kinetic energy data */
267     std::unique_ptr<gmx_ekindata_t> eKinData = std::make_unique<gmx_ekindata_t>();
268     gmx_ekindata_t                 *ekind    = eKinData.get();
269     init_ekindata(fplog, top_global, &(ir->opts), ekind);
270     /* Copy the cos acceleration to the groups struct */
271     ekind->cosacc.cos_accel = ir->cos_accel;
272
273     gstat = global_stat_init(ir);
274
275     /* Check for polarizable models and flexible constraints */
276     shellfc = init_shell_flexcon(fplog,
277                                  top_global, constr ? constr->numFlexibleConstraints() : 0,
278                                  ir->nstcalcenergy, DOMAINDECOMP(cr));
279
280     {
281         double io = compute_io(ir, top_global->natoms, groups, energyOutput.numEnergyTerms(), 1);
282         if ((io > 2000) && MASTER(cr))
283         {
284             fprintf(stderr,
285                     "\nWARNING: This run will generate roughly %.0f Mb of data\n\n",
286                     io);
287         }
288     }
289
290     /* Set up interactive MD (IMD) */
291     init_IMD(ir, cr, ms, top_global, fplog, ir->nstcalcenergy,
292              MASTER(cr) ? state_global->x.rvec_array() : nullptr,
293              nfile, fnm, oenv, mdrunOptions);
294
295     // Local state only becomes valid now.
296     std::unique_ptr<t_state> stateInstance;
297     t_state *                state;
298
299     if (DOMAINDECOMP(cr))
300     {
301         dd_init_local_top(*top_global, &top);
302
303         stateInstance = std::make_unique<t_state>();
304         state         = stateInstance.get();
305         dd_init_local_state(cr->dd, state_global, state);
306
307         /* Distribute the charge groups over the nodes from the master node */
308         dd_partition_system(fplog, mdlog, ir->init_step, cr, TRUE, 1,
309                             state_global, *top_global, ir,
310                             state, &f, mdAtoms, &top, fr,
311                             vsite, constr,
312                             nrnb, nullptr, FALSE);
313         shouldCheckNumberOfBondedInteractions = true;
314         upd.setNumAtoms(state->natoms);
315     }
316     else
317     {
318         state_change_natoms(state_global, state_global->natoms);
319         f.resizeWithPadding(state_global->natoms);
320         /* Copy the pointer to the global state */
321         state = state_global;
322
323         /* Generate and initialize new topology */
324         mdAlgorithmsSetupAtomData(cr, ir, *top_global, &top, fr,
325                                   &graph, mdAtoms, constr, vsite, shellfc);
326
327         upd.setNumAtoms(state->natoms);
328     }
329
330     auto mdatoms = mdAtoms->mdatoms();
331
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.)
336
337     update_mdatoms(mdatoms, state->lambda[efptMASS]);
338
339     const ContinuationOptions &continuationOptions    = mdrunOptions.continuationOptions;
340     bool                       startingFromCheckpoint = continuationOptions.startedFromCheckpoint;
341
342     if (ir->bExpanded)
343     {
344         /* Check nstexpanded here, because the grompp check was broken */
345         if (ir->expandedvals->nstexpanded % ir->nstcalcenergy != 0)
346         {
347             gmx_fatal(FARGS, "With expanded ensemble, nstexpanded should be a multiple of nstcalcenergy");
348         }
349         init_expanded_ensemble(startingFromCheckpoint, ir, state->dfhist);
350     }
351
352     if (MASTER(cr))
353     {
354         if (startingFromCheckpoint)
355         {
356             /* Restore from energy history if appending to output files */
357             if (continuationOptions.appendFiles)
358             {
359                 /* If no history is available (because a checkpoint is from before
360                  * it was written) make a new one later, otherwise restore it.
361                  */
362                 if (observablesHistory->energyHistory)
363                 {
364                     energyOutput.restoreFromEnergyHistory(*observablesHistory->energyHistory);
365                 }
366             }
367             else if (observablesHistory->energyHistory)
368             {
369                 /* We might have read an energy history from checkpoint.
370                  * As we are not appending, we want to restart the statistics.
371                  * Free the allocated memory and reset the counts.
372                  */
373                 observablesHistory->energyHistory = {};
374                 /* We might have read a pull history from checkpoint.
375                  * We will still want to keep the statistics, so that the files
376                  * can be joined and still be meaningful.
377                  * This means that observablesHistory->pullHistory
378                  * should not be reset.
379                  */
380             }
381         }
382         if (!observablesHistory->energyHistory)
383         {
384             observablesHistory->energyHistory = std::make_unique<energyhistory_t>();
385         }
386         if (!observablesHistory->pullHistory)
387         {
388             observablesHistory->pullHistory = std::make_unique<PullHistory>();
389         }
390         /* Set the initial energy history */
391         energyOutput.fillEnergyHistory(observablesHistory->energyHistory.get());
392     }
393
394     preparePrevStepPullCom(ir, mdatoms, state, state_global, cr, startingFromCheckpoint);
395
396     // TODO: Remove this by converting AWH into a ForceProvider
397     auto awh = prepareAwhModule(fplog, *ir, state_global, cr, ms, startingFromCheckpoint,
398                                 shellfc != nullptr,
399                                 opt2fn("-awh", nfile, fnm), ir->pull_work);
400
401     const bool useReplicaExchange = (replExParams.exchangeInterval > 0);
402     if (useReplicaExchange && MASTER(cr))
403     {
404         repl_ex = init_replica_exchange(fplog, ms, top_global->natoms, ir,
405                                         replExParams);
406     }
407     /* PME tuning is only supported in the Verlet scheme, with PME for
408      * Coulomb. It is not supported with only LJ PME. */
409     bPMETune = (mdrunOptions.tunePme && EEL_PME(fr->ic->eeltype) &&
410                 !mdrunOptions.reproducible && ir->cutoff_scheme != ecutsGROUP);
411
412     pme_load_balancing_t *pme_loadbal      = nullptr;
413     if (bPMETune)
414     {
415         pme_loadbal_init(&pme_loadbal, cr, mdlog, *ir, state->box,
416                          *fr->ic, fr->nbv->pairlistSets().params(), fr->pmedata, use_GPU(fr->nbv.get()),
417                          &bPMETunePrinting);
418     }
419
420     if (!ir->bContinuation)
421     {
422         if (state->flags & (1 << estV))
423         {
424             auto v = makeArrayRef(state->v);
425             /* Set the velocities of vsites, shells and frozen atoms to zero */
426             for (i = 0; i < mdatoms->homenr; i++)
427             {
428                 if (mdatoms->ptype[i] == eptVSite ||
429                     mdatoms->ptype[i] == eptShell)
430                 {
431                     clear_rvec(v[i]);
432                 }
433                 else if (mdatoms->cFREEZE)
434                 {
435                     for (m = 0; m < DIM; m++)
436                     {
437                         if (ir->opts.nFreeze[mdatoms->cFREEZE[i]][m])
438                         {
439                             v[i][m] = 0;
440                         }
441                     }
442                 }
443             }
444         }
445
446         if (constr)
447         {
448             /* Constrain the initial coordinates and velocities */
449             do_constrain_first(fplog, constr, ir, mdatoms, state);
450         }
451         if (vsite)
452         {
453             /* Construct the virtual sites for the initial configuration */
454             construct_vsites(vsite, state->x.rvec_array(), ir->delta_t, nullptr,
455                              top.idef.iparams, top.idef.il,
456                              fr->ePBC, fr->bMolPBC, cr, state->box);
457         }
458     }
459
460     if (ir->efep != efepNO)
461     {
462         /* Set free energy calculation frequency as the greatest common
463          * denominator of nstdhdl and repl_ex_nst. */
464         nstfep = ir->fepvals->nstdhdl;
465         if (ir->bExpanded)
466         {
467             nstfep = gmx_greatest_common_divisor(ir->expandedvals->nstexpanded, nstfep);
468         }
469         if (useReplicaExchange)
470         {
471             nstfep = gmx_greatest_common_divisor(replExParams.exchangeInterval, nstfep);
472         }
473     }
474
475     /* Be REALLY careful about what flags you set here. You CANNOT assume
476      * this is the first step, since we might be restarting from a checkpoint,
477      * and in that case we should not do any modifications to the state.
478      */
479     bStopCM = (ir->comm_mode != ecmNO && !ir->bContinuation);
480
481     if (continuationOptions.haveReadEkin)
482     {
483         restore_ekinstate_from_state(cr, ekind, &state_global->ekinstate);
484     }
485
486     cglo_flags = (CGLO_INITIALIZATION | CGLO_TEMPERATURE | CGLO_GSTAT
487                   | (EI_VV(ir->eI) ? CGLO_PRESSURE : 0)
488                   | (EI_VV(ir->eI) ? CGLO_CONSTRAINT : 0)
489                   | (continuationOptions.haveReadEkin ? CGLO_READEKIN : 0));
490
491     bSumEkinhOld = FALSE;
492
493     t_vcm vcm(top_global->groups, *ir);
494     reportComRemovalInfo(fplog, vcm);
495
496     /* To minimize communication, compute_globals computes the COM velocity
497      * and the kinetic energy for the velocities without COM motion removed.
498      * Thus to get the kinetic energy without the COM contribution, we need
499      * to call compute_globals twice.
500      */
501     for (int cgloIteration = 0; cgloIteration < (bStopCM ? 2 : 1); cgloIteration++)
502     {
503         int cglo_flags_iteration = cglo_flags;
504         if (bStopCM && cgloIteration == 0)
505         {
506             cglo_flags_iteration |= CGLO_STOPCM;
507             cglo_flags_iteration &= ~CGLO_TEMPERATURE;
508         }
509         compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
510                         nullptr, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
511                         constr, &nullSignaller, state->box,
512                         &totalNumberOfBondedInteractions, &bSumEkinhOld, cglo_flags_iteration
513                         | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0));
514     }
515     checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
516                                     top_global, &top, state,
517                                     &shouldCheckNumberOfBondedInteractions);
518     if (ir->eI == eiVVAK)
519     {
520         /* a second call to get the half step temperature initialized as well */
521         /* we do the same call as above, but turn the pressure off -- internally to
522            compute_globals, this is recognized as a velocity verlet half-step
523            kinetic energy calculation.  This minimized excess variables, but
524            perhaps loses some logic?*/
525
526         compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
527                         nullptr, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
528                         constr, &nullSignaller, state->box,
529                         nullptr, &bSumEkinhOld,
530                         cglo_flags & ~CGLO_PRESSURE);
531     }
532
533     /* Calculate the initial half step temperature, and save the ekinh_old */
534     if (!continuationOptions.startedFromCheckpoint)
535     {
536         for (i = 0; (i < ir->opts.ngtc); i++)
537         {
538             copy_mat(ekind->tcstat[i].ekinh, ekind->tcstat[i].ekinh_old);
539         }
540     }
541
542     /* need to make an initiation call to get the Trotter variables set, as well as other constants for non-trotter
543        temperature control */
544     auto trotter_seq = init_npt_vars(ir, state, &MassQ, bTrotter);
545
546     if (MASTER(cr))
547     {
548         if (!ir->bContinuation)
549         {
550             if (constr && ir->eConstrAlg == econtLINCS)
551             {
552                 fprintf(fplog,
553                         "RMS relative constraint deviation after constraining: %.2e\n",
554                         constr->rmsd());
555             }
556             if (EI_STATE_VELOCITY(ir->eI))
557             {
558                 real temp = enerd->term[F_TEMP];
559                 if (ir->eI != eiVV)
560                 {
561                     /* Result of Ekin averaged over velocities of -half
562                      * and +half step, while we only have -half step here.
563                      */
564                     temp *= 2;
565                 }
566                 fprintf(fplog, "Initial temperature: %g K\n", temp);
567             }
568         }
569
570         char tbuf[20];
571         fprintf(stderr, "starting mdrun '%s'\n",
572                 *(top_global->name));
573         if (ir->nsteps >= 0)
574         {
575             sprintf(tbuf, "%8.1f", (ir->init_step+ir->nsteps)*ir->delta_t);
576         }
577         else
578         {
579             sprintf(tbuf, "%s", "infinite");
580         }
581         if (ir->init_step > 0)
582         {
583             fprintf(stderr, "%s steps, %s ps (continuing from step %s, %8.1f ps).\n",
584                     gmx_step_str(ir->init_step+ir->nsteps, sbuf), tbuf,
585                     gmx_step_str(ir->init_step, sbuf2),
586                     ir->init_step*ir->delta_t);
587         }
588         else
589         {
590             fprintf(stderr, "%s steps, %s ps.\n",
591                     gmx_step_str(ir->nsteps, sbuf), tbuf);
592         }
593         fprintf(fplog, "\n");
594     }
595
596     walltime_accounting_start_time(walltime_accounting);
597     wallcycle_start(wcycle, ewcRUN);
598     print_start(fplog, cr, walltime_accounting, "mdrun");
599
600 #if GMX_FAHCORE
601     /* safest point to do file checkpointing is here.  More general point would be immediately before integrator call */
602     int chkpt_ret = fcCheckPointParallel( cr->nodeid,
603                                           NULL, 0);
604     if (chkpt_ret == 0)
605     {
606         gmx_fatal( 3, __FILE__, __LINE__, "Checkpoint error on step %d\n", 0 );
607     }
608 #endif
609
610     /***********************************************************
611      *
612      *             Loop over MD steps
613      *
614      ************************************************************/
615
616     bFirstStep       = TRUE;
617     /* Skip the first Nose-Hoover integration when we get the state from tpx */
618     bInitStep        = !startingFromCheckpoint || EI_VV(ir->eI);
619     bSumEkinhOld     = FALSE;
620     bExchanged       = FALSE;
621     bNeedRepartition = FALSE;
622
623     bool simulationsShareState = false;
624     int  nstSignalComm         = nstglobalcomm;
625     {
626         // TODO This implementation of ensemble orientation restraints is nasty because
627         // a user can't just do multi-sim with single-sim orientation restraints.
628         bool usingEnsembleRestraints = (fcd->disres.nsystems > 1) || ((ms != nullptr) && (fcd->orires.nr != 0));
629         bool awhUsesMultiSim         = (ir->bDoAwh && ir->awhParams->shareBiasMultisim && (ms != nullptr));
630
631         // Replica exchange, ensemble restraints and AWH need all
632         // simulations to remain synchronized, so they need
633         // checkpoints and stop conditions to act on the same step, so
634         // the propagation of such signals must take place between
635         // simulations, not just within simulations.
636         // TODO: Make algorithm initializers set these flags.
637         simulationsShareState = useReplicaExchange || usingEnsembleRestraints || awhUsesMultiSim;
638
639         if (simulationsShareState)
640         {
641             // Inter-simulation signal communication does not need to happen
642             // often, so we use a minimum of 200 steps to reduce overhead.
643             const int c_minimumInterSimulationSignallingInterval = 200;
644             nstSignalComm = ((c_minimumInterSimulationSignallingInterval + nstglobalcomm - 1)/nstglobalcomm)*nstglobalcomm;
645         }
646     }
647
648     auto stopHandler = stopHandlerBuilder->getStopHandlerMD(
649                 compat::not_null<SimulationSignal*>(&signals[eglsSTOPCOND]), simulationsShareState,
650                 MASTER(cr), ir->nstlist, mdrunOptions.reproducible, nstSignalComm,
651                 mdrunOptions.maximumHoursToRun, ir->nstlist == 0, fplog, step, bNS, walltime_accounting);
652
653     auto checkpointHandler = std::make_unique<CheckpointHandler>(
654                 compat::make_not_null<SimulationSignal*>(&signals[eglsCHKPT]),
655                 simulationsShareState, ir->nstlist == 0, MASTER(cr),
656                 mdrunOptions.writeConfout, mdrunOptions.checkpointOptions.period);
657
658     const bool resetCountersIsLocal = true;
659     auto       resetHandler         = std::make_unique<ResetHandler>(
660                 compat::make_not_null<SimulationSignal*>(&signals[eglsRESETCOUNTERS]), !resetCountersIsLocal,
661                 ir->nsteps, MASTER(cr), mdrunOptions.timingOptions.resetHalfway,
662                 mdrunOptions.maximumHoursToRun, mdlog, wcycle, walltime_accounting);
663
664     const DDBalanceRegionHandler ddBalanceRegionHandler(cr);
665
666     step     = ir->init_step;
667     step_rel = 0;
668
669     // TODO extract this to new multi-simulation module
670     if (MASTER(cr) && isMultiSim(ms) && !useReplicaExchange)
671     {
672         if (!multisim_int_all_are_equal(ms, ir->nsteps))
673         {
674             GMX_LOG(mdlog.warning).appendText(
675                     "Note: The number of steps is not consistent across multi simulations,\n"
676                     "but we are proceeding anyway!");
677         }
678         if (!multisim_int_all_are_equal(ms, ir->init_step))
679         {
680             GMX_LOG(mdlog.warning).appendText(
681                     "Note: The initial step is not consistent across multi simulations,\n"
682                     "but we are proceeding anyway!");
683         }
684     }
685
686     /* and stop now if we should */
687     bLastStep = (bLastStep || (ir->nsteps >= 0 && step_rel > ir->nsteps));
688     while (!bLastStep)
689     {
690
691         /* Determine if this is a neighbor search step */
692         bNStList = (ir->nstlist > 0  && step % ir->nstlist == 0);
693
694         if (bPMETune && bNStList)
695         {
696             /* PME grid + cut-off optimization with GPUs or PME nodes */
697             pme_loadbal_do(pme_loadbal, cr,
698                            (mdrunOptions.verbose && MASTER(cr)) ? stderr : nullptr,
699                            fplog, mdlog,
700                            *ir, fr, *state,
701                            wcycle,
702                            step, step_rel,
703                            &bPMETunePrinting);
704         }
705
706         wallcycle_start(wcycle, ewcSTEP);
707
708         bLastStep = (step_rel == ir->nsteps);
709         t         = t0 + step*ir->delta_t;
710
711         // TODO Refactor this, so that nstfep does not need a default value of zero
712         if (ir->efep != efepNO || ir->bSimTemp)
713         {
714             /* find and set the current lambdas */
715             setCurrentLambdasLocal(step, ir->fepvals, lam0, state);
716
717             bDoDHDL      = do_per_step(step, ir->fepvals->nstdhdl);
718             bDoFEP       = ((ir->efep != efepNO) && do_per_step(step, nstfep));
719             bDoExpanded  = (do_per_step(step, ir->expandedvals->nstexpanded)
720                             && (ir->bExpanded) && (step > 0) && (!startingFromCheckpoint));
721         }
722
723         bDoReplEx = (useReplicaExchange && (step > 0) && !bLastStep &&
724                      do_per_step(step, replExParams.exchangeInterval));
725
726         if (doSimulatedAnnealing)
727         {
728             update_annealing_target_temp(ir, t, &upd);
729         }
730
731         /* Stop Center of Mass motion */
732         bStopCM = (ir->comm_mode != ecmNO && do_per_step(step, ir->nstcomm));
733
734         /* Determine whether or not to do Neighbour Searching */
735         bNS = (bFirstStep || bNStList || bExchanged || bNeedRepartition);
736
737         bLastStep = bLastStep || stopHandler->stoppingAfterCurrentStep(bNS);
738
739         /* do_log triggers energy and virial calculation. Because this leads
740          * to different code paths, forces can be different. Thus for exact
741          * continuation we should avoid extra log output.
742          * Note that the || bLastStep can result in non-exact continuation
743          * beyond the last step. But we don't consider that to be an issue.
744          */
745         do_log     = do_per_step(step, ir->nstlog) || (bFirstStep && !startingFromCheckpoint) || bLastStep;
746         do_verbose = mdrunOptions.verbose &&
747             (step % mdrunOptions.verboseStepPrintInterval == 0 || bFirstStep || bLastStep);
748
749         if (bNS && !(bFirstStep && ir->bContinuation))
750         {
751             bMasterState = FALSE;
752             /* Correct the new box if it is too skewed */
753             if (inputrecDynamicBox(ir))
754             {
755                 if (correct_box(fplog, step, state->box, graph))
756                 {
757                     bMasterState = TRUE;
758                 }
759             }
760             if (DOMAINDECOMP(cr) && bMasterState)
761             {
762                 dd_collect_state(cr->dd, state, state_global);
763             }
764
765             if (DOMAINDECOMP(cr))
766             {
767                 /* Repartition the domain decomposition */
768                 dd_partition_system(fplog, mdlog, step, cr,
769                                     bMasterState, nstglobalcomm,
770                                     state_global, *top_global, ir,
771                                     state, &f, mdAtoms, &top, fr,
772                                     vsite, constr,
773                                     nrnb, wcycle,
774                                     do_verbose && !bPMETunePrinting);
775                 shouldCheckNumberOfBondedInteractions = true;
776                 upd.setNumAtoms(state->natoms);
777             }
778         }
779
780         if (MASTER(cr) && do_log)
781         {
782             print_ebin_header(fplog, step, t); /* can we improve the information printed here? */
783         }
784
785         if (ir->efep != efepNO)
786         {
787             update_mdatoms(mdatoms, state->lambda[efptMASS]);
788         }
789
790         if (bExchanged)
791         {
792
793             /* We need the kinetic energy at minus the half step for determining
794              * the full step kinetic energy and possibly for T-coupling.*/
795             /* This may not be quite working correctly yet . . . . */
796             compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
797                             wcycle, enerd, nullptr, nullptr, nullptr, nullptr, mu_tot,
798                             constr, &nullSignaller, state->box,
799                             &totalNumberOfBondedInteractions, &bSumEkinhOld,
800                             CGLO_GSTAT | CGLO_TEMPERATURE | CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS);
801             checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
802                                             top_global, &top, state,
803                                             &shouldCheckNumberOfBondedInteractions);
804         }
805         clear_mat(force_vir);
806
807         checkpointHandler->decideIfCheckpointingThisStep(bNS, bFirstStep, bLastStep);
808
809         /* Determine the energy and pressure:
810          * at nstcalcenergy steps and at energy output steps (set below).
811          */
812         if (EI_VV(ir->eI) && (!bInitStep))
813         {
814             bCalcEnerStep = do_per_step(step, ir->nstcalcenergy);
815             bCalcVir      = bCalcEnerStep ||
816                 (ir->epc != epcNO && (do_per_step(step, ir->nstpcouple) || do_per_step(step-1, ir->nstpcouple)));
817         }
818         else
819         {
820             bCalcEnerStep = do_per_step(step, ir->nstcalcenergy);
821             bCalcVir      = bCalcEnerStep ||
822                 (ir->epc != epcNO && do_per_step(step, ir->nstpcouple));
823         }
824         bCalcEner = bCalcEnerStep;
825
826         do_ene = (do_per_step(step, ir->nstenergy) || bLastStep);
827
828         if (do_ene || do_log || bDoReplEx)
829         {
830             bCalcVir  = TRUE;
831             bCalcEner = TRUE;
832         }
833
834         /* Do we need global communication ? */
835         bGStat = (bCalcVir || bCalcEner || bStopCM ||
836                   do_per_step(step, nstglobalcomm) ||
837                   (EI_VV(ir->eI) && inputrecNvtTrotter(ir) && do_per_step(step-1, nstglobalcomm)));
838
839         force_flags = (GMX_FORCE_STATECHANGED |
840                        ((inputrecDynamicBox(ir)) ? GMX_FORCE_DYNAMICBOX : 0) |
841                        GMX_FORCE_ALLFORCES |
842                        (bCalcVir ? GMX_FORCE_VIRIAL : 0) |
843                        (bCalcEner ? GMX_FORCE_ENERGY : 0) |
844                        (bDoFEP ? GMX_FORCE_DHDL : 0)
845                        );
846
847         if (shellfc)
848         {
849             /* Now is the time to relax the shells */
850             relax_shell_flexcon(fplog, cr, ms, mdrunOptions.verbose,
851                                 enforcedRotation, step,
852                                 ir, bNS, force_flags, &top,
853                                 constr, enerd, fcd,
854                                 state, f.arrayRefWithPadding(), force_vir, mdatoms,
855                                 nrnb, wcycle, graph, groups,
856                                 shellfc, fr, ppForceWorkload, t, mu_tot,
857                                 vsite,
858                                 ddBalanceRegionHandler);
859         }
860         else
861         {
862             /* The AWH history need to be saved _before_ doing force calculations where the AWH bias is updated
863                (or the AWH update will be performed twice for one step when continuing). It would be best to
864                call this update function from do_md_trajectory_writing but that would occur after do_force.
865                One would have to divide the update_awh function into one function applying the AWH force
866                and one doing the AWH bias update. The update AWH bias function could then be called after
867                do_md_trajectory_writing (then containing update_awh_history).
868                The checkpointing will in the future probably moved to the start of the md loop which will
869                rid of this issue. */
870             if (awh && checkpointHandler->isCheckpointingStep() && MASTER(cr))
871             {
872                 awh->updateHistory(state_global->awhHistory.get());
873             }
874
875             /* The coordinates (x) are shifted (to get whole molecules)
876              * in do_force.
877              * This is parallellized as well, and does communication too.
878              * Check comments in sim_util.c
879              */
880             do_force(fplog, cr, ms, ir, awh.get(), enforcedRotation,
881                      step, nrnb, wcycle, &top, groups,
882                      state->box, state->x.arrayRefWithPadding(), &state->hist,
883                      f.arrayRefWithPadding(), force_vir, mdatoms, enerd, fcd,
884                      state->lambda, graph,
885                      fr, ppForceWorkload, vsite, mu_tot, t, ed ? ed->getLegacyED() : nullptr,
886                      (bNS ? GMX_FORCE_NS : 0) | force_flags,
887                      ddBalanceRegionHandler);
888         }
889
890         if (EI_VV(ir->eI) && !startingFromCheckpoint)
891         /*  ############### START FIRST UPDATE HALF-STEP FOR VV METHODS############### */
892         {
893             rvec *vbuf = nullptr;
894
895             wallcycle_start(wcycle, ewcUPDATE);
896             if (ir->eI == eiVV && bInitStep)
897             {
898                 /* if using velocity verlet with full time step Ekin,
899                  * take the first half step only to compute the
900                  * virial for the first step. From there,
901                  * revert back to the initial coordinates
902                  * so that the input is actually the initial step.
903                  */
904                 snew(vbuf, state->natoms);
905                 copy_rvecn(state->v.rvec_array(), vbuf, 0, state->natoms); /* should make this better for parallelizing? */
906             }
907             else
908             {
909                 /* this is for NHC in the Ekin(t+dt/2) version of vv */
910                 trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ1);
911             }
912
913             update_coords(step, ir, mdatoms, state, f.arrayRefWithPadding(), fcd,
914                           ekind, M, &upd, etrtVELOCITY1,
915                           cr, constr);
916
917             wallcycle_stop(wcycle, ewcUPDATE);
918             constrain_velocities(step, nullptr,
919                                  state,
920                                  shake_vir,
921                                  constr,
922                                  bCalcVir, do_log, do_ene);
923             wallcycle_start(wcycle, ewcUPDATE);
924             /* if VV, compute the pressure and constraints */
925             /* For VV2, we strictly only need this if using pressure
926              * control, but we really would like to have accurate pressures
927              * printed out.
928              * Think about ways around this in the future?
929              * For now, keep this choice in comments.
930              */
931             /*bPres = (ir->eI==eiVV || inputrecNptTrotter(ir)); */
932             /*bTemp = ((ir->eI==eiVV &&(!bInitStep)) || (ir->eI==eiVVAK && inputrecNptTrotter(ir)));*/
933             bPres = TRUE;
934             bTemp = ((ir->eI == eiVV && (!bInitStep)) || (ir->eI == eiVVAK));
935             if (bCalcEner && ir->eI == eiVVAK)
936             {
937                 bSumEkinhOld = TRUE;
938             }
939             /* for vv, the first half of the integration actually corresponds to the previous step.
940                So we need information from the last step in the first half of the integration */
941             if (bGStat || do_per_step(step-1, nstglobalcomm))
942             {
943                 wallcycle_stop(wcycle, ewcUPDATE);
944                 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
945                                 wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
946                                 constr, &nullSignaller, state->box,
947                                 &totalNumberOfBondedInteractions, &bSumEkinhOld,
948                                 (bGStat ? CGLO_GSTAT : 0)
949                                 | (bCalcEner ? CGLO_ENERGY : 0)
950                                 | (bTemp ? CGLO_TEMPERATURE : 0)
951                                 | (bPres ? CGLO_PRESSURE : 0)
952                                 | (bPres ? CGLO_CONSTRAINT : 0)
953                                 | (bStopCM ? CGLO_STOPCM : 0)
954                                 | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)
955                                 | CGLO_SCALEEKIN
956                                 );
957                 /* explanation of above:
958                    a) We compute Ekin at the full time step
959                    if 1) we are using the AveVel Ekin, and it's not the
960                    initial step, or 2) if we are using AveEkin, but need the full
961                    time step kinetic energy for the pressure (always true now, since we want accurate statistics).
962                    b) If we are using EkinAveEkin for the kinetic energy for the temperature control, we still feed in
963                    EkinAveVel because it's needed for the pressure */
964                 checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
965                                                 top_global, &top, state,
966                                                 &shouldCheckNumberOfBondedInteractions);
967                 wallcycle_start(wcycle, ewcUPDATE);
968             }
969             /* temperature scaling and pressure scaling to produce the extended variables at t+dt */
970             if (!bInitStep)
971             {
972                 if (bTrotter)
973                 {
974                     m_add(force_vir, shake_vir, total_vir);     /* we need the un-dispersion corrected total vir here */
975                     trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ2);
976
977                     /* TODO This is only needed when we're about to write
978                      * a checkpoint, because we use it after the restart
979                      * (in a kludge?). But what should we be doing if
980                      * startingFromCheckpoint or bInitStep are true? */
981                     if (inputrecNptTrotter(ir) || inputrecNphTrotter(ir))
982                     {
983                         copy_mat(shake_vir, state->svir_prev);
984                         copy_mat(force_vir, state->fvir_prev);
985                     }
986                     if (inputrecNvtTrotter(ir) && ir->eI == eiVV)
987                     {
988                         /* update temperature and kinetic energy now that step is over - this is the v(t+dt) point */
989                         enerd->term[F_TEMP] = sum_ekin(&(ir->opts), ekind, nullptr, (ir->eI == eiVV), FALSE);
990                         enerd->term[F_EKIN] = trace(ekind->ekin);
991                     }
992                 }
993                 else if (bExchanged)
994                 {
995                     wallcycle_stop(wcycle, ewcUPDATE);
996                     /* We need the kinetic energy at minus the half step for determining
997                      * the full step kinetic energy and possibly for T-coupling.*/
998                     /* This may not be quite working correctly yet . . . . */
999                     compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
1000                                     wcycle, enerd, nullptr, nullptr, nullptr, nullptr, mu_tot,
1001                                     constr, &nullSignaller, state->box,
1002                                     nullptr, &bSumEkinhOld,
1003                                     CGLO_GSTAT | CGLO_TEMPERATURE);
1004                     wallcycle_start(wcycle, ewcUPDATE);
1005                 }
1006             }
1007             /* if it's the initial step, we performed this first step just to get the constraint virial */
1008             if (ir->eI == eiVV && bInitStep)
1009             {
1010                 copy_rvecn(vbuf, state->v.rvec_array(), 0, state->natoms);
1011                 sfree(vbuf);
1012             }
1013             wallcycle_stop(wcycle, ewcUPDATE);
1014         }
1015
1016         /* compute the conserved quantity */
1017         if (EI_VV(ir->eI))
1018         {
1019             saved_conserved_quantity = NPT_energy(ir, state, &MassQ);
1020             if (ir->eI == eiVV)
1021             {
1022                 last_ekin = enerd->term[F_EKIN];
1023             }
1024             if ((ir->eDispCorr != edispcEnerPres) && (ir->eDispCorr != edispcAllEnerPres))
1025             {
1026                 saved_conserved_quantity -= enerd->term[F_DISPCORR];
1027             }
1028             /* sum up the foreign energy and dhdl terms for vv.  currently done every step so that dhdl is correct in the .edr */
1029             if (ir->efep != efepNO)
1030             {
1031                 sum_dhdl(enerd, state->lambda, ir->fepvals);
1032             }
1033         }
1034
1035         /* ########  END FIRST UPDATE STEP  ############## */
1036         /* ########  If doing VV, we now have v(dt) ###### */
1037         if (bDoExpanded)
1038         {
1039             /* perform extended ensemble sampling in lambda - we don't
1040                actually move to the new state before outputting
1041                statistics, but if performing simulated tempering, we
1042                do update the velocities and the tau_t. */
1043
1044             lamnew = ExpandedEnsembleDynamics(fplog, ir, enerd, state, &MassQ, state->fep_state, state->dfhist, step, state->v.rvec_array(), mdatoms);
1045             /* history is maintained in state->dfhist, but state_global is what is sent to trajectory and log output */
1046             if (MASTER(cr))
1047             {
1048                 copy_df_history(state_global->dfhist, state->dfhist);
1049             }
1050         }
1051
1052         /* Now we have the energies and forces corresponding to the
1053          * coordinates at time t. We must output all of this before
1054          * the update.
1055          */
1056         do_md_trajectory_writing(fplog, cr, nfile, fnm, step, step_rel, t,
1057                                  ir, state, state_global, observablesHistory,
1058                                  top_global, fr,
1059                                  outf, energyOutput, ekind, f,
1060                                  checkpointHandler->isCheckpointingStep(),
1061                                  bRerunMD, bLastStep,
1062                                  mdrunOptions.writeConfout,
1063                                  bSumEkinhOld);
1064         /* Check if IMD step and do IMD communication, if bIMD is TRUE. */
1065         bIMDstep = do_IMD(ir->bIMD, step, cr, bNS, state->box, state->x.rvec_array(), ir, t, wcycle);
1066
1067         /* kludge -- virial is lost with restart for MTTK NPT control. Must reload (saved earlier). */
1068         if (startingFromCheckpoint && (inputrecNptTrotter(ir) || inputrecNphTrotter(ir)))
1069         {
1070             copy_mat(state->svir_prev, shake_vir);
1071             copy_mat(state->fvir_prev, force_vir);
1072         }
1073
1074         stopHandler->setSignal();
1075         resetHandler->setSignal(walltime_accounting);
1076
1077         if (bGStat || !PAR(cr))
1078         {
1079             /* In parallel we only have to check for checkpointing in steps
1080              * where we do global communication,
1081              *  otherwise the other nodes don't know.
1082              */
1083             checkpointHandler->setSignal(walltime_accounting);
1084         }
1085
1086         /* #########   START SECOND UPDATE STEP ################# */
1087
1088         /* at the start of step, randomize or scale the velocities ((if vv. Restriction of Andersen controlled
1089            in preprocessing */
1090
1091         if (ETC_ANDERSEN(ir->etc)) /* keep this outside of update_tcouple because of the extra info required to pass */
1092         {
1093             gmx_bool bIfRandomize;
1094             bIfRandomize = update_randomize_velocities(ir, step, cr, mdatoms, state->v, &upd, constr);
1095             /* if we have constraints, we have to remove the kinetic energy parallel to the bonds */
1096             if (constr && bIfRandomize)
1097             {
1098                 constrain_velocities(step, nullptr,
1099                                      state,
1100                                      tmp_vir,
1101                                      constr,
1102                                      bCalcVir, do_log, do_ene);
1103             }
1104         }
1105         /* Box is changed in update() when we do pressure coupling,
1106          * but we should still use the old box for energy corrections and when
1107          * writing it to the energy file, so it matches the trajectory files for
1108          * the same timestep above. Make a copy in a separate array.
1109          */
1110         copy_mat(state->box, lastbox);
1111
1112         dvdl_constr = 0;
1113
1114         wallcycle_start(wcycle, ewcUPDATE);
1115         /* UPDATE PRESSURE VARIABLES IN TROTTER FORMULATION WITH CONSTRAINTS */
1116         if (bTrotter)
1117         {
1118             trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ3);
1119             /* We can only do Berendsen coupling after we have summed
1120              * the kinetic energy or virial. Since the happens
1121              * in global_state after update, we should only do it at
1122              * step % nstlist = 1 with bGStatEveryStep=FALSE.
1123              */
1124         }
1125         else
1126         {
1127             update_tcouple(step, ir, state, ekind, &MassQ, mdatoms);
1128             update_pcouple_before_coordinates(fplog, step, ir, state,
1129                                               parrinellorahmanMu, M,
1130                                               bInitStep);
1131         }
1132
1133         if (EI_VV(ir->eI))
1134         {
1135             /* velocity half-step update */
1136             update_coords(step, ir, mdatoms, state, f.arrayRefWithPadding(), fcd,
1137                           ekind, M, &upd, etrtVELOCITY2,
1138                           cr, constr);
1139         }
1140
1141         /* Above, initialize just copies ekinh into ekin,
1142          * it doesn't copy position (for VV),
1143          * and entire integrator for MD.
1144          */
1145
1146         if (ir->eI == eiVVAK)
1147         {
1148             /* We probably only need md->homenr, not state->natoms */
1149             if (state->natoms > cbuf_nalloc)
1150             {
1151                 cbuf_nalloc = state->natoms;
1152                 srenew(cbuf, cbuf_nalloc);
1153             }
1154             copy_rvecn(as_rvec_array(state->x.data()), cbuf, 0, state->natoms);
1155         }
1156
1157         update_coords(step, ir, mdatoms, state, f.arrayRefWithPadding(), fcd,
1158                       ekind, M, &upd, etrtPOSITION, cr, constr);
1159         wallcycle_stop(wcycle, ewcUPDATE);
1160
1161         constrain_coordinates(step, &dvdl_constr, state,
1162                               shake_vir,
1163                               &upd, constr,
1164                               bCalcVir, do_log, do_ene);
1165         update_sd_second_half(step, &dvdl_constr, ir, mdatoms, state,
1166                               cr, nrnb, wcycle, &upd, constr, do_log, do_ene);
1167         finish_update(ir, mdatoms,
1168                       state, graph,
1169                       nrnb, wcycle, &upd, constr);
1170
1171         if (ir->bPull && ir->pull->bSetPbcRefToPrevStepCOM)
1172         {
1173             updatePrevStepPullCom(ir->pull_work, state);
1174         }
1175
1176         if (ir->eI == eiVVAK)
1177         {
1178             /* erase F_EKIN and F_TEMP here? */
1179             /* just compute the kinetic energy at the half step to perform a trotter step */
1180             compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
1181                             wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
1182                             constr, &nullSignaller, lastbox,
1183                             nullptr, &bSumEkinhOld,
1184                             (bGStat ? CGLO_GSTAT : 0) | CGLO_TEMPERATURE
1185                             );
1186             wallcycle_start(wcycle, ewcUPDATE);
1187             trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ4);
1188             /* now we know the scaling, we can compute the positions again again */
1189             copy_rvecn(cbuf, as_rvec_array(state->x.data()), 0, state->natoms);
1190
1191             update_coords(step, ir, mdatoms, state, f.arrayRefWithPadding(), fcd,
1192                           ekind, M, &upd, etrtPOSITION, cr, constr);
1193             wallcycle_stop(wcycle, ewcUPDATE);
1194
1195             /* do we need an extra constraint here? just need to copy out of as_rvec_array(state->v.data()) to upd->xp? */
1196             /* are the small terms in the shake_vir here due
1197              * to numerical errors, or are they important
1198              * physically? I'm thinking they are just errors, but not completely sure.
1199              * For now, will call without actually constraining, constr=NULL*/
1200             finish_update(ir, mdatoms,
1201                           state, graph,
1202                           nrnb, wcycle, &upd, nullptr);
1203         }
1204         if (EI_VV(ir->eI))
1205         {
1206             /* this factor or 2 correction is necessary
1207                because half of the constraint force is removed
1208                in the vv step, so we have to double it.  See
1209                the Redmine issue #1255.  It is not yet clear
1210                if the factor of 2 is exact, or just a very
1211                good approximation, and this will be
1212                investigated.  The next step is to see if this
1213                can be done adding a dhdl contribution from the
1214                rattle step, but this is somewhat more
1215                complicated with the current code. Will be
1216                investigated, hopefully for 4.6.3. However,
1217                this current solution is much better than
1218                having it completely wrong.
1219              */
1220             enerd->term[F_DVDL_CONSTR] += 2*dvdl_constr;
1221         }
1222         else
1223         {
1224             enerd->term[F_DVDL_CONSTR] += dvdl_constr;
1225         }
1226
1227         if (vsite != nullptr)
1228         {
1229             wallcycle_start(wcycle, ewcVSITECONSTR);
1230             if (graph != nullptr)
1231             {
1232                 shift_self(graph, state->box, state->x.rvec_array());
1233             }
1234             construct_vsites(vsite, state->x.rvec_array(), ir->delta_t, state->v.rvec_array(),
1235                              top.idef.iparams, top.idef.il,
1236                              fr->ePBC, fr->bMolPBC, cr, state->box);
1237
1238             if (graph != nullptr)
1239             {
1240                 unshift_self(graph, state->box, state->x.rvec_array());
1241             }
1242             wallcycle_stop(wcycle, ewcVSITECONSTR);
1243         }
1244
1245         /* ############## IF NOT VV, Calculate globals HERE  ############ */
1246         /* With Leap-Frog we can skip compute_globals at
1247          * non-communication steps, but we need to calculate
1248          * the kinetic energy one step before communication.
1249          */
1250         {
1251             // Organize to do inter-simulation signalling on steps if
1252             // and when algorithms require it.
1253             bool doInterSimSignal = (simulationsShareState && do_per_step(step, nstSignalComm));
1254
1255             if (bGStat || (!EI_VV(ir->eI) && do_per_step(step+1, nstglobalcomm)) || doInterSimSignal)
1256             {
1257                 // Since we're already communicating at this step, we
1258                 // can propagate intra-simulation signals. Note that
1259                 // check_nstglobalcomm has the responsibility for
1260                 // choosing the value of nstglobalcomm that is one way
1261                 // bGStat becomes true, so we can't get into a
1262                 // situation where e.g. checkpointing can't be
1263                 // signalled.
1264                 bool                doIntraSimSignal = true;
1265                 SimulationSignaller signaller(&signals, cr, ms, doInterSimSignal, doIntraSimSignal);
1266
1267                 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
1268                                 wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
1269                                 constr, &signaller,
1270                                 lastbox,
1271                                 &totalNumberOfBondedInteractions, &bSumEkinhOld,
1272                                 (bGStat ? CGLO_GSTAT : 0)
1273                                 | (!EI_VV(ir->eI) && bCalcEner ? CGLO_ENERGY : 0)
1274                                 | (!EI_VV(ir->eI) && bStopCM ? CGLO_STOPCM : 0)
1275                                 | (!EI_VV(ir->eI) ? CGLO_TEMPERATURE : 0)
1276                                 | (!EI_VV(ir->eI) ? CGLO_PRESSURE : 0)
1277                                 | CGLO_CONSTRAINT
1278                                 | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)
1279                                 );
1280                 checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
1281                                                 top_global, &top, state,
1282                                                 &shouldCheckNumberOfBondedInteractions);
1283             }
1284         }
1285
1286         /* #############  END CALC EKIN AND PRESSURE ################# */
1287
1288         /* Note: this is OK, but there are some numerical precision issues with using the convergence of
1289            the virial that should probably be addressed eventually. state->veta has better properies,
1290            but what we actually need entering the new cycle is the new shake_vir value. Ideally, we could
1291            generate the new shake_vir, but test the veta value for convergence.  This will take some thought. */
1292
1293         if (ir->efep != efepNO && !EI_VV(ir->eI))
1294         {
1295             /* Sum up the foreign energy and dhdl terms for md and sd.
1296                Currently done every step so that dhdl is correct in the .edr */
1297             sum_dhdl(enerd, state->lambda, ir->fepvals);
1298         }
1299
1300         update_pcouple_after_coordinates(fplog, step, ir, mdatoms,
1301                                          pres, force_vir, shake_vir,
1302                                          parrinellorahmanMu,
1303                                          state, nrnb, &upd);
1304
1305         /* ################# END UPDATE STEP 2 ################# */
1306         /* #### We now have r(t+dt) and v(t+dt/2)  ############# */
1307
1308         /* The coordinates (x) were unshifted in update */
1309         if (!bGStat)
1310         {
1311             /* We will not sum ekinh_old,
1312              * so signal that we still have to do it.
1313              */
1314             bSumEkinhOld = TRUE;
1315         }
1316
1317         if (bCalcEner)
1318         {
1319             /* #########  BEGIN PREPARING EDR OUTPUT  ###########  */
1320
1321             /* use the directly determined last velocity, not actually the averaged half steps */
1322             if (bTrotter && ir->eI == eiVV)
1323             {
1324                 enerd->term[F_EKIN] = last_ekin;
1325             }
1326             enerd->term[F_ETOT] = enerd->term[F_EPOT] + enerd->term[F_EKIN];
1327
1328             if (integratorHasConservedEnergyQuantity(ir))
1329             {
1330                 if (EI_VV(ir->eI))
1331                 {
1332                     enerd->term[F_ECONSERVED] = enerd->term[F_ETOT] + saved_conserved_quantity;
1333                 }
1334                 else
1335                 {
1336                     enerd->term[F_ECONSERVED] = enerd->term[F_ETOT] + NPT_energy(ir, state, &MassQ);
1337                 }
1338             }
1339             /* #########  END PREPARING EDR OUTPUT  ###########  */
1340         }
1341
1342         /* Output stuff */
1343         if (MASTER(cr))
1344         {
1345             if (fplog && do_log && bDoExpanded)
1346             {
1347                 /* only needed if doing expanded ensemble */
1348                 PrintFreeEnergyInfoToFile(fplog, ir->fepvals, ir->expandedvals, ir->bSimTemp ? ir->simtempvals : nullptr,
1349                                           state_global->dfhist, state->fep_state, ir->nstlog, step);
1350             }
1351             if (bCalcEner)
1352             {
1353                 energyOutput.addDataAtEnergyStep(bDoDHDL, bCalcEnerStep,
1354                                                  t, mdatoms->tmass, enerd, state,
1355                                                  ir->fepvals, ir->expandedvals, lastbox,
1356                                                  shake_vir, force_vir, total_vir, pres,
1357                                                  ekind, mu_tot, constr);
1358             }
1359             else
1360             {
1361                 energyOutput.recordNonEnergyStep();
1362             }
1363
1364             gmx_bool do_dr  = do_per_step(step, ir->nstdisreout);
1365             gmx_bool do_or  = do_per_step(step, ir->nstorireout);
1366
1367             energyOutput.printStepToEnergyFile(mdoutf_get_fp_ene(outf), do_ene, do_dr, do_or,
1368                                                do_log ? fplog : nullptr,
1369                                                step, t,
1370                                                eprNORMAL, fcd, groups, &(ir->opts), awh.get());
1371
1372             if (ir->bPull)
1373             {
1374                 pull_print_output(ir->pull_work, step, t);
1375             }
1376
1377             if (do_per_step(step, ir->nstlog))
1378             {
1379                 if (fflush(fplog) != 0)
1380                 {
1381                     gmx_fatal(FARGS, "Cannot flush logfile - maybe you are out of disk space?");
1382                 }
1383             }
1384         }
1385         if (bDoExpanded)
1386         {
1387             /* Have to do this part _after_ outputting the logfile and the edr file */
1388             /* Gets written into the state at the beginning of next loop*/
1389             state->fep_state = lamnew;
1390         }
1391         /* Print the remaining wall clock time for the run */
1392         if (isMasterSimMasterRank(ms, cr) &&
1393             (do_verbose || gmx_got_usr_signal()) &&
1394             !bPMETunePrinting)
1395         {
1396             if (shellfc)
1397             {
1398                 fprintf(stderr, "\n");
1399             }
1400             print_time(stderr, walltime_accounting, step, ir, cr);
1401         }
1402
1403         /* Ion/water position swapping.
1404          * Not done in last step since trajectory writing happens before this call
1405          * in the MD loop and exchanges would be lost anyway. */
1406         bNeedRepartition = FALSE;
1407         if ((ir->eSwapCoords != eswapNO) && (step > 0) && !bLastStep &&
1408             do_per_step(step, ir->swap->nstswap))
1409         {
1410             bNeedRepartition = do_swapcoords(cr, step, t, ir, wcycle,
1411                                              as_rvec_array(state->x.data()),
1412                                              state->box,
1413                                              MASTER(cr) && mdrunOptions.verbose,
1414                                              bRerunMD);
1415
1416             if (bNeedRepartition && DOMAINDECOMP(cr))
1417             {
1418                 dd_collect_state(cr->dd, state, state_global);
1419             }
1420         }
1421
1422         /* Replica exchange */
1423         bExchanged = FALSE;
1424         if (bDoReplEx)
1425         {
1426             bExchanged = replica_exchange(fplog, cr, ms, repl_ex,
1427                                           state_global, enerd,
1428                                           state, step, t);
1429         }
1430
1431         if ( (bExchanged || bNeedRepartition) && DOMAINDECOMP(cr) )
1432         {
1433             dd_partition_system(fplog, mdlog, step, cr, TRUE, 1,
1434                                 state_global, *top_global, ir,
1435                                 state, &f, mdAtoms, &top, fr,
1436                                 vsite, constr,
1437                                 nrnb, wcycle, FALSE);
1438             shouldCheckNumberOfBondedInteractions = true;
1439             upd.setNumAtoms(state->natoms);
1440         }
1441
1442         bFirstStep             = FALSE;
1443         bInitStep              = FALSE;
1444         startingFromCheckpoint = false;
1445
1446         /* #######  SET VARIABLES FOR NEXT ITERATION IF THEY STILL NEED IT ###### */
1447         /* With all integrators, except VV, we need to retain the pressure
1448          * at the current step for coupling at the next step.
1449          */
1450         if ((state->flags & (1<<estPRES_PREV)) &&
1451             (bGStatEveryStep ||
1452              (ir->nstpcouple > 0 && step % ir->nstpcouple == 0)))
1453         {
1454             /* Store the pressure in t_state for pressure coupling
1455              * at the next MD step.
1456              */
1457             copy_mat(pres, state->pres_prev);
1458         }
1459
1460         /* #######  END SET VARIABLES FOR NEXT ITERATION ###### */
1461
1462         if ( (membed != nullptr) && (!bLastStep) )
1463         {
1464             rescale_membed(step_rel, membed, as_rvec_array(state_global->x.data()));
1465         }
1466
1467         cycles = wallcycle_stop(wcycle, ewcSTEP);
1468         if (DOMAINDECOMP(cr) && wcycle)
1469         {
1470             dd_cycles_add(cr->dd, cycles, ddCyclStep);
1471         }
1472
1473         /* increase the MD step number */
1474         step++;
1475         step_rel++;
1476
1477         resetHandler->resetCounters(
1478                 step, step_rel, mdlog, fplog, cr, (use_GPU(fr->nbv.get()) ? fr->nbv.get() : nullptr),
1479                 nrnb, fr->pmedata, pme_loadbal, wcycle, walltime_accounting);
1480
1481         /* If bIMD is TRUE, the master updates the IMD energy record and sends positions to VMD client */
1482         IMD_prep_energies_send_positions(ir->bIMD && MASTER(cr), bIMDstep, ir->imd, enerd, step, bCalcEner, wcycle);
1483
1484     }
1485     /* End of main MD loop */
1486
1487     /* Closing TNG files can include compressing data. Therefore it is good to do that
1488      * before stopping the time measurements. */
1489     mdoutf_tng_close(outf);
1490
1491     /* Stop measuring walltime */
1492     walltime_accounting_end_time(walltime_accounting);
1493
1494     if (!thisRankHasDuty(cr, DUTY_PME))
1495     {
1496         /* Tell the PME only node to finish */
1497         gmx_pme_send_finish(cr);
1498     }
1499
1500     if (MASTER(cr))
1501     {
1502         if (ir->nstcalcenergy > 0)
1503         {
1504             energyOutput.printStepToEnergyFile(mdoutf_get_fp_ene(outf), FALSE, FALSE, FALSE,
1505                                                fplog, step, t,
1506                                                eprAVER, fcd, groups, &(ir->opts), awh.get());
1507         }
1508     }
1509     done_mdoutf(outf);
1510
1511     if (bPMETune)
1512     {
1513         pme_loadbal_done(pme_loadbal, fplog, mdlog, use_GPU(fr->nbv.get()));
1514     }
1515
1516     done_shellfc(fplog, shellfc, step_rel);
1517
1518     if (useReplicaExchange && MASTER(cr))
1519     {
1520         print_replica_exchange_statistics(fplog, repl_ex);
1521     }
1522
1523     // Clean up swapcoords
1524     if (ir->eSwapCoords != eswapNO)
1525     {
1526         finish_swapcoords(ir->swap);
1527     }
1528
1529     /* IMD cleanup, if bIMD is TRUE. */
1530     IMD_finalize(ir->bIMD, ir->imd);
1531
1532     walltime_accounting_set_nsteps_done(walltime_accounting, step_rel);
1533
1534     destroy_enerdata(enerd);
1535
1536     sfree(enerd);
1537     global_stat_destroy(gstat);
1538
1539 }