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