Free topology in non-DD simulations
[gromacs.git] / src / gromacs / mdrun / md.cpp
blob1d8eef6d6068eaa2f26a8795bd9127e4b8422b88
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,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.
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 char sbuf[STEPSTRSIZE], sbuf2[STEPSTRSIZE];
197 /* PME load balancing data for GPU kernels */
198 pme_load_balancing_t *pme_loadbal = nullptr;
199 gmx_bool bPMETune = FALSE;
200 gmx_bool bPMETunePrinting = FALSE;
202 /* Interactive MD */
203 gmx_bool bIMDstep = FALSE;
205 /* Domain decomposition could incorrectly miss a bonded
206 interaction, but checking for that requires a global
207 communication stage, which does not otherwise happen in DD
208 code. So we do that alongside the first global energy reduction
209 after a new DD is made. These variables handle whether the
210 check happens, and the result it returns. */
211 bool shouldCheckNumberOfBondedInteractions = false;
212 int totalNumberOfBondedInteractions = -1;
214 SimulationSignals signals;
215 // Most global communnication stages don't propagate mdrun
216 // signals, and will use this object to achieve that.
217 SimulationSignaller nullSignaller(nullptr, nullptr, nullptr, false, false);
219 if (!mdrunOptions.writeConfout)
221 // This is on by default, and the main known use case for
222 // turning it off is for convenience in benchmarking, which is
223 // something that should not show up in the general user
224 // interface.
225 GMX_LOG(mdlog.info).asParagraph().
226 appendText("The -noconfout functionality is deprecated, and may be removed in a future version.");
229 /* md-vv uses averaged full step velocities for T-control
230 md-vv-avek uses averaged half step velocities for T-control (but full step ekin for P control)
231 md uses averaged half step kinetic energies to determine temperature unless defined otherwise by GMX_EKIN_AVE_VEL; */
232 bTrotter = (EI_VV(ir->eI) && (inputrecNptTrotter(ir) || inputrecNphTrotter(ir) || inputrecNvtTrotter(ir)));
234 const bool bRerunMD = false;
235 int nstglobalcomm = mdrunOptions.globalCommunicationInterval;
237 nstglobalcomm = check_nstglobalcomm(mdlog, nstglobalcomm, ir, cr);
238 bGStatEveryStep = (nstglobalcomm == 1);
240 groups = &top_global->groups;
242 std::unique_ptr<EssentialDynamics> ed = nullptr;
243 if (opt2bSet("-ei", nfile, fnm) || observablesHistory->edsamHistory != nullptr)
245 /* Initialize essential dynamics sampling */
246 ed = init_edsam(mdlog,
247 opt2fn_null("-ei", nfile, fnm), opt2fn("-eo", nfile, fnm),
248 top_global,
249 ir, cr, constr,
250 state_global, observablesHistory,
251 oenv, mdrunOptions.continuationOptions.appendFiles);
254 /* Initial values */
255 init_md(fplog, cr, outputProvider, ir, oenv, mdrunOptions,
256 &t, &t0, state_global, lam0,
257 nrnb, top_global, &upd, deform,
258 nfile, fnm, &outf, &mdebin,
259 force_vir, shake_vir, total_vir, pres, mu_tot, &bSimAnn, &vcm, wcycle);
261 /* Energy terms and groups */
262 snew(enerd, 1);
263 init_enerdata(top_global->groups.grps[egcENER].nr, ir->fepvals->n_lambda,
264 enerd);
266 /* Kinetic energy data */
267 snew(ekind, 1);
268 init_ekindata(fplog, top_global, &(ir->opts), ekind);
269 /* Copy the cos acceleration to the groups struct */
270 ekind->cosacc.cos_accel = ir->cos_accel;
272 gstat = global_stat_init(ir);
274 /* Check for polarizable models and flexible constraints */
275 shellfc = init_shell_flexcon(fplog,
276 top_global, constr ? constr->numFlexibleConstraints() : 0,
277 ir->nstcalcenergy, DOMAINDECOMP(cr));
280 double io = compute_io(ir, top_global->natoms, groups, mdebin->ebin->nener, 1);
281 if ((io > 2000) && MASTER(cr))
283 fprintf(stderr,
284 "\nWARNING: This run will generate roughly %.0f Mb of data\n\n",
285 io);
289 /* Set up interactive MD (IMD) */
290 init_IMD(ir, cr, ms, top_global, fplog, ir->nstcalcenergy,
291 MASTER(cr) ? state_global->x.rvec_array() : nullptr,
292 nfile, fnm, oenv, mdrunOptions);
294 // Local state only becomes valid now.
295 std::unique_ptr<t_state> stateInstance;
296 t_state * state;
298 if (DOMAINDECOMP(cr))
300 top = dd_init_local_top(top_global);
302 stateInstance = compat::make_unique<t_state>();
303 state = stateInstance.get();
304 dd_init_local_state(cr->dd, state_global, state);
306 /* Distribute the charge groups over the nodes from the master node */
307 dd_partition_system(fplog, mdlog, ir->init_step, cr, TRUE, 1,
308 state_global, top_global, ir,
309 state, &f, mdAtoms, top, fr,
310 vsite, constr,
311 nrnb, nullptr, FALSE);
312 shouldCheckNumberOfBondedInteractions = true;
313 update_realloc(upd, state->natoms);
315 else
317 state_change_natoms(state_global, state_global->natoms);
318 f.resizeWithPadding(state_global->natoms);
319 /* Copy the pointer to the global state */
320 state = state_global;
322 snew(top, 1);
323 mdAlgorithmsSetupAtomData(cr, ir, top_global, top, fr,
324 &graph, mdAtoms, constr, vsite, shellfc);
326 update_realloc(upd, state->natoms);
329 auto mdatoms = mdAtoms->mdatoms();
331 // NOTE: The global state is no longer used at this point.
332 // But state_global is still used as temporary storage space for writing
333 // the global state to file and potentially for replica exchange.
334 // (Global topology should persist.)
336 update_mdatoms(mdatoms, state->lambda[efptMASS]);
338 const ContinuationOptions &continuationOptions = mdrunOptions.continuationOptions;
339 bool startingFromCheckpoint = continuationOptions.startedFromCheckpoint;
341 if (ir->bExpanded)
343 /* Check nstexpanded here, because the grompp check was broken */
344 if (ir->expandedvals->nstexpanded % ir->nstcalcenergy != 0)
346 gmx_fatal(FARGS, "With expanded ensemble, nstexpanded should be a multiple of nstcalcenergy");
348 init_expanded_ensemble(startingFromCheckpoint, ir, state->dfhist);
351 if (MASTER(cr))
353 if (startingFromCheckpoint)
355 /* Update mdebin with energy history if appending to output files */
356 if (continuationOptions.appendFiles)
358 /* If no history is available (because a checkpoint is from before
359 * it was written) make a new one later, otherwise restore it.
361 if (observablesHistory->energyHistory)
363 restore_energyhistory_from_state(mdebin, observablesHistory->energyHistory.get());
366 else if (observablesHistory->energyHistory)
368 /* We might have read an energy history from checkpoint.
369 * As we are not appending, we want to restart the statistics.
370 * Free the allocated memory and reset the counts.
372 observablesHistory->energyHistory = {};
373 /* We might have read a pull history from checkpoint.
374 * We will still want to keep the statistics, so that the files
375 * can be joined and still be meaningful.
376 * This means that observablesHistory->pullHistory
377 * should not be reset.
381 if (!observablesHistory->energyHistory)
383 observablesHistory->energyHistory = compat::make_unique<energyhistory_t>();
385 if (!observablesHistory->pullHistory)
387 observablesHistory->pullHistory = compat::make_unique<PullHistory>();
389 /* Set the initial energy history in state by updating once */
390 update_energyhistory(observablesHistory->energyHistory.get(), mdebin);
393 preparePrevStepPullCom(ir, mdatoms, state, state_global, cr, startingFromCheckpoint);
395 // TODO: Remove this by converting AWH into a ForceProvider
396 auto awh = prepareAwhModule(fplog, *ir, state_global, cr, ms, startingFromCheckpoint,
397 shellfc != nullptr,
398 opt2fn("-awh", nfile, fnm), ir->pull_work);
400 const bool useReplicaExchange = (replExParams.exchangeInterval > 0);
401 if (useReplicaExchange && MASTER(cr))
403 repl_ex = init_replica_exchange(fplog, ms, top_global->natoms, ir,
404 replExParams);
406 /* PME tuning is only supported in the Verlet scheme, with PME for
407 * Coulomb. It is not supported with only LJ PME. */
408 bPMETune = (mdrunOptions.tunePme && EEL_PME(fr->ic->eeltype) &&
409 !mdrunOptions.reproducible && ir->cutoff_scheme != ecutsGROUP);
410 if (bPMETune)
412 pme_loadbal_init(&pme_loadbal, cr, mdlog, *ir, state->box,
413 *fr->ic, *fr->nbv->listParams, fr->pmedata, use_GPU(fr->nbv),
414 &bPMETunePrinting);
417 if (!ir->bContinuation)
419 if (state->flags & (1 << estV))
421 auto v = makeArrayRef(state->v);
422 /* Set the velocities of vsites, shells and frozen atoms to zero */
423 for (i = 0; i < mdatoms->homenr; i++)
425 if (mdatoms->ptype[i] == eptVSite ||
426 mdatoms->ptype[i] == eptShell)
428 clear_rvec(v[i]);
430 else if (mdatoms->cFREEZE)
432 for (m = 0; m < DIM; m++)
434 if (ir->opts.nFreeze[mdatoms->cFREEZE[i]][m])
436 v[i][m] = 0;
443 if (constr)
445 /* Constrain the initial coordinates and velocities */
446 do_constrain_first(fplog, constr, ir, mdatoms, state);
448 if (vsite)
450 /* Construct the virtual sites for the initial configuration */
451 construct_vsites(vsite, state->x.rvec_array(), ir->delta_t, nullptr,
452 top->idef.iparams, top->idef.il,
453 fr->ePBC, fr->bMolPBC, cr, state->box);
457 if (ir->efep != efepNO)
459 /* Set free energy calculation frequency as the greatest common
460 * denominator of nstdhdl and repl_ex_nst. */
461 nstfep = ir->fepvals->nstdhdl;
462 if (ir->bExpanded)
464 nstfep = gmx_greatest_common_divisor(ir->expandedvals->nstexpanded, nstfep);
466 if (useReplicaExchange)
468 nstfep = gmx_greatest_common_divisor(replExParams.exchangeInterval, nstfep);
472 /* Be REALLY careful about what flags you set here. You CANNOT assume
473 * this is the first step, since we might be restarting from a checkpoint,
474 * and in that case we should not do any modifications to the state.
476 bStopCM = (ir->comm_mode != ecmNO && !ir->bContinuation);
478 if (continuationOptions.haveReadEkin)
480 restore_ekinstate_from_state(cr, ekind, &state_global->ekinstate);
483 cglo_flags = (CGLO_INITIALIZATION | CGLO_TEMPERATURE | CGLO_GSTAT
484 | (EI_VV(ir->eI) ? CGLO_PRESSURE : 0)
485 | (EI_VV(ir->eI) ? CGLO_CONSTRAINT : 0)
486 | (continuationOptions.haveReadEkin ? CGLO_READEKIN : 0));
488 bSumEkinhOld = FALSE;
489 /* To minimize communication, compute_globals computes the COM velocity
490 * and the kinetic energy for the velocities without COM motion removed.
491 * Thus to get the kinetic energy without the COM contribution, we need
492 * to call compute_globals twice.
494 for (int cgloIteration = 0; cgloIteration < (bStopCM ? 2 : 1); cgloIteration++)
496 int cglo_flags_iteration = cglo_flags;
497 if (bStopCM && cgloIteration == 0)
499 cglo_flags_iteration |= CGLO_STOPCM;
500 cglo_flags_iteration &= ~CGLO_TEMPERATURE;
502 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
503 nullptr, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
504 constr, &nullSignaller, state->box,
505 &totalNumberOfBondedInteractions, &bSumEkinhOld, cglo_flags_iteration
506 | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0));
508 checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
509 top_global, top, state,
510 &shouldCheckNumberOfBondedInteractions);
511 if (ir->eI == eiVVAK)
513 /* a second call to get the half step temperature initialized as well */
514 /* we do the same call as above, but turn the pressure off -- internally to
515 compute_globals, this is recognized as a velocity verlet half-step
516 kinetic energy calculation. This minimized excess variables, but
517 perhaps loses some logic?*/
519 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
520 nullptr, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
521 constr, &nullSignaller, state->box,
522 nullptr, &bSumEkinhOld,
523 cglo_flags & ~CGLO_PRESSURE);
526 /* Calculate the initial half step temperature, and save the ekinh_old */
527 if (!continuationOptions.startedFromCheckpoint)
529 for (i = 0; (i < ir->opts.ngtc); i++)
531 copy_mat(ekind->tcstat[i].ekinh, ekind->tcstat[i].ekinh_old);
535 /* need to make an initiation call to get the Trotter variables set, as well as other constants for non-trotter
536 temperature control */
537 auto trotter_seq = init_npt_vars(ir, state, &MassQ, bTrotter);
539 if (MASTER(cr))
541 if (!ir->bContinuation)
543 if (constr && ir->eConstrAlg == econtLINCS)
545 fprintf(fplog,
546 "RMS relative constraint deviation after constraining: %.2e\n",
547 constr->rmsd());
549 if (EI_STATE_VELOCITY(ir->eI))
551 real temp = enerd->term[F_TEMP];
552 if (ir->eI != eiVV)
554 /* Result of Ekin averaged over velocities of -half
555 * and +half step, while we only have -half step here.
557 temp *= 2;
559 fprintf(fplog, "Initial temperature: %g K\n", temp);
563 char tbuf[20];
564 fprintf(stderr, "starting mdrun '%s'\n",
565 *(top_global->name));
566 if (ir->nsteps >= 0)
568 sprintf(tbuf, "%8.1f", (ir->init_step+ir->nsteps)*ir->delta_t);
570 else
572 sprintf(tbuf, "%s", "infinite");
574 if (ir->init_step > 0)
576 fprintf(stderr, "%s steps, %s ps (continuing from step %s, %8.1f ps).\n",
577 gmx_step_str(ir->init_step+ir->nsteps, sbuf), tbuf,
578 gmx_step_str(ir->init_step, sbuf2),
579 ir->init_step*ir->delta_t);
581 else
583 fprintf(stderr, "%s steps, %s ps.\n",
584 gmx_step_str(ir->nsteps, sbuf), tbuf);
586 fprintf(fplog, "\n");
589 walltime_accounting_start_time(walltime_accounting);
590 wallcycle_start(wcycle, ewcRUN);
591 print_start(fplog, cr, walltime_accounting, "mdrun");
593 #if GMX_FAHCORE
594 /* safest point to do file checkpointing is here. More general point would be immediately before integrator call */
595 int chkpt_ret = fcCheckPointParallel( cr->nodeid,
596 NULL, 0);
597 if (chkpt_ret == 0)
599 gmx_fatal( 3, __FILE__, __LINE__, "Checkpoint error on step %d\n", 0 );
601 #endif
603 /***********************************************************
605 * Loop over MD steps
607 ************************************************************/
609 bFirstStep = TRUE;
610 /* Skip the first Nose-Hoover integration when we get the state from tpx */
611 bInitStep = !startingFromCheckpoint || EI_VV(ir->eI);
612 bSumEkinhOld = FALSE;
613 bExchanged = FALSE;
614 bNeedRepartition = FALSE;
616 bool simulationsShareState = false;
617 int nstSignalComm = nstglobalcomm;
619 // TODO This implementation of ensemble orientation restraints is nasty because
620 // a user can't just do multi-sim with single-sim orientation restraints.
621 bool usingEnsembleRestraints = (fcd->disres.nsystems > 1) || ((ms != nullptr) && (fcd->orires.nr != 0));
622 bool awhUsesMultiSim = (ir->bDoAwh && ir->awhParams->shareBiasMultisim && (ms != nullptr));
624 // Replica exchange, ensemble restraints and AWH need all
625 // simulations to remain synchronized, so they need
626 // checkpoints and stop conditions to act on the same step, so
627 // the propagation of such signals must take place between
628 // simulations, not just within simulations.
629 // TODO: Make algorithm initializers set these flags.
630 simulationsShareState = useReplicaExchange || usingEnsembleRestraints || awhUsesMultiSim;
632 if (simulationsShareState)
634 // Inter-simulation signal communication does not need to happen
635 // often, so we use a minimum of 200 steps to reduce overhead.
636 const int c_minimumInterSimulationSignallingInterval = 200;
637 nstSignalComm = ((c_minimumInterSimulationSignallingInterval + nstglobalcomm - 1)/nstglobalcomm)*nstglobalcomm;
641 auto stopHandler = stopHandlerBuilder->getStopHandlerMD(
642 compat::not_null<SimulationSignal*>(&signals[eglsSTOPCOND]), simulationsShareState,
643 MASTER(cr), ir->nstlist, mdrunOptions.reproducible, nstSignalComm,
644 mdrunOptions.maximumHoursToRun, ir->nstlist == 0, fplog, step, bNS, walltime_accounting);
646 auto checkpointHandler = compat::make_unique<CheckpointHandler>(
647 compat::make_not_null<SimulationSignal*>(&signals[eglsCHKPT]),
648 simulationsShareState, ir->nstlist == 0, MASTER(cr),
649 mdrunOptions.writeConfout, mdrunOptions.checkpointOptions.period);
651 const bool resetCountersIsLocal = true;
652 auto resetHandler = compat::make_unique<ResetHandler>(
653 compat::make_not_null<SimulationSignal*>(&signals[eglsRESETCOUNTERS]), !resetCountersIsLocal,
654 ir->nsteps, MASTER(cr), mdrunOptions.timingOptions.resetHalfway,
655 mdrunOptions.maximumHoursToRun, mdlog, wcycle, walltime_accounting);
657 DdOpenBalanceRegionBeforeForceComputation ddOpenBalanceRegion = (DOMAINDECOMP(cr) ? DdOpenBalanceRegionBeforeForceComputation::yes : DdOpenBalanceRegionBeforeForceComputation::no);
658 DdCloseBalanceRegionAfterForceComputation ddCloseBalanceRegion = (DOMAINDECOMP(cr) ? DdCloseBalanceRegionAfterForceComputation::yes : DdCloseBalanceRegionAfterForceComputation::no);
660 step = ir->init_step;
661 step_rel = 0;
663 // TODO extract this to new multi-simulation module
664 if (MASTER(cr) && isMultiSim(ms) && !useReplicaExchange)
666 if (!multisim_int_all_are_equal(ms, ir->nsteps))
668 GMX_LOG(mdlog.warning).appendText(
669 "Note: The number of steps is not consistent across multi simulations,\n"
670 "but we are proceeding anyway!");
672 if (!multisim_int_all_are_equal(ms, ir->init_step))
674 GMX_LOG(mdlog.warning).appendText(
675 "Note: The initial step is not consistent across multi simulations,\n"
676 "but we are proceeding anyway!");
680 /* and stop now if we should */
681 bLastStep = (bLastStep || (ir->nsteps >= 0 && step_rel > ir->nsteps));
682 while (!bLastStep)
685 /* Determine if this is a neighbor search step */
686 bNStList = (ir->nstlist > 0 && step % ir->nstlist == 0);
688 if (bPMETune && bNStList)
690 /* PME grid + cut-off optimization with GPUs or PME nodes */
691 pme_loadbal_do(pme_loadbal, cr,
692 (mdrunOptions.verbose && MASTER(cr)) ? stderr : nullptr,
693 fplog, mdlog,
694 *ir, fr, *state,
695 wcycle,
696 step, step_rel,
697 &bPMETunePrinting);
700 wallcycle_start(wcycle, ewcSTEP);
702 bLastStep = (step_rel == ir->nsteps);
703 t = t0 + step*ir->delta_t;
705 // TODO Refactor this, so that nstfep does not need a default value of zero
706 if (ir->efep != efepNO || ir->bSimTemp)
708 /* find and set the current lambdas */
709 setCurrentLambdasLocal(step, ir->fepvals, lam0, state);
711 bDoDHDL = do_per_step(step, ir->fepvals->nstdhdl);
712 bDoFEP = ((ir->efep != efepNO) && do_per_step(step, nstfep));
713 bDoExpanded = (do_per_step(step, ir->expandedvals->nstexpanded)
714 && (ir->bExpanded) && (step > 0) && (!startingFromCheckpoint));
717 bDoReplEx = (useReplicaExchange && (step > 0) && !bLastStep &&
718 do_per_step(step, replExParams.exchangeInterval));
720 if (bSimAnn)
722 update_annealing_target_temp(ir, t, upd);
725 /* Stop Center of Mass motion */
726 bStopCM = (ir->comm_mode != ecmNO && do_per_step(step, ir->nstcomm));
728 /* Determine whether or not to do Neighbour Searching */
729 bNS = (bFirstStep || bNStList || bExchanged || bNeedRepartition);
731 bLastStep = bLastStep || stopHandler->stoppingAfterCurrentStep(bNS);
733 /* do_log triggers energy and virial calculation. Because this leads
734 * to different code paths, forces can be different. Thus for exact
735 * continuation we should avoid extra log output.
736 * Note that the || bLastStep can result in non-exact continuation
737 * beyond the last step. But we don't consider that to be an issue.
739 do_log = do_per_step(step, ir->nstlog) || (bFirstStep && !startingFromCheckpoint) || bLastStep;
740 do_verbose = mdrunOptions.verbose &&
741 (step % mdrunOptions.verboseStepPrintInterval == 0 || bFirstStep || bLastStep);
743 if (bNS && !(bFirstStep && ir->bContinuation))
745 bMasterState = FALSE;
746 /* Correct the new box if it is too skewed */
747 if (inputrecDynamicBox(ir))
749 if (correct_box(fplog, step, state->box, graph))
751 bMasterState = TRUE;
754 if (DOMAINDECOMP(cr) && bMasterState)
756 dd_collect_state(cr->dd, state, state_global);
759 if (DOMAINDECOMP(cr))
761 /* Repartition the domain decomposition */
762 dd_partition_system(fplog, mdlog, step, cr,
763 bMasterState, nstglobalcomm,
764 state_global, top_global, ir,
765 state, &f, mdAtoms, top, fr,
766 vsite, constr,
767 nrnb, wcycle,
768 do_verbose && !bPMETunePrinting);
769 shouldCheckNumberOfBondedInteractions = true;
770 update_realloc(upd, state->natoms);
774 if (MASTER(cr) && do_log)
776 print_ebin_header(fplog, step, t); /* can we improve the information printed here? */
779 if (ir->efep != efepNO)
781 update_mdatoms(mdatoms, state->lambda[efptMASS]);
784 if (bExchanged)
787 /* We need the kinetic energy at minus the half step for determining
788 * the full step kinetic energy and possibly for T-coupling.*/
789 /* This may not be quite working correctly yet . . . . */
790 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
791 wcycle, enerd, nullptr, nullptr, nullptr, nullptr, mu_tot,
792 constr, &nullSignaller, state->box,
793 &totalNumberOfBondedInteractions, &bSumEkinhOld,
794 CGLO_GSTAT | CGLO_TEMPERATURE | CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS);
795 checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
796 top_global, top, state,
797 &shouldCheckNumberOfBondedInteractions);
799 clear_mat(force_vir);
801 checkpointHandler->decideIfCheckpointingThisStep(bNS, bFirstStep, bLastStep);
803 /* Determine the energy and pressure:
804 * at nstcalcenergy steps and at energy output steps (set below).
806 if (EI_VV(ir->eI) && (!bInitStep))
808 bCalcEnerStep = do_per_step(step, ir->nstcalcenergy);
809 bCalcVir = bCalcEnerStep ||
810 (ir->epc != epcNO && (do_per_step(step, ir->nstpcouple) || do_per_step(step-1, ir->nstpcouple)));
812 else
814 bCalcEnerStep = do_per_step(step, ir->nstcalcenergy);
815 bCalcVir = bCalcEnerStep ||
816 (ir->epc != epcNO && do_per_step(step, ir->nstpcouple));
818 bCalcEner = bCalcEnerStep;
820 do_ene = (do_per_step(step, ir->nstenergy) || bLastStep);
822 if (do_ene || do_log || bDoReplEx)
824 bCalcVir = TRUE;
825 bCalcEner = TRUE;
828 /* Do we need global communication ? */
829 bGStat = (bCalcVir || bCalcEner || bStopCM ||
830 do_per_step(step, nstglobalcomm) ||
831 (EI_VV(ir->eI) && inputrecNvtTrotter(ir) && do_per_step(step-1, nstglobalcomm)));
833 force_flags = (GMX_FORCE_STATECHANGED |
834 ((inputrecDynamicBox(ir)) ? GMX_FORCE_DYNAMICBOX : 0) |
835 GMX_FORCE_ALLFORCES |
836 (bCalcVir ? GMX_FORCE_VIRIAL : 0) |
837 (bCalcEner ? GMX_FORCE_ENERGY : 0) |
838 (bDoFEP ? GMX_FORCE_DHDL : 0)
841 if (shellfc)
843 /* Now is the time to relax the shells */
844 relax_shell_flexcon(fplog, cr, ms, mdrunOptions.verbose,
845 enforcedRotation, step,
846 ir, bNS, force_flags, top,
847 constr, enerd, fcd,
848 state, f.arrayRefWithPadding(), force_vir, mdatoms,
849 nrnb, wcycle, graph, groups,
850 shellfc, fr, ppForceWorkload, t, mu_tot,
851 vsite,
852 ddOpenBalanceRegion, ddCloseBalanceRegion);
854 else
856 /* The AWH history need to be saved _before_ doing force calculations where the AWH bias is updated
857 (or the AWH update will be performed twice for one step when continuing). It would be best to
858 call this update function from do_md_trajectory_writing but that would occur after do_force.
859 One would have to divide the update_awh function into one function applying the AWH force
860 and one doing the AWH bias update. The update AWH bias function could then be called after
861 do_md_trajectory_writing (then containing update_awh_history).
862 The checkpointing will in the future probably moved to the start of the md loop which will
863 rid of this issue. */
864 if (awh && checkpointHandler->isCheckpointingStep() && MASTER(cr))
866 awh->updateHistory(state_global->awhHistory.get());
869 /* The coordinates (x) are shifted (to get whole molecules)
870 * in do_force.
871 * This is parallellized as well, and does communication too.
872 * Check comments in sim_util.c
874 do_force(fplog, cr, ms, ir, awh.get(), enforcedRotation,
875 step, nrnb, wcycle, top, groups,
876 state->box, state->x.arrayRefWithPadding(), &state->hist,
877 f.arrayRefWithPadding(), force_vir, mdatoms, enerd, fcd,
878 state->lambda, graph,
879 fr, ppForceWorkload, vsite, mu_tot, t, ed ? ed->getLegacyED() : nullptr,
880 (bNS ? GMX_FORCE_NS : 0) | force_flags,
881 ddOpenBalanceRegion, ddCloseBalanceRegion);
884 if (EI_VV(ir->eI) && !startingFromCheckpoint)
885 /* ############### START FIRST UPDATE HALF-STEP FOR VV METHODS############### */
887 rvec *vbuf = nullptr;
889 wallcycle_start(wcycle, ewcUPDATE);
890 if (ir->eI == eiVV && bInitStep)
892 /* if using velocity verlet with full time step Ekin,
893 * take the first half step only to compute the
894 * virial for the first step. From there,
895 * revert back to the initial coordinates
896 * so that the input is actually the initial step.
898 snew(vbuf, state->natoms);
899 copy_rvecn(state->v.rvec_array(), vbuf, 0, state->natoms); /* should make this better for parallelizing? */
901 else
903 /* this is for NHC in the Ekin(t+dt/2) version of vv */
904 trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ1);
907 update_coords(step, ir, mdatoms, state, f.arrayRefWithPadding(), fcd,
908 ekind, M, upd, etrtVELOCITY1,
909 cr, constr);
911 wallcycle_stop(wcycle, ewcUPDATE);
912 constrain_velocities(step, nullptr,
913 state,
914 shake_vir,
915 constr,
916 bCalcVir, do_log, do_ene);
917 wallcycle_start(wcycle, ewcUPDATE);
918 /* if VV, compute the pressure and constraints */
919 /* For VV2, we strictly only need this if using pressure
920 * control, but we really would like to have accurate pressures
921 * printed out.
922 * Think about ways around this in the future?
923 * For now, keep this choice in comments.
925 /*bPres = (ir->eI==eiVV || inputrecNptTrotter(ir)); */
926 /*bTemp = ((ir->eI==eiVV &&(!bInitStep)) || (ir->eI==eiVVAK && inputrecNptTrotter(ir)));*/
927 bPres = TRUE;
928 bTemp = ((ir->eI == eiVV && (!bInitStep)) || (ir->eI == eiVVAK));
929 if (bCalcEner && ir->eI == eiVVAK)
931 bSumEkinhOld = TRUE;
933 /* for vv, the first half of the integration actually corresponds to the previous step.
934 So we need information from the last step in the first half of the integration */
935 if (bGStat || do_per_step(step-1, nstglobalcomm))
937 wallcycle_stop(wcycle, ewcUPDATE);
938 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
939 wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
940 constr, &nullSignaller, state->box,
941 &totalNumberOfBondedInteractions, &bSumEkinhOld,
942 (bGStat ? CGLO_GSTAT : 0)
943 | (bCalcEner ? CGLO_ENERGY : 0)
944 | (bTemp ? CGLO_TEMPERATURE : 0)
945 | (bPres ? CGLO_PRESSURE : 0)
946 | (bPres ? CGLO_CONSTRAINT : 0)
947 | (bStopCM ? CGLO_STOPCM : 0)
948 | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)
949 | CGLO_SCALEEKIN
951 /* explanation of above:
952 a) We compute Ekin at the full time step
953 if 1) we are using the AveVel Ekin, and it's not the
954 initial step, or 2) if we are using AveEkin, but need the full
955 time step kinetic energy for the pressure (always true now, since we want accurate statistics).
956 b) If we are using EkinAveEkin for the kinetic energy for the temperature control, we still feed in
957 EkinAveVel because it's needed for the pressure */
958 checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
959 top_global, top, state,
960 &shouldCheckNumberOfBondedInteractions);
961 wallcycle_start(wcycle, ewcUPDATE);
963 /* temperature scaling and pressure scaling to produce the extended variables at t+dt */
964 if (!bInitStep)
966 if (bTrotter)
968 m_add(force_vir, shake_vir, total_vir); /* we need the un-dispersion corrected total vir here */
969 trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ2);
971 /* TODO This is only needed when we're about to write
972 * a checkpoint, because we use it after the restart
973 * (in a kludge?). But what should we be doing if
974 * startingFromCheckpoint or bInitStep are true? */
975 if (inputrecNptTrotter(ir) || inputrecNphTrotter(ir))
977 copy_mat(shake_vir, state->svir_prev);
978 copy_mat(force_vir, state->fvir_prev);
980 if (inputrecNvtTrotter(ir) && ir->eI == eiVV)
982 /* update temperature and kinetic energy now that step is over - this is the v(t+dt) point */
983 enerd->term[F_TEMP] = sum_ekin(&(ir->opts), ekind, nullptr, (ir->eI == eiVV), FALSE);
984 enerd->term[F_EKIN] = trace(ekind->ekin);
987 else if (bExchanged)
989 wallcycle_stop(wcycle, ewcUPDATE);
990 /* We need the kinetic energy at minus the half step for determining
991 * the full step kinetic energy and possibly for T-coupling.*/
992 /* This may not be quite working correctly yet . . . . */
993 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
994 wcycle, enerd, nullptr, nullptr, nullptr, nullptr, mu_tot,
995 constr, &nullSignaller, state->box,
996 nullptr, &bSumEkinhOld,
997 CGLO_GSTAT | CGLO_TEMPERATURE);
998 wallcycle_start(wcycle, ewcUPDATE);
1001 /* if it's the initial step, we performed this first step just to get the constraint virial */
1002 if (ir->eI == eiVV && bInitStep)
1004 copy_rvecn(vbuf, state->v.rvec_array(), 0, state->natoms);
1005 sfree(vbuf);
1007 wallcycle_stop(wcycle, ewcUPDATE);
1010 /* compute the conserved quantity */
1011 if (EI_VV(ir->eI))
1013 saved_conserved_quantity = NPT_energy(ir, state, &MassQ);
1014 if (ir->eI == eiVV)
1016 last_ekin = enerd->term[F_EKIN];
1018 if ((ir->eDispCorr != edispcEnerPres) && (ir->eDispCorr != edispcAllEnerPres))
1020 saved_conserved_quantity -= enerd->term[F_DISPCORR];
1022 /* sum up the foreign energy and dhdl terms for vv. currently done every step so that dhdl is correct in the .edr */
1023 if (ir->efep != efepNO)
1025 sum_dhdl(enerd, state->lambda, ir->fepvals);
1029 /* ######## END FIRST UPDATE STEP ############## */
1030 /* ######## If doing VV, we now have v(dt) ###### */
1031 if (bDoExpanded)
1033 /* perform extended ensemble sampling in lambda - we don't
1034 actually move to the new state before outputting
1035 statistics, but if performing simulated tempering, we
1036 do update the velocities and the tau_t. */
1038 lamnew = ExpandedEnsembleDynamics(fplog, ir, enerd, state, &MassQ, state->fep_state, state->dfhist, step, state->v.rvec_array(), mdatoms);
1039 /* history is maintained in state->dfhist, but state_global is what is sent to trajectory and log output */
1040 if (MASTER(cr))
1042 copy_df_history(state_global->dfhist, state->dfhist);
1046 /* Now we have the energies and forces corresponding to the
1047 * coordinates at time t. We must output all of this before
1048 * the update.
1050 do_md_trajectory_writing(fplog, cr, nfile, fnm, step, step_rel, t,
1051 ir, state, state_global, observablesHistory,
1052 top_global, fr,
1053 outf, mdebin, ekind, f,
1054 checkpointHandler->isCheckpointingStep(),
1055 bRerunMD, bLastStep,
1056 mdrunOptions.writeConfout,
1057 bSumEkinhOld);
1058 /* Check if IMD step and do IMD communication, if bIMD is TRUE. */
1059 bIMDstep = do_IMD(ir->bIMD, step, cr, bNS, state->box, state->x.rvec_array(), ir, t, wcycle);
1061 /* kludge -- virial is lost with restart for MTTK NPT control. Must reload (saved earlier). */
1062 if (startingFromCheckpoint && (inputrecNptTrotter(ir) || inputrecNphTrotter(ir)))
1064 copy_mat(state->svir_prev, shake_vir);
1065 copy_mat(state->fvir_prev, force_vir);
1068 stopHandler->setSignal();
1069 resetHandler->setSignal(walltime_accounting);
1071 if (bGStat || !PAR(cr))
1073 /* In parallel we only have to check for checkpointing in steps
1074 * where we do global communication,
1075 * otherwise the other nodes don't know.
1077 checkpointHandler->setSignal(walltime_accounting);
1080 /* ######### START SECOND UPDATE STEP ################# */
1082 /* at the start of step, randomize or scale the velocities ((if vv. Restriction of Andersen controlled
1083 in preprocessing */
1085 if (ETC_ANDERSEN(ir->etc)) /* keep this outside of update_tcouple because of the extra info required to pass */
1087 gmx_bool bIfRandomize;
1088 bIfRandomize = update_randomize_velocities(ir, step, cr, mdatoms, state->v, upd, constr);
1089 /* if we have constraints, we have to remove the kinetic energy parallel to the bonds */
1090 if (constr && bIfRandomize)
1092 constrain_velocities(step, nullptr,
1093 state,
1094 tmp_vir,
1095 constr,
1096 bCalcVir, do_log, do_ene);
1099 /* Box is changed in update() when we do pressure coupling,
1100 * but we should still use the old box for energy corrections and when
1101 * writing it to the energy file, so it matches the trajectory files for
1102 * the same timestep above. Make a copy in a separate array.
1104 copy_mat(state->box, lastbox);
1106 dvdl_constr = 0;
1108 wallcycle_start(wcycle, ewcUPDATE);
1109 /* UPDATE PRESSURE VARIABLES IN TROTTER FORMULATION WITH CONSTRAINTS */
1110 if (bTrotter)
1112 trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ3);
1113 /* We can only do Berendsen coupling after we have summed
1114 * the kinetic energy or virial. Since the happens
1115 * in global_state after update, we should only do it at
1116 * step % nstlist = 1 with bGStatEveryStep=FALSE.
1119 else
1121 update_tcouple(step, ir, state, ekind, &MassQ, mdatoms);
1122 update_pcouple_before_coordinates(fplog, step, ir, state,
1123 parrinellorahmanMu, M,
1124 bInitStep);
1127 if (EI_VV(ir->eI))
1129 /* velocity half-step update */
1130 update_coords(step, ir, mdatoms, state, f.arrayRefWithPadding(), fcd,
1131 ekind, M, upd, etrtVELOCITY2,
1132 cr, constr);
1135 /* Above, initialize just copies ekinh into ekin,
1136 * it doesn't copy position (for VV),
1137 * and entire integrator for MD.
1140 if (ir->eI == eiVVAK)
1142 /* We probably only need md->homenr, not state->natoms */
1143 if (state->natoms > cbuf_nalloc)
1145 cbuf_nalloc = state->natoms;
1146 srenew(cbuf, cbuf_nalloc);
1148 copy_rvecn(as_rvec_array(state->x.data()), cbuf, 0, state->natoms);
1151 update_coords(step, ir, mdatoms, state, f.arrayRefWithPadding(), fcd,
1152 ekind, M, upd, etrtPOSITION, cr, constr);
1153 wallcycle_stop(wcycle, ewcUPDATE);
1155 constrain_coordinates(step, &dvdl_constr, state,
1156 shake_vir,
1157 upd, constr,
1158 bCalcVir, do_log, do_ene);
1159 update_sd_second_half(step, &dvdl_constr, ir, mdatoms, state,
1160 cr, nrnb, wcycle, upd, constr, do_log, do_ene);
1161 finish_update(ir, mdatoms,
1162 state, graph,
1163 nrnb, wcycle, upd, constr);
1165 if (ir->bPull && ir->pull->bSetPbcRefToPrevStepCOM)
1167 updatePrevStepPullCom(ir->pull_work, state);
1170 if (ir->eI == eiVVAK)
1172 /* erase F_EKIN and F_TEMP here? */
1173 /* just compute the kinetic energy at the half step to perform a trotter step */
1174 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
1175 wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
1176 constr, &nullSignaller, lastbox,
1177 nullptr, &bSumEkinhOld,
1178 (bGStat ? CGLO_GSTAT : 0) | CGLO_TEMPERATURE
1180 wallcycle_start(wcycle, ewcUPDATE);
1181 trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ4);
1182 /* now we know the scaling, we can compute the positions again again */
1183 copy_rvecn(cbuf, as_rvec_array(state->x.data()), 0, state->natoms);
1185 update_coords(step, ir, mdatoms, state, f.arrayRefWithPadding(), fcd,
1186 ekind, M, upd, etrtPOSITION, cr, constr);
1187 wallcycle_stop(wcycle, ewcUPDATE);
1189 /* do we need an extra constraint here? just need to copy out of as_rvec_array(state->v.data()) to upd->xp? */
1190 /* are the small terms in the shake_vir here due
1191 * to numerical errors, or are they important
1192 * physically? I'm thinking they are just errors, but not completely sure.
1193 * For now, will call without actually constraining, constr=NULL*/
1194 finish_update(ir, mdatoms,
1195 state, graph,
1196 nrnb, wcycle, upd, nullptr);
1198 if (EI_VV(ir->eI))
1200 /* this factor or 2 correction is necessary
1201 because half of the constraint force is removed
1202 in the vv step, so we have to double it. See
1203 the Redmine issue #1255. It is not yet clear
1204 if the factor of 2 is exact, or just a very
1205 good approximation, and this will be
1206 investigated. The next step is to see if this
1207 can be done adding a dhdl contribution from the
1208 rattle step, but this is somewhat more
1209 complicated with the current code. Will be
1210 investigated, hopefully for 4.6.3. However,
1211 this current solution is much better than
1212 having it completely wrong.
1214 enerd->term[F_DVDL_CONSTR] += 2*dvdl_constr;
1216 else
1218 enerd->term[F_DVDL_CONSTR] += dvdl_constr;
1221 if (vsite != nullptr)
1223 wallcycle_start(wcycle, ewcVSITECONSTR);
1224 if (graph != nullptr)
1226 shift_self(graph, state->box, state->x.rvec_array());
1228 construct_vsites(vsite, state->x.rvec_array(), ir->delta_t, state->v.rvec_array(),
1229 top->idef.iparams, top->idef.il,
1230 fr->ePBC, fr->bMolPBC, cr, state->box);
1232 if (graph != nullptr)
1234 unshift_self(graph, state->box, state->x.rvec_array());
1236 wallcycle_stop(wcycle, ewcVSITECONSTR);
1239 /* ############## IF NOT VV, Calculate globals HERE ############ */
1240 /* With Leap-Frog we can skip compute_globals at
1241 * non-communication steps, but we need to calculate
1242 * the kinetic energy one step before communication.
1245 // Organize to do inter-simulation signalling on steps if
1246 // and when algorithms require it.
1247 bool doInterSimSignal = (simulationsShareState && do_per_step(step, nstSignalComm));
1249 if (bGStat || (!EI_VV(ir->eI) && do_per_step(step+1, nstglobalcomm)) || doInterSimSignal)
1251 // Since we're already communicating at this step, we
1252 // can propagate intra-simulation signals. Note that
1253 // check_nstglobalcomm has the responsibility for
1254 // choosing the value of nstglobalcomm that is one way
1255 // bGStat becomes true, so we can't get into a
1256 // situation where e.g. checkpointing can't be
1257 // signalled.
1258 bool doIntraSimSignal = true;
1259 SimulationSignaller signaller(&signals, cr, ms, doInterSimSignal, doIntraSimSignal);
1261 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
1262 wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
1263 constr, &signaller,
1264 lastbox,
1265 &totalNumberOfBondedInteractions, &bSumEkinhOld,
1266 (bGStat ? CGLO_GSTAT : 0)
1267 | (!EI_VV(ir->eI) && bCalcEner ? CGLO_ENERGY : 0)
1268 | (!EI_VV(ir->eI) && bStopCM ? CGLO_STOPCM : 0)
1269 | (!EI_VV(ir->eI) ? CGLO_TEMPERATURE : 0)
1270 | (!EI_VV(ir->eI) ? CGLO_PRESSURE : 0)
1271 | CGLO_CONSTRAINT
1272 | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)
1274 checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
1275 top_global, top, state,
1276 &shouldCheckNumberOfBondedInteractions);
1280 /* ############# END CALC EKIN AND PRESSURE ################# */
1282 /* Note: this is OK, but there are some numerical precision issues with using the convergence of
1283 the virial that should probably be addressed eventually. state->veta has better properies,
1284 but what we actually need entering the new cycle is the new shake_vir value. Ideally, we could
1285 generate the new shake_vir, but test the veta value for convergence. This will take some thought. */
1287 if (ir->efep != efepNO && !EI_VV(ir->eI))
1289 /* Sum up the foreign energy and dhdl terms for md and sd.
1290 Currently done every step so that dhdl is correct in the .edr */
1291 sum_dhdl(enerd, state->lambda, ir->fepvals);
1294 update_pcouple_after_coordinates(fplog, step, ir, mdatoms,
1295 pres, force_vir, shake_vir,
1296 parrinellorahmanMu,
1297 state, nrnb, upd);
1299 /* ################# END UPDATE STEP 2 ################# */
1300 /* #### We now have r(t+dt) and v(t+dt/2) ############# */
1302 /* The coordinates (x) were unshifted in update */
1303 if (!bGStat)
1305 /* We will not sum ekinh_old,
1306 * so signal that we still have to do it.
1308 bSumEkinhOld = TRUE;
1311 if (bCalcEner)
1313 /* ######### BEGIN PREPARING EDR OUTPUT ########### */
1315 /* use the directly determined last velocity, not actually the averaged half steps */
1316 if (bTrotter && ir->eI == eiVV)
1318 enerd->term[F_EKIN] = last_ekin;
1320 enerd->term[F_ETOT] = enerd->term[F_EPOT] + enerd->term[F_EKIN];
1322 if (integratorHasConservedEnergyQuantity(ir))
1324 if (EI_VV(ir->eI))
1326 enerd->term[F_ECONSERVED] = enerd->term[F_ETOT] + saved_conserved_quantity;
1328 else
1330 enerd->term[F_ECONSERVED] = enerd->term[F_ETOT] + NPT_energy(ir, state, &MassQ);
1333 /* ######### END PREPARING EDR OUTPUT ########### */
1336 /* Output stuff */
1337 if (MASTER(cr))
1339 if (fplog && do_log && bDoExpanded)
1341 /* only needed if doing expanded ensemble */
1342 PrintFreeEnergyInfoToFile(fplog, ir->fepvals, ir->expandedvals, ir->bSimTemp ? ir->simtempvals : nullptr,
1343 state_global->dfhist, state->fep_state, ir->nstlog, step);
1345 if (bCalcEner)
1347 upd_mdebin(mdebin, bDoDHDL, bCalcEnerStep,
1348 t, mdatoms->tmass, enerd, state,
1349 ir->fepvals, ir->expandedvals, lastbox,
1350 shake_vir, force_vir, total_vir, pres,
1351 ekind, mu_tot, constr);
1353 else
1355 upd_mdebin_step(mdebin);
1358 gmx_bool do_dr = do_per_step(step, ir->nstdisreout);
1359 gmx_bool do_or = do_per_step(step, ir->nstorireout);
1361 print_ebin(mdoutf_get_fp_ene(outf), do_ene, do_dr, do_or, do_log ? fplog : nullptr,
1362 step, t,
1363 eprNORMAL, mdebin, fcd, groups, &(ir->opts), awh.get());
1365 if (ir->bPull)
1367 pull_print_output(ir->pull_work, step, t);
1370 if (do_per_step(step, ir->nstlog))
1372 if (fflush(fplog) != 0)
1374 gmx_fatal(FARGS, "Cannot flush logfile - maybe you are out of disk space?");
1378 if (bDoExpanded)
1380 /* Have to do this part _after_ outputting the logfile and the edr file */
1381 /* Gets written into the state at the beginning of next loop*/
1382 state->fep_state = lamnew;
1384 /* Print the remaining wall clock time for the run */
1385 if (isMasterSimMasterRank(ms, cr) &&
1386 (do_verbose || gmx_got_usr_signal()) &&
1387 !bPMETunePrinting)
1389 if (shellfc)
1391 fprintf(stderr, "\n");
1393 print_time(stderr, walltime_accounting, step, ir, cr);
1396 /* Ion/water position swapping.
1397 * Not done in last step since trajectory writing happens before this call
1398 * in the MD loop and exchanges would be lost anyway. */
1399 bNeedRepartition = FALSE;
1400 if ((ir->eSwapCoords != eswapNO) && (step > 0) && !bLastStep &&
1401 do_per_step(step, ir->swap->nstswap))
1403 bNeedRepartition = do_swapcoords(cr, step, t, ir, wcycle,
1404 as_rvec_array(state->x.data()),
1405 state->box,
1406 MASTER(cr) && mdrunOptions.verbose,
1407 bRerunMD);
1409 if (bNeedRepartition && DOMAINDECOMP(cr))
1411 dd_collect_state(cr->dd, state, state_global);
1415 /* Replica exchange */
1416 bExchanged = FALSE;
1417 if (bDoReplEx)
1419 bExchanged = replica_exchange(fplog, cr, ms, repl_ex,
1420 state_global, enerd,
1421 state, step, t);
1424 if ( (bExchanged || bNeedRepartition) && DOMAINDECOMP(cr) )
1426 dd_partition_system(fplog, mdlog, step, cr, TRUE, 1,
1427 state_global, top_global, ir,
1428 state, &f, mdAtoms, top, fr,
1429 vsite, constr,
1430 nrnb, wcycle, FALSE);
1431 shouldCheckNumberOfBondedInteractions = true;
1432 update_realloc(upd, state->natoms);
1435 bFirstStep = FALSE;
1436 bInitStep = FALSE;
1437 startingFromCheckpoint = false;
1439 /* ####### SET VARIABLES FOR NEXT ITERATION IF THEY STILL NEED IT ###### */
1440 /* With all integrators, except VV, we need to retain the pressure
1441 * at the current step for coupling at the next step.
1443 if ((state->flags & (1<<estPRES_PREV)) &&
1444 (bGStatEveryStep ||
1445 (ir->nstpcouple > 0 && step % ir->nstpcouple == 0)))
1447 /* Store the pressure in t_state for pressure coupling
1448 * at the next MD step.
1450 copy_mat(pres, state->pres_prev);
1453 /* ####### END SET VARIABLES FOR NEXT ITERATION ###### */
1455 if ( (membed != nullptr) && (!bLastStep) )
1457 rescale_membed(step_rel, membed, as_rvec_array(state_global->x.data()));
1460 cycles = wallcycle_stop(wcycle, ewcSTEP);
1461 if (DOMAINDECOMP(cr) && wcycle)
1463 dd_cycles_add(cr->dd, cycles, ddCyclStep);
1466 /* increase the MD step number */
1467 step++;
1468 step_rel++;
1470 resetHandler->resetCounters(
1471 step, step_rel, mdlog, fplog, cr, (use_GPU(fr->nbv) ? fr->nbv : nullptr),
1472 nrnb, fr->pmedata, pme_loadbal, wcycle, walltime_accounting);
1474 /* If bIMD is TRUE, the master updates the IMD energy record and sends positions to VMD client */
1475 IMD_prep_energies_send_positions(ir->bIMD && MASTER(cr), bIMDstep, ir->imd, enerd, step, bCalcEner, wcycle);
1478 /* End of main MD loop */
1480 /* Closing TNG files can include compressing data. Therefore it is good to do that
1481 * before stopping the time measurements. */
1482 mdoutf_tng_close(outf);
1484 /* Stop measuring walltime */
1485 walltime_accounting_end_time(walltime_accounting);
1487 if (!thisRankHasDuty(cr, DUTY_PME))
1489 /* Tell the PME only node to finish */
1490 gmx_pme_send_finish(cr);
1493 if (MASTER(cr))
1495 if (ir->nstcalcenergy > 0)
1497 print_ebin(mdoutf_get_fp_ene(outf), FALSE, FALSE, FALSE, fplog, step, t,
1498 eprAVER, mdebin, fcd, groups, &(ir->opts), awh.get());
1501 done_mdebin(mdebin);
1502 done_mdoutf(outf);
1504 if (bPMETune)
1506 pme_loadbal_done(pme_loadbal, fplog, mdlog, use_GPU(fr->nbv));
1509 done_shellfc(fplog, shellfc, step_rel);
1511 if (useReplicaExchange && MASTER(cr))
1513 print_replica_exchange_statistics(fplog, repl_ex);
1516 // Clean up swapcoords
1517 if (ir->eSwapCoords != eswapNO)
1519 finish_swapcoords(ir->swap);
1522 /* IMD cleanup, if bIMD is TRUE. */
1523 IMD_finalize(ir->bIMD, ir->imd);
1525 walltime_accounting_set_nsteps_done(walltime_accounting, step_rel);
1527 destroy_enerdata(enerd);
1529 sfree(enerd);
1531 global_stat_destroy(gstat);
1533 /* Clean up topology. top->atomtypes has an allocated pointer if no domain decomposition*/
1534 if (!DOMAINDECOMP(cr))
1536 done_localtop(top);
1538 sfree(top);