Fix exact continuation from non-energy steps
[alexxy/gromacs.git] / src / programs / mdrun / md.cpp
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5  * Copyright (c) 2001-2004, The GROMACS development team.
6  * Copyright (c) 2011,2012,2013,2014,2015,2016, by the GROMACS development team, led by
7  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8  * and including many others, as listed in the AUTHORS file in the
9  * top-level source directory and at http://www.gromacs.org.
10  *
11  * GROMACS is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public License
13  * as published by the Free Software Foundation; either version 2.1
14  * of the License, or (at your option) any later version.
15  *
16  * GROMACS is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public
22  * License along with GROMACS; if not, see
23  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
25  *
26  * If you want to redistribute modifications to GROMACS, please
27  * consider that scientific software is very special. Version
28  * control is crucial - bugs must be traceable. We will be happy to
29  * consider code for inclusion in the official distribution, but
30  * derived work must not be called official GROMACS. Details are found
31  * in the README & COPYING files - if they are missing, get the
32  * official version at http://www.gromacs.org.
33  *
34  * To help us fund GROMACS development, we humbly ask that you cite
35  * the research papers on the package. Check out http://www.gromacs.org.
36  */
37 #include "gmxpre.h"
38
39 #include "config.h"
40
41 #include <math.h>
42 #include <stdio.h>
43 #include <stdlib.h>
44
45 #include "thread_mpi/threads.h"
46
47 #include "gromacs/domdec/domdec.h"
48 #include "gromacs/domdec/domdec_network.h"
49 #include "gromacs/ewald/pme-load-balancing.h"
50 #include "gromacs/ewald/pme.h"
51 #include "gromacs/fileio/filenm.h"
52 #include "gromacs/fileio/mdoutf.h"
53 #include "gromacs/fileio/trajectory_writing.h"
54 #include "gromacs/fileio/trx.h"
55 #include "gromacs/fileio/trxio.h"
56 #include "gromacs/imd/imd.h"
57 #include "gromacs/legacyheaders/constr.h"
58 #include "gromacs/legacyheaders/ebin.h"
59 #include "gromacs/legacyheaders/force.h"
60 #include "gromacs/legacyheaders/md_logging.h"
61 #include "gromacs/legacyheaders/md_support.h"
62 #include "gromacs/legacyheaders/mdatoms.h"
63 #include "gromacs/legacyheaders/mdebin.h"
64 #include "gromacs/legacyheaders/mdrun.h"
65 #include "gromacs/legacyheaders/network.h"
66 #include "gromacs/legacyheaders/nrnb.h"
67 #include "gromacs/legacyheaders/ns.h"
68 #include "gromacs/legacyheaders/shellfc.h"
69 #include "gromacs/legacyheaders/sighandler.h"
70 #include "gromacs/legacyheaders/sim_util.h"
71 #include "gromacs/legacyheaders/tgroup.h"
72 #include "gromacs/legacyheaders/typedefs.h"
73 #include "gromacs/legacyheaders/update.h"
74 #include "gromacs/legacyheaders/vcm.h"
75 #include "gromacs/legacyheaders/vsite.h"
76 #include "gromacs/legacyheaders/types/commrec.h"
77 #include "gromacs/legacyheaders/types/constr.h"
78 #include "gromacs/legacyheaders/types/enums.h"
79 #include "gromacs/legacyheaders/types/fcdata.h"
80 #include "gromacs/legacyheaders/types/force_flags.h"
81 #include "gromacs/legacyheaders/types/forcerec.h"
82 #include "gromacs/legacyheaders/types/group.h"
83 #include "gromacs/legacyheaders/types/inputrec.h"
84 #include "gromacs/legacyheaders/types/interaction_const.h"
85 #include "gromacs/legacyheaders/types/mdatom.h"
86 #include "gromacs/legacyheaders/types/membedt.h"
87 #include "gromacs/legacyheaders/types/nrnb.h"
88 #include "gromacs/legacyheaders/types/oenv.h"
89 #include "gromacs/legacyheaders/types/shellfc.h"
90 #include "gromacs/legacyheaders/types/state.h"
91 #include "gromacs/listed-forces/manage-threading.h"
92 #include "gromacs/math/utilities.h"
93 #include "gromacs/math/vec.h"
94 #include "gromacs/math/vectypes.h"
95 #include "gromacs/mdlib/compute_io.h"
96 #include "gromacs/mdlib/mdrun_signalling.h"
97 #include "gromacs/mdlib/nb_verlet.h"
98 #include "gromacs/mdlib/nbnxn_gpu_data_mgmt.h"
99 #include "gromacs/pbcutil/mshift.h"
100 #include "gromacs/pbcutil/pbc.h"
101 #include "gromacs/pulling/pull.h"
102 #include "gromacs/swap/swapcoords.h"
103 #include "gromacs/timing/wallcycle.h"
104 #include "gromacs/timing/walltime_accounting.h"
105 #include "gromacs/topology/atoms.h"
106 #include "gromacs/topology/idef.h"
107 #include "gromacs/topology/mtop_util.h"
108 #include "gromacs/topology/topology.h"
109 #include "gromacs/utility/basedefinitions.h"
110 #include "gromacs/utility/cstringutil.h"
111 #include "gromacs/utility/fatalerror.h"
112 #include "gromacs/utility/real.h"
113 #include "gromacs/utility/smalloc.h"
114
115 #include "deform.h"
116 #include "membed.h"
117 #include "repl_ex.h"
118
119 #ifdef GMX_FAHCORE
120 #include "corewrap.h"
121 #endif
122
123 static void reset_all_counters(FILE *fplog, t_commrec *cr,
124                                gmx_int64_t step,
125                                gmx_int64_t *step_rel, t_inputrec *ir,
126                                gmx_wallcycle_t wcycle, t_nrnb *nrnb,
127                                gmx_walltime_accounting_t walltime_accounting,
128                                struct nonbonded_verlet_t *nbv)
129 {
130     char sbuf[STEPSTRSIZE];
131
132     /* Reset all the counters related to performance over the run */
133     md_print_warn(cr, fplog, "step %s: resetting all time and cycle counters\n",
134                   gmx_step_str(step, sbuf));
135
136     if (use_GPU(nbv))
137     {
138         nbnxn_gpu_reset_timings(nbv);
139     }
140
141     wallcycle_stop(wcycle, ewcRUN);
142     wallcycle_reset_all(wcycle);
143     if (DOMAINDECOMP(cr))
144     {
145         reset_dd_statistics_counters(cr->dd);
146     }
147     init_nrnb(nrnb);
148     ir->init_step += *step_rel;
149     ir->nsteps    -= *step_rel;
150     *step_rel      = 0;
151     wallcycle_start(wcycle, ewcRUN);
152     walltime_accounting_start(walltime_accounting);
153     print_date_and_time(fplog, cr->nodeid, "Restarted time", gmx_gettime());
154 }
155
156 double do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
157              const output_env_t oenv, gmx_bool bVerbose, gmx_bool bCompact,
158              int nstglobalcomm,
159              gmx_vsite_t *vsite, gmx_constr_t constr,
160              int stepout, t_inputrec *ir,
161              gmx_mtop_t *top_global,
162              t_fcdata *fcd,
163              t_state *state_global,
164              t_mdatoms *mdatoms,
165              t_nrnb *nrnb, gmx_wallcycle_t wcycle,
166              gmx_edsam_t ed, t_forcerec *fr,
167              int repl_ex_nst, int repl_ex_nex, int repl_ex_seed, gmx_membed_t membed,
168              real cpt_period, real max_hours,
169              int imdport,
170              unsigned long Flags,
171              gmx_walltime_accounting_t walltime_accounting)
172 {
173     gmx_mdoutf_t    outf = NULL;
174     gmx_int64_t     step, step_rel;
175     double          elapsed_time;
176     double          t, t0, lam0[efptNR];
177     gmx_bool        bGStatEveryStep, bGStat, bCalcVir, bCalcEnerStep, bCalcEner;
178     gmx_bool        bNS, bNStList, bSimAnn, bStopCM, bRerunMD, bNotLastFrame = FALSE,
179                     bFirstStep, bStateFromCP, bStateFromTPX, bInitStep, bLastStep,
180                     bBornRadii, bStartingFromCpt;
181     gmx_bool          bDoDHDL = FALSE, bDoFEP = FALSE, bDoExpanded = FALSE;
182     gmx_bool          do_ene, do_log, do_verbose, bRerunWarnNoV = TRUE,
183                       bForceUpdate = FALSE, bCPT;
184     gmx_bool          bMasterState;
185     int               force_flags, cglo_flags;
186     tensor            force_vir, shake_vir, total_vir, tmp_vir, pres;
187     int               i, m;
188     t_trxstatus      *status;
189     rvec              mu_tot;
190     t_vcm            *vcm;
191     matrix            pcoupl_mu, M;
192     t_trxframe        rerun_fr;
193     gmx_repl_ex_t     repl_ex = NULL;
194     int               nchkpt  = 1;
195     gmx_localtop_t   *top;
196     t_mdebin         *mdebin   = NULL;
197     t_state          *state    = NULL;
198     rvec             *f_global = NULL;
199     gmx_enerdata_t   *enerd;
200     rvec             *f = NULL;
201     gmx_global_stat_t gstat;
202     gmx_update_t      upd   = NULL;
203     t_graph          *graph = NULL;
204     gmx_signalling_t  gs;
205     gmx_groups_t     *groups;
206     gmx_ekindata_t   *ekind;
207     gmx_shellfc_t     shellfc;
208     int               count, nconverged = 0;
209     double            tcount                 = 0;
210     gmx_bool          bConverged             = TRUE, bSumEkinhOld, bDoReplEx, bExchanged, bNeedRepartition;
211     gmx_bool          bResetCountersHalfMaxH = FALSE;
212     gmx_bool          bVV, bTemp, bPres, bTrotter;
213     gmx_bool          bUpdateDoLR;
214     real              dvdl_constr;
215     rvec             *cbuf        = NULL;
216     int               cbuf_nalloc = 0;
217     matrix            lastbox;
218     int               lamnew  = 0;
219     /* for FEP */
220     int               nstfep = 0;
221     double            cycles;
222     real              saved_conserved_quantity = 0;
223     real              last_ekin                = 0;
224     t_extmass         MassQ;
225     int             **trotter_seq;
226     char              sbuf[STEPSTRSIZE], sbuf2[STEPSTRSIZE];
227     int               handled_stop_condition = gmx_stop_cond_none; /* compare to get_stop_condition*/
228     gmx_int64_t       multisim_nsteps        = -1;                 /* number of steps to do  before first multisim
229                                                                           simulation stops. If equal to zero, don't
230                                                                           communicate any more between multisims.*/
231     /* PME load balancing data for GPU kernels */
232     pme_load_balancing_t *pme_loadbal      = NULL;
233     gmx_bool              bPMETune         = FALSE;
234     gmx_bool              bPMETunePrinting = FALSE;
235
236     /* Interactive MD */
237     gmx_bool          bIMDstep = FALSE;
238
239 #ifdef GMX_FAHCORE
240     /* Temporary addition for FAHCORE checkpointing */
241     int chkpt_ret;
242 #endif
243
244     /* Check for special mdrun options */
245     bRerunMD = (Flags & MD_RERUN);
246     if (Flags & MD_RESETCOUNTERSHALFWAY)
247     {
248         if (ir->nsteps > 0)
249         {
250             /* Signal to reset the counters half the simulation steps. */
251             wcycle_set_reset_counters(wcycle, ir->nsteps/2);
252         }
253         /* Signal to reset the counters halfway the simulation time. */
254         bResetCountersHalfMaxH = (max_hours > 0);
255     }
256
257     /* md-vv uses averaged full step velocities for T-control
258        md-vv-avek uses averaged half step velocities for T-control (but full step ekin for P control)
259        md uses averaged half step kinetic energies to determine temperature unless defined otherwise by GMX_EKIN_AVE_VEL; */
260     bVV      = EI_VV(ir->eI);
261     bTrotter = (bVV && (IR_NPT_TROTTER(ir) || IR_NPH_TROTTER(ir) || IR_NVT_TROTTER(ir)));
262
263     if (bRerunMD)
264     {
265         /* Since we don't know if the frames read are related in any way,
266          * rebuild the neighborlist at every step.
267          */
268         ir->nstlist       = 1;
269         ir->nstcalcenergy = 1;
270         nstglobalcomm     = 1;
271     }
272
273     check_ir_old_tpx_versions(cr, fplog, ir, top_global);
274
275     nstglobalcomm   = check_nstglobalcomm(fplog, cr, nstglobalcomm, ir);
276     bGStatEveryStep = (nstglobalcomm == 1);
277
278     if (bRerunMD)
279     {
280         ir->nstxout_compressed = 0;
281     }
282     groups = &top_global->groups;
283
284     /* Initial values */
285     init_md(fplog, cr, ir, oenv, &t, &t0, state_global->lambda,
286             &(state_global->fep_state), lam0,
287             nrnb, top_global, &upd,
288             nfile, fnm, &outf, &mdebin,
289             force_vir, shake_vir, mu_tot, &bSimAnn, &vcm, Flags, wcycle);
290
291     clear_mat(total_vir);
292     clear_mat(pres);
293     /* Energy terms and groups */
294     snew(enerd, 1);
295     init_enerdata(top_global->groups.grps[egcENER].nr, ir->fepvals->n_lambda,
296                   enerd);
297     if (DOMAINDECOMP(cr))
298     {
299         f = NULL;
300     }
301     else
302     {
303         snew(f, top_global->natoms);
304     }
305
306     /* Kinetic energy data */
307     snew(ekind, 1);
308     init_ekindata(fplog, top_global, &(ir->opts), ekind);
309     /* Copy the cos acceleration to the groups struct */
310     ekind->cosacc.cos_accel = ir->cos_accel;
311
312     gstat = global_stat_init(ir);
313     debug_gmx();
314
315     /* Check for polarizable models and flexible constraints */
316     shellfc = init_shell_flexcon(fplog,
317                                  top_global, n_flexible_constraints(constr),
318                                  (ir->bContinuation ||
319                                   (DOMAINDECOMP(cr) && !MASTER(cr))) ?
320                                  NULL : state_global->x);
321     if (shellfc && ir->nstcalcenergy != 1)
322     {
323         gmx_fatal(FARGS, "You have nstcalcenergy set to a value (%d) that is different from 1.\nThis is not supported in combinations with shell particles.\nPlease make a new tpr file.", ir->nstcalcenergy);
324     }
325     if (shellfc && DOMAINDECOMP(cr))
326     {
327         gmx_fatal(FARGS, "Shell particles are not implemented with domain decomposition, use a single rank");
328     }
329     if (shellfc && ir->eI == eiNM)
330     {
331         /* Currently shells don't work with Normal Modes */
332         gmx_fatal(FARGS, "Normal Mode analysis is not supported with shells.\nIf you'd like to help with adding support, we have an open discussion at http://redmine.gromacs.org/issues/879\n");
333     }
334
335     if (vsite && ir->eI == eiNM)
336     {
337         /* Currently virtual sites don't work with Normal Modes */
338         gmx_fatal(FARGS, "Normal Mode analysis is not supported with virtual sites.\nIf you'd like to help with adding support, we have an open discussion at http://redmine.gromacs.org/issues/879\n");
339     }
340
341     if (DEFORM(*ir))
342     {
343         tMPI_Thread_mutex_lock(&deform_init_box_mutex);
344         set_deform_reference_box(upd,
345                                  deform_init_init_step_tpx,
346                                  deform_init_box_tpx);
347         tMPI_Thread_mutex_unlock(&deform_init_box_mutex);
348     }
349
350     {
351         double io = compute_io(ir, top_global->natoms, groups, mdebin->ebin->nener, 1);
352         if ((io > 2000) && MASTER(cr))
353         {
354             fprintf(stderr,
355                     "\nWARNING: This run will generate roughly %.0f Mb of data\n\n",
356                     io);
357         }
358     }
359
360     if (DOMAINDECOMP(cr))
361     {
362         top = dd_init_local_top(top_global);
363
364         snew(state, 1);
365         dd_init_local_state(cr->dd, state_global, state);
366
367         if (DDMASTER(cr->dd) && ir->nstfout)
368         {
369             snew(f_global, state_global->natoms);
370         }
371     }
372     else
373     {
374         top = gmx_mtop_generate_local_top(top_global, ir);
375
376         forcerec_set_excl_load(fr, top);
377
378         state    = serial_init_local_state(state_global);
379         f_global = f;
380
381         atoms2md(top_global, ir, 0, NULL, top_global->natoms, mdatoms);
382
383         if (vsite)
384         {
385             set_vsite_top(vsite, top, mdatoms, cr);
386         }
387
388         if (ir->ePBC != epbcNONE && !fr->bMolPBC)
389         {
390             graph = mk_graph(fplog, &(top->idef), 0, top_global->natoms, FALSE, FALSE);
391         }
392
393         if (shellfc)
394         {
395             make_local_shells(cr, mdatoms, shellfc);
396         }
397
398         setup_bonded_threading(fr, &top->idef);
399     }
400
401     /* Set up interactive MD (IMD) */
402     init_IMD(ir, cr, top_global, fplog, ir->nstcalcenergy, state_global->x,
403              nfile, fnm, oenv, imdport, Flags);
404
405     if (DOMAINDECOMP(cr))
406     {
407         /* Distribute the charge groups over the nodes from the master node */
408         dd_partition_system(fplog, ir->init_step, cr, TRUE, 1,
409                             state_global, top_global, ir,
410                             state, &f, mdatoms, top, fr,
411                             vsite, shellfc, constr,
412                             nrnb, NULL, FALSE);
413
414     }
415
416     update_mdatoms(mdatoms, state->lambda[efptMASS]);
417
418     if (opt2bSet("-cpi", nfile, fnm))
419     {
420         bStateFromCP = gmx_fexist_master(opt2fn_master("-cpi", nfile, fnm, cr), cr);
421     }
422     else
423     {
424         bStateFromCP = FALSE;
425     }
426
427     if (ir->bExpanded)
428     {
429         init_expanded_ensemble(bStateFromCP, ir, &state->dfhist);
430     }
431
432     if (MASTER(cr))
433     {
434         if (bStateFromCP)
435         {
436             /* Update mdebin with energy history if appending to output files */
437             if (Flags & MD_APPENDFILES)
438             {
439                 restore_energyhistory_from_state(mdebin, &state_global->enerhist);
440             }
441             else
442             {
443                 /* We might have read an energy history from checkpoint,
444                  * free the allocated memory and reset the counts.
445                  */
446                 done_energyhistory(&state_global->enerhist);
447                 init_energyhistory(&state_global->enerhist);
448             }
449         }
450         /* Set the initial energy history in state by updating once */
451         update_energyhistory(&state_global->enerhist, mdebin);
452     }
453
454     /* Initialize constraints */
455     if (constr && !DOMAINDECOMP(cr))
456     {
457         set_constraints(constr, top, ir, mdatoms, cr);
458     }
459
460     if (repl_ex_nst > 0 && MASTER(cr))
461     {
462         repl_ex = init_replica_exchange(fplog, cr->ms, state_global, ir,
463                                         repl_ex_nst, repl_ex_nex, repl_ex_seed);
464     }
465
466     /* PME tuning is only supported with PME for Coulomb. Is is not supported
467      * with only LJ PME, or for reruns.
468      */
469     bPMETune = ((Flags & MD_TUNEPME) && EEL_PME(fr->eeltype) && !bRerunMD &&
470                 !(Flags & MD_REPRODUCIBLE));
471     if (bPMETune)
472     {
473         pme_loadbal_init(&pme_loadbal, cr, fplog, ir, state->box,
474                          fr->ic, fr->pmedata, use_GPU(fr->nbv),
475                          &bPMETunePrinting);
476     }
477
478     if (!ir->bContinuation && !bRerunMD)
479     {
480         if (mdatoms->cFREEZE && (state->flags & (1<<estV)))
481         {
482             /* Set the velocities of frozen particles to zero */
483             for (i = 0; i < mdatoms->homenr; i++)
484             {
485                 for (m = 0; m < DIM; m++)
486                 {
487                     if (ir->opts.nFreeze[mdatoms->cFREEZE[i]][m])
488                     {
489                         state->v[i][m] = 0;
490                     }
491                 }
492             }
493         }
494
495         if (constr)
496         {
497             /* Constrain the initial coordinates and velocities */
498             do_constrain_first(fplog, constr, ir, mdatoms, state,
499                                cr, nrnb, fr, top);
500         }
501         if (vsite)
502         {
503             /* Construct the virtual sites for the initial configuration */
504             construct_vsites(vsite, state->x, ir->delta_t, NULL,
505                              top->idef.iparams, top->idef.il,
506                              fr->ePBC, fr->bMolPBC, cr, state->box);
507         }
508     }
509
510     debug_gmx();
511
512     if (IR_TWINRANGE(*ir) && repl_ex_nst % ir->nstcalclr != 0)
513     {
514         /* We should exchange at nstcalclr steps to get correct integration */
515         gmx_fatal(FARGS, "The replica exchange period (%d) is not divisible by nstcalclr (%d)", repl_ex_nst, ir->nstcalclr);
516     }
517
518     if (ir->efep != efepNO)
519     {
520         /* Set free energy calculation frequency as the greatest common
521          * denominator of nstdhdl and repl_ex_nst.
522          * Check for nstcalclr with twin-range, since we need the long-range
523          * contribution to the free-energy at the correct (nstcalclr) steps.
524          */
525         nstfep = ir->fepvals->nstdhdl;
526         if (ir->bExpanded)
527         {
528             if (IR_TWINRANGE(*ir) &&
529                 ir->expandedvals->nstexpanded % ir->nstcalclr != 0)
530             {
531                 gmx_fatal(FARGS, "nstexpanded should be divisible by nstcalclr");
532             }
533             nstfep = gmx_greatest_common_divisor(ir->expandedvals->nstexpanded, nstfep);
534         }
535         if (repl_ex_nst > 0)
536         {
537             nstfep = gmx_greatest_common_divisor(repl_ex_nst, nstfep);
538         }
539         /* We checked divisibility of repl_ex_nst and nstcalclr above */
540         if (IR_TWINRANGE(*ir) && nstfep % ir->nstcalclr != 0)
541         {
542             gmx_incons("nstfep not divisible by nstcalclr");
543         }
544     }
545
546     /* Be REALLY careful about what flags you set here. You CANNOT assume
547      * this is the first step, since we might be restarting from a checkpoint,
548      * and in that case we should not do any modifications to the state.
549      */
550     bStopCM = (ir->comm_mode != ecmNO && !ir->bContinuation);
551
552     cglo_flags = (CGLO_TEMPERATURE | CGLO_GSTAT
553                   | (bStopCM ? CGLO_STOPCM : 0)
554                   | (bVV ? CGLO_PRESSURE : 0)
555                   | (bVV ? CGLO_CONSTRAINT : 0)
556                   | (bRerunMD ? CGLO_RERUNMD : 0)
557                   | ((Flags & MD_READ_EKIN) ? CGLO_READEKIN : 0));
558
559     bSumEkinhOld = FALSE;
560     compute_globals(fplog, gstat, cr, ir, fr, ekind, state, state_global, mdatoms, nrnb, vcm,
561                     NULL, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
562                     constr, NULL, FALSE, state->box,
563                     top_global, &bSumEkinhOld, cglo_flags);
564     if (ir->eI == eiVVAK)
565     {
566         /* a second call to get the half step temperature initialized as well */
567         /* we do the same call as above, but turn the pressure off -- internally to
568            compute_globals, this is recognized as a velocity verlet half-step
569            kinetic energy calculation.  This minimized excess variables, but
570            perhaps loses some logic?*/
571
572         compute_globals(fplog, gstat, cr, ir, fr, ekind, state, state_global, mdatoms, nrnb, vcm,
573                         NULL, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
574                         constr, NULL, FALSE, state->box,
575                         top_global, &bSumEkinhOld,
576                         cglo_flags &~(CGLO_STOPCM | CGLO_PRESSURE));
577     }
578
579     /* Calculate the initial half step temperature, and save the ekinh_old */
580     if (!(Flags & MD_STARTFROMCPT))
581     {
582         for (i = 0; (i < ir->opts.ngtc); i++)
583         {
584             copy_mat(ekind->tcstat[i].ekinh, ekind->tcstat[i].ekinh_old);
585         }
586     }
587     if (ir->eI != eiVV)
588     {
589         enerd->term[F_TEMP] *= 2; /* result of averages being done over previous and current step,
590                                      and there is no previous step */
591     }
592
593     /* need to make an initiation call to get the Trotter variables set, as well as other constants for non-trotter
594        temperature control */
595     trotter_seq = init_npt_vars(ir, state, &MassQ, bTrotter);
596
597     if (MASTER(cr))
598     {
599         if (constr && !ir->bContinuation && ir->eConstrAlg == econtLINCS)
600         {
601             fprintf(fplog,
602                     "RMS relative constraint deviation after constraining: %.2e\n",
603                     constr_rmsd(constr, FALSE));
604         }
605         if (EI_STATE_VELOCITY(ir->eI))
606         {
607             fprintf(fplog, "Initial temperature: %g K\n", enerd->term[F_TEMP]);
608         }
609         if (bRerunMD)
610         {
611             fprintf(stderr, "starting md rerun '%s', reading coordinates from"
612                     " input trajectory '%s'\n\n",
613                     *(top_global->name), opt2fn("-rerun", nfile, fnm));
614             if (bVerbose)
615             {
616                 fprintf(stderr, "Calculated time to finish depends on nsteps from "
617                         "run input file,\nwhich may not correspond to the time "
618                         "needed to process input trajectory.\n\n");
619             }
620         }
621         else
622         {
623             char tbuf[20];
624             fprintf(stderr, "starting mdrun '%s'\n",
625                     *(top_global->name));
626             if (ir->nsteps >= 0)
627             {
628                 sprintf(tbuf, "%8.1f", (ir->init_step+ir->nsteps)*ir->delta_t);
629             }
630             else
631             {
632                 sprintf(tbuf, "%s", "infinite");
633             }
634             if (ir->init_step > 0)
635             {
636                 fprintf(stderr, "%s steps, %s ps (continuing from step %s, %8.1f ps).\n",
637                         gmx_step_str(ir->init_step+ir->nsteps, sbuf), tbuf,
638                         gmx_step_str(ir->init_step, sbuf2),
639                         ir->init_step*ir->delta_t);
640             }
641             else
642             {
643                 fprintf(stderr, "%s steps, %s ps.\n",
644                         gmx_step_str(ir->nsteps, sbuf), tbuf);
645             }
646         }
647         fprintf(fplog, "\n");
648     }
649
650     walltime_accounting_start(walltime_accounting);
651     wallcycle_start(wcycle, ewcRUN);
652     print_start(fplog, cr, walltime_accounting, "mdrun");
653
654     /* safest point to do file checkpointing is here.  More general point would be immediately before integrator call */
655 #ifdef GMX_FAHCORE
656     chkpt_ret = fcCheckPointParallel( cr->nodeid,
657                                       NULL, 0);
658     if (chkpt_ret == 0)
659     {
660         gmx_fatal( 3, __FILE__, __LINE__, "Checkpoint error on step %d\n", 0 );
661     }
662 #endif
663
664     debug_gmx();
665     /***********************************************************
666      *
667      *             Loop over MD steps
668      *
669      ************************************************************/
670
671     /* if rerunMD then read coordinates and velocities from input trajectory */
672     if (bRerunMD)
673     {
674         if (getenv("GMX_FORCE_UPDATE"))
675         {
676             bForceUpdate = TRUE;
677         }
678
679         rerun_fr.natoms = 0;
680         if (MASTER(cr))
681         {
682             bNotLastFrame = read_first_frame(oenv, &status,
683                                              opt2fn("-rerun", nfile, fnm),
684                                              &rerun_fr, TRX_NEED_X | TRX_READ_V);
685             if (rerun_fr.natoms != top_global->natoms)
686             {
687                 gmx_fatal(FARGS,
688                           "Number of atoms in trajectory (%d) does not match the "
689                           "run input file (%d)\n",
690                           rerun_fr.natoms, top_global->natoms);
691             }
692             if (ir->ePBC != epbcNONE)
693             {
694                 if (!rerun_fr.bBox)
695                 {
696                     gmx_fatal(FARGS, "Rerun trajectory frame step %d time %f does not contain a box, while pbc is used", rerun_fr.step, rerun_fr.time);
697                 }
698                 if (max_cutoff2(ir->ePBC, rerun_fr.box) < sqr(fr->rlistlong))
699                 {
700                     gmx_fatal(FARGS, "Rerun trajectory frame step %d time %f has too small box dimensions", rerun_fr.step, rerun_fr.time);
701                 }
702             }
703         }
704
705         if (PAR(cr))
706         {
707             rerun_parallel_comm(cr, &rerun_fr, &bNotLastFrame);
708         }
709
710         if (ir->ePBC != epbcNONE)
711         {
712             /* Set the shift vectors.
713              * Necessary here when have a static box different from the tpr box.
714              */
715             calc_shifts(rerun_fr.box, fr->shift_vec);
716         }
717     }
718
719     /* loop over MD steps or if rerunMD to end of input trajectory */
720     bFirstStep = TRUE;
721     /* Skip the first Nose-Hoover integration when we get the state from tpx */
722     bStateFromTPX    = !bStateFromCP;
723     bInitStep        = bFirstStep && (bStateFromTPX || bVV);
724     bStartingFromCpt = (Flags & MD_STARTFROMCPT) && bInitStep;
725     bSumEkinhOld     = FALSE;
726     bExchanged       = FALSE;
727     bNeedRepartition = FALSE;
728
729     init_global_signals(&gs, cr, ir, repl_ex_nst);
730
731     step     = ir->init_step;
732     step_rel = 0;
733
734     if (MULTISIM(cr) && (repl_ex_nst <= 0 ))
735     {
736         /* check how many steps are left in other sims */
737         multisim_nsteps = get_multisim_nsteps(cr, ir->nsteps);
738     }
739
740
741     /* and stop now if we should */
742     bLastStep = (bRerunMD || (ir->nsteps >= 0 && step_rel > ir->nsteps) ||
743                  ((multisim_nsteps >= 0) && (step_rel >= multisim_nsteps )));
744     while (!bLastStep || (bRerunMD && bNotLastFrame))
745     {
746
747         /* Determine if this is a neighbor search step */
748         bNStList = (ir->nstlist > 0  && step % ir->nstlist == 0);
749
750         if (bPMETune && bNStList)
751         {
752             /* PME grid + cut-off optimization with GPUs or PME nodes */
753             pme_loadbal_do(pme_loadbal, cr,
754                            (bVerbose && MASTER(cr)) ? stderr : NULL,
755                            fplog,
756                            ir, fr, state, wcycle,
757                            step, step_rel,
758                            &bPMETunePrinting);
759         }
760
761         wallcycle_start(wcycle, ewcSTEP);
762
763         if (bRerunMD)
764         {
765             if (rerun_fr.bStep)
766             {
767                 step     = rerun_fr.step;
768                 step_rel = step - ir->init_step;
769             }
770             if (rerun_fr.bTime)
771             {
772                 t = rerun_fr.time;
773             }
774             else
775             {
776                 t = step;
777             }
778         }
779         else
780         {
781             bLastStep = (step_rel == ir->nsteps);
782             t         = t0 + step*ir->delta_t;
783         }
784
785         if (ir->efep != efepNO || ir->bSimTemp)
786         {
787             /* find and set the current lambdas.  If rerunning, we either read in a state, or a lambda value,
788                requiring different logic. */
789
790             set_current_lambdas(step, ir->fepvals, bRerunMD, &rerun_fr, state_global, state, lam0);
791             bDoDHDL      = do_per_step(step, ir->fepvals->nstdhdl);
792             bDoFEP       = ((ir->efep != efepNO) && do_per_step(step, nstfep));
793             bDoExpanded  = (do_per_step(step, ir->expandedvals->nstexpanded)
794                             && (ir->bExpanded) && (step > 0) && (!bStartingFromCpt));
795         }
796
797         bDoReplEx = ((repl_ex_nst > 0) && (step > 0) && !bLastStep &&
798                      do_per_step(step, repl_ex_nst));
799
800         if (bSimAnn)
801         {
802             update_annealing_target_temp(&(ir->opts), t);
803         }
804
805         if (bRerunMD)
806         {
807             if (!DOMAINDECOMP(cr) || MASTER(cr))
808             {
809                 for (i = 0; i < state_global->natoms; i++)
810                 {
811                     copy_rvec(rerun_fr.x[i], state_global->x[i]);
812                 }
813                 if (rerun_fr.bV)
814                 {
815                     for (i = 0; i < state_global->natoms; i++)
816                     {
817                         copy_rvec(rerun_fr.v[i], state_global->v[i]);
818                     }
819                 }
820                 else
821                 {
822                     for (i = 0; i < state_global->natoms; i++)
823                     {
824                         clear_rvec(state_global->v[i]);
825                     }
826                     if (bRerunWarnNoV)
827                     {
828                         fprintf(stderr, "\nWARNING: Some frames do not contain velocities.\n"
829                                 "         Ekin, temperature and pressure are incorrect,\n"
830                                 "         the virial will be incorrect when constraints are present.\n"
831                                 "\n");
832                         bRerunWarnNoV = FALSE;
833                     }
834                 }
835             }
836             copy_mat(rerun_fr.box, state_global->box);
837             copy_mat(state_global->box, state->box);
838
839             if (vsite && (Flags & MD_RERUN_VSITE))
840             {
841                 if (DOMAINDECOMP(cr))
842                 {
843                     gmx_fatal(FARGS, "Vsite recalculation with -rerun is not implemented with domain decomposition, use a single rank");
844                 }
845                 if (graph)
846                 {
847                     /* Following is necessary because the graph may get out of sync
848                      * with the coordinates if we only have every N'th coordinate set
849                      */
850                     mk_mshift(fplog, graph, fr->ePBC, state->box, state->x);
851                     shift_self(graph, state->box, state->x);
852                 }
853                 construct_vsites(vsite, state->x, ir->delta_t, state->v,
854                                  top->idef.iparams, top->idef.il,
855                                  fr->ePBC, fr->bMolPBC, cr, state->box);
856                 if (graph)
857                 {
858                     unshift_self(graph, state->box, state->x);
859                 }
860             }
861         }
862
863         /* Stop Center of Mass motion */
864         bStopCM = (ir->comm_mode != ecmNO && do_per_step(step, ir->nstcomm));
865
866         if (bRerunMD)
867         {
868             /* for rerun MD always do Neighbour Searching */
869             bNS      = (bFirstStep || ir->nstlist != 0);
870             bNStList = bNS;
871         }
872         else
873         {
874             /* Determine whether or not to do Neighbour Searching and LR */
875             bNS = (bFirstStep || bNStList || bExchanged || bNeedRepartition);
876         }
877
878         /* check whether we should stop because another simulation has
879            stopped. */
880         if (MULTISIM(cr))
881         {
882             if ( (multisim_nsteps >= 0) &&  (step_rel >= multisim_nsteps)  &&
883                  (multisim_nsteps != ir->nsteps) )
884             {
885                 if (bNS)
886                 {
887                     if (MASTER(cr))
888                     {
889                         fprintf(stderr,
890                                 "Stopping simulation %d because another one has finished\n",
891                                 cr->ms->sim);
892                     }
893                     bLastStep         = TRUE;
894                     gs.sig[eglsCHKPT] = 1;
895                 }
896             }
897         }
898
899         /* < 0 means stop at next step, > 0 means stop at next NS step */
900         if ( (gs.set[eglsSTOPCOND] < 0) ||
901              ( (gs.set[eglsSTOPCOND] > 0) && (bNStList || ir->nstlist == 0) ) )
902         {
903             bLastStep = TRUE;
904         }
905
906         /* Determine whether or not to update the Born radii if doing GB */
907         bBornRadii = bFirstStep;
908         if (ir->implicit_solvent && (step % ir->nstgbradii == 0))
909         {
910             bBornRadii = TRUE;
911         }
912
913         /* do_log triggers energy and virial calculation. Because this leads
914          * to different code paths, forces can be different. Thus for exact
915          * continuation we should avoid extra log output.
916          * Note that the || bLastStep can result in non-exact continuation
917          * beyond the last step. But we don't consider that to be an issue.
918          */
919         do_log     = do_per_step(step, ir->nstlog) || (bFirstStep && !bStateFromCP) || bLastStep;
920         do_verbose = bVerbose &&
921             (step % stepout == 0 || bFirstStep || bLastStep);
922
923         if (bNS && !(bFirstStep && ir->bContinuation && !bRerunMD))
924         {
925             if (bRerunMD)
926             {
927                 bMasterState = TRUE;
928             }
929             else
930             {
931                 bMasterState = FALSE;
932                 /* Correct the new box if it is too skewed */
933                 if (DYNAMIC_BOX(*ir))
934                 {
935                     if (correct_box(fplog, step, state->box, graph))
936                     {
937                         bMasterState = TRUE;
938                     }
939                 }
940                 if (DOMAINDECOMP(cr) && bMasterState)
941                 {
942                     dd_collect_state(cr->dd, state, state_global);
943                 }
944             }
945
946             if (DOMAINDECOMP(cr))
947             {
948                 /* Repartition the domain decomposition */
949                 dd_partition_system(fplog, step, cr,
950                                     bMasterState, nstglobalcomm,
951                                     state_global, top_global, ir,
952                                     state, &f, mdatoms, top, fr,
953                                     vsite, shellfc, constr,
954                                     nrnb, wcycle,
955                                     do_verbose && !bPMETunePrinting);
956             }
957         }
958
959         if (MASTER(cr) && do_log)
960         {
961             print_ebin_header(fplog, step, t, state->lambda[efptFEP]); /* can we improve the information printed here? */
962         }
963
964         if (ir->efep != efepNO)
965         {
966             update_mdatoms(mdatoms, state->lambda[efptMASS]);
967         }
968
969         if ((bRerunMD && rerun_fr.bV) || bExchanged)
970         {
971
972             /* We need the kinetic energy at minus the half step for determining
973              * the full step kinetic energy and possibly for T-coupling.*/
974             /* This may not be quite working correctly yet . . . . */
975             compute_globals(fplog, gstat, cr, ir, fr, ekind, state, state_global, mdatoms, nrnb, vcm,
976                             wcycle, enerd, NULL, NULL, NULL, NULL, mu_tot,
977                             constr, NULL, FALSE, state->box,
978                             top_global, &bSumEkinhOld,
979                             CGLO_RERUNMD | CGLO_GSTAT | CGLO_TEMPERATURE);
980         }
981         clear_mat(force_vir);
982
983         /* We write a checkpoint at this MD step when:
984          * either at an NS step when we signalled through gs,
985          * or at the last step (but not when we do not want confout),
986          * but never at the first step or with rerun.
987          */
988         bCPT = (((gs.set[eglsCHKPT] && (bNS || ir->nstlist == 0)) ||
989                  (bLastStep && (Flags & MD_CONFOUT))) &&
990                 step > ir->init_step && !bRerunMD);
991         if (bCPT)
992         {
993             gs.set[eglsCHKPT] = 0;
994         }
995
996         /* Determine the energy and pressure:
997          * at nstcalcenergy steps and at energy output steps (set below).
998          */
999         if (EI_VV(ir->eI) && (!bInitStep))
1000         {
1001             /* for vv, the first half of the integration actually corresponds
1002                to the previous step.  bCalcEner is only required to be evaluated on the 'next' step,
1003                but the virial needs to be calculated on both the current step and the 'next' step. Future
1004                reorganization may be able to get rid of one of the bCalcVir=TRUE steps. */
1005
1006             /* TODO: This is probably not what we want, we will write to energy file one step after nstcalcenergy steps. */
1007             bCalcEnerStep = do_per_step(step - 1, ir->nstcalcenergy);
1008             bCalcVir      = bCalcEnerStep ||
1009                 (ir->epc != epcNO && (do_per_step(step, ir->nstpcouple) || do_per_step(step-1, ir->nstpcouple)));
1010         }
1011         else
1012         {
1013             bCalcEnerStep = do_per_step(step, ir->nstcalcenergy);
1014             bCalcVir      = bCalcEnerStep ||
1015                 (ir->epc != epcNO && do_per_step(step, ir->nstpcouple));
1016         }
1017         bCalcEner = bCalcEnerStep;
1018
1019         do_ene = (do_per_step(step, ir->nstenergy) || bLastStep);
1020
1021         if (do_ene || do_log || bDoReplEx)
1022         {
1023             bCalcVir  = TRUE;
1024             bCalcEner = TRUE;
1025         }
1026
1027         /* Do we need global communication ? */
1028         bGStat = (bCalcVir || bCalcEner || bStopCM ||
1029                   do_per_step(step, nstglobalcomm) ||
1030                   (bVV && IR_NVT_TROTTER(ir) && do_per_step(step-1, nstglobalcomm)));
1031
1032         /* these CGLO_ options remain the same throughout the iteration */
1033         cglo_flags = ((bRerunMD ? CGLO_RERUNMD : 0) |
1034                       (bGStat ? CGLO_GSTAT : 0)
1035                       );
1036
1037         force_flags = (GMX_FORCE_STATECHANGED |
1038                        ((DYNAMIC_BOX(*ir) || bRerunMD) ? GMX_FORCE_DYNAMICBOX : 0) |
1039                        GMX_FORCE_ALLFORCES |
1040                        GMX_FORCE_SEPLRF |
1041                        (bCalcVir ? GMX_FORCE_VIRIAL : 0) |
1042                        (bCalcEner ? GMX_FORCE_ENERGY : 0) |
1043                        (bDoFEP ? GMX_FORCE_DHDL : 0)
1044                        );
1045
1046         if (fr->bTwinRange)
1047         {
1048             if (do_per_step(step, ir->nstcalclr))
1049             {
1050                 force_flags |= GMX_FORCE_DO_LR;
1051             }
1052         }
1053
1054         if (shellfc)
1055         {
1056             /* Now is the time to relax the shells */
1057             count = relax_shell_flexcon(fplog, cr, bVerbose, step,
1058                                         ir, bNS, force_flags,
1059                                         top,
1060                                         constr, enerd, fcd,
1061                                         state, f, force_vir, mdatoms,
1062                                         nrnb, wcycle, graph, groups,
1063                                         shellfc, fr, bBornRadii, t, mu_tot,
1064                                         &bConverged, vsite,
1065                                         mdoutf_get_fp_field(outf));
1066             tcount += count;
1067
1068             if (bConverged)
1069             {
1070                 nconverged++;
1071             }
1072         }
1073         else
1074         {
1075             /* The coordinates (x) are shifted (to get whole molecules)
1076              * in do_force.
1077              * This is parallellized as well, and does communication too.
1078              * Check comments in sim_util.c
1079              */
1080             do_force(fplog, cr, ir, step, nrnb, wcycle, top, groups,
1081                      state->box, state->x, &state->hist,
1082                      f, force_vir, mdatoms, enerd, fcd,
1083                      state->lambda, graph,
1084                      fr, vsite, mu_tot, t, mdoutf_get_fp_field(outf), ed, bBornRadii,
1085                      (bNS ? GMX_FORCE_NS : 0) | force_flags);
1086         }
1087
1088         if (bVV && !bStartingFromCpt && !bRerunMD)
1089         /*  ############### START FIRST UPDATE HALF-STEP FOR VV METHODS############### */
1090         {
1091             rvec *vbuf = NULL;
1092
1093             wallcycle_start(wcycle, ewcUPDATE);
1094             if (ir->eI == eiVV && bInitStep)
1095             {
1096                 /* if using velocity verlet with full time step Ekin,
1097                  * take the first half step only to compute the
1098                  * virial for the first step. From there,
1099                  * revert back to the initial coordinates
1100                  * so that the input is actually the initial step.
1101                  */
1102                 snew(vbuf, state->natoms);
1103                 copy_rvecn(state->v, vbuf, 0, state->natoms); /* should make this better for parallelizing? */
1104             }
1105             else
1106             {
1107                 /* this is for NHC in the Ekin(t+dt/2) version of vv */
1108                 trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ1);
1109             }
1110
1111             /* If we are using twin-range interactions where the long-range component
1112              * is only evaluated every nstcalclr>1 steps, we should do a special update
1113              * step to combine the long-range forces on these steps.
1114              * For nstcalclr=1 this is not done, since the forces would have been added
1115              * directly to the short-range forces already.
1116              *
1117              * TODO Remove various aspects of VV+twin-range in master
1118              * branch, because VV integrators did not ever support
1119              * twin-range multiple time stepping with constraints.
1120              */
1121             bUpdateDoLR = (fr->bTwinRange && do_per_step(step, ir->nstcalclr));
1122
1123             update_coords(fplog, step, ir, mdatoms, state, fr->bMolPBC,
1124                           f, bUpdateDoLR, fr->f_twin, bCalcVir ? &fr->vir_twin_constr : NULL, fcd,
1125                           ekind, M, upd, bInitStep, etrtVELOCITY1,
1126                           cr, nrnb, constr, &top->idef);
1127
1128             if (!bRerunMD || rerun_fr.bV || bForceUpdate)         /* Why is rerun_fr.bV here?  Unclear. */
1129             {
1130                 wallcycle_stop(wcycle, ewcUPDATE);
1131                 update_constraints(fplog, step, NULL, ir, mdatoms,
1132                                    state, fr->bMolPBC, graph, f,
1133                                    &top->idef, shake_vir,
1134                                    cr, nrnb, wcycle, upd, constr,
1135                                    TRUE, bCalcVir);
1136                 wallcycle_start(wcycle, ewcUPDATE);
1137                 if (bCalcVir && bUpdateDoLR && ir->nstcalclr > 1)
1138                 {
1139                     /* Correct the virial for multiple time stepping */
1140                     m_sub(shake_vir, fr->vir_twin_constr, shake_vir);
1141                 }
1142             }
1143             else if (graph)
1144             {
1145                 /* Need to unshift here if a do_force has been
1146                    called in the previous step */
1147                 unshift_self(graph, state->box, state->x);
1148             }
1149             /* if VV, compute the pressure and constraints */
1150             /* For VV2, we strictly only need this if using pressure
1151              * control, but we really would like to have accurate pressures
1152              * printed out.
1153              * Think about ways around this in the future?
1154              * For now, keep this choice in comments.
1155              */
1156             /*bPres = (ir->eI==eiVV || IR_NPT_TROTTER(ir)); */
1157             /*bTemp = ((ir->eI==eiVV &&(!bInitStep)) || (ir->eI==eiVVAK && IR_NPT_TROTTER(ir)));*/
1158             bPres = TRUE;
1159             bTemp = ((ir->eI == eiVV && (!bInitStep)) || (ir->eI == eiVVAK));
1160             if (bCalcEner && ir->eI == eiVVAK)
1161             {
1162                 bSumEkinhOld = TRUE;
1163             }
1164             /* for vv, the first half of the integration actually corresponds to the previous step.
1165                So we need information from the last step in the first half of the integration */
1166             if (bGStat || do_per_step(step-1, nstglobalcomm))
1167             {
1168                 wallcycle_stop(wcycle, ewcUPDATE);
1169                 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, state_global, mdatoms, nrnb, vcm,
1170                                 wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
1171                                 constr, NULL, FALSE, state->box,
1172                                 top_global, &bSumEkinhOld,
1173                                 cglo_flags
1174                                 | CGLO_ENERGY
1175                                 | (bTemp ? CGLO_TEMPERATURE : 0)
1176                                 | (bPres ? CGLO_PRESSURE : 0)
1177                                 | (bPres ? CGLO_CONSTRAINT : 0)
1178                                 | (bStopCM ? CGLO_STOPCM : 0)
1179                                 | CGLO_SCALEEKIN
1180                                 );
1181                 /* explanation of above:
1182                    a) We compute Ekin at the full time step
1183                    if 1) we are using the AveVel Ekin, and it's not the
1184                    initial step, or 2) if we are using AveEkin, but need the full
1185                    time step kinetic energy for the pressure (always true now, since we want accurate statistics).
1186                    b) If we are using EkinAveEkin for the kinetic energy for the temperature control, we still feed in
1187                    EkinAveVel because it's needed for the pressure */
1188                 wallcycle_start(wcycle, ewcUPDATE);
1189             }
1190             /* temperature scaling and pressure scaling to produce the extended variables at t+dt */
1191             if (!bInitStep)
1192             {
1193                 if (bTrotter)
1194                 {
1195                     m_add(force_vir, shake_vir, total_vir);     /* we need the un-dispersion corrected total vir here */
1196                     trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ2);
1197                 }
1198                 else
1199                 {
1200                     if (bExchanged)
1201                     {
1202                         wallcycle_stop(wcycle, ewcUPDATE);
1203                         /* We need the kinetic energy at minus the half step for determining
1204                          * the full step kinetic energy and possibly for T-coupling.*/
1205                         /* This may not be quite working correctly yet . . . . */
1206                         compute_globals(fplog, gstat, cr, ir, fr, ekind, state, state_global, mdatoms, nrnb, vcm,
1207                                         wcycle, enerd, NULL, NULL, NULL, NULL, mu_tot,
1208                                         constr, NULL, FALSE, state->box,
1209                                         top_global, &bSumEkinhOld,
1210                                         CGLO_RERUNMD | CGLO_GSTAT | CGLO_TEMPERATURE);
1211                         wallcycle_start(wcycle, ewcUPDATE);
1212                     }
1213                 }
1214             }
1215             if (bTrotter && !bInitStep)
1216             {
1217                 copy_mat(shake_vir, state->svir_prev);
1218                 copy_mat(force_vir, state->fvir_prev);
1219                 if (IR_NVT_TROTTER(ir) && ir->eI == eiVV)
1220                 {
1221                     /* update temperature and kinetic energy now that step is over - this is the v(t+dt) point */
1222                     enerd->term[F_TEMP] = sum_ekin(&(ir->opts), ekind, NULL, (ir->eI == eiVV), FALSE);
1223                     enerd->term[F_EKIN] = trace(ekind->ekin);
1224                 }
1225             }
1226             /* if it's the initial step, we performed this first step just to get the constraint virial */
1227             if (ir->eI == eiVV && bInitStep)
1228             {
1229                 copy_rvecn(vbuf, state->v, 0, state->natoms);
1230                 sfree(vbuf);
1231             }
1232             wallcycle_stop(wcycle, ewcUPDATE);
1233         }
1234
1235         /* compute the conserved quantity */
1236         if (bVV)
1237         {
1238             saved_conserved_quantity = compute_conserved_from_auxiliary(ir, state, &MassQ);
1239             if (ir->eI == eiVV)
1240             {
1241                 last_ekin = enerd->term[F_EKIN];
1242             }
1243             if ((ir->eDispCorr != edispcEnerPres) && (ir->eDispCorr != edispcAllEnerPres))
1244             {
1245                 saved_conserved_quantity -= enerd->term[F_DISPCORR];
1246             }
1247             /* sum up the foreign energy and dhdl terms for vv.  currently done every step so that dhdl is correct in the .edr */
1248             if (ir->efep != efepNO && !bRerunMD)
1249             {
1250                 sum_dhdl(enerd, state->lambda, ir->fepvals);
1251             }
1252         }
1253
1254         /* ########  END FIRST UPDATE STEP  ############## */
1255         /* ########  If doing VV, we now have v(dt) ###### */
1256         if (bDoExpanded)
1257         {
1258             /* perform extended ensemble sampling in lambda - we don't
1259                actually move to the new state before outputting
1260                statistics, but if performing simulated tempering, we
1261                do update the velocities and the tau_t. */
1262
1263             lamnew = ExpandedEnsembleDynamics(fplog, ir, enerd, state, &MassQ, state->fep_state, &state->dfhist, step, state->v, mdatoms);
1264             /* history is maintained in state->dfhist, but state_global is what is sent to trajectory and log output */
1265             copy_df_history(&state_global->dfhist, &state->dfhist);
1266         }
1267
1268         /* Now we have the energies and forces corresponding to the
1269          * coordinates at time t. We must output all of this before
1270          * the update.
1271          */
1272         do_md_trajectory_writing(fplog, cr, nfile, fnm, step, step_rel, t,
1273                                  ir, state, state_global, top_global, fr,
1274                                  outf, mdebin, ekind, f, f_global,
1275                                  &nchkpt,
1276                                  bCPT, bRerunMD, bLastStep, (Flags & MD_CONFOUT),
1277                                  bSumEkinhOld);
1278         /* Check if IMD step and do IMD communication, if bIMD is TRUE. */
1279         bIMDstep = do_IMD(ir->bIMD, step, cr, bNS, state->box, state->x, ir, t, wcycle);
1280
1281         /* kludge -- virial is lost with restart for MTTK NPT control. Must reload (saved earlier). */
1282         if (bStartingFromCpt && bTrotter)
1283         {
1284             copy_mat(state->svir_prev, shake_vir);
1285             copy_mat(state->fvir_prev, force_vir);
1286         }
1287
1288         elapsed_time = walltime_accounting_get_current_elapsed_time(walltime_accounting);
1289
1290         /* Check whether everything is still allright */
1291         if (((int)gmx_get_stop_condition() > handled_stop_condition)
1292 #ifdef GMX_THREAD_MPI
1293             && MASTER(cr)
1294 #endif
1295             )
1296         {
1297             /* this is just make gs.sig compatible with the hack
1298                of sending signals around by MPI_Reduce with together with
1299                other floats */
1300             if (gmx_get_stop_condition() == gmx_stop_cond_next_ns)
1301             {
1302                 gs.sig[eglsSTOPCOND] = 1;
1303             }
1304             if (gmx_get_stop_condition() == gmx_stop_cond_next)
1305             {
1306                 gs.sig[eglsSTOPCOND] = -1;
1307             }
1308             /* < 0 means stop at next step, > 0 means stop at next NS step */
1309             if (fplog)
1310             {
1311                 fprintf(fplog,
1312                         "\n\nReceived the %s signal, stopping at the next %sstep\n\n",
1313                         gmx_get_signal_name(),
1314                         gs.sig[eglsSTOPCOND] == 1 ? "NS " : "");
1315                 fflush(fplog);
1316             }
1317             fprintf(stderr,
1318                     "\n\nReceived the %s signal, stopping at the next %sstep\n\n",
1319                     gmx_get_signal_name(),
1320                     gs.sig[eglsSTOPCOND] == 1 ? "NS " : "");
1321             fflush(stderr);
1322             handled_stop_condition = (int)gmx_get_stop_condition();
1323         }
1324         else if (MASTER(cr) && (bNS || ir->nstlist <= 0) &&
1325                  (max_hours > 0 && elapsed_time > max_hours*60.0*60.0*0.99) &&
1326                  gs.sig[eglsSTOPCOND] == 0 && gs.set[eglsSTOPCOND] == 0)
1327         {
1328             /* Signal to terminate the run */
1329             gs.sig[eglsSTOPCOND] = 1;
1330             if (fplog)
1331             {
1332                 fprintf(fplog, "\nStep %s: Run time exceeded %.3f hours, will terminate the run\n", gmx_step_str(step, sbuf), max_hours*0.99);
1333             }
1334             fprintf(stderr, "\nStep %s: Run time exceeded %.3f hours, will terminate the run\n", gmx_step_str(step, sbuf), max_hours*0.99);
1335         }
1336
1337         if (bResetCountersHalfMaxH && MASTER(cr) &&
1338             elapsed_time > max_hours*60.0*60.0*0.495)
1339         {
1340             /* Set flag that will communicate the signal to all ranks in the simulation */
1341             gs.sig[eglsRESETCOUNTERS] = 1;
1342         }
1343
1344         /* In parallel we only have to check for checkpointing in steps
1345          * where we do global communication,
1346          *  otherwise the other nodes don't know.
1347          */
1348         if (MASTER(cr) && ((bGStat || !PAR(cr)) &&
1349                            cpt_period >= 0 &&
1350                            (cpt_period == 0 ||
1351                             elapsed_time >= nchkpt*cpt_period*60.0)) &&
1352             gs.set[eglsCHKPT] == 0)
1353         {
1354             gs.sig[eglsCHKPT] = 1;
1355         }
1356
1357         /* at the start of step, randomize or scale the velocities ((if vv. Restriction of Andersen controlled
1358            in preprocessing */
1359
1360         if (ETC_ANDERSEN(ir->etc)) /* keep this outside of update_tcouple because of the extra info required to pass */
1361         {
1362             gmx_bool bIfRandomize;
1363             bIfRandomize = update_randomize_velocities(ir, step, cr, mdatoms, state, upd, constr);
1364             /* if we have constraints, we have to remove the kinetic energy parallel to the bonds */
1365             if (constr && bIfRandomize)
1366             {
1367                 update_constraints(fplog, step, NULL, ir, mdatoms,
1368                                    state, fr->bMolPBC, graph, f,
1369                                    &top->idef, tmp_vir,
1370                                    cr, nrnb, wcycle, upd, constr,
1371                                    TRUE, bCalcVir);
1372             }
1373         }
1374         /* #########   START SECOND UPDATE STEP ################# */
1375         /* Box is changed in update() when we do pressure coupling,
1376          * but we should still use the old box for energy corrections and when
1377          * writing it to the energy file, so it matches the trajectory files for
1378          * the same timestep above. Make a copy in a separate array.
1379          */
1380         copy_mat(state->box, lastbox);
1381
1382         dvdl_constr = 0;
1383
1384         if (!bRerunMD || rerun_fr.bV || bForceUpdate)
1385         {
1386             wallcycle_start(wcycle, ewcUPDATE);
1387             /* UPDATE PRESSURE VARIABLES IN TROTTER FORMULATION WITH CONSTRAINTS */
1388             if (bTrotter)
1389             {
1390                 trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ3);
1391                 /* We can only do Berendsen coupling after we have summed
1392                  * the kinetic energy or virial. Since the happens
1393                  * in global_state after update, we should only do it at
1394                  * step % nstlist = 1 with bGStatEveryStep=FALSE.
1395                  */
1396             }
1397             else
1398             {
1399                 update_tcouple(step, ir, state, ekind, &MassQ, mdatoms);
1400                 update_pcouple(fplog, step, ir, state, pcoupl_mu, M, bInitStep);
1401             }
1402
1403             if (bVV)
1404             {
1405                 bUpdateDoLR = (fr->bTwinRange && do_per_step(step, ir->nstcalclr));
1406
1407                 /* velocity half-step update */
1408                 update_coords(fplog, step, ir, mdatoms, state, fr->bMolPBC, f,
1409                               bUpdateDoLR, fr->f_twin, bCalcVir ? &fr->vir_twin_constr : NULL, fcd,
1410                               ekind, M, upd, FALSE, etrtVELOCITY2,
1411                               cr, nrnb, constr, &top->idef);
1412             }
1413
1414             /* Above, initialize just copies ekinh into ekin,
1415              * it doesn't copy position (for VV),
1416              * and entire integrator for MD.
1417              */
1418
1419             if (ir->eI == eiVVAK)
1420             {
1421                 /* We probably only need md->homenr, not state->natoms */
1422                 if (state->natoms > cbuf_nalloc)
1423                 {
1424                     cbuf_nalloc = state->natoms;
1425                     srenew(cbuf, cbuf_nalloc);
1426                 }
1427                 copy_rvecn(state->x, cbuf, 0, state->natoms);
1428             }
1429             bUpdateDoLR = (fr->bTwinRange && do_per_step(step, ir->nstcalclr));
1430
1431             update_coords(fplog, step, ir, mdatoms, state, fr->bMolPBC, f,
1432                           bUpdateDoLR, fr->f_twin, bCalcVir ? &fr->vir_twin_constr : NULL, fcd,
1433                           ekind, M, upd, bInitStep, etrtPOSITION, cr, nrnb, constr, &top->idef);
1434             wallcycle_stop(wcycle, ewcUPDATE);
1435
1436             update_constraints(fplog, step, &dvdl_constr, ir, mdatoms, state,
1437                                fr->bMolPBC, graph, f,
1438                                &top->idef, shake_vir,
1439                                cr, nrnb, wcycle, upd, constr,
1440                                FALSE, bCalcVir);
1441
1442             if (bCalcVir && bUpdateDoLR && ir->nstcalclr > 1)
1443             {
1444                 /* Correct the virial for multiple time stepping */
1445                 m_sub(shake_vir, fr->vir_twin_constr, shake_vir);
1446             }
1447
1448             if (ir->eI == eiVVAK)
1449             {
1450                 /* erase F_EKIN and F_TEMP here? */
1451                 /* just compute the kinetic energy at the half step to perform a trotter step */
1452                 compute_globals(fplog, gstat, cr, ir, fr, ekind, state, state_global, mdatoms, nrnb, vcm,
1453                                 wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
1454                                 constr, NULL, FALSE, lastbox,
1455                                 top_global, &bSumEkinhOld,
1456                                 cglo_flags | CGLO_TEMPERATURE
1457                                 );
1458                 wallcycle_start(wcycle, ewcUPDATE);
1459                 trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ4);
1460                 /* now we know the scaling, we can compute the positions again again */
1461                 copy_rvecn(cbuf, state->x, 0, state->natoms);
1462
1463                 bUpdateDoLR = (fr->bTwinRange && do_per_step(step, ir->nstcalclr));
1464
1465                 update_coords(fplog, step, ir, mdatoms, state, fr->bMolPBC, f,
1466                               bUpdateDoLR, fr->f_twin, bCalcVir ? &fr->vir_twin_constr : NULL, fcd,
1467                               ekind, M, upd, bInitStep, etrtPOSITION, cr, nrnb, constr, &top->idef);
1468                 wallcycle_stop(wcycle, ewcUPDATE);
1469
1470                 /* do we need an extra constraint here? just need to copy out of state->v to upd->xp? */
1471                 /* are the small terms in the shake_vir here due
1472                  * to numerical errors, or are they important
1473                  * physically? I'm thinking they are just errors, but not completely sure.
1474                  * For now, will call without actually constraining, constr=NULL*/
1475                 update_constraints(fplog, step, NULL, ir, mdatoms,
1476                                    state, fr->bMolPBC, graph, f,
1477                                    &top->idef, tmp_vir,
1478                                    cr, nrnb, wcycle, upd, NULL,
1479                                    FALSE, bCalcVir);
1480             }
1481             if (bVV)
1482             {
1483                 /* this factor or 2 correction is necessary
1484                    because half of the constraint force is removed
1485                    in the vv step, so we have to double it.  See
1486                    the Redmine issue #1255.  It is not yet clear
1487                    if the factor of 2 is exact, or just a very
1488                    good approximation, and this will be
1489                    investigated.  The next step is to see if this
1490                    can be done adding a dhdl contribution from the
1491                    rattle step, but this is somewhat more
1492                    complicated with the current code. Will be
1493                    investigated, hopefully for 4.6.3. However,
1494                    this current solution is much better than
1495                    having it completely wrong.
1496                  */
1497                 enerd->term[F_DVDL_CONSTR] += 2*dvdl_constr;
1498             }
1499             else
1500             {
1501                 enerd->term[F_DVDL_CONSTR] += dvdl_constr;
1502             }
1503         }
1504         else if (graph)
1505         {
1506             /* Need to unshift here */
1507             unshift_self(graph, state->box, state->x);
1508         }
1509
1510         if (vsite != NULL)
1511         {
1512             wallcycle_start(wcycle, ewcVSITECONSTR);
1513             if (graph != NULL)
1514             {
1515                 shift_self(graph, state->box, state->x);
1516             }
1517             construct_vsites(vsite, state->x, ir->delta_t, state->v,
1518                              top->idef.iparams, top->idef.il,
1519                              fr->ePBC, fr->bMolPBC, cr, state->box);
1520
1521             if (graph != NULL)
1522             {
1523                 unshift_self(graph, state->box, state->x);
1524             }
1525             wallcycle_stop(wcycle, ewcVSITECONSTR);
1526         }
1527
1528         /* ############## IF NOT VV, Calculate globals HERE  ############ */
1529         /* With Leap-Frog we can skip compute_globals at
1530          * non-communication steps, but we need to calculate
1531          * the kinetic energy one step before communication.
1532          */
1533         if (bGStat || (!EI_VV(ir->eI) && do_per_step(step+1, nstglobalcomm)))
1534         {
1535             compute_globals(fplog, gstat, cr, ir, fr, ekind, state, state_global, mdatoms, nrnb, vcm,
1536                             wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
1537                             constr, &gs,
1538                             (step_rel % gs.nstms == 0) &&
1539                             (multisim_nsteps < 0 || (step_rel < multisim_nsteps)),
1540                             lastbox,
1541                             top_global, &bSumEkinhOld,
1542                             cglo_flags
1543                             | (!EI_VV(ir->eI) || bRerunMD ? CGLO_ENERGY : 0)
1544                             | (!EI_VV(ir->eI) && bStopCM ? CGLO_STOPCM : 0)
1545                             | (!EI_VV(ir->eI) ? CGLO_TEMPERATURE : 0)
1546                             | (!EI_VV(ir->eI) || bRerunMD ? CGLO_PRESSURE : 0)
1547                             | CGLO_CONSTRAINT
1548                             );
1549         }
1550
1551         /* #############  END CALC EKIN AND PRESSURE ################# */
1552
1553         /* Note: this is OK, but there are some numerical precision issues with using the convergence of
1554            the virial that should probably be addressed eventually. state->veta has better properies,
1555            but what we actually need entering the new cycle is the new shake_vir value. Ideally, we could
1556            generate the new shake_vir, but test the veta value for convergence.  This will take some thought. */
1557
1558         if (ir->efep != efepNO && (!bVV || bRerunMD))
1559         {
1560             /* Sum up the foreign energy and dhdl terms for md and sd.
1561                Currently done every step so that dhdl is correct in the .edr */
1562             sum_dhdl(enerd, state->lambda, ir->fepvals);
1563         }
1564         update_box(fplog, step, ir, mdatoms, state, f,
1565                    pcoupl_mu, nrnb, upd);
1566
1567         /* ################# END UPDATE STEP 2 ################# */
1568         /* #### We now have r(t+dt) and v(t+dt/2)  ############# */
1569
1570         /* The coordinates (x) were unshifted in update */
1571         if (!bGStat)
1572         {
1573             /* We will not sum ekinh_old,
1574              * so signal that we still have to do it.
1575              */
1576             bSumEkinhOld = TRUE;
1577         }
1578
1579         /* #########  BEGIN PREPARING EDR OUTPUT  ###########  */
1580
1581         /* use the directly determined last velocity, not actually the averaged half steps */
1582         if (bTrotter && ir->eI == eiVV)
1583         {
1584             enerd->term[F_EKIN] = last_ekin;
1585         }
1586         enerd->term[F_ETOT] = enerd->term[F_EPOT] + enerd->term[F_EKIN];
1587
1588         if (bVV)
1589         {
1590             enerd->term[F_ECONSERVED] = enerd->term[F_ETOT] + saved_conserved_quantity;
1591         }
1592         else
1593         {
1594             enerd->term[F_ECONSERVED] = enerd->term[F_ETOT] + compute_conserved_from_auxiliary(ir, state, &MassQ);
1595         }
1596         /* #########  END PREPARING EDR OUTPUT  ###########  */
1597
1598         /* Output stuff */
1599         if (MASTER(cr))
1600         {
1601             if (fplog && do_log && bDoExpanded)
1602             {
1603                 /* only needed if doing expanded ensemble */
1604                 PrintFreeEnergyInfoToFile(fplog, ir->fepvals, ir->expandedvals, ir->bSimTemp ? ir->simtempvals : NULL,
1605                                           &state_global->dfhist, state->fep_state, ir->nstlog, step);
1606             }
1607             if (bCalcEner)
1608             {
1609                 upd_mdebin(mdebin, bDoDHDL, bCalcEnerStep,
1610                            t, mdatoms->tmass, enerd, state,
1611                            ir->fepvals, ir->expandedvals, lastbox,
1612                            shake_vir, force_vir, total_vir, pres,
1613                            ekind, mu_tot, constr);
1614             }
1615             else
1616             {
1617                 upd_mdebin_step(mdebin);
1618             }
1619
1620             gmx_bool do_dr  = do_per_step(step, ir->nstdisreout);
1621             gmx_bool do_or  = do_per_step(step, ir->nstorireout);
1622
1623             print_ebin(mdoutf_get_fp_ene(outf), do_ene, do_dr, do_or, do_log ? fplog : NULL,
1624                        step, t,
1625                        eprNORMAL, bCompact, mdebin, fcd, groups, &(ir->opts));
1626
1627             if (ir->bPull)
1628             {
1629                 pull_print_output(ir->pull_work, step, t);
1630             }
1631
1632             if (do_per_step(step, ir->nstlog))
1633             {
1634                 if (fflush(fplog) != 0)
1635                 {
1636                     gmx_fatal(FARGS, "Cannot flush logfile - maybe you are out of disk space?");
1637                 }
1638             }
1639         }
1640         if (bDoExpanded)
1641         {
1642             /* Have to do this part _after_ outputting the logfile and the edr file */
1643             /* Gets written into the state at the beginning of next loop*/
1644             state->fep_state = lamnew;
1645         }
1646         /* Print the remaining wall clock time for the run */
1647         if (MULTIMASTER(cr) &&
1648             (do_verbose || gmx_got_usr_signal()) &&
1649             !bPMETunePrinting)
1650         {
1651             if (shellfc)
1652             {
1653                 fprintf(stderr, "\n");
1654             }
1655             print_time(stderr, walltime_accounting, step, ir, cr);
1656         }
1657
1658         /* Ion/water position swapping.
1659          * Not done in last step since trajectory writing happens before this call
1660          * in the MD loop and exchanges would be lost anyway. */
1661         bNeedRepartition = FALSE;
1662         if ((ir->eSwapCoords != eswapNO) && (step > 0) && !bLastStep &&
1663             do_per_step(step, ir->swap->nstswap))
1664         {
1665             bNeedRepartition = do_swapcoords(cr, step, t, ir, wcycle,
1666                                              bRerunMD ? rerun_fr.x   : state->x,
1667                                              bRerunMD ? rerun_fr.box : state->box,
1668                                              top_global, MASTER(cr) && bVerbose, bRerunMD);
1669
1670             if (bNeedRepartition && DOMAINDECOMP(cr))
1671             {
1672                 dd_collect_state(cr->dd, state, state_global);
1673             }
1674         }
1675
1676         /* Replica exchange */
1677         bExchanged = FALSE;
1678         if (bDoReplEx)
1679         {
1680             bExchanged = replica_exchange(fplog, cr, repl_ex,
1681                                           state_global, enerd,
1682                                           state, step, t);
1683         }
1684
1685         if ( (bExchanged || bNeedRepartition) && DOMAINDECOMP(cr) )
1686         {
1687             dd_partition_system(fplog, step, cr, TRUE, 1,
1688                                 state_global, top_global, ir,
1689                                 state, &f, mdatoms, top, fr,
1690                                 vsite, shellfc, constr,
1691                                 nrnb, wcycle, FALSE);
1692         }
1693
1694         bFirstStep       = FALSE;
1695         bInitStep        = FALSE;
1696         bStartingFromCpt = FALSE;
1697
1698         /* #######  SET VARIABLES FOR NEXT ITERATION IF THEY STILL NEED IT ###### */
1699         /* With all integrators, except VV, we need to retain the pressure
1700          * at the current step for coupling at the next step.
1701          */
1702         if ((state->flags & (1<<estPRES_PREV)) &&
1703             (bGStatEveryStep ||
1704              (ir->nstpcouple > 0 && step % ir->nstpcouple == 0)))
1705         {
1706             /* Store the pressure in t_state for pressure coupling
1707              * at the next MD step.
1708              */
1709             copy_mat(pres, state->pres_prev);
1710         }
1711
1712         /* #######  END SET VARIABLES FOR NEXT ITERATION ###### */
1713
1714         if ( (membed != NULL) && (!bLastStep) )
1715         {
1716             rescale_membed(step_rel, membed, state_global->x);
1717         }
1718
1719         if (bRerunMD)
1720         {
1721             if (MASTER(cr))
1722             {
1723                 /* read next frame from input trajectory */
1724                 bNotLastFrame = read_next_frame(oenv, status, &rerun_fr);
1725             }
1726
1727             if (PAR(cr))
1728             {
1729                 rerun_parallel_comm(cr, &rerun_fr, &bNotLastFrame);
1730             }
1731         }
1732
1733         cycles = wallcycle_stop(wcycle, ewcSTEP);
1734         if (DOMAINDECOMP(cr) && wcycle)
1735         {
1736             dd_cycles_add(cr->dd, cycles, ddCyclStep);
1737         }
1738
1739         if (!bRerunMD || !rerun_fr.bStep)
1740         {
1741             /* increase the MD step number */
1742             step++;
1743             step_rel++;
1744         }
1745
1746         /* TODO make a counter-reset module */
1747         /* If it is time to reset counters, set a flag that remains
1748            true until counters actually get reset */
1749         if (step_rel == wcycle_get_reset_counters(wcycle) ||
1750             gs.set[eglsRESETCOUNTERS] != 0)
1751         {
1752             if (pme_loadbal_is_active(pme_loadbal))
1753             {
1754                 /* Do not permit counter reset while PME load
1755                  * balancing is active. The only purpose for resetting
1756                  * counters is to measure reliable performance data,
1757                  * and that can't be done before balancing
1758                  * completes.
1759                  *
1760                  * TODO consider fixing this by delaying the reset
1761                  * until after load balancing completes,
1762                  * e.g. https://gerrit.gromacs.org/#/c/4964/2 */
1763                 gmx_fatal(FARGS, "PME tuning was still active when attempting to "
1764                           "reset mdrun counters at step %" GMX_PRId64 ". Try "
1765                           "resetting counters later in the run, e.g. with gmx "
1766                           "mdrun -resetstep.", step);
1767             }
1768             reset_all_counters(fplog, cr, step, &step_rel, ir, wcycle, nrnb, walltime_accounting,
1769                                use_GPU(fr->nbv) ? fr->nbv : NULL);
1770             wcycle_set_reset_counters(wcycle, -1);
1771             if (!(cr->duty & DUTY_PME))
1772             {
1773                 /* Tell our PME node to reset its counters */
1774                 gmx_pme_send_resetcounters(cr, step);
1775             }
1776             /* Correct max_hours for the elapsed time */
1777             max_hours                -= elapsed_time/(60.0*60.0);
1778             /* If mdrun -maxh -resethway was active, it can only trigger once */
1779             bResetCountersHalfMaxH    = FALSE; /* TODO move this to where gs.sig[eglsRESETCOUNTERS] is set */
1780             /* Reset can only happen once, so clear the triggering flag. */
1781             gs.set[eglsRESETCOUNTERS] = 0;
1782         }
1783
1784         /* If bIMD is TRUE, the master updates the IMD energy record and sends positions to VMD client */
1785         IMD_prep_energies_send_positions(ir->bIMD && MASTER(cr), bIMDstep, ir->imd, enerd, step, bCalcEner, wcycle);
1786
1787     }
1788     /* End of main MD loop */
1789     debug_gmx();
1790
1791     /* Closing TNG files can include compressing data. Therefore it is good to do that
1792      * before stopping the time measurements. */
1793     mdoutf_tng_close(outf);
1794
1795     /* Stop measuring walltime */
1796     walltime_accounting_end(walltime_accounting);
1797
1798     if (bRerunMD && MASTER(cr))
1799     {
1800         close_trj(status);
1801     }
1802
1803     if (!(cr->duty & DUTY_PME))
1804     {
1805         /* Tell the PME only node to finish */
1806         gmx_pme_send_finish(cr);
1807     }
1808
1809     if (MASTER(cr))
1810     {
1811         if (ir->nstcalcenergy > 0 && !bRerunMD)
1812         {
1813             print_ebin(mdoutf_get_fp_ene(outf), FALSE, FALSE, FALSE, fplog, step, t,
1814                        eprAVER, FALSE, mdebin, fcd, groups, &(ir->opts));
1815         }
1816     }
1817
1818     done_mdoutf(outf);
1819     debug_gmx();
1820
1821     if (bPMETune)
1822     {
1823         pme_loadbal_done(pme_loadbal, cr, fplog, use_GPU(fr->nbv));
1824     }
1825
1826     if (shellfc && fplog)
1827     {
1828         fprintf(fplog, "Fraction of iterations that converged:           %.2f %%\n",
1829                 (nconverged*100.0)/step_rel);
1830         fprintf(fplog, "Average number of force evaluations per MD step: %.2f\n\n",
1831                 tcount/step_rel);
1832     }
1833
1834     if (repl_ex_nst > 0 && MASTER(cr))
1835     {
1836         print_replica_exchange_statistics(fplog, repl_ex);
1837     }
1838
1839     /* IMD cleanup, if bIMD is TRUE. */
1840     IMD_finalize(ir->bIMD, ir->imd);
1841
1842     walltime_accounting_set_nsteps_done(walltime_accounting, step_rel);
1843
1844     return 0;
1845 }