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