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.
39 * \brief Implements the integrator for normal molecular dynamics simulations
41 * \author David van der Spoel <david.vanderspoel@icm.uu.se>
42 * \ingroup module_mdrun
54 #include "gromacs/awh/awh.h"
55 #include "gromacs/commandline/filenm.h"
56 #include "gromacs/domdec/collect.h"
57 #include "gromacs/domdec/dlbtiming.h"
58 #include "gromacs/domdec/domdec.h"
59 #include "gromacs/domdec/domdec_network.h"
60 #include "gromacs/domdec/domdec_struct.h"
61 #include "gromacs/domdec/mdsetup.h"
62 #include "gromacs/domdec/partition.h"
63 #include "gromacs/essentialdynamics/edsam.h"
64 #include "gromacs/ewald/pme.h"
65 #include "gromacs/ewald/pme_load_balancing.h"
66 #include "gromacs/fileio/trxio.h"
67 #include "gromacs/gmxlib/network.h"
68 #include "gromacs/gmxlib/nrnb.h"
69 #include "gromacs/gpu_utils/gpu_utils.h"
70 #include "gromacs/imd/imd.h"
71 #include "gromacs/listed_forces/manage_threading.h"
72 #include "gromacs/math/functions.h"
73 #include "gromacs/math/utilities.h"
74 #include "gromacs/math/vec.h"
75 #include "gromacs/math/vectypes.h"
76 #include "gromacs/mdlib/checkpointhandler.h"
77 #include "gromacs/mdlib/compute_io.h"
78 #include "gromacs/mdlib/constr.h"
79 #include "gromacs/mdlib/ebin.h"
80 #include "gromacs/mdlib/enerdata_utils.h"
81 #include "gromacs/mdlib/energyoutput.h"
82 #include "gromacs/mdlib/expanded.h"
83 #include "gromacs/mdlib/force.h"
84 #include "gromacs/mdlib/force_flags.h"
85 #include "gromacs/mdlib/forcerec.h"
86 #include "gromacs/mdlib/md_support.h"
87 #include "gromacs/mdlib/mdatoms.h"
88 #include "gromacs/mdlib/mdoutf.h"
89 #include "gromacs/mdlib/membed.h"
90 #include "gromacs/mdlib/resethandler.h"
91 #include "gromacs/mdlib/sighandler.h"
92 #include "gromacs/mdlib/simulationsignal.h"
93 #include "gromacs/mdlib/stat.h"
94 #include "gromacs/mdlib/stophandler.h"
95 #include "gromacs/mdlib/tgroup.h"
96 #include "gromacs/mdlib/trajectory_writing.h"
97 #include "gromacs/mdlib/update.h"
98 #include "gromacs/mdlib/update_constrain_cuda.h"
99 #include "gromacs/mdlib/vcm.h"
100 #include "gromacs/mdlib/vsite.h"
101 #include "gromacs/mdrunutility/handlerestart.h"
102 #include "gromacs/mdrunutility/multisim.h"
103 #include "gromacs/mdrunutility/printtime.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/mdrunoptions.h"
117 #include "gromacs/mdtypes/observableshistory.h"
118 #include "gromacs/mdtypes/pullhistory.h"
119 #include "gromacs/mdtypes/state.h"
120 #include "gromacs/modularsimulator/energyelement.h"
121 #include "gromacs/nbnxm/nbnxm.h"
122 #include "gromacs/pbcutil/mshift.h"
123 #include "gromacs/pbcutil/pbc.h"
124 #include "gromacs/pulling/output.h"
125 #include "gromacs/pulling/pull.h"
126 #include "gromacs/swap/swapcoords.h"
127 #include "gromacs/timing/wallcycle.h"
128 #include "gromacs/timing/walltime_accounting.h"
129 #include "gromacs/topology/atoms.h"
130 #include "gromacs/topology/idef.h"
131 #include "gromacs/topology/mtop_util.h"
132 #include "gromacs/topology/topology.h"
133 #include "gromacs/trajectory/trajectoryframe.h"
134 #include "gromacs/utility/basedefinitions.h"
135 #include "gromacs/utility/cstringutil.h"
136 #include "gromacs/utility/fatalerror.h"
137 #include "gromacs/utility/logger.h"
138 #include "gromacs/utility/real.h"
139 #include "gromacs/utility/smalloc.h"
141 #include "legacysimulator.h"
142 #include "replicaexchange.h"
146 #include "corewrap.h"
149 using gmx::SimulationSignaller
;
151 void gmx::LegacySimulator::do_md()
153 // TODO Historically, the EM and MD "integrators" used different
154 // names for the t_inputrec *parameter, but these must have the
155 // same name, now that it's a member of a struct. We use this ir
156 // alias to avoid a large ripple of nearly useless changes.
157 // t_inputrec is being replaced by IMdpOptionsProvider, so this
158 // will go away eventually.
159 t_inputrec
*ir
= inputrec
;
160 int64_t step
, step_rel
;
161 double t
, t0
= ir
->init_t
, lam0
[efptNR
];
162 gmx_bool bGStatEveryStep
, bGStat
, bCalcVir
, bCalcEnerStep
, bCalcEner
;
163 gmx_bool bNS
, bNStList
, bStopCM
,
164 bFirstStep
, bInitStep
, bLastStep
= FALSE
;
165 gmx_bool bDoDHDL
= FALSE
, bDoFEP
= FALSE
, bDoExpanded
= FALSE
;
166 gmx_bool do_ene
, do_log
, do_verbose
;
167 gmx_bool bMasterState
;
168 unsigned int force_flags
;
169 tensor force_vir
= {{0}}, shake_vir
= {{0}}, total_vir
= {{0}},
170 tmp_vir
= {{0}}, pres
= {{0}};
173 matrix parrinellorahmanMu
, M
;
174 gmx_repl_ex_t repl_ex
= nullptr;
176 PaddedHostVector
<gmx::RVec
> f
{};
177 gmx_global_stat_t gstat
;
178 t_graph
*graph
= nullptr;
179 gmx_shellfc_t
*shellfc
;
180 gmx_bool bSumEkinhOld
, bDoReplEx
, bExchanged
, bNeedRepartition
;
181 gmx_bool bTemp
, bPres
, bTrotter
;
183 std::vector
<RVec
> cbuf
;
189 real saved_conserved_quantity
= 0;
192 char sbuf
[STEPSTRSIZE
], sbuf2
[STEPSTRSIZE
];
194 /* PME load balancing data for GPU kernels */
195 gmx_bool bPMETune
= FALSE
;
196 gmx_bool bPMETunePrinting
= FALSE
;
198 bool bInteractiveMDstep
= false;
200 /* Domain decomposition could incorrectly miss a bonded
201 interaction, but checking for that requires a global
202 communication stage, which does not otherwise happen in DD
203 code. So we do that alongside the first global energy reduction
204 after a new DD is made. These variables handle whether the
205 check happens, and the result it returns. */
206 bool shouldCheckNumberOfBondedInteractions
= false;
207 int totalNumberOfBondedInteractions
= -1;
209 SimulationSignals signals
;
210 // Most global communnication stages don't propagate mdrun
211 // signals, and will use this object to achieve that.
212 SimulationSignaller
nullSignaller(nullptr, nullptr, nullptr, false, false);
214 if (!mdrunOptions
.writeConfout
)
216 // This is on by default, and the main known use case for
217 // turning it off is for convenience in benchmarking, which is
218 // something that should not show up in the general user
220 GMX_LOG(mdlog
.info
).asParagraph().
221 appendText("The -noconfout functionality is deprecated, and may be removed in a future version.");
224 /* md-vv uses averaged full step velocities for T-control
225 md-vv-avek uses averaged half step velocities for T-control (but full step ekin for P control)
226 md uses averaged half step kinetic energies to determine temperature unless defined otherwise by GMX_EKIN_AVE_VEL; */
227 bTrotter
= (EI_VV(ir
->eI
) && (inputrecNptTrotter(ir
) || inputrecNphTrotter(ir
) || inputrecNvtTrotter(ir
)));
229 const bool bRerunMD
= false;
231 int nstglobalcomm
= computeGlobalCommunicationPeriod(mdlog
, ir
, cr
);
232 bGStatEveryStep
= (nstglobalcomm
== 1);
234 SimulationGroups
*groups
= &top_global
->groups
;
236 std::unique_ptr
<EssentialDynamics
> ed
= nullptr;
237 if (opt2bSet("-ei", nfile
, fnm
) || observablesHistory
->edsamHistory
!= nullptr)
239 /* Initialize essential dynamics sampling */
240 ed
= init_edsam(mdlog
,
241 opt2fn_null("-ei", nfile
, fnm
), opt2fn("-eo", nfile
, fnm
),
244 state_global
, observablesHistory
,
249 initialize_lambdas(fplog
, *ir
, MASTER(cr
), &state_global
->fep_state
, state_global
->lambda
, lam0
);
250 Update
upd(ir
, deform
);
251 const bool doSimulatedAnnealing
= initSimulatedAnnealing(ir
, &upd
);
252 if (startingBehavior
!= StartingBehavior::RestartWithAppending
)
254 pleaseCiteCouplingAlgorithms(fplog
, *ir
);
256 gmx_mdoutf
*outf
= init_mdoutf(fplog
, nfile
, fnm
, mdrunOptions
, cr
, outputProvider
, mdModulesNotifier
, ir
, top_global
, oenv
, wcycle
,
258 gmx::EnergyOutput
energyOutput(mdoutf_get_fp_ene(outf
), top_global
, ir
, pull_work
, mdoutf_get_fp_dhdl(outf
), false, mdModulesNotifier
);
260 gstat
= global_stat_init(ir
);
262 /* Check for polarizable models and flexible constraints */
263 shellfc
= init_shell_flexcon(fplog
,
264 top_global
, constr
? constr
->numFlexibleConstraints() : 0,
265 ir
->nstcalcenergy
, DOMAINDECOMP(cr
));
268 double io
= compute_io(ir
, top_global
->natoms
, *groups
, energyOutput
.numEnergyTerms(), 1);
269 if ((io
> 2000) && MASTER(cr
))
272 "\nWARNING: This run will generate roughly %.0f Mb of data\n\n",
277 // Local state only becomes valid now.
278 std::unique_ptr
<t_state
> stateInstance
;
282 auto mdatoms
= mdAtoms
->mdatoms();
284 std::unique_ptr
<UpdateConstrainCuda
> integrator
;
286 if (DOMAINDECOMP(cr
))
288 dd_init_local_top(*top_global
, &top
);
290 stateInstance
= std::make_unique
<t_state
>();
291 state
= stateInstance
.get();
292 dd_init_local_state(cr
->dd
, state_global
, state
);
294 /* Distribute the charge groups over the nodes from the master node */
295 dd_partition_system(fplog
, mdlog
, ir
->init_step
, cr
, TRUE
, 1,
296 state_global
, *top_global
, ir
, imdSession
,
298 state
, &f
, mdAtoms
, &top
, fr
,
300 nrnb
, nullptr, FALSE
);
301 shouldCheckNumberOfBondedInteractions
= true;
302 upd
.setNumAtoms(state
->natoms
);
306 state_change_natoms(state_global
, state_global
->natoms
);
307 f
.resizeWithPadding(state_global
->natoms
);
308 /* Copy the pointer to the global state */
309 state
= state_global
;
311 /* Generate and initialize new topology */
312 mdAlgorithmsSetupAtomData(cr
, ir
, *top_global
, &top
, fr
,
313 &graph
, mdAtoms
, constr
, vsite
, shellfc
);
315 upd
.setNumAtoms(state
->natoms
);
320 GMX_RELEASE_ASSERT(ir
->eI
== eiMD
, "Only md integrator is supported on the GPU.");
321 GMX_RELEASE_ASSERT(ir
->etc
!= etcNOSEHOOVER
, "Nose Hoover temperature coupling is not supported on the GPU.");
322 GMX_RELEASE_ASSERT(ir
->epc
== epcNO
|| ir
->epc
== epcPARRINELLORAHMAN
, "Only Parrinello Rahman pressure control is supported on the GPU.");
323 GMX_RELEASE_ASSERT(!mdatoms
->haveVsites
, "Virtual sites are not supported on the GPU");
324 GMX_RELEASE_ASSERT(ed
== nullptr, "Essential dynamics is not supported with GPU-based update constraints.");
325 GMX_LOG(mdlog
.info
).asParagraph().
326 appendText("Updating coordinates on the GPU.");
327 // TODO: Pass proper device command stream
328 integrator
= std::make_unique
<UpdateConstrainCuda
>(*ir
, *top_global
, nullptr);
329 integrator
->set(top
.idef
, *mdatoms
, ekind
->ngtc
);
331 set_pbc(&pbc
, epbcXYZ
, state
->box
);
332 integrator
->setPbc(&pbc
);
335 if (fr
->nbv
->useGpu())
337 changePinningPolicy(&state
->x
, gmx::PinningPolicy::PinnedIfSupported
);
340 // NOTE: The global state is no longer used at this point.
341 // But state_global is still used as temporary storage space for writing
342 // the global state to file and potentially for replica exchange.
343 // (Global topology should persist.)
345 update_mdatoms(mdatoms
, state
->lambda
[efptMASS
]);
349 /* Check nstexpanded here, because the grompp check was broken */
350 if (ir
->expandedvals
->nstexpanded
% ir
->nstcalcenergy
!= 0)
352 gmx_fatal(FARGS
, "With expanded ensemble, nstexpanded should be a multiple of nstcalcenergy");
354 init_expanded_ensemble(startingBehavior
!= StartingBehavior::NewSimulation
,
360 EnergyElement::initializeEnergyHistory(
361 startingBehavior
, observablesHistory
, &energyOutput
);
364 preparePrevStepPullCom(ir
, pull_work
, mdatoms
, state
, state_global
, cr
,
365 startingBehavior
!= StartingBehavior::NewSimulation
);
367 // TODO: Remove this by converting AWH into a ForceProvider
368 auto awh
= prepareAwhModule(fplog
, *ir
, state_global
, cr
, ms
, startingBehavior
!= StartingBehavior::NewSimulation
,
370 opt2fn("-awh", nfile
, fnm
), pull_work
);
372 const bool useReplicaExchange
= (replExParams
.exchangeInterval
> 0);
373 if (useReplicaExchange
&& MASTER(cr
))
375 repl_ex
= init_replica_exchange(fplog
, ms
, top_global
->natoms
, ir
,
378 /* PME tuning is only supported in the Verlet scheme, with PME for
379 * Coulomb. It is not supported with only LJ PME. */
380 bPMETune
= (mdrunOptions
.tunePme
&& EEL_PME(fr
->ic
->eeltype
) &&
381 !mdrunOptions
.reproducible
&& ir
->cutoff_scheme
!= ecutsGROUP
);
383 pme_load_balancing_t
*pme_loadbal
= nullptr;
386 pme_loadbal_init(&pme_loadbal
, cr
, mdlog
, *ir
, state
->box
,
387 *fr
->ic
, *fr
->nbv
, fr
->pmedata
, fr
->nbv
->useGpu(),
391 if (!ir
->bContinuation
)
393 if (state
->flags
& (1U << estV
))
395 auto v
= makeArrayRef(state
->v
);
396 /* Set the velocities of vsites, shells and frozen atoms to zero */
397 for (i
= 0; i
< mdatoms
->homenr
; i
++)
399 if (mdatoms
->ptype
[i
] == eptVSite
||
400 mdatoms
->ptype
[i
] == eptShell
)
404 else if (mdatoms
->cFREEZE
)
406 for (m
= 0; m
< DIM
; m
++)
408 if (ir
->opts
.nFreeze
[mdatoms
->cFREEZE
[i
]][m
])
419 /* Constrain the initial coordinates and velocities */
420 do_constrain_first(fplog
, constr
, ir
, mdatoms
,
422 state
->x
.arrayRefWithPadding(),
423 state
->v
.arrayRefWithPadding(),
424 state
->box
, state
->lambda
[efptBONDED
]);
428 /* Construct the virtual sites for the initial configuration */
429 construct_vsites(vsite
, state
->x
.rvec_array(), ir
->delta_t
, nullptr,
430 top
.idef
.iparams
, top
.idef
.il
,
431 fr
->ePBC
, fr
->bMolPBC
, cr
, state
->box
);
435 if (ir
->efep
!= efepNO
)
437 /* Set free energy calculation frequency as the greatest common
438 * denominator of nstdhdl and repl_ex_nst. */
439 nstfep
= ir
->fepvals
->nstdhdl
;
442 nstfep
= gmx_greatest_common_divisor(ir
->expandedvals
->nstexpanded
, nstfep
);
444 if (useReplicaExchange
)
446 nstfep
= gmx_greatest_common_divisor(replExParams
.exchangeInterval
, nstfep
);
450 /* Be REALLY careful about what flags you set here. You CANNOT assume
451 * this is the first step, since we might be restarting from a checkpoint,
452 * and in that case we should not do any modifications to the state.
454 bStopCM
= (ir
->comm_mode
!= ecmNO
&& !ir
->bContinuation
);
456 // When restarting from a checkpoint, it can be appropriate to
457 // initialize ekind from quantities in the checkpoint. Otherwise,
458 // compute_globals must initialize ekind before the simulation
459 // starts/restarts. However, only the master rank knows what was
460 // found in the checkpoint file, so we have to communicate in
461 // order to coordinate the restart.
463 // TODO Consider removing this communication if/when checkpoint
464 // reading directly follows .tpr reading, because all ranks can
465 // agree on hasReadEkinState at that time.
466 bool hasReadEkinState
= MASTER(cr
) ? state_global
->ekinstate
.hasReadEkinState
: false;
469 gmx_bcast(sizeof(hasReadEkinState
), &hasReadEkinState
, cr
);
471 if (hasReadEkinState
)
473 restore_ekinstate_from_state(cr
, ekind
, &state_global
->ekinstate
);
476 unsigned int cglo_flags
= (CGLO_TEMPERATURE
| CGLO_GSTAT
477 | (EI_VV(ir
->eI
) ? CGLO_PRESSURE
: 0)
478 | (EI_VV(ir
->eI
) ? CGLO_CONSTRAINT
: 0)
479 | (hasReadEkinState
? CGLO_READEKIN
: 0));
481 bSumEkinhOld
= FALSE
;
483 t_vcm
vcm(top_global
->groups
, *ir
);
484 reportComRemovalInfo(fplog
, vcm
);
486 /* To minimize communication, compute_globals computes the COM velocity
487 * and the kinetic energy for the velocities without COM motion removed.
488 * Thus to get the kinetic energy without the COM contribution, we need
489 * to call compute_globals twice.
491 for (int cgloIteration
= 0; cgloIteration
< (bStopCM
? 2 : 1); cgloIteration
++)
493 unsigned int cglo_flags_iteration
= cglo_flags
;
494 if (bStopCM
&& cgloIteration
== 0)
496 cglo_flags_iteration
|= CGLO_STOPCM
;
497 cglo_flags_iteration
&= ~CGLO_TEMPERATURE
;
499 compute_globals(gstat
, cr
, ir
, fr
, ekind
,
500 state
->x
.rvec_array(), state
->v
.rvec_array(), state
->box
, state
->lambda
[efptVDW
],
502 nullptr, enerd
, force_vir
, shake_vir
, total_vir
, pres
, mu_tot
,
503 constr
, &nullSignaller
, state
->box
,
504 &totalNumberOfBondedInteractions
, &bSumEkinhOld
, cglo_flags_iteration
505 | (shouldCheckNumberOfBondedInteractions
? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS
: 0));
506 if (cglo_flags_iteration
& CGLO_STOPCM
)
508 /* At initialization, do not pass x with acceleration-correction mode
509 * to avoid (incorrect) correction of the initial coordinates.
511 rvec
*xPtr
= nullptr;
512 if (vcm
.mode
!= ecmLINEAR_ACCELERATION_CORRECTION
)
514 xPtr
= state
->x
.rvec_array();
516 process_and_stopcm_grp(fplog
, &vcm
, *mdatoms
, xPtr
, state
->v
.rvec_array());
517 inc_nrnb(nrnb
, eNR_STOPCM
, mdatoms
->homenr
);
520 checkNumberOfBondedInteractions(mdlog
, cr
, totalNumberOfBondedInteractions
,
521 top_global
, &top
, state
->x
.rvec_array(), state
->box
,
522 &shouldCheckNumberOfBondedInteractions
);
523 if (ir
->eI
== eiVVAK
)
525 /* a second call to get the half step temperature initialized as well */
526 /* we do the same call as above, but turn the pressure off -- internally to
527 compute_globals, this is recognized as a velocity verlet half-step
528 kinetic energy calculation. This minimized excess variables, but
529 perhaps loses some logic?*/
531 compute_globals(gstat
, cr
, ir
, fr
, ekind
,
532 state
->x
.rvec_array(), state
->v
.rvec_array(), state
->box
, state
->lambda
[efptVDW
],
534 nullptr, enerd
, force_vir
, shake_vir
, total_vir
, pres
, mu_tot
,
535 constr
, &nullSignaller
, state
->box
,
536 nullptr, &bSumEkinhOld
,
537 cglo_flags
& ~CGLO_PRESSURE
);
540 /* Calculate the initial half step temperature, and save the ekinh_old */
541 if (startingBehavior
== StartingBehavior::NewSimulation
)
543 for (i
= 0; (i
< ir
->opts
.ngtc
); i
++)
545 copy_mat(ekind
->tcstat
[i
].ekinh
, ekind
->tcstat
[i
].ekinh_old
);
549 /* need to make an initiation call to get the Trotter variables set, as well as other constants for non-trotter
550 temperature control */
551 auto trotter_seq
= init_npt_vars(ir
, state
, &MassQ
, bTrotter
);
555 if (!ir
->bContinuation
)
557 if (constr
&& ir
->eConstrAlg
== econtLINCS
)
560 "RMS relative constraint deviation after constraining: %.2e\n",
563 if (EI_STATE_VELOCITY(ir
->eI
))
565 real temp
= enerd
->term
[F_TEMP
];
568 /* Result of Ekin averaged over velocities of -half
569 * and +half step, while we only have -half step here.
573 fprintf(fplog
, "Initial temperature: %g K\n", temp
);
578 fprintf(stderr
, "starting mdrun '%s'\n",
579 *(top_global
->name
));
582 sprintf(tbuf
, "%8.1f", (ir
->init_step
+ir
->nsteps
)*ir
->delta_t
);
586 sprintf(tbuf
, "%s", "infinite");
588 if (ir
->init_step
> 0)
590 fprintf(stderr
, "%s steps, %s ps (continuing from step %s, %8.1f ps).\n",
591 gmx_step_str(ir
->init_step
+ir
->nsteps
, sbuf
), tbuf
,
592 gmx_step_str(ir
->init_step
, sbuf2
),
593 ir
->init_step
*ir
->delta_t
);
597 fprintf(stderr
, "%s steps, %s ps.\n",
598 gmx_step_str(ir
->nsteps
, sbuf
), tbuf
);
600 fprintf(fplog
, "\n");
603 walltime_accounting_start_time(walltime_accounting
);
604 wallcycle_start(wcycle
, ewcRUN
);
605 print_start(fplog
, cr
, walltime_accounting
, "mdrun");
608 /* safest point to do file checkpointing is here. More general point would be immediately before integrator call */
609 int chkpt_ret
= fcCheckPointParallel( cr
->nodeid
,
613 gmx_fatal( 3, __FILE__
, __LINE__
, "Checkpoint error on step %d\n", 0 );
617 /***********************************************************
621 ************************************************************/
624 /* Skip the first Nose-Hoover integration when we get the state from tpx */
625 bInitStep
= startingBehavior
== StartingBehavior::NewSimulation
|| EI_VV(ir
->eI
);
626 bSumEkinhOld
= FALSE
;
628 bNeedRepartition
= FALSE
;
630 bool simulationsShareState
= false;
631 int nstSignalComm
= nstglobalcomm
;
633 // TODO This implementation of ensemble orientation restraints is nasty because
634 // a user can't just do multi-sim with single-sim orientation restraints.
635 bool usingEnsembleRestraints
= (fcd
->disres
.nsystems
> 1) || ((ms
!= nullptr) && (fcd
->orires
.nr
!= 0));
636 bool awhUsesMultiSim
= (ir
->bDoAwh
&& ir
->awhParams
->shareBiasMultisim
&& (ms
!= nullptr));
638 // Replica exchange, ensemble restraints and AWH need all
639 // simulations to remain synchronized, so they need
640 // checkpoints and stop conditions to act on the same step, so
641 // the propagation of such signals must take place between
642 // simulations, not just within simulations.
643 // TODO: Make algorithm initializers set these flags.
644 simulationsShareState
= useReplicaExchange
|| usingEnsembleRestraints
|| awhUsesMultiSim
;
646 if (simulationsShareState
)
648 // Inter-simulation signal communication does not need to happen
649 // often, so we use a minimum of 200 steps to reduce overhead.
650 const int c_minimumInterSimulationSignallingInterval
= 200;
651 nstSignalComm
= ((c_minimumInterSimulationSignallingInterval
+ nstglobalcomm
- 1)/nstglobalcomm
)*nstglobalcomm
;
655 auto stopHandler
= stopHandlerBuilder
->getStopHandlerMD(
656 compat::not_null
<SimulationSignal
*>(&signals
[eglsSTOPCOND
]), simulationsShareState
,
657 MASTER(cr
), ir
->nstlist
, mdrunOptions
.reproducible
, nstSignalComm
,
658 mdrunOptions
.maximumHoursToRun
, ir
->nstlist
== 0, fplog
, step
, bNS
, walltime_accounting
);
660 auto checkpointHandler
= std::make_unique
<CheckpointHandler
>(
661 compat::make_not_null
<SimulationSignal
*>(&signals
[eglsCHKPT
]),
662 simulationsShareState
, ir
->nstlist
== 0, MASTER(cr
),
663 mdrunOptions
.writeConfout
, mdrunOptions
.checkpointOptions
.period
);
665 const bool resetCountersIsLocal
= true;
666 auto resetHandler
= std::make_unique
<ResetHandler
>(
667 compat::make_not_null
<SimulationSignal
*>(&signals
[eglsRESETCOUNTERS
]), !resetCountersIsLocal
,
668 ir
->nsteps
, MASTER(cr
), mdrunOptions
.timingOptions
.resetHalfway
,
669 mdrunOptions
.maximumHoursToRun
, mdlog
, wcycle
, walltime_accounting
);
671 const DDBalanceRegionHandler
ddBalanceRegionHandler(cr
);
673 step
= ir
->init_step
;
676 // TODO extract this to new multi-simulation module
677 if (MASTER(cr
) && isMultiSim(ms
) && !useReplicaExchange
)
679 if (!multisim_int_all_are_equal(ms
, ir
->nsteps
))
681 GMX_LOG(mdlog
.warning
).appendText(
682 "Note: The number of steps is not consistent across multi simulations,\n"
683 "but we are proceeding anyway!");
685 if (!multisim_int_all_are_equal(ms
, ir
->init_step
))
687 GMX_LOG(mdlog
.warning
).appendText(
688 "Note: The initial step is not consistent across multi simulations,\n"
689 "but we are proceeding anyway!");
693 /* and stop now if we should */
694 bLastStep
= (bLastStep
|| (ir
->nsteps
>= 0 && step_rel
> ir
->nsteps
));
698 /* Determine if this is a neighbor search step */
699 bNStList
= (ir
->nstlist
> 0 && step
% ir
->nstlist
== 0);
701 if (bPMETune
&& bNStList
)
703 /* PME grid + cut-off optimization with GPUs or PME nodes */
704 pme_loadbal_do(pme_loadbal
, cr
,
705 (mdrunOptions
.verbose
&& MASTER(cr
)) ? stderr
: nullptr,
707 *ir
, fr
, state
->box
, state
->x
,
713 wallcycle_start(wcycle
, ewcSTEP
);
715 bLastStep
= (step_rel
== ir
->nsteps
);
716 t
= t0
+ step
*ir
->delta_t
;
718 // TODO Refactor this, so that nstfep does not need a default value of zero
719 if (ir
->efep
!= efepNO
|| ir
->bSimTemp
)
721 /* find and set the current lambdas */
722 setCurrentLambdasLocal(step
, ir
->fepvals
, lam0
, state
->lambda
, state
->fep_state
);
724 bDoDHDL
= do_per_step(step
, ir
->fepvals
->nstdhdl
);
725 bDoFEP
= ((ir
->efep
!= efepNO
) && do_per_step(step
, nstfep
));
726 bDoExpanded
= (do_per_step(step
, ir
->expandedvals
->nstexpanded
)
727 && (ir
->bExpanded
) && (step
> 0) &&
728 (startingBehavior
== StartingBehavior::NewSimulation
));
731 bDoReplEx
= (useReplicaExchange
&& (step
> 0) && !bLastStep
&&
732 do_per_step(step
, replExParams
.exchangeInterval
));
734 if (doSimulatedAnnealing
)
736 update_annealing_target_temp(ir
, t
, &upd
);
739 /* Stop Center of Mass motion */
740 bStopCM
= (ir
->comm_mode
!= ecmNO
&& do_per_step(step
, ir
->nstcomm
));
742 /* Determine whether or not to do Neighbour Searching */
743 bNS
= (bFirstStep
|| bNStList
|| bExchanged
|| bNeedRepartition
);
745 bLastStep
= bLastStep
|| stopHandler
->stoppingAfterCurrentStep(bNS
);
747 /* do_log triggers energy and virial calculation. Because this leads
748 * to different code paths, forces can be different. Thus for exact
749 * continuation we should avoid extra log output.
750 * Note that the || bLastStep can result in non-exact continuation
751 * beyond the last step. But we don't consider that to be an issue.
754 (do_per_step(step
, ir
->nstlog
) ||
755 (bFirstStep
&& startingBehavior
== StartingBehavior::NewSimulation
) ||
757 do_verbose
= mdrunOptions
.verbose
&&
758 (step
% mdrunOptions
.verboseStepPrintInterval
== 0 || bFirstStep
|| bLastStep
);
760 if (bNS
&& !(bFirstStep
&& ir
->bContinuation
))
762 bMasterState
= FALSE
;
763 /* Correct the new box if it is too skewed */
764 if (inputrecDynamicBox(ir
))
766 if (correct_box(fplog
, step
, state
->box
, graph
))
771 if (DOMAINDECOMP(cr
) && bMasterState
)
773 dd_collect_state(cr
->dd
, state
, state_global
);
776 if (DOMAINDECOMP(cr
))
778 /* Repartition the domain decomposition */
779 dd_partition_system(fplog
, mdlog
, step
, cr
,
780 bMasterState
, nstglobalcomm
,
781 state_global
, *top_global
, ir
, imdSession
,
783 state
, &f
, mdAtoms
, &top
, fr
,
786 do_verbose
&& !bPMETunePrinting
);
787 shouldCheckNumberOfBondedInteractions
= true;
788 upd
.setNumAtoms(state
->natoms
);
792 if (MASTER(cr
) && do_log
)
794 energyOutput
.printHeader(fplog
, step
, t
); /* can we improve the information printed here? */
797 if (ir
->efep
!= efepNO
)
799 update_mdatoms(mdatoms
, state
->lambda
[efptMASS
]);
805 /* We need the kinetic energy at minus the half step for determining
806 * the full step kinetic energy and possibly for T-coupling.*/
807 /* This may not be quite working correctly yet . . . . */
808 compute_globals(gstat
, cr
, ir
, fr
, ekind
,
809 state
->x
.rvec_array(), state
->v
.rvec_array(), state
->box
, state
->lambda
[efptVDW
],
811 wcycle
, enerd
, nullptr, nullptr, nullptr, nullptr, mu_tot
,
812 constr
, &nullSignaller
, state
->box
,
813 &totalNumberOfBondedInteractions
, &bSumEkinhOld
,
814 CGLO_GSTAT
| CGLO_TEMPERATURE
| CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS
);
815 checkNumberOfBondedInteractions(mdlog
, cr
, totalNumberOfBondedInteractions
,
816 top_global
, &top
, state
->x
.rvec_array(), state
->box
,
817 &shouldCheckNumberOfBondedInteractions
);
819 clear_mat(force_vir
);
821 checkpointHandler
->decideIfCheckpointingThisStep(bNS
, bFirstStep
, bLastStep
);
823 /* Determine the energy and pressure:
824 * at nstcalcenergy steps and at energy output steps (set below).
826 if (EI_VV(ir
->eI
) && (!bInitStep
))
828 bCalcEnerStep
= do_per_step(step
, ir
->nstcalcenergy
);
829 bCalcVir
= bCalcEnerStep
||
830 (ir
->epc
!= epcNO
&& (do_per_step(step
, ir
->nstpcouple
) || do_per_step(step
-1, ir
->nstpcouple
)));
834 bCalcEnerStep
= do_per_step(step
, ir
->nstcalcenergy
);
835 bCalcVir
= bCalcEnerStep
||
836 (ir
->epc
!= epcNO
&& do_per_step(step
, ir
->nstpcouple
));
838 bCalcEner
= bCalcEnerStep
;
840 do_ene
= (do_per_step(step
, ir
->nstenergy
) || bLastStep
);
842 if (do_ene
|| do_log
|| bDoReplEx
)
848 /* Do we need global communication ? */
849 bGStat
= (bCalcVir
|| bCalcEner
|| bStopCM
||
850 do_per_step(step
, nstglobalcomm
) ||
851 (EI_VV(ir
->eI
) && inputrecNvtTrotter(ir
) && do_per_step(step
-1, nstglobalcomm
)));
853 force_flags
= (GMX_FORCE_STATECHANGED
|
854 ((inputrecDynamicBox(ir
)) ? GMX_FORCE_DYNAMICBOX
: 0) |
855 GMX_FORCE_ALLFORCES
|
856 (bCalcVir
? GMX_FORCE_VIRIAL
: 0) |
857 (bCalcEner
? GMX_FORCE_ENERGY
: 0) |
858 (bDoFEP
? GMX_FORCE_DHDL
: 0)
863 /* Now is the time to relax the shells */
864 relax_shell_flexcon(fplog
, cr
, ms
, mdrunOptions
.verbose
,
865 enforcedRotation
, step
,
866 ir
, imdSession
, pull_work
, bNS
, force_flags
, &top
,
869 state
->x
.arrayRefWithPadding(),
870 state
->v
.arrayRefWithPadding(),
874 f
.arrayRefWithPadding(), force_vir
, mdatoms
,
876 shellfc
, fr
, runScheduleWork
, t
, mu_tot
,
878 ddBalanceRegionHandler
);
882 /* The AWH history need to be saved _before_ doing force calculations where the AWH bias is updated
883 (or the AWH update will be performed twice for one step when continuing). It would be best to
884 call this update function from do_md_trajectory_writing but that would occur after do_force.
885 One would have to divide the update_awh function into one function applying the AWH force
886 and one doing the AWH bias update. The update AWH bias function could then be called after
887 do_md_trajectory_writing (then containing update_awh_history).
888 The checkpointing will in the future probably moved to the start of the md loop which will
889 rid of this issue. */
890 if (awh
&& checkpointHandler
->isCheckpointingStep() && MASTER(cr
))
892 awh
->updateHistory(state_global
->awhHistory
.get());
895 /* The coordinates (x) are shifted (to get whole molecules)
897 * This is parallellized as well, and does communication too.
898 * Check comments in sim_util.c
900 do_force(fplog
, cr
, ms
, ir
, awh
.get(), enforcedRotation
, imdSession
,
902 step
, nrnb
, wcycle
, &top
,
903 state
->box
, state
->x
.arrayRefWithPadding(), &state
->hist
,
904 f
.arrayRefWithPadding(), force_vir
, mdatoms
, enerd
, fcd
,
905 state
->lambda
, graph
,
906 fr
, runScheduleWork
, vsite
, mu_tot
, t
, ed
? ed
->getLegacyED() : nullptr,
907 (bNS
? GMX_FORCE_NS
: 0) | force_flags
,
908 ddBalanceRegionHandler
);
911 // VV integrators do not need the following velocity half step
912 // if it is the first step after starting from a checkpoint.
913 // That is, the half step is needed on all other steps, and
914 // also the first step when starting from a .tpr file.
915 if (EI_VV(ir
->eI
) && (!bFirstStep
|| startingBehavior
== StartingBehavior::NewSimulation
))
916 /* ############### START FIRST UPDATE HALF-STEP FOR VV METHODS############### */
918 rvec
*vbuf
= nullptr;
920 wallcycle_start(wcycle
, ewcUPDATE
);
921 if (ir
->eI
== eiVV
&& bInitStep
)
923 /* if using velocity verlet with full time step Ekin,
924 * take the first half step only to compute the
925 * virial for the first step. From there,
926 * revert back to the initial coordinates
927 * so that the input is actually the initial step.
929 snew(vbuf
, state
->natoms
);
930 copy_rvecn(state
->v
.rvec_array(), vbuf
, 0, state
->natoms
); /* should make this better for parallelizing? */
934 /* this is for NHC in the Ekin(t+dt/2) version of vv */
935 trotter_update(ir
, step
, ekind
, enerd
, state
, total_vir
, mdatoms
, &MassQ
, trotter_seq
, ettTSEQ1
);
938 update_coords(step
, ir
, mdatoms
, state
, f
.arrayRefWithPadding(), fcd
,
939 ekind
, M
, &upd
, etrtVELOCITY1
,
942 wallcycle_stop(wcycle
, ewcUPDATE
);
943 constrain_velocities(step
, nullptr,
947 bCalcVir
, do_log
, do_ene
);
948 wallcycle_start(wcycle
, ewcUPDATE
);
949 /* if VV, compute the pressure and constraints */
950 /* For VV2, we strictly only need this if using pressure
951 * control, but we really would like to have accurate pressures
953 * Think about ways around this in the future?
954 * For now, keep this choice in comments.
956 /*bPres = (ir->eI==eiVV || inputrecNptTrotter(ir)); */
957 /*bTemp = ((ir->eI==eiVV &&(!bInitStep)) || (ir->eI==eiVVAK && inputrecNptTrotter(ir)));*/
959 bTemp
= ((ir
->eI
== eiVV
&& (!bInitStep
)) || (ir
->eI
== eiVVAK
));
960 if (bCalcEner
&& ir
->eI
== eiVVAK
)
964 /* for vv, the first half of the integration actually corresponds to the previous step.
965 So we need information from the last step in the first half of the integration */
966 if (bGStat
|| do_per_step(step
-1, nstglobalcomm
))
968 wallcycle_stop(wcycle
, ewcUPDATE
);
969 compute_globals(gstat
, cr
, ir
, fr
, ekind
,
970 state
->x
.rvec_array(), state
->v
.rvec_array(), state
->box
, state
->lambda
[efptVDW
],
972 wcycle
, enerd
, force_vir
, shake_vir
, total_vir
, pres
, mu_tot
,
973 constr
, &nullSignaller
, state
->box
,
974 &totalNumberOfBondedInteractions
, &bSumEkinhOld
,
975 (bGStat
? CGLO_GSTAT
: 0)
976 | (bCalcEner
? CGLO_ENERGY
: 0)
977 | (bTemp
? CGLO_TEMPERATURE
: 0)
978 | (bPres
? CGLO_PRESSURE
: 0)
979 | (bPres
? CGLO_CONSTRAINT
: 0)
980 | (bStopCM
? CGLO_STOPCM
: 0)
981 | (shouldCheckNumberOfBondedInteractions
? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS
: 0)
984 /* explanation of above:
985 a) We compute Ekin at the full time step
986 if 1) we are using the AveVel Ekin, and it's not the
987 initial step, or 2) if we are using AveEkin, but need the full
988 time step kinetic energy for the pressure (always true now, since we want accurate statistics).
989 b) If we are using EkinAveEkin for the kinetic energy for the temperature control, we still feed in
990 EkinAveVel because it's needed for the pressure */
991 checkNumberOfBondedInteractions(mdlog
, cr
, totalNumberOfBondedInteractions
,
992 top_global
, &top
, state
->x
.rvec_array(), state
->box
,
993 &shouldCheckNumberOfBondedInteractions
);
996 process_and_stopcm_grp(fplog
, &vcm
, *mdatoms
, state
->x
.rvec_array(), state
->v
.rvec_array());
997 inc_nrnb(nrnb
, eNR_STOPCM
, mdatoms
->homenr
);
999 wallcycle_start(wcycle
, ewcUPDATE
);
1001 /* temperature scaling and pressure scaling to produce the extended variables at t+dt */
1006 m_add(force_vir
, shake_vir
, total_vir
); /* we need the un-dispersion corrected total vir here */
1007 trotter_update(ir
, step
, ekind
, enerd
, state
, total_vir
, mdatoms
, &MassQ
, trotter_seq
, ettTSEQ2
);
1009 /* TODO This is only needed when we're about to write
1010 * a checkpoint, because we use it after the restart
1011 * (in a kludge?). But what should we be doing if
1012 * the startingBehavior is NewSimulation or bInitStep are true? */
1013 if (inputrecNptTrotter(ir
) || inputrecNphTrotter(ir
))
1015 copy_mat(shake_vir
, state
->svir_prev
);
1016 copy_mat(force_vir
, state
->fvir_prev
);
1018 if (inputrecNvtTrotter(ir
) && ir
->eI
== eiVV
)
1020 /* update temperature and kinetic energy now that step is over - this is the v(t+dt) point */
1021 enerd
->term
[F_TEMP
] = sum_ekin(&(ir
->opts
), ekind
, nullptr, (ir
->eI
== eiVV
), FALSE
);
1022 enerd
->term
[F_EKIN
] = trace(ekind
->ekin
);
1025 else if (bExchanged
)
1027 wallcycle_stop(wcycle
, ewcUPDATE
);
1028 /* We need the kinetic energy at minus the half step for determining
1029 * the full step kinetic energy and possibly for T-coupling.*/
1030 /* This may not be quite working correctly yet . . . . */
1031 compute_globals(gstat
, cr
, ir
, fr
, ekind
,
1032 state
->x
.rvec_array(), state
->v
.rvec_array(), state
->box
, state
->lambda
[efptVDW
],
1033 mdatoms
, nrnb
, &vcm
,
1034 wcycle
, enerd
, nullptr, nullptr, nullptr, nullptr, mu_tot
,
1035 constr
, &nullSignaller
, state
->box
,
1036 nullptr, &bSumEkinhOld
,
1037 CGLO_GSTAT
| CGLO_TEMPERATURE
);
1038 wallcycle_start(wcycle
, ewcUPDATE
);
1041 /* if it's the initial step, we performed this first step just to get the constraint virial */
1042 if (ir
->eI
== eiVV
&& bInitStep
)
1044 copy_rvecn(vbuf
, state
->v
.rvec_array(), 0, state
->natoms
);
1047 wallcycle_stop(wcycle
, ewcUPDATE
);
1050 /* compute the conserved quantity */
1053 saved_conserved_quantity
= NPT_energy(ir
, state
, &MassQ
);
1056 last_ekin
= enerd
->term
[F_EKIN
];
1058 if ((ir
->eDispCorr
!= edispcEnerPres
) && (ir
->eDispCorr
!= edispcAllEnerPres
))
1060 saved_conserved_quantity
-= enerd
->term
[F_DISPCORR
];
1062 /* sum up the foreign energy and dhdl terms for vv. currently done every step so that dhdl is correct in the .edr */
1063 if (ir
->efep
!= efepNO
)
1065 sum_dhdl(enerd
, state
->lambda
, *ir
->fepvals
);
1069 /* ######## END FIRST UPDATE STEP ############## */
1070 /* ######## If doing VV, we now have v(dt) ###### */
1073 /* perform extended ensemble sampling in lambda - we don't
1074 actually move to the new state before outputting
1075 statistics, but if performing simulated tempering, we
1076 do update the velocities and the tau_t. */
1078 lamnew
= ExpandedEnsembleDynamics(fplog
, ir
, enerd
, state
, &MassQ
, state
->fep_state
, state
->dfhist
, step
, state
->v
.rvec_array(), mdatoms
);
1079 /* history is maintained in state->dfhist, but state_global is what is sent to trajectory and log output */
1082 copy_df_history(state_global
->dfhist
, state
->dfhist
);
1086 /* Now we have the energies and forces corresponding to the
1087 * coordinates at time t. We must output all of this before
1090 do_md_trajectory_writing(fplog
, cr
, nfile
, fnm
, step
, step_rel
, t
,
1091 ir
, state
, state_global
, observablesHistory
,
1093 outf
, energyOutput
, ekind
, f
,
1094 checkpointHandler
->isCheckpointingStep(),
1095 bRerunMD
, bLastStep
,
1096 mdrunOptions
.writeConfout
,
1098 /* Check if IMD step and do IMD communication, if bIMD is TRUE. */
1099 bInteractiveMDstep
= imdSession
->run(step
, bNS
, state
->box
, state
->x
.rvec_array(), t
);
1101 /* kludge -- virial is lost with restart for MTTK NPT control. Must reload (saved earlier). */
1102 if (startingBehavior
!= StartingBehavior::NewSimulation
&&
1103 (inputrecNptTrotter(ir
) || inputrecNphTrotter(ir
)))
1105 copy_mat(state
->svir_prev
, shake_vir
);
1106 copy_mat(state
->fvir_prev
, force_vir
);
1109 stopHandler
->setSignal();
1110 resetHandler
->setSignal(walltime_accounting
);
1112 if (bGStat
|| !PAR(cr
))
1114 /* In parallel we only have to check for checkpointing in steps
1115 * where we do global communication,
1116 * otherwise the other nodes don't know.
1118 checkpointHandler
->setSignal(walltime_accounting
);
1121 /* ######### START SECOND UPDATE STEP ################# */
1123 /* at the start of step, randomize or scale the velocities ((if vv. Restriction of Andersen controlled
1126 if (ETC_ANDERSEN(ir
->etc
)) /* keep this outside of update_tcouple because of the extra info required to pass */
1128 gmx_bool bIfRandomize
;
1129 bIfRandomize
= update_randomize_velocities(ir
, step
, cr
, mdatoms
, state
->v
, &upd
, constr
);
1130 /* if we have constraints, we have to remove the kinetic energy parallel to the bonds */
1131 if (constr
&& bIfRandomize
)
1133 constrain_velocities(step
, nullptr,
1137 bCalcVir
, do_log
, do_ene
);
1140 /* Box is changed in update() when we do pressure coupling,
1141 * but we should still use the old box for energy corrections and when
1142 * writing it to the energy file, so it matches the trajectory files for
1143 * the same timestep above. Make a copy in a separate array.
1145 copy_mat(state
->box
, lastbox
);
1149 wallcycle_start(wcycle
, ewcUPDATE
);
1150 /* UPDATE PRESSURE VARIABLES IN TROTTER FORMULATION WITH CONSTRAINTS */
1153 trotter_update(ir
, step
, ekind
, enerd
, state
, total_vir
, mdatoms
, &MassQ
, trotter_seq
, ettTSEQ3
);
1154 /* We can only do Berendsen coupling after we have summed
1155 * the kinetic energy or virial. Since the happens
1156 * in global_state after update, we should only do it at
1157 * step % nstlist = 1 with bGStatEveryStep=FALSE.
1162 update_tcouple(step
, ir
, state
, ekind
, &MassQ
, mdatoms
);
1163 update_pcouple_before_coordinates(fplog
, step
, ir
, state
,
1164 parrinellorahmanMu
, M
,
1170 /* velocity half-step update */
1171 update_coords(step
, ir
, mdatoms
, state
, f
.arrayRefWithPadding(), fcd
,
1172 ekind
, M
, &upd
, etrtVELOCITY2
,
1176 /* Above, initialize just copies ekinh into ekin,
1177 * it doesn't copy position (for VV),
1178 * and entire integrator for MD.
1181 if (ir
->eI
== eiVVAK
)
1183 cbuf
.resize(state
->x
.size());
1184 std::copy(state
->x
.begin(), state
->x
.end(), cbuf
.begin());
1187 if (useGpuForUpdate
)
1191 integrator
->set(top
.idef
, *mdatoms
, ekind
->ngtc
);
1193 set_pbc(&pbc
, epbcXYZ
, state
->box
);
1194 integrator
->setPbc(&pbc
);
1196 integrator
->copyCoordinatesToGpu(state
->x
.rvec_array());
1197 integrator
->copyVelocitiesToGpu(state
->v
.rvec_array());
1198 integrator
->copyForcesToGpu(as_rvec_array(f
.data()));
1200 bool doTempCouple
= (ir
->etc
!= etcNO
&& do_per_step(step
+ ir
->nsttcouple
- 1, ir
->nsttcouple
));
1201 bool doPressureCouple
= (ir
->epc
== epcPARRINELLORAHMAN
&& do_per_step(step
+ ir
->nstpcouple
- 1, ir
->nstpcouple
));
1203 // This applies Leap-Frog, LINCS and SETTLE in succession
1204 integrator
->integrate(ir
->delta_t
, true, bCalcVir
, shake_vir
,
1205 doTempCouple
, ekind
->tcstat
,
1206 doPressureCouple
, ir
->nstpcouple
*ir
->delta_t
, M
);
1208 integrator
->copyCoordinatesFromGpu(state
->x
.rvec_array());
1209 integrator
->copyVelocitiesFromGpu(state
->v
.rvec_array());
1213 update_coords(step
, ir
, mdatoms
, state
, f
.arrayRefWithPadding(), fcd
,
1214 ekind
, M
, &upd
, etrtPOSITION
, cr
, constr
);
1216 wallcycle_stop(wcycle
, ewcUPDATE
);
1218 constrain_coordinates(step
, &dvdl_constr
, state
,
1221 bCalcVir
, do_log
, do_ene
);
1223 update_sd_second_half(step
, &dvdl_constr
, ir
, mdatoms
, state
,
1224 cr
, nrnb
, wcycle
, &upd
, constr
, do_log
, do_ene
);
1225 finish_update(ir
, mdatoms
,
1227 nrnb
, wcycle
, &upd
, constr
);
1230 if (ir
->bPull
&& ir
->pull
->bSetPbcRefToPrevStepCOM
)
1232 updatePrevStepPullCom(pull_work
, state
);
1235 if (ir
->eI
== eiVVAK
)
1237 /* erase F_EKIN and F_TEMP here? */
1238 /* just compute the kinetic energy at the half step to perform a trotter step */
1239 compute_globals(gstat
, cr
, ir
, fr
, ekind
,
1240 state
->x
.rvec_array(), state
->v
.rvec_array(), state
->box
, state
->lambda
[efptVDW
],
1241 mdatoms
, nrnb
, &vcm
,
1242 wcycle
, enerd
, force_vir
, shake_vir
, total_vir
, pres
, mu_tot
,
1243 constr
, &nullSignaller
, lastbox
,
1244 nullptr, &bSumEkinhOld
,
1245 (bGStat
? CGLO_GSTAT
: 0) | CGLO_TEMPERATURE
1247 wallcycle_start(wcycle
, ewcUPDATE
);
1248 trotter_update(ir
, step
, ekind
, enerd
, state
, total_vir
, mdatoms
, &MassQ
, trotter_seq
, ettTSEQ4
);
1249 /* now we know the scaling, we can compute the positions again */
1250 std::copy(cbuf
.begin(), cbuf
.end(), state
->x
.begin());
1252 update_coords(step
, ir
, mdatoms
, state
, f
.arrayRefWithPadding(), fcd
,
1253 ekind
, M
, &upd
, etrtPOSITION
, cr
, constr
);
1254 wallcycle_stop(wcycle
, ewcUPDATE
);
1256 /* do we need an extra constraint here? just need to copy out of as_rvec_array(state->v.data()) to upd->xp? */
1257 /* are the small terms in the shake_vir here due
1258 * to numerical errors, or are they important
1259 * physically? I'm thinking they are just errors, but not completely sure.
1260 * For now, will call without actually constraining, constr=NULL*/
1261 finish_update(ir
, mdatoms
,
1263 nrnb
, wcycle
, &upd
, nullptr);
1267 /* this factor or 2 correction is necessary
1268 because half of the constraint force is removed
1269 in the vv step, so we have to double it. See
1270 the Redmine issue #1255. It is not yet clear
1271 if the factor of 2 is exact, or just a very
1272 good approximation, and this will be
1273 investigated. The next step is to see if this
1274 can be done adding a dhdl contribution from the
1275 rattle step, but this is somewhat more
1276 complicated with the current code. Will be
1277 investigated, hopefully for 4.6.3. However,
1278 this current solution is much better than
1279 having it completely wrong.
1281 enerd
->term
[F_DVDL_CONSTR
] += 2*dvdl_constr
;
1285 enerd
->term
[F_DVDL_CONSTR
] += dvdl_constr
;
1288 if (vsite
!= nullptr)
1290 wallcycle_start(wcycle
, ewcVSITECONSTR
);
1291 if (graph
!= nullptr)
1293 shift_self(graph
, state
->box
, state
->x
.rvec_array());
1295 construct_vsites(vsite
, state
->x
.rvec_array(), ir
->delta_t
, state
->v
.rvec_array(),
1296 top
.idef
.iparams
, top
.idef
.il
,
1297 fr
->ePBC
, fr
->bMolPBC
, cr
, state
->box
);
1299 if (graph
!= nullptr)
1301 unshift_self(graph
, state
->box
, state
->x
.rvec_array());
1303 wallcycle_stop(wcycle
, ewcVSITECONSTR
);
1306 /* ############## IF NOT VV, Calculate globals HERE ############ */
1307 /* With Leap-Frog we can skip compute_globals at
1308 * non-communication steps, but we need to calculate
1309 * the kinetic energy one step before communication.
1312 // Organize to do inter-simulation signalling on steps if
1313 // and when algorithms require it.
1314 bool doInterSimSignal
= (simulationsShareState
&& do_per_step(step
, nstSignalComm
));
1316 if (bGStat
|| (!EI_VV(ir
->eI
) && do_per_step(step
+1, nstglobalcomm
)) || doInterSimSignal
)
1318 // Since we're already communicating at this step, we
1319 // can propagate intra-simulation signals. Note that
1320 // check_nstglobalcomm has the responsibility for
1321 // choosing the value of nstglobalcomm that is one way
1322 // bGStat becomes true, so we can't get into a
1323 // situation where e.g. checkpointing can't be
1325 bool doIntraSimSignal
= true;
1326 SimulationSignaller
signaller(&signals
, cr
, ms
, doInterSimSignal
, doIntraSimSignal
);
1328 compute_globals(gstat
, cr
, ir
, fr
, ekind
,
1329 state
->x
.rvec_array(), state
->v
.rvec_array(), state
->box
, state
->lambda
[efptVDW
],
1330 mdatoms
, nrnb
, &vcm
,
1331 wcycle
, enerd
, force_vir
, shake_vir
, total_vir
, pres
, mu_tot
,
1334 &totalNumberOfBondedInteractions
, &bSumEkinhOld
,
1335 (bGStat
? CGLO_GSTAT
: 0)
1336 | (!EI_VV(ir
->eI
) && bCalcEner
? CGLO_ENERGY
: 0)
1337 | (!EI_VV(ir
->eI
) && bStopCM
? CGLO_STOPCM
: 0)
1338 | (!EI_VV(ir
->eI
) ? CGLO_TEMPERATURE
: 0)
1339 | (!EI_VV(ir
->eI
) ? CGLO_PRESSURE
: 0)
1341 | (shouldCheckNumberOfBondedInteractions
? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS
: 0)
1343 checkNumberOfBondedInteractions(mdlog
, cr
, totalNumberOfBondedInteractions
,
1344 top_global
, &top
, state
->x
.rvec_array(), state
->box
,
1345 &shouldCheckNumberOfBondedInteractions
);
1346 if (!EI_VV(ir
->eI
) && bStopCM
)
1348 process_and_stopcm_grp(fplog
, &vcm
, *mdatoms
, state
->x
.rvec_array(), state
->v
.rvec_array());
1349 inc_nrnb(nrnb
, eNR_STOPCM
, mdatoms
->homenr
);
1354 /* ############# END CALC EKIN AND PRESSURE ################# */
1356 /* Note: this is OK, but there are some numerical precision issues with using the convergence of
1357 the virial that should probably be addressed eventually. state->veta has better properies,
1358 but what we actually need entering the new cycle is the new shake_vir value. Ideally, we could
1359 generate the new shake_vir, but test the veta value for convergence. This will take some thought. */
1361 if (ir
->efep
!= efepNO
&& !EI_VV(ir
->eI
))
1363 /* Sum up the foreign energy and dhdl terms for md and sd.
1364 Currently done every step so that dhdl is correct in the .edr */
1365 sum_dhdl(enerd
, state
->lambda
, *ir
->fepvals
);
1368 update_pcouple_after_coordinates(fplog
, step
, ir
, mdatoms
,
1369 pres
, force_vir
, shake_vir
,
1373 /* ################# END UPDATE STEP 2 ################# */
1374 /* #### We now have r(t+dt) and v(t+dt/2) ############# */
1376 /* The coordinates (x) were unshifted in update */
1379 /* We will not sum ekinh_old,
1380 * so signal that we still have to do it.
1382 bSumEkinhOld
= TRUE
;
1387 /* ######### BEGIN PREPARING EDR OUTPUT ########### */
1389 /* use the directly determined last velocity, not actually the averaged half steps */
1390 if (bTrotter
&& ir
->eI
== eiVV
)
1392 enerd
->term
[F_EKIN
] = last_ekin
;
1394 enerd
->term
[F_ETOT
] = enerd
->term
[F_EPOT
] + enerd
->term
[F_EKIN
];
1396 if (integratorHasConservedEnergyQuantity(ir
))
1400 enerd
->term
[F_ECONSERVED
] = enerd
->term
[F_ETOT
] + saved_conserved_quantity
;
1404 enerd
->term
[F_ECONSERVED
] = enerd
->term
[F_ETOT
] + NPT_energy(ir
, state
, &MassQ
);
1407 /* ######### END PREPARING EDR OUTPUT ########### */
1413 if (fplog
&& do_log
&& bDoExpanded
)
1415 /* only needed if doing expanded ensemble */
1416 PrintFreeEnergyInfoToFile(fplog
, ir
->fepvals
, ir
->expandedvals
, ir
->bSimTemp
? ir
->simtempvals
: nullptr,
1417 state_global
->dfhist
, state
->fep_state
, ir
->nstlog
, step
);
1421 energyOutput
.addDataAtEnergyStep(bDoDHDL
, bCalcEnerStep
,
1422 t
, mdatoms
->tmass
, enerd
, state
,
1423 ir
->fepvals
, ir
->expandedvals
, lastbox
,
1424 shake_vir
, force_vir
, total_vir
, pres
,
1425 ekind
, mu_tot
, constr
);
1429 energyOutput
.recordNonEnergyStep();
1432 gmx_bool do_dr
= do_per_step(step
, ir
->nstdisreout
);
1433 gmx_bool do_or
= do_per_step(step
, ir
->nstorireout
);
1435 if (doSimulatedAnnealing
)
1437 energyOutput
.printAnnealingTemperatures(do_log
? fplog
: nullptr, groups
, &(ir
->opts
));
1439 if (do_log
|| do_ene
|| do_dr
|| do_or
)
1441 energyOutput
.printStepToEnergyFile(mdoutf_get_fp_ene(outf
), do_ene
, do_dr
, do_or
,
1442 do_log
? fplog
: nullptr,
1449 pull_print_output(pull_work
, step
, t
);
1452 if (do_per_step(step
, ir
->nstlog
))
1454 if (fflush(fplog
) != 0)
1456 gmx_fatal(FARGS
, "Cannot flush logfile - maybe you are out of disk space?");
1462 /* Have to do this part _after_ outputting the logfile and the edr file */
1463 /* Gets written into the state at the beginning of next loop*/
1464 state
->fep_state
= lamnew
;
1466 /* Print the remaining wall clock time for the run */
1467 if (isMasterSimMasterRank(ms
, MASTER(cr
)) &&
1468 (do_verbose
|| gmx_got_usr_signal()) &&
1473 fprintf(stderr
, "\n");
1475 print_time(stderr
, walltime_accounting
, step
, ir
, cr
);
1478 /* Ion/water position swapping.
1479 * Not done in last step since trajectory writing happens before this call
1480 * in the MD loop and exchanges would be lost anyway. */
1481 bNeedRepartition
= FALSE
;
1482 if ((ir
->eSwapCoords
!= eswapNO
) && (step
> 0) && !bLastStep
&&
1483 do_per_step(step
, ir
->swap
->nstswap
))
1485 bNeedRepartition
= do_swapcoords(cr
, step
, t
, ir
, swap
, wcycle
,
1486 as_rvec_array(state
->x
.data()),
1488 MASTER(cr
) && mdrunOptions
.verbose
,
1491 if (bNeedRepartition
&& DOMAINDECOMP(cr
))
1493 dd_collect_state(cr
->dd
, state
, state_global
);
1497 /* Replica exchange */
1501 bExchanged
= replica_exchange(fplog
, cr
, ms
, repl_ex
,
1502 state_global
, enerd
,
1506 if ( (bExchanged
|| bNeedRepartition
) && DOMAINDECOMP(cr
) )
1508 dd_partition_system(fplog
, mdlog
, step
, cr
, TRUE
, 1,
1509 state_global
, *top_global
, ir
, imdSession
,
1511 state
, &f
, mdAtoms
, &top
, fr
,
1513 nrnb
, wcycle
, FALSE
);
1514 shouldCheckNumberOfBondedInteractions
= true;
1515 upd
.setNumAtoms(state
->natoms
);
1521 /* ####### SET VARIABLES FOR NEXT ITERATION IF THEY STILL NEED IT ###### */
1522 /* With all integrators, except VV, we need to retain the pressure
1523 * at the current step for coupling at the next step.
1525 if ((state
->flags
& (1U<<estPRES_PREV
)) &&
1527 (ir
->nstpcouple
> 0 && step
% ir
->nstpcouple
== 0)))
1529 /* Store the pressure in t_state for pressure coupling
1530 * at the next MD step.
1532 copy_mat(pres
, state
->pres_prev
);
1535 /* ####### END SET VARIABLES FOR NEXT ITERATION ###### */
1537 if ( (membed
!= nullptr) && (!bLastStep
) )
1539 rescale_membed(step_rel
, membed
, as_rvec_array(state_global
->x
.data()));
1542 cycles
= wallcycle_stop(wcycle
, ewcSTEP
);
1543 if (DOMAINDECOMP(cr
) && wcycle
)
1545 dd_cycles_add(cr
->dd
, cycles
, ddCyclStep
);
1548 /* increase the MD step number */
1552 resetHandler
->resetCounters(
1553 step
, step_rel
, mdlog
, fplog
, cr
, fr
->nbv
.get(),
1554 nrnb
, fr
->pmedata
, pme_loadbal
, wcycle
, walltime_accounting
);
1556 /* If bIMD is TRUE, the master updates the IMD energy record and sends positions to VMD client */
1557 imdSession
->updateEnergyRecordAndSendPositionsAndEnergies(bInteractiveMDstep
, step
, bCalcEner
);
1560 /* End of main MD loop */
1562 /* Closing TNG files can include compressing data. Therefore it is good to do that
1563 * before stopping the time measurements. */
1564 mdoutf_tng_close(outf
);
1566 /* Stop measuring walltime */
1567 walltime_accounting_end_time(walltime_accounting
);
1569 if (!thisRankHasDuty(cr
, DUTY_PME
))
1571 /* Tell the PME only node to finish */
1572 gmx_pme_send_finish(cr
);
1577 if (ir
->nstcalcenergy
> 0)
1579 energyOutput
.printAnnealingTemperatures(fplog
, groups
, &(ir
->opts
));
1580 energyOutput
.printAverages(fplog
, groups
);
1587 pme_loadbal_done(pme_loadbal
, fplog
, mdlog
, fr
->nbv
->useGpu());
1590 done_shellfc(fplog
, shellfc
, step_rel
);
1592 if (useReplicaExchange
&& MASTER(cr
))
1594 print_replica_exchange_statistics(fplog
, repl_ex
);
1597 walltime_accounting_set_nsteps_done(walltime_accounting
, step_rel
);
1599 global_stat_destroy(gstat
);