Merge release-2019 branch into master
[gromacs.git] / src / gromacs / mdrun / md.cpp
blob765ffd18a627c57c52c7687a4235ee1284a6a9f2
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 <cinttypes>
47 #include <cmath>
48 #include <cstdio>
49 #include <cstdlib>
51 #include <algorithm>
52 #include <memory>
54 #include "gromacs/awh/awh.h"
55 #include "gromacs/commandline/filenm.h"
56 #include "gromacs/compat/make_unique.h"
57 #include "gromacs/domdec/collect.h"
58 #include "gromacs/domdec/domdec.h"
59 #include "gromacs/domdec/domdec_network.h"
60 #include "gromacs/domdec/domdec_struct.h"
61 #include "gromacs/domdec/partition.h"
62 #include "gromacs/essentialdynamics/edsam.h"
63 #include "gromacs/ewald/pme.h"
64 #include "gromacs/ewald/pme-load-balancing.h"
65 #include "gromacs/fileio/trxio.h"
66 #include "gromacs/gmxlib/network.h"
67 #include "gromacs/gmxlib/nrnb.h"
68 #include "gromacs/gpu_utils/gpu_utils.h"
69 #include "gromacs/imd/imd.h"
70 #include "gromacs/listed-forces/manage-threading.h"
71 #include "gromacs/math/functions.h"
72 #include "gromacs/math/utilities.h"
73 #include "gromacs/math/vec.h"
74 #include "gromacs/math/vectypes.h"
75 #include "gromacs/mdlib/checkpointhandler.h"
76 #include "gromacs/mdlib/compute_io.h"
77 #include "gromacs/mdlib/constr.h"
78 #include "gromacs/mdlib/ebin.h"
79 #include "gromacs/mdlib/expanded.h"
80 #include "gromacs/mdlib/force.h"
81 #include "gromacs/mdlib/force_flags.h"
82 #include "gromacs/mdlib/forcerec.h"
83 #include "gromacs/mdlib/md_support.h"
84 #include "gromacs/mdlib/mdatoms.h"
85 #include "gromacs/mdlib/mdebin.h"
86 #include "gromacs/mdlib/mdoutf.h"
87 #include "gromacs/mdlib/mdrun.h"
88 #include "gromacs/mdlib/mdsetup.h"
89 #include "gromacs/mdlib/membed.h"
90 #include "gromacs/mdlib/nb_verlet.h"
91 #include "gromacs/mdlib/nbnxn_gpu_data_mgmt.h"
92 #include "gromacs/mdlib/ns.h"
93 #include "gromacs/mdlib/resethandler.h"
94 #include "gromacs/mdlib/shellfc.h"
95 #include "gromacs/mdlib/sighandler.h"
96 #include "gromacs/mdlib/sim_util.h"
97 #include "gromacs/mdlib/simulationsignal.h"
98 #include "gromacs/mdlib/stophandler.h"
99 #include "gromacs/mdlib/tgroup.h"
100 #include "gromacs/mdlib/trajectory_writing.h"
101 #include "gromacs/mdlib/update.h"
102 #include "gromacs/mdlib/vcm.h"
103 #include "gromacs/mdlib/vsite.h"
104 #include "gromacs/mdtypes/awh-history.h"
105 #include "gromacs/mdtypes/awh-params.h"
106 #include "gromacs/mdtypes/commrec.h"
107 #include "gromacs/mdtypes/df_history.h"
108 #include "gromacs/mdtypes/energyhistory.h"
109 #include "gromacs/mdtypes/fcdata.h"
110 #include "gromacs/mdtypes/forcerec.h"
111 #include "gromacs/mdtypes/group.h"
112 #include "gromacs/mdtypes/inputrec.h"
113 #include "gromacs/mdtypes/interaction_const.h"
114 #include "gromacs/mdtypes/md_enums.h"
115 #include "gromacs/mdtypes/mdatom.h"
116 #include "gromacs/mdtypes/observableshistory.h"
117 #include "gromacs/mdtypes/pullhistory.h"
118 #include "gromacs/mdtypes/state.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"
138 #include "integrator.h"
139 #include "replicaexchange.h"
141 #if GMX_FAHCORE
142 #include "corewrap.h"
143 #endif
145 using gmx::SimulationSignaller;
147 void gmx::Integrator::do_md()
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 gmx_mdoutf *outf = nullptr;
157 int64_t step, step_rel;
158 double t, t0, lam0[efptNR];
159 gmx_bool bGStatEveryStep, bGStat, bCalcVir, bCalcEnerStep, bCalcEner;
160 gmx_bool bNS, bNStList, bSimAnn, bStopCM,
161 bFirstStep, bInitStep, bLastStep = FALSE;
162 gmx_bool bDoDHDL = FALSE, bDoFEP = FALSE, bDoExpanded = FALSE;
163 gmx_bool do_ene, do_log, do_verbose;
164 gmx_bool bMasterState;
165 int force_flags, cglo_flags;
166 tensor force_vir, shake_vir, total_vir, tmp_vir, pres;
167 int i, m;
168 rvec mu_tot;
169 t_vcm *vcm;
170 matrix parrinellorahmanMu, M;
171 gmx_repl_ex_t repl_ex = nullptr;
172 gmx_localtop_t *top;
173 t_mdebin *mdebin = nullptr;
174 gmx_enerdata_t *enerd;
175 PaddedVector<gmx::RVec> f {};
176 gmx_global_stat_t gstat;
177 gmx_update_t *upd = nullptr;
178 t_graph *graph = nullptr;
179 gmx_groups_t *groups;
180 gmx_ekindata_t *ekind;
181 gmx_shellfc_t *shellfc;
182 gmx_bool bSumEkinhOld, bDoReplEx, bExchanged, bNeedRepartition;
183 gmx_bool bTemp, bPres, bTrotter;
184 real dvdl_constr;
185 rvec *cbuf = nullptr;
186 int cbuf_nalloc = 0;
187 matrix lastbox;
188 int lamnew = 0;
189 /* for FEP */
190 int nstfep = 0;
191 double cycles;
192 real saved_conserved_quantity = 0;
193 real last_ekin = 0;
194 t_extmass MassQ;
195 int **trotter_seq;
196 char sbuf[STEPSTRSIZE], sbuf2[STEPSTRSIZE];
198 /* PME load balancing data for GPU kernels */
199 pme_load_balancing_t *pme_loadbal = nullptr;
200 gmx_bool bPMETune = FALSE;
201 gmx_bool bPMETunePrinting = FALSE;
203 /* Interactive MD */
204 gmx_bool bIMDstep = FALSE;
206 /* Domain decomposition could incorrectly miss a bonded
207 interaction, but checking for that requires a global
208 communication stage, which does not otherwise happen in DD
209 code. So we do that alongside the first global energy reduction
210 after a new DD is made. These variables handle whether the
211 check happens, and the result it returns. */
212 bool shouldCheckNumberOfBondedInteractions = false;
213 int totalNumberOfBondedInteractions = -1;
215 SimulationSignals signals;
216 // Most global communnication stages don't propagate mdrun
217 // signals, and will use this object to achieve that.
218 SimulationSignaller nullSignaller(nullptr, nullptr, nullptr, false, false);
220 if (!mdrunOptions.writeConfout)
222 // This is on by default, and the main known use case for
223 // turning it off is for convenience in benchmarking, which is
224 // something that should not show up in the general user
225 // interface.
226 GMX_LOG(mdlog.info).asParagraph().
227 appendText("The -noconfout functionality is deprecated, and may be removed in a future version.");
230 /* md-vv uses averaged full step velocities for T-control
231 md-vv-avek uses averaged half step velocities for T-control (but full step ekin for P control)
232 md uses averaged half step kinetic energies to determine temperature unless defined otherwise by GMX_EKIN_AVE_VEL; */
233 bTrotter = (EI_VV(ir->eI) && (inputrecNptTrotter(ir) || inputrecNphTrotter(ir) || inputrecNvtTrotter(ir)));
235 const bool bRerunMD = false;
236 int nstglobalcomm = mdrunOptions.globalCommunicationInterval;
238 nstglobalcomm = check_nstglobalcomm(mdlog, nstglobalcomm, ir);
239 bGStatEveryStep = (nstglobalcomm == 1);
241 groups = &top_global->groups;
243 std::unique_ptr<EssentialDynamics> ed = nullptr;
244 if (opt2bSet("-ei", nfile, fnm) || observablesHistory->edsamHistory != nullptr)
246 /* Initialize essential dynamics sampling */
247 ed = init_edsam(mdlog,
248 opt2fn_null("-ei", nfile, fnm), opt2fn("-eo", nfile, fnm),
249 top_global,
250 ir, cr, constr,
251 state_global, observablesHistory,
252 oenv, mdrunOptions.continuationOptions.appendFiles);
255 /* Initial values */
256 init_md(fplog, cr, outputProvider, ir, oenv, mdrunOptions,
257 &t, &t0, state_global, lam0,
258 nrnb, top_global, &upd, deform,
259 nfile, fnm, &outf, &mdebin,
260 force_vir, shake_vir, total_vir, pres, mu_tot, &bSimAnn, &vcm, wcycle);
262 /* Energy terms and groups */
263 snew(enerd, 1);
264 init_enerdata(top_global->groups.grps[egcENER].nr, ir->fepvals->n_lambda,
265 enerd);
267 /* Kinetic energy data */
268 snew(ekind, 1);
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;
273 gstat = global_stat_init(ir);
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));
281 double io = compute_io(ir, top_global->natoms, groups, mdebin->ebin->nener, 1);
282 if ((io > 2000) && MASTER(cr))
284 fprintf(stderr,
285 "\nWARNING: This run will generate roughly %.0f Mb of data\n\n",
286 io);
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);
295 // Local state only becomes valid now.
296 std::unique_ptr<t_state> stateInstance;
297 t_state * state;
299 if (DOMAINDECOMP(cr))
301 top = dd_init_local_top(top_global);
303 stateInstance = compat::make_unique<t_state>();
304 state = stateInstance.get();
305 dd_init_local_state(cr->dd, state_global, state);
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 update_realloc(upd, state->natoms);
316 else
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;
323 snew(top, 1);
324 mdAlgorithmsSetupAtomData(cr, ir, top_global, top, fr,
325 &graph, mdAtoms, constr, vsite, shellfc);
327 update_realloc(upd, state->natoms);
330 auto mdatoms = mdAtoms->mdatoms();
332 // NOTE: The global state is no longer used at this point.
333 // But state_global is still used as temporary storage space for writing
334 // the global state to file and potentially for replica exchange.
335 // (Global topology should persist.)
337 update_mdatoms(mdatoms, state->lambda[efptMASS]);
339 const ContinuationOptions &continuationOptions = mdrunOptions.continuationOptions;
340 bool startingFromCheckpoint = continuationOptions.startedFromCheckpoint;
342 if (ir->bExpanded)
344 /* Check nstexpanded here, because the grompp check was broken */
345 if (ir->expandedvals->nstexpanded % ir->nstcalcenergy != 0)
347 gmx_fatal(FARGS, "With expanded ensemble, nstexpanded should be a multiple of nstcalcenergy");
349 init_expanded_ensemble(startingFromCheckpoint, ir, state->dfhist);
352 if (MASTER(cr))
354 if (startingFromCheckpoint)
356 /* Update mdebin with energy history if appending to output files */
357 if (continuationOptions.appendFiles)
359 /* If no history is available (because a checkpoint is from before
360 * it was written) make a new one later, otherwise restore it.
362 if (observablesHistory->energyHistory)
364 restore_energyhistory_from_state(mdebin, observablesHistory->energyHistory.get());
367 else if (observablesHistory->energyHistory)
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.
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.
382 if (!observablesHistory->energyHistory)
384 observablesHistory->energyHistory = compat::make_unique<energyhistory_t>();
386 if (!observablesHistory->pullHistory)
388 observablesHistory->pullHistory = compat::make_unique<PullHistory>();
390 /* Set the initial energy history in state by updating once */
391 update_energyhistory(observablesHistory->energyHistory.get(), mdebin);
394 preparePrevStepPullCom(ir, mdatoms, state, state_global, cr, startingFromCheckpoint);
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);
401 const bool useReplicaExchange = (replExParams.exchangeInterval > 0);
402 if (useReplicaExchange && MASTER(cr))
404 repl_ex = init_replica_exchange(fplog, ms, top_global->natoms, ir,
405 replExParams);
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 if (bPMETune)
413 pme_loadbal_init(&pme_loadbal, cr, mdlog, *ir, state->box,
414 *fr->ic, *fr->nbv->listParams, fr->pmedata, use_GPU(fr->nbv),
415 &bPMETunePrinting);
418 if (!ir->bContinuation)
420 if (state->flags & (1 << estV))
422 auto v = makeArrayRef(state->v);
423 /* Set the velocities of vsites, shells and frozen atoms to zero */
424 for (i = 0; i < mdatoms->homenr; i++)
426 if (mdatoms->ptype[i] == eptVSite ||
427 mdatoms->ptype[i] == eptShell)
429 clear_rvec(v[i]);
431 else if (mdatoms->cFREEZE)
433 for (m = 0; m < DIM; m++)
435 if (ir->opts.nFreeze[mdatoms->cFREEZE[i]][m])
437 v[i][m] = 0;
444 if (constr)
446 /* Constrain the initial coordinates and velocities */
447 do_constrain_first(fplog, constr, ir, mdatoms, state);
449 if (vsite)
451 /* Construct the virtual sites for the initial configuration */
452 construct_vsites(vsite, state->x.rvec_array(), ir->delta_t, nullptr,
453 top->idef.iparams, top->idef.il,
454 fr->ePBC, fr->bMolPBC, cr, state->box);
458 if (ir->efep != efepNO)
460 /* Set free energy calculation frequency as the greatest common
461 * denominator of nstdhdl and repl_ex_nst. */
462 nstfep = ir->fepvals->nstdhdl;
463 if (ir->bExpanded)
465 nstfep = gmx_greatest_common_divisor(ir->expandedvals->nstexpanded, nstfep);
467 if (useReplicaExchange)
469 nstfep = gmx_greatest_common_divisor(replExParams.exchangeInterval, nstfep);
473 /* Be REALLY careful about what flags you set here. You CANNOT assume
474 * this is the first step, since we might be restarting from a checkpoint,
475 * and in that case we should not do any modifications to the state.
477 bStopCM = (ir->comm_mode != ecmNO && !ir->bContinuation);
479 if (continuationOptions.haveReadEkin)
481 restore_ekinstate_from_state(cr, ekind, &state_global->ekinstate);
484 cglo_flags = (CGLO_INITIALIZATION | CGLO_TEMPERATURE | CGLO_GSTAT
485 | (EI_VV(ir->eI) ? CGLO_PRESSURE : 0)
486 | (EI_VV(ir->eI) ? CGLO_CONSTRAINT : 0)
487 | (continuationOptions.haveReadEkin ? CGLO_READEKIN : 0));
489 bSumEkinhOld = FALSE;
490 /* To minimize communication, compute_globals computes the COM velocity
491 * and the kinetic energy for the velocities without COM motion removed.
492 * Thus to get the kinetic energy without the COM contribution, we need
493 * to call compute_globals twice.
495 for (int cgloIteration = 0; cgloIteration < (bStopCM ? 2 : 1); cgloIteration++)
497 int cglo_flags_iteration = cglo_flags;
498 if (bStopCM && cgloIteration == 0)
500 cglo_flags_iteration |= CGLO_STOPCM;
501 cglo_flags_iteration &= ~CGLO_TEMPERATURE;
503 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
504 nullptr, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
505 constr, &nullSignaller, state->box,
506 &totalNumberOfBondedInteractions, &bSumEkinhOld, cglo_flags_iteration
507 | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0));
509 checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
510 top_global, top, state,
511 &shouldCheckNumberOfBondedInteractions);
512 if (ir->eI == eiVVAK)
514 /* a second call to get the half step temperature initialized as well */
515 /* we do the same call as above, but turn the pressure off -- internally to
516 compute_globals, this is recognized as a velocity verlet half-step
517 kinetic energy calculation. This minimized excess variables, but
518 perhaps loses some logic?*/
520 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
521 nullptr, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
522 constr, &nullSignaller, state->box,
523 nullptr, &bSumEkinhOld,
524 cglo_flags & ~CGLO_PRESSURE);
527 /* Calculate the initial half step temperature, and save the ekinh_old */
528 if (!continuationOptions.startedFromCheckpoint)
530 for (i = 0; (i < ir->opts.ngtc); i++)
532 copy_mat(ekind->tcstat[i].ekinh, ekind->tcstat[i].ekinh_old);
536 /* need to make an initiation call to get the Trotter variables set, as well as other constants for non-trotter
537 temperature control */
538 trotter_seq = init_npt_vars(ir, state, &MassQ, bTrotter);
540 if (MASTER(cr))
542 if (!ir->bContinuation)
544 if (constr && ir->eConstrAlg == econtLINCS)
546 fprintf(fplog,
547 "RMS relative constraint deviation after constraining: %.2e\n",
548 constr->rmsd());
550 if (EI_STATE_VELOCITY(ir->eI))
552 real temp = enerd->term[F_TEMP];
553 if (ir->eI != eiVV)
555 /* Result of Ekin averaged over velocities of -half
556 * and +half step, while we only have -half step here.
558 temp *= 2;
560 fprintf(fplog, "Initial temperature: %g K\n", temp);
564 char tbuf[20];
565 fprintf(stderr, "starting mdrun '%s'\n",
566 *(top_global->name));
567 if (ir->nsteps >= 0)
569 sprintf(tbuf, "%8.1f", (ir->init_step+ir->nsteps)*ir->delta_t);
571 else
573 sprintf(tbuf, "%s", "infinite");
575 if (ir->init_step > 0)
577 fprintf(stderr, "%s steps, %s ps (continuing from step %s, %8.1f ps).\n",
578 gmx_step_str(ir->init_step+ir->nsteps, sbuf), tbuf,
579 gmx_step_str(ir->init_step, sbuf2),
580 ir->init_step*ir->delta_t);
582 else
584 fprintf(stderr, "%s steps, %s ps.\n",
585 gmx_step_str(ir->nsteps, sbuf), tbuf);
587 fprintf(fplog, "\n");
590 walltime_accounting_start_time(walltime_accounting);
591 wallcycle_start(wcycle, ewcRUN);
592 print_start(fplog, cr, walltime_accounting, "mdrun");
594 #if GMX_FAHCORE
595 /* safest point to do file checkpointing is here. More general point would be immediately before integrator call */
596 int chkpt_ret = fcCheckPointParallel( cr->nodeid,
597 NULL, 0);
598 if (chkpt_ret == 0)
600 gmx_fatal( 3, __FILE__, __LINE__, "Checkpoint error on step %d\n", 0 );
602 #endif
604 /***********************************************************
606 * Loop over MD steps
608 ************************************************************/
610 bFirstStep = TRUE;
611 /* Skip the first Nose-Hoover integration when we get the state from tpx */
612 bInitStep = !startingFromCheckpoint || EI_VV(ir->eI);
613 bSumEkinhOld = FALSE;
614 bExchanged = FALSE;
615 bNeedRepartition = FALSE;
617 bool simulationsShareState = false;
618 int nstSignalComm = nstglobalcomm;
620 // TODO This implementation of ensemble orientation restraints is nasty because
621 // a user can't just do multi-sim with single-sim orientation restraints.
622 bool usingEnsembleRestraints = (fcd->disres.nsystems > 1) || ((ms != nullptr) && (fcd->orires.nr != 0));
623 bool awhUsesMultiSim = (ir->bDoAwh && ir->awhParams->shareBiasMultisim && (ms != nullptr));
625 // Replica exchange, ensemble restraints and AWH need all
626 // simulations to remain synchronized, so they need
627 // checkpoints and stop conditions to act on the same step, so
628 // the propagation of such signals must take place between
629 // simulations, not just within simulations.
630 // TODO: Make algorithm initializers set these flags.
631 simulationsShareState = useReplicaExchange || usingEnsembleRestraints || awhUsesMultiSim;
633 if (simulationsShareState)
635 // Inter-simulation signal communication does not need to happen
636 // often, so we use a minimum of 200 steps to reduce overhead.
637 const int c_minimumInterSimulationSignallingInterval = 200;
638 nstSignalComm = ((c_minimumInterSimulationSignallingInterval + nstglobalcomm - 1)/nstglobalcomm)*nstglobalcomm;
642 auto stopHandler = stopHandlerBuilder->getStopHandlerMD(
643 compat::not_null<SimulationSignal*>(&signals[eglsSTOPCOND]), simulationsShareState,
644 MASTER(cr), ir->nstlist, mdrunOptions.reproducible, nstSignalComm,
645 mdrunOptions.maximumHoursToRun, ir->nstlist == 0, fplog, step, bNS, walltime_accounting);
647 auto checkpointHandler = compat::make_unique<CheckpointHandler>(
648 compat::make_not_null<SimulationSignal*>(&signals[eglsCHKPT]),
649 simulationsShareState, ir->nstlist == 0, MASTER(cr),
650 mdrunOptions.writeConfout, mdrunOptions.checkpointOptions.period);
652 const bool resetCountersIsLocal = true;
653 auto resetHandler = compat::make_unique<ResetHandler>(
654 compat::make_not_null<SimulationSignal*>(&signals[eglsRESETCOUNTERS]), !resetCountersIsLocal,
655 ir->nsteps, MASTER(cr), mdrunOptions.timingOptions.resetHalfway,
656 mdrunOptions.maximumHoursToRun, mdlog, wcycle, walltime_accounting);
658 DdOpenBalanceRegionBeforeForceComputation ddOpenBalanceRegion = (DOMAINDECOMP(cr) ? DdOpenBalanceRegionBeforeForceComputation::yes : DdOpenBalanceRegionBeforeForceComputation::no);
659 DdCloseBalanceRegionAfterForceComputation ddCloseBalanceRegion = (DOMAINDECOMP(cr) ? DdCloseBalanceRegionAfterForceComputation::yes : DdCloseBalanceRegionAfterForceComputation::no);
661 step = ir->init_step;
662 step_rel = 0;
664 // TODO extract this to new multi-simulation module
665 if (MASTER(cr) && isMultiSim(ms) && !useReplicaExchange)
667 if (!multisim_int_all_are_equal(ms, ir->nsteps))
669 GMX_LOG(mdlog.warning).appendText(
670 "Note: The number of steps is not consistent across multi simulations,\n"
671 "but we are proceeding anyway!");
673 if (!multisim_int_all_are_equal(ms, ir->init_step))
675 GMX_LOG(mdlog.warning).appendText(
676 "Note: The initial step is not consistent across multi simulations,\n"
677 "but we are proceeding anyway!");
681 /* and stop now if we should */
682 bLastStep = (bLastStep || (ir->nsteps >= 0 && step_rel > ir->nsteps));
683 while (!bLastStep)
686 /* Determine if this is a neighbor search step */
687 bNStList = (ir->nstlist > 0 && step % ir->nstlist == 0);
689 if (bPMETune && bNStList)
691 /* PME grid + cut-off optimization with GPUs or PME nodes */
692 pme_loadbal_do(pme_loadbal, cr,
693 (mdrunOptions.verbose && MASTER(cr)) ? stderr : nullptr,
694 fplog, mdlog,
695 *ir, fr, *state,
696 wcycle,
697 step, step_rel,
698 &bPMETunePrinting);
701 wallcycle_start(wcycle, ewcSTEP);
703 bLastStep = (step_rel == ir->nsteps);
704 t = t0 + step*ir->delta_t;
706 // TODO Refactor this, so that nstfep does not need a default value of zero
707 if (ir->efep != efepNO || ir->bSimTemp)
709 /* find and set the current lambdas */
710 setCurrentLambdasLocal(step, ir->fepvals, lam0, state);
712 bDoDHDL = do_per_step(step, ir->fepvals->nstdhdl);
713 bDoFEP = ((ir->efep != efepNO) && do_per_step(step, nstfep));
714 bDoExpanded = (do_per_step(step, ir->expandedvals->nstexpanded)
715 && (ir->bExpanded) && (step > 0) && (!startingFromCheckpoint));
718 bDoReplEx = (useReplicaExchange && (step > 0) && !bLastStep &&
719 do_per_step(step, replExParams.exchangeInterval));
721 if (bSimAnn)
723 update_annealing_target_temp(ir, t, upd);
726 /* Stop Center of Mass motion */
727 bStopCM = (ir->comm_mode != ecmNO && do_per_step(step, ir->nstcomm));
729 /* Determine whether or not to do Neighbour Searching */
730 bNS = (bFirstStep || bNStList || bExchanged || bNeedRepartition);
732 bLastStep = bLastStep || stopHandler->stoppingAfterCurrentStep(bNS);
734 /* do_log triggers energy and virial calculation. Because this leads
735 * to different code paths, forces can be different. Thus for exact
736 * continuation we should avoid extra log output.
737 * Note that the || bLastStep can result in non-exact continuation
738 * beyond the last step. But we don't consider that to be an issue.
740 do_log = do_per_step(step, ir->nstlog) || (bFirstStep && !startingFromCheckpoint) || bLastStep;
741 do_verbose = mdrunOptions.verbose &&
742 (step % mdrunOptions.verboseStepPrintInterval == 0 || bFirstStep || bLastStep);
744 if (bNS && !(bFirstStep && ir->bContinuation))
746 bMasterState = FALSE;
747 /* Correct the new box if it is too skewed */
748 if (inputrecDynamicBox(ir))
750 if (correct_box(fplog, step, state->box, graph))
752 bMasterState = TRUE;
755 if (DOMAINDECOMP(cr) && bMasterState)
757 dd_collect_state(cr->dd, state, state_global);
760 if (DOMAINDECOMP(cr))
762 /* Repartition the domain decomposition */
763 dd_partition_system(fplog, mdlog, step, cr,
764 bMasterState, nstglobalcomm,
765 state_global, top_global, ir,
766 state, &f, mdAtoms, top, fr,
767 vsite, constr,
768 nrnb, wcycle,
769 do_verbose && !bPMETunePrinting);
770 shouldCheckNumberOfBondedInteractions = true;
771 update_realloc(upd, state->natoms);
775 if (MASTER(cr) && do_log)
777 print_ebin_header(fplog, step, t); /* can we improve the information printed here? */
780 if (ir->efep != efepNO)
782 update_mdatoms(mdatoms, state->lambda[efptMASS]);
785 if (bExchanged)
788 /* We need the kinetic energy at minus the half step for determining
789 * the full step kinetic energy and possibly for T-coupling.*/
790 /* This may not be quite working correctly yet . . . . */
791 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
792 wcycle, enerd, nullptr, nullptr, nullptr, nullptr, mu_tot,
793 constr, &nullSignaller, state->box,
794 &totalNumberOfBondedInteractions, &bSumEkinhOld,
795 CGLO_GSTAT | CGLO_TEMPERATURE | CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS);
796 checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
797 top_global, top, state,
798 &shouldCheckNumberOfBondedInteractions);
800 clear_mat(force_vir);
802 checkpointHandler->decideIfCheckpointingThisStep(bNS, bFirstStep, bLastStep);
804 /* Determine the energy and pressure:
805 * at nstcalcenergy steps and at energy output steps (set below).
807 if (EI_VV(ir->eI) && (!bInitStep))
809 bCalcEnerStep = do_per_step(step, ir->nstcalcenergy);
810 bCalcVir = bCalcEnerStep ||
811 (ir->epc != epcNO && (do_per_step(step, ir->nstpcouple) || do_per_step(step-1, ir->nstpcouple)));
813 else
815 bCalcEnerStep = do_per_step(step, ir->nstcalcenergy);
816 bCalcVir = bCalcEnerStep ||
817 (ir->epc != epcNO && do_per_step(step, ir->nstpcouple));
819 bCalcEner = bCalcEnerStep;
821 do_ene = (do_per_step(step, ir->nstenergy) || bLastStep);
823 if (do_ene || do_log || bDoReplEx)
825 bCalcVir = TRUE;
826 bCalcEner = TRUE;
829 /* Do we need global communication ? */
830 bGStat = (bCalcVir || bCalcEner || bStopCM ||
831 do_per_step(step, nstglobalcomm) ||
832 (EI_VV(ir->eI) && inputrecNvtTrotter(ir) && do_per_step(step-1, nstglobalcomm)));
834 force_flags = (GMX_FORCE_STATECHANGED |
835 ((inputrecDynamicBox(ir)) ? GMX_FORCE_DYNAMICBOX : 0) |
836 GMX_FORCE_ALLFORCES |
837 (bCalcVir ? GMX_FORCE_VIRIAL : 0) |
838 (bCalcEner ? GMX_FORCE_ENERGY : 0) |
839 (bDoFEP ? GMX_FORCE_DHDL : 0)
842 if (shellfc)
844 /* Now is the time to relax the shells */
845 relax_shell_flexcon(fplog, cr, ms, mdrunOptions.verbose,
846 enforcedRotation, step,
847 ir, bNS, force_flags, top,
848 constr, enerd, fcd,
849 state, f.arrayRefWithPadding(), force_vir, mdatoms,
850 nrnb, wcycle, graph, groups,
851 shellfc, fr, ppForceWorkload, t, mu_tot,
852 vsite,
853 ddOpenBalanceRegion, ddCloseBalanceRegion);
855 else
857 /* The AWH history need to be saved _before_ doing force calculations where the AWH bias is updated
858 (or the AWH update will be performed twice for one step when continuing). It would be best to
859 call this update function from do_md_trajectory_writing but that would occur after do_force.
860 One would have to divide the update_awh function into one function applying the AWH force
861 and one doing the AWH bias update. The update AWH bias function could then be called after
862 do_md_trajectory_writing (then containing update_awh_history).
863 The checkpointing will in the future probably moved to the start of the md loop which will
864 rid of this issue. */
865 if (awh && checkpointHandler->isCheckpointingStep() && MASTER(cr))
867 awh->updateHistory(state_global->awhHistory.get());
870 /* The coordinates (x) are shifted (to get whole molecules)
871 * in do_force.
872 * This is parallellized as well, and does communication too.
873 * Check comments in sim_util.c
875 do_force(fplog, cr, ms, ir, awh.get(), enforcedRotation,
876 step, nrnb, wcycle, top, groups,
877 state->box, state->x.arrayRefWithPadding(), &state->hist,
878 f.arrayRefWithPadding(), force_vir, mdatoms, enerd, fcd,
879 state->lambda, graph,
880 fr, ppForceWorkload, vsite, mu_tot, t, ed ? ed->getLegacyED() : nullptr,
881 (bNS ? GMX_FORCE_NS : 0) | force_flags,
882 ddOpenBalanceRegion, ddCloseBalanceRegion);
885 if (EI_VV(ir->eI) && !startingFromCheckpoint)
886 /* ############### START FIRST UPDATE HALF-STEP FOR VV METHODS############### */
888 rvec *vbuf = nullptr;
890 wallcycle_start(wcycle, ewcUPDATE);
891 if (ir->eI == eiVV && bInitStep)
893 /* if using velocity verlet with full time step Ekin,
894 * take the first half step only to compute the
895 * virial for the first step. From there,
896 * revert back to the initial coordinates
897 * so that the input is actually the initial step.
899 snew(vbuf, state->natoms);
900 copy_rvecn(state->v.rvec_array(), vbuf, 0, state->natoms); /* should make this better for parallelizing? */
902 else
904 /* this is for NHC in the Ekin(t+dt/2) version of vv */
905 trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ1);
908 update_coords(step, ir, mdatoms, state, f.arrayRefWithPadding(), fcd,
909 ekind, M, upd, etrtVELOCITY1,
910 cr, constr);
912 wallcycle_stop(wcycle, ewcUPDATE);
913 constrain_velocities(step, nullptr,
914 state,
915 shake_vir,
916 constr,
917 bCalcVir, do_log, do_ene);
918 wallcycle_start(wcycle, ewcUPDATE);
919 /* if VV, compute the pressure and constraints */
920 /* For VV2, we strictly only need this if using pressure
921 * control, but we really would like to have accurate pressures
922 * printed out.
923 * Think about ways around this in the future?
924 * For now, keep this choice in comments.
926 /*bPres = (ir->eI==eiVV || inputrecNptTrotter(ir)); */
927 /*bTemp = ((ir->eI==eiVV &&(!bInitStep)) || (ir->eI==eiVVAK && inputrecNptTrotter(ir)));*/
928 bPres = TRUE;
929 bTemp = ((ir->eI == eiVV && (!bInitStep)) || (ir->eI == eiVVAK));
930 if (bCalcEner && ir->eI == eiVVAK)
932 bSumEkinhOld = TRUE;
934 /* for vv, the first half of the integration actually corresponds to the previous step.
935 So we need information from the last step in the first half of the integration */
936 if (bGStat || do_per_step(step-1, nstglobalcomm))
938 wallcycle_stop(wcycle, ewcUPDATE);
939 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
940 wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
941 constr, &nullSignaller, state->box,
942 &totalNumberOfBondedInteractions, &bSumEkinhOld,
943 (bGStat ? CGLO_GSTAT : 0)
944 | (bCalcEner ? CGLO_ENERGY : 0)
945 | (bTemp ? CGLO_TEMPERATURE : 0)
946 | (bPres ? CGLO_PRESSURE : 0)
947 | (bPres ? CGLO_CONSTRAINT : 0)
948 | (bStopCM ? CGLO_STOPCM : 0)
949 | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)
950 | CGLO_SCALEEKIN
952 /* explanation of above:
953 a) We compute Ekin at the full time step
954 if 1) we are using the AveVel Ekin, and it's not the
955 initial step, or 2) if we are using AveEkin, but need the full
956 time step kinetic energy for the pressure (always true now, since we want accurate statistics).
957 b) If we are using EkinAveEkin for the kinetic energy for the temperature control, we still feed in
958 EkinAveVel because it's needed for the pressure */
959 checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
960 top_global, top, state,
961 &shouldCheckNumberOfBondedInteractions);
962 wallcycle_start(wcycle, ewcUPDATE);
964 /* temperature scaling and pressure scaling to produce the extended variables at t+dt */
965 if (!bInitStep)
967 if (bTrotter)
969 m_add(force_vir, shake_vir, total_vir); /* we need the un-dispersion corrected total vir here */
970 trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ2);
972 /* TODO This is only needed when we're about to write
973 * a checkpoint, because we use it after the restart
974 * (in a kludge?). But what should we be doing if
975 * startingFromCheckpoint or bInitStep are true? */
976 if (inputrecNptTrotter(ir) || inputrecNphTrotter(ir))
978 copy_mat(shake_vir, state->svir_prev);
979 copy_mat(force_vir, state->fvir_prev);
981 if (inputrecNvtTrotter(ir) && ir->eI == eiVV)
983 /* update temperature and kinetic energy now that step is over - this is the v(t+dt) point */
984 enerd->term[F_TEMP] = sum_ekin(&(ir->opts), ekind, nullptr, (ir->eI == eiVV), FALSE);
985 enerd->term[F_EKIN] = trace(ekind->ekin);
988 else if (bExchanged)
990 wallcycle_stop(wcycle, ewcUPDATE);
991 /* We need the kinetic energy at minus the half step for determining
992 * the full step kinetic energy and possibly for T-coupling.*/
993 /* This may not be quite working correctly yet . . . . */
994 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
995 wcycle, enerd, nullptr, nullptr, nullptr, nullptr, mu_tot,
996 constr, &nullSignaller, state->box,
997 nullptr, &bSumEkinhOld,
998 CGLO_GSTAT | CGLO_TEMPERATURE);
999 wallcycle_start(wcycle, ewcUPDATE);
1002 /* if it's the initial step, we performed this first step just to get the constraint virial */
1003 if (ir->eI == eiVV && bInitStep)
1005 copy_rvecn(vbuf, state->v.rvec_array(), 0, state->natoms);
1006 sfree(vbuf);
1008 wallcycle_stop(wcycle, ewcUPDATE);
1011 /* compute the conserved quantity */
1012 if (EI_VV(ir->eI))
1014 saved_conserved_quantity = NPT_energy(ir, state, &MassQ);
1015 if (ir->eI == eiVV)
1017 last_ekin = enerd->term[F_EKIN];
1019 if ((ir->eDispCorr != edispcEnerPres) && (ir->eDispCorr != edispcAllEnerPres))
1021 saved_conserved_quantity -= enerd->term[F_DISPCORR];
1023 /* sum up the foreign energy and dhdl terms for vv. currently done every step so that dhdl is correct in the .edr */
1024 if (ir->efep != efepNO)
1026 sum_dhdl(enerd, state->lambda, ir->fepvals);
1030 /* ######## END FIRST UPDATE STEP ############## */
1031 /* ######## If doing VV, we now have v(dt) ###### */
1032 if (bDoExpanded)
1034 /* perform extended ensemble sampling in lambda - we don't
1035 actually move to the new state before outputting
1036 statistics, but if performing simulated tempering, we
1037 do update the velocities and the tau_t. */
1039 lamnew = ExpandedEnsembleDynamics(fplog, ir, enerd, state, &MassQ, state->fep_state, state->dfhist, step, state->v.rvec_array(), mdatoms);
1040 /* history is maintained in state->dfhist, but state_global is what is sent to trajectory and log output */
1041 if (MASTER(cr))
1043 copy_df_history(state_global->dfhist, state->dfhist);
1047 /* Now we have the energies and forces corresponding to the
1048 * coordinates at time t. We must output all of this before
1049 * the update.
1051 do_md_trajectory_writing(fplog, cr, nfile, fnm, step, step_rel, t,
1052 ir, state, state_global, observablesHistory,
1053 top_global, fr,
1054 outf, mdebin, ekind, f,
1055 checkpointHandler->isCheckpointingStep(),
1056 bRerunMD, bLastStep,
1057 mdrunOptions.writeConfout,
1058 bSumEkinhOld);
1059 /* Check if IMD step and do IMD communication, if bIMD is TRUE. */
1060 bIMDstep = do_IMD(ir->bIMD, step, cr, bNS, state->box, state->x.rvec_array(), ir, t, wcycle);
1062 /* kludge -- virial is lost with restart for MTTK NPT control. Must reload (saved earlier). */
1063 if (startingFromCheckpoint && (inputrecNptTrotter(ir) || inputrecNphTrotter(ir)))
1065 copy_mat(state->svir_prev, shake_vir);
1066 copy_mat(state->fvir_prev, force_vir);
1069 stopHandler->setSignal();
1070 resetHandler->setSignal(walltime_accounting);
1072 if (bGStat || !PAR(cr))
1074 /* In parallel we only have to check for checkpointing in steps
1075 * where we do global communication,
1076 * otherwise the other nodes don't know.
1078 checkpointHandler->setSignal(walltime_accounting);
1081 /* ######### START SECOND UPDATE STEP ################# */
1083 /* at the start of step, randomize or scale the velocities ((if vv. Restriction of Andersen controlled
1084 in preprocessing */
1086 if (ETC_ANDERSEN(ir->etc)) /* keep this outside of update_tcouple because of the extra info required to pass */
1088 gmx_bool bIfRandomize;
1089 bIfRandomize = update_randomize_velocities(ir, step, cr, mdatoms, state->v, upd, constr);
1090 /* if we have constraints, we have to remove the kinetic energy parallel to the bonds */
1091 if (constr && bIfRandomize)
1093 constrain_velocities(step, nullptr,
1094 state,
1095 tmp_vir,
1096 constr,
1097 bCalcVir, do_log, do_ene);
1100 /* Box is changed in update() when we do pressure coupling,
1101 * but we should still use the old box for energy corrections and when
1102 * writing it to the energy file, so it matches the trajectory files for
1103 * the same timestep above. Make a copy in a separate array.
1105 copy_mat(state->box, lastbox);
1107 dvdl_constr = 0;
1109 wallcycle_start(wcycle, ewcUPDATE);
1110 /* UPDATE PRESSURE VARIABLES IN TROTTER FORMULATION WITH CONSTRAINTS */
1111 if (bTrotter)
1113 trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ3);
1114 /* We can only do Berendsen coupling after we have summed
1115 * the kinetic energy or virial. Since the happens
1116 * in global_state after update, we should only do it at
1117 * step % nstlist = 1 with bGStatEveryStep=FALSE.
1120 else
1122 update_tcouple(step, ir, state, ekind, &MassQ, mdatoms);
1123 update_pcouple_before_coordinates(fplog, step, ir, state,
1124 parrinellorahmanMu, M,
1125 bInitStep);
1128 if (EI_VV(ir->eI))
1130 /* velocity half-step update */
1131 update_coords(step, ir, mdatoms, state, f.arrayRefWithPadding(), fcd,
1132 ekind, M, upd, etrtVELOCITY2,
1133 cr, constr);
1136 /* Above, initialize just copies ekinh into ekin,
1137 * it doesn't copy position (for VV),
1138 * and entire integrator for MD.
1141 if (ir->eI == eiVVAK)
1143 /* We probably only need md->homenr, not state->natoms */
1144 if (state->natoms > cbuf_nalloc)
1146 cbuf_nalloc = state->natoms;
1147 srenew(cbuf, cbuf_nalloc);
1149 copy_rvecn(as_rvec_array(state->x.data()), cbuf, 0, state->natoms);
1152 update_coords(step, ir, mdatoms, state, f.arrayRefWithPadding(), fcd,
1153 ekind, M, upd, etrtPOSITION, cr, constr);
1154 wallcycle_stop(wcycle, ewcUPDATE);
1156 constrain_coordinates(step, &dvdl_constr, state,
1157 shake_vir,
1158 upd, constr,
1159 bCalcVir, do_log, do_ene);
1160 update_sd_second_half(step, &dvdl_constr, ir, mdatoms, state,
1161 cr, nrnb, wcycle, upd, constr, do_log, do_ene);
1162 finish_update(ir, mdatoms,
1163 state, graph,
1164 nrnb, wcycle, upd, constr);
1166 if (ir->bPull && ir->pull->bSetPbcRefToPrevStepCOM)
1168 updatePrevStepPullCom(ir->pull_work, state);
1171 if (ir->eI == eiVVAK)
1173 /* erase F_EKIN and F_TEMP here? */
1174 /* just compute the kinetic energy at the half step to perform a trotter step */
1175 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
1176 wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
1177 constr, &nullSignaller, lastbox,
1178 nullptr, &bSumEkinhOld,
1179 (bGStat ? CGLO_GSTAT : 0) | CGLO_TEMPERATURE
1181 wallcycle_start(wcycle, ewcUPDATE);
1182 trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ4);
1183 /* now we know the scaling, we can compute the positions again again */
1184 copy_rvecn(cbuf, as_rvec_array(state->x.data()), 0, state->natoms);
1186 update_coords(step, ir, mdatoms, state, f.arrayRefWithPadding(), fcd,
1187 ekind, M, upd, etrtPOSITION, cr, constr);
1188 wallcycle_stop(wcycle, ewcUPDATE);
1190 /* do we need an extra constraint here? just need to copy out of as_rvec_array(state->v.data()) to upd->xp? */
1191 /* are the small terms in the shake_vir here due
1192 * to numerical errors, or are they important
1193 * physically? I'm thinking they are just errors, but not completely sure.
1194 * For now, will call without actually constraining, constr=NULL*/
1195 finish_update(ir, mdatoms,
1196 state, graph,
1197 nrnb, wcycle, upd, nullptr);
1199 if (EI_VV(ir->eI))
1201 /* this factor or 2 correction is necessary
1202 because half of the constraint force is removed
1203 in the vv step, so we have to double it. See
1204 the Redmine issue #1255. It is not yet clear
1205 if the factor of 2 is exact, or just a very
1206 good approximation, and this will be
1207 investigated. The next step is to see if this
1208 can be done adding a dhdl contribution from the
1209 rattle step, but this is somewhat more
1210 complicated with the current code. Will be
1211 investigated, hopefully for 4.6.3. However,
1212 this current solution is much better than
1213 having it completely wrong.
1215 enerd->term[F_DVDL_CONSTR] += 2*dvdl_constr;
1217 else
1219 enerd->term[F_DVDL_CONSTR] += dvdl_constr;
1222 if (vsite != nullptr)
1224 wallcycle_start(wcycle, ewcVSITECONSTR);
1225 if (graph != nullptr)
1227 shift_self(graph, state->box, state->x.rvec_array());
1229 construct_vsites(vsite, state->x.rvec_array(), ir->delta_t, state->v.rvec_array(),
1230 top->idef.iparams, top->idef.il,
1231 fr->ePBC, fr->bMolPBC, cr, state->box);
1233 if (graph != nullptr)
1235 unshift_self(graph, state->box, state->x.rvec_array());
1237 wallcycle_stop(wcycle, ewcVSITECONSTR);
1240 /* ############## IF NOT VV, Calculate globals HERE ############ */
1241 /* With Leap-Frog we can skip compute_globals at
1242 * non-communication steps, but we need to calculate
1243 * the kinetic energy one step before communication.
1246 // Organize to do inter-simulation signalling on steps if
1247 // and when algorithms require it.
1248 bool doInterSimSignal = (simulationsShareState && do_per_step(step, nstSignalComm));
1250 if (bGStat || (!EI_VV(ir->eI) && do_per_step(step+1, nstglobalcomm)) || doInterSimSignal)
1252 // Since we're already communicating at this step, we
1253 // can propagate intra-simulation signals. Note that
1254 // check_nstglobalcomm has the responsibility for
1255 // choosing the value of nstglobalcomm that is one way
1256 // bGStat becomes true, so we can't get into a
1257 // situation where e.g. checkpointing can't be
1258 // signalled.
1259 bool doIntraSimSignal = true;
1260 SimulationSignaller signaller(&signals, cr, ms, doInterSimSignal, doIntraSimSignal);
1262 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
1263 wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
1264 constr, &signaller,
1265 lastbox,
1266 &totalNumberOfBondedInteractions, &bSumEkinhOld,
1267 (bGStat ? CGLO_GSTAT : 0)
1268 | (!EI_VV(ir->eI) && bCalcEner ? CGLO_ENERGY : 0)
1269 | (!EI_VV(ir->eI) && bStopCM ? CGLO_STOPCM : 0)
1270 | (!EI_VV(ir->eI) ? CGLO_TEMPERATURE : 0)
1271 | (!EI_VV(ir->eI) ? CGLO_PRESSURE : 0)
1272 | CGLO_CONSTRAINT
1273 | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)
1275 checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
1276 top_global, top, state,
1277 &shouldCheckNumberOfBondedInteractions);
1281 /* ############# END CALC EKIN AND PRESSURE ################# */
1283 /* Note: this is OK, but there are some numerical precision issues with using the convergence of
1284 the virial that should probably be addressed eventually. state->veta has better properies,
1285 but what we actually need entering the new cycle is the new shake_vir value. Ideally, we could
1286 generate the new shake_vir, but test the veta value for convergence. This will take some thought. */
1288 if (ir->efep != efepNO && !EI_VV(ir->eI))
1290 /* Sum up the foreign energy and dhdl terms for md and sd.
1291 Currently done every step so that dhdl is correct in the .edr */
1292 sum_dhdl(enerd, state->lambda, ir->fepvals);
1295 update_pcouple_after_coordinates(fplog, step, ir, mdatoms,
1296 pres, force_vir, shake_vir,
1297 parrinellorahmanMu,
1298 state, nrnb, upd);
1300 /* ################# END UPDATE STEP 2 ################# */
1301 /* #### We now have r(t+dt) and v(t+dt/2) ############# */
1303 /* The coordinates (x) were unshifted in update */
1304 if (!bGStat)
1306 /* We will not sum ekinh_old,
1307 * so signal that we still have to do it.
1309 bSumEkinhOld = TRUE;
1312 if (bCalcEner)
1314 /* ######### BEGIN PREPARING EDR OUTPUT ########### */
1316 /* use the directly determined last velocity, not actually the averaged half steps */
1317 if (bTrotter && ir->eI == eiVV)
1319 enerd->term[F_EKIN] = last_ekin;
1321 enerd->term[F_ETOT] = enerd->term[F_EPOT] + enerd->term[F_EKIN];
1323 if (integratorHasConservedEnergyQuantity(ir))
1325 if (EI_VV(ir->eI))
1327 enerd->term[F_ECONSERVED] = enerd->term[F_ETOT] + saved_conserved_quantity;
1329 else
1331 enerd->term[F_ECONSERVED] = enerd->term[F_ETOT] + NPT_energy(ir, state, &MassQ);
1334 /* ######### END PREPARING EDR OUTPUT ########### */
1337 /* Output stuff */
1338 if (MASTER(cr))
1340 if (fplog && do_log && bDoExpanded)
1342 /* only needed if doing expanded ensemble */
1343 PrintFreeEnergyInfoToFile(fplog, ir->fepvals, ir->expandedvals, ir->bSimTemp ? ir->simtempvals : nullptr,
1344 state_global->dfhist, state->fep_state, ir->nstlog, step);
1346 if (bCalcEner)
1348 upd_mdebin(mdebin, bDoDHDL, bCalcEnerStep,
1349 t, mdatoms->tmass, enerd, state,
1350 ir->fepvals, ir->expandedvals, lastbox,
1351 shake_vir, force_vir, total_vir, pres,
1352 ekind, mu_tot, constr);
1354 else
1356 upd_mdebin_step(mdebin);
1359 gmx_bool do_dr = do_per_step(step, ir->nstdisreout);
1360 gmx_bool do_or = do_per_step(step, ir->nstorireout);
1362 print_ebin(mdoutf_get_fp_ene(outf), do_ene, do_dr, do_or, do_log ? fplog : nullptr,
1363 step, t,
1364 eprNORMAL, mdebin, fcd, groups, &(ir->opts), awh.get());
1366 if (ir->bPull)
1368 pull_print_output(ir->pull_work, step, t);
1371 if (do_per_step(step, ir->nstlog))
1373 if (fflush(fplog) != 0)
1375 gmx_fatal(FARGS, "Cannot flush logfile - maybe you are out of disk space?");
1379 if (bDoExpanded)
1381 /* Have to do this part _after_ outputting the logfile and the edr file */
1382 /* Gets written into the state at the beginning of next loop*/
1383 state->fep_state = lamnew;
1385 /* Print the remaining wall clock time for the run */
1386 if (isMasterSimMasterRank(ms, cr) &&
1387 (do_verbose || gmx_got_usr_signal()) &&
1388 !bPMETunePrinting)
1390 if (shellfc)
1392 fprintf(stderr, "\n");
1394 print_time(stderr, walltime_accounting, step, ir, cr);
1397 /* Ion/water position swapping.
1398 * Not done in last step since trajectory writing happens before this call
1399 * in the MD loop and exchanges would be lost anyway. */
1400 bNeedRepartition = FALSE;
1401 if ((ir->eSwapCoords != eswapNO) && (step > 0) && !bLastStep &&
1402 do_per_step(step, ir->swap->nstswap))
1404 bNeedRepartition = do_swapcoords(cr, step, t, ir, wcycle,
1405 as_rvec_array(state->x.data()),
1406 state->box,
1407 MASTER(cr) && mdrunOptions.verbose,
1408 bRerunMD);
1410 if (bNeedRepartition && DOMAINDECOMP(cr))
1412 dd_collect_state(cr->dd, state, state_global);
1416 /* Replica exchange */
1417 bExchanged = FALSE;
1418 if (bDoReplEx)
1420 bExchanged = replica_exchange(fplog, cr, ms, repl_ex,
1421 state_global, enerd,
1422 state, step, t);
1425 if ( (bExchanged || bNeedRepartition) && DOMAINDECOMP(cr) )
1427 dd_partition_system(fplog, mdlog, step, cr, TRUE, 1,
1428 state_global, top_global, ir,
1429 state, &f, mdAtoms, top, fr,
1430 vsite, constr,
1431 nrnb, wcycle, FALSE);
1432 shouldCheckNumberOfBondedInteractions = true;
1433 update_realloc(upd, state->natoms);
1436 bFirstStep = FALSE;
1437 bInitStep = FALSE;
1438 startingFromCheckpoint = false;
1440 /* ####### SET VARIABLES FOR NEXT ITERATION IF THEY STILL NEED IT ###### */
1441 /* With all integrators, except VV, we need to retain the pressure
1442 * at the current step for coupling at the next step.
1444 if ((state->flags & (1<<estPRES_PREV)) &&
1445 (bGStatEveryStep ||
1446 (ir->nstpcouple > 0 && step % ir->nstpcouple == 0)))
1448 /* Store the pressure in t_state for pressure coupling
1449 * at the next MD step.
1451 copy_mat(pres, state->pres_prev);
1454 /* ####### END SET VARIABLES FOR NEXT ITERATION ###### */
1456 if ( (membed != nullptr) && (!bLastStep) )
1458 rescale_membed(step_rel, membed, as_rvec_array(state_global->x.data()));
1461 cycles = wallcycle_stop(wcycle, ewcSTEP);
1462 if (DOMAINDECOMP(cr) && wcycle)
1464 dd_cycles_add(cr->dd, cycles, ddCyclStep);
1467 /* increase the MD step number */
1468 step++;
1469 step_rel++;
1471 resetHandler->resetCounters(
1472 step, step_rel, mdlog, fplog, cr, (use_GPU(fr->nbv) ? fr->nbv : nullptr),
1473 nrnb, fr->pmedata, pme_loadbal, wcycle, walltime_accounting);
1475 /* If bIMD is TRUE, the master updates the IMD energy record and sends positions to VMD client */
1476 IMD_prep_energies_send_positions(ir->bIMD && MASTER(cr), bIMDstep, ir->imd, enerd, step, bCalcEner, wcycle);
1479 /* End of main MD loop */
1481 /* Closing TNG files can include compressing data. Therefore it is good to do that
1482 * before stopping the time measurements. */
1483 mdoutf_tng_close(outf);
1485 /* Stop measuring walltime */
1486 walltime_accounting_end_time(walltime_accounting);
1488 if (!thisRankHasDuty(cr, DUTY_PME))
1490 /* Tell the PME only node to finish */
1491 gmx_pme_send_finish(cr);
1494 if (MASTER(cr))
1496 if (ir->nstcalcenergy > 0)
1498 print_ebin(mdoutf_get_fp_ene(outf), FALSE, FALSE, FALSE, fplog, step, t,
1499 eprAVER, mdebin, fcd, groups, &(ir->opts), awh.get());
1502 done_mdebin(mdebin);
1503 done_mdoutf(outf);
1505 if (bPMETune)
1507 pme_loadbal_done(pme_loadbal, fplog, mdlog, use_GPU(fr->nbv));
1510 done_shellfc(fplog, shellfc, step_rel);
1512 if (useReplicaExchange && MASTER(cr))
1514 print_replica_exchange_statistics(fplog, repl_ex);
1517 // Clean up swapcoords
1518 if (ir->eSwapCoords != eswapNO)
1520 finish_swapcoords(ir->swap);
1523 /* IMD cleanup, if bIMD is TRUE. */
1524 IMD_finalize(ir->bIMD, ir->imd);
1526 walltime_accounting_set_nsteps_done(walltime_accounting, step_rel);
1528 destroy_enerdata(enerd);
1530 sfree(enerd);
1532 /* Clean up topology. top->atomtypes has an allocated pointer if no domain decomposition*/
1533 if (!DOMAINDECOMP(cr))
1535 done_atomtypes(&top->atomtypes);
1537 sfree(top);