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