From b148b715cf635bc179cdaaafa34a7a5b02dfa080 Mon Sep 17 00:00:00 2001
From: Giovanni Bussi <giovanni.bussi@gmail.com>
Date: Mon, 18 May 2015 19:55:41 +0200
Subject: [PATCH] updated gromacs 5.0 to 5.0.5

---
 .../src/gromacs/CMakeLists.txt                |  0
 .../src/gromacs/CMakeLists.txt.preplumed      |  0
 .../src/gromacs/mdlib/force.c                 |  0
 .../src/gromacs/mdlib/force.c.preplumed       |  0
 .../src/gromacs/mdlib/minimize.c              |  0
 .../src/gromacs/mdlib/minimize.c.preplumed    |  0
 .../src/programs/mdrun/md.c                   | 30 +++++++++++++------
 .../src/programs/mdrun/md.c.preplumed         | 30 +++++++++++++------
 .../src/programs/mdrun/mdrun.cpp              |  0
 .../src/programs/mdrun/mdrun.cpp.preplumed    |  0
 .../src/programs/mdrun/repl_ex.c              |  4 +--
 .../src/programs/mdrun/repl_ex.c.preplumed    |  4 +--
 12 files changed, 46 insertions(+), 22 deletions(-)
 rename patches/{gromacs-5.0.diff => gromacs-5.0.5.diff}/src/gromacs/CMakeLists.txt (100%)
 rename patches/{gromacs-5.0.diff => gromacs-5.0.5.diff}/src/gromacs/CMakeLists.txt.preplumed (100%)
 rename patches/{gromacs-5.0.diff => gromacs-5.0.5.diff}/src/gromacs/mdlib/force.c (100%)
 rename patches/{gromacs-5.0.diff => gromacs-5.0.5.diff}/src/gromacs/mdlib/force.c.preplumed (100%)
 rename patches/{gromacs-5.0.diff => gromacs-5.0.5.diff}/src/gromacs/mdlib/minimize.c (100%)
 rename patches/{gromacs-5.0.diff => gromacs-5.0.5.diff}/src/gromacs/mdlib/minimize.c.preplumed (100%)
 rename patches/{gromacs-5.0.diff => gromacs-5.0.5.diff}/src/programs/mdrun/md.c (98%)
 rename patches/{gromacs-5.0.diff => gromacs-5.0.5.diff}/src/programs/mdrun/md.c.preplumed (98%)
 rename patches/{gromacs-5.0.diff => gromacs-5.0.5.diff}/src/programs/mdrun/mdrun.cpp (100%)
 rename patches/{gromacs-5.0.diff => gromacs-5.0.5.diff}/src/programs/mdrun/mdrun.cpp.preplumed (100%)
 rename patches/{gromacs-5.0.diff => gromacs-5.0.5.diff}/src/programs/mdrun/repl_ex.c (99%)
 rename patches/{gromacs-5.0.diff => gromacs-5.0.5.diff}/src/programs/mdrun/repl_ex.c.preplumed (99%)

diff --git a/patches/gromacs-5.0.diff/src/gromacs/CMakeLists.txt b/patches/gromacs-5.0.5.diff/src/gromacs/CMakeLists.txt
similarity index 100%
rename from patches/gromacs-5.0.diff/src/gromacs/CMakeLists.txt
rename to patches/gromacs-5.0.5.diff/src/gromacs/CMakeLists.txt
diff --git a/patches/gromacs-5.0.diff/src/gromacs/CMakeLists.txt.preplumed b/patches/gromacs-5.0.5.diff/src/gromacs/CMakeLists.txt.preplumed
similarity index 100%
rename from patches/gromacs-5.0.diff/src/gromacs/CMakeLists.txt.preplumed
rename to patches/gromacs-5.0.5.diff/src/gromacs/CMakeLists.txt.preplumed
diff --git a/patches/gromacs-5.0.diff/src/gromacs/mdlib/force.c b/patches/gromacs-5.0.5.diff/src/gromacs/mdlib/force.c
similarity index 100%
rename from patches/gromacs-5.0.diff/src/gromacs/mdlib/force.c
rename to patches/gromacs-5.0.5.diff/src/gromacs/mdlib/force.c
diff --git a/patches/gromacs-5.0.diff/src/gromacs/mdlib/force.c.preplumed b/patches/gromacs-5.0.5.diff/src/gromacs/mdlib/force.c.preplumed
similarity index 100%
rename from patches/gromacs-5.0.diff/src/gromacs/mdlib/force.c.preplumed
rename to patches/gromacs-5.0.5.diff/src/gromacs/mdlib/force.c.preplumed
diff --git a/patches/gromacs-5.0.diff/src/gromacs/mdlib/minimize.c b/patches/gromacs-5.0.5.diff/src/gromacs/mdlib/minimize.c
similarity index 100%
rename from patches/gromacs-5.0.diff/src/gromacs/mdlib/minimize.c
rename to patches/gromacs-5.0.5.diff/src/gromacs/mdlib/minimize.c
diff --git a/patches/gromacs-5.0.diff/src/gromacs/mdlib/minimize.c.preplumed b/patches/gromacs-5.0.5.diff/src/gromacs/mdlib/minimize.c.preplumed
similarity index 100%
rename from patches/gromacs-5.0.diff/src/gromacs/mdlib/minimize.c.preplumed
rename to patches/gromacs-5.0.5.diff/src/gromacs/mdlib/minimize.c.preplumed
diff --git a/patches/gromacs-5.0.diff/src/programs/mdrun/md.c b/patches/gromacs-5.0.5.diff/src/programs/mdrun/md.c
similarity index 98%
rename from patches/gromacs-5.0.diff/src/programs/mdrun/md.c
rename to patches/gromacs-5.0.5.diff/src/programs/mdrun/md.c
index b34d23c71..449bae0bd 100644
--- a/patches/gromacs-5.0.diff/src/programs/mdrun/md.c
+++ b/patches/gromacs-5.0.5.diff/src/programs/mdrun/md.c
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2012,2013,2014, by the GROMACS development team, led by
+ * Copyright (c) 2011,2012,2013,2014,2015, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -203,7 +203,8 @@ double do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
     gmx_bool          bVV, bIterativeCase, bFirstIterate, bTemp, bPres, bTrotter;
     gmx_bool          bUpdateDoLR;
     real              dvdl_constr;
-    rvec             *cbuf = NULL;
+    rvec             *cbuf        = NULL;
+    int               cbuf_nalloc = 0;
     matrix            lastbox;
     real              veta_save, scalevir, tracevir;
     real              vetanew = 0;
@@ -259,10 +260,6 @@ double do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
        md-vv-avek uses averaged half step velocities for T-control (but full step ekin for P control)
        md uses averaged half step kinetic energies to determine temperature unless defined otherwise by GMX_EKIN_AVE_VEL; */
     bVV = EI_VV(ir->eI);
-    if (bVV) /* to store the initial velocities while computing virial */
-    {
-        snew(cbuf, top_global->natoms);
-    }
     /* all the iteratative cases - only if there are constraints */
     bIterativeCase = ((IR_NPH_TROTTER(ir) || IR_NPT_TROTTER(ir)) && (constr) && (!bRerunMD));
     gmx_iterate_init(&iterate, FALSE); /* The default value of iterate->bIterationActive is set to
@@ -365,6 +362,11 @@ double do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
         gmx_fatal(FARGS, "Normal Mode analysis is not supported with virtual sites.\nIf you'd like to help with adding support, we have an open discussion at http://redmine.gromacs.org/issues/879\n");
     }
 
+    if (bRerunMD && fr->cutoff_scheme == ecutsVERLET && ir->opts.ngener > 1 && fr->nbv && fr->nbv->bUseGPU)
+    {
+        gmx_fatal(FARGS, "The Verlet scheme on GPUs does not support energy groups, so your rerun should probably use a .tpr file without energy groups, or mdrun -nb auto");
+    }
+
     if (DEFORM(*ir))
     {
         tMPI_Thread_mutex_lock(&deform_init_box_mutex);
@@ -1183,6 +1185,8 @@ double do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
         if (bVV && !bStartingFromCpt && !bRerunMD)
         /*  ############### START FIRST UPDATE HALF-STEP FOR VV METHODS############### */
         {
+            rvec *vbuf = NULL;
+
             wallcycle_start(wcycle, ewcUPDATE);
             if (ir->eI == eiVV && bInitStep)
             {
@@ -1192,7 +1196,8 @@ double do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
                  * revert back to the initial coordinates
                  * so that the input is actually the initial step.
                  */
-                copy_rvecn(state->v, cbuf, 0, state->natoms); /* should make this better for parallelizing? */
+                snew(vbuf, state->natoms);
+                copy_rvecn(state->v, vbuf, 0, state->natoms); /* should make this better for parallelizing? */
             }
             else
             {
@@ -1374,9 +1379,10 @@ double do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
                 }
             }
             /* if it's the initial step, we performed this first step just to get the constraint virial */
-            if (bInitStep && ir->eI == eiVV)
+            if (ir->eI == eiVV && bInitStep)
             {
-                copy_rvecn(cbuf, state->v, 0, state->natoms);
+                copy_rvecn(vbuf, state->v, 0, state->natoms);
+                sfree(vbuf);
             }
             wallcycle_stop(wcycle, ewcUPDATE);
         }
@@ -1632,6 +1638,12 @@ double do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
 
                 if (ir->eI == eiVVAK)
                 {
+                    /* We probably only need md->homenr, not state->natoms */
+                    if (state->natoms > cbuf_nalloc)
+                    {
+                        cbuf_nalloc = state->natoms;
+                        srenew(cbuf, cbuf_nalloc);
+                    }
                     copy_rvecn(state->x, cbuf, 0, state->natoms);
                 }
                 bUpdateDoLR = (fr->bTwinRange && do_per_step(step, ir->nstcalclr));
diff --git a/patches/gromacs-5.0.diff/src/programs/mdrun/md.c.preplumed b/patches/gromacs-5.0.5.diff/src/programs/mdrun/md.c.preplumed
similarity index 98%
rename from patches/gromacs-5.0.diff/src/programs/mdrun/md.c.preplumed
rename to patches/gromacs-5.0.5.diff/src/programs/mdrun/md.c.preplumed
index 3d98d597c..73cc2103e 100644
--- a/patches/gromacs-5.0.diff/src/programs/mdrun/md.c.preplumed
+++ b/patches/gromacs-5.0.5.diff/src/programs/mdrun/md.c.preplumed
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2012,2013,2014, by the GROMACS development team, led by
+ * Copyright (c) 2011,2012,2013,2014,2015, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -197,7 +197,8 @@ double do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
     gmx_bool          bVV, bIterativeCase, bFirstIterate, bTemp, bPres, bTrotter;
     gmx_bool          bUpdateDoLR;
     real              dvdl_constr;
-    rvec             *cbuf = NULL;
+    rvec             *cbuf        = NULL;
+    int               cbuf_nalloc = 0;
     matrix            lastbox;
     real              veta_save, scalevir, tracevir;
     real              vetanew = 0;
@@ -247,10 +248,6 @@ double do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
        md-vv-avek uses averaged half step velocities for T-control (but full step ekin for P control)
        md uses averaged half step kinetic energies to determine temperature unless defined otherwise by GMX_EKIN_AVE_VEL; */
     bVV = EI_VV(ir->eI);
-    if (bVV) /* to store the initial velocities while computing virial */
-    {
-        snew(cbuf, top_global->natoms);
-    }
     /* all the iteratative cases - only if there are constraints */
     bIterativeCase = ((IR_NPH_TROTTER(ir) || IR_NPT_TROTTER(ir)) && (constr) && (!bRerunMD));
     gmx_iterate_init(&iterate, FALSE); /* The default value of iterate->bIterationActive is set to
@@ -353,6 +350,11 @@ double do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
         gmx_fatal(FARGS, "Normal Mode analysis is not supported with virtual sites.\nIf you'd like to help with adding support, we have an open discussion at http://redmine.gromacs.org/issues/879\n");
     }
 
+    if (bRerunMD && fr->cutoff_scheme == ecutsVERLET && ir->opts.ngener > 1 && fr->nbv && fr->nbv->bUseGPU)
+    {
+        gmx_fatal(FARGS, "The Verlet scheme on GPUs does not support energy groups, so your rerun should probably use a .tpr file without energy groups, or mdrun -nb auto");
+    }
+
     if (DEFORM(*ir))
     {
         tMPI_Thread_mutex_lock(&deform_init_box_mutex);
@@ -1089,6 +1091,8 @@ double do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
         if (bVV && !bStartingFromCpt && !bRerunMD)
         /*  ############### START FIRST UPDATE HALF-STEP FOR VV METHODS############### */
         {
+            rvec *vbuf = NULL;
+
             wallcycle_start(wcycle, ewcUPDATE);
             if (ir->eI == eiVV && bInitStep)
             {
@@ -1098,7 +1102,8 @@ double do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
                  * revert back to the initial coordinates
                  * so that the input is actually the initial step.
                  */
-                copy_rvecn(state->v, cbuf, 0, state->natoms); /* should make this better for parallelizing? */
+                snew(vbuf, state->natoms);
+                copy_rvecn(state->v, vbuf, 0, state->natoms); /* should make this better for parallelizing? */
             }
             else
             {
@@ -1280,9 +1285,10 @@ double do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
                 }
             }
             /* if it's the initial step, we performed this first step just to get the constraint virial */
-            if (bInitStep && ir->eI == eiVV)
+            if (ir->eI == eiVV && bInitStep)
             {
-                copy_rvecn(cbuf, state->v, 0, state->natoms);
+                copy_rvecn(vbuf, state->v, 0, state->natoms);
+                sfree(vbuf);
             }
             wallcycle_stop(wcycle, ewcUPDATE);
         }
@@ -1538,6 +1544,12 @@ double do_md(FILE *fplog, t_commrec *cr, int nfile, const t_filenm fnm[],
 
                 if (ir->eI == eiVVAK)
                 {
+                    /* We probably only need md->homenr, not state->natoms */
+                    if (state->natoms > cbuf_nalloc)
+                    {
+                        cbuf_nalloc = state->natoms;
+                        srenew(cbuf, cbuf_nalloc);
+                    }
                     copy_rvecn(state->x, cbuf, 0, state->natoms);
                 }
                 bUpdateDoLR = (fr->bTwinRange && do_per_step(step, ir->nstcalclr));
diff --git a/patches/gromacs-5.0.diff/src/programs/mdrun/mdrun.cpp b/patches/gromacs-5.0.5.diff/src/programs/mdrun/mdrun.cpp
similarity index 100%
rename from patches/gromacs-5.0.diff/src/programs/mdrun/mdrun.cpp
rename to patches/gromacs-5.0.5.diff/src/programs/mdrun/mdrun.cpp
diff --git a/patches/gromacs-5.0.diff/src/programs/mdrun/mdrun.cpp.preplumed b/patches/gromacs-5.0.5.diff/src/programs/mdrun/mdrun.cpp.preplumed
similarity index 100%
rename from patches/gromacs-5.0.diff/src/programs/mdrun/mdrun.cpp.preplumed
rename to patches/gromacs-5.0.5.diff/src/programs/mdrun/mdrun.cpp.preplumed
diff --git a/patches/gromacs-5.0.diff/src/programs/mdrun/repl_ex.c b/patches/gromacs-5.0.5.diff/src/programs/mdrun/repl_ex.c
similarity index 99%
rename from patches/gromacs-5.0.diff/src/programs/mdrun/repl_ex.c
rename to patches/gromacs-5.0.5.diff/src/programs/mdrun/repl_ex.c
index cfb0b7f35..af47b1d3b 100644
--- a/patches/gromacs-5.0.diff/src/programs/mdrun/repl_ex.c
+++ b/patches/gromacs-5.0.5.diff/src/programs/mdrun/repl_ex.c
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2012,2013,2014, by the GROMACS development team, led by
+ * Copyright (c) 2011,2012,2013,2014,2015, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -415,7 +415,7 @@ gmx_repl_ex_t init_replica_exchange(FILE *fplog,
     snew(re->order, re->nrepl);
     for (i = 0; i < re->nrepl; i++)
     {
-        snew(re->cyclic[i], re->nrepl);
+        snew(re->cyclic[i], re->nrepl+1);
         snew(re->order[i], re->nrepl);
     }
     /* allocate space for the functions storing the data for the replicas */
diff --git a/patches/gromacs-5.0.diff/src/programs/mdrun/repl_ex.c.preplumed b/patches/gromacs-5.0.5.diff/src/programs/mdrun/repl_ex.c.preplumed
similarity index 99%
rename from patches/gromacs-5.0.diff/src/programs/mdrun/repl_ex.c.preplumed
rename to patches/gromacs-5.0.5.diff/src/programs/mdrun/repl_ex.c.preplumed
index 46a9bc011..5db5d309c 100644
--- a/patches/gromacs-5.0.diff/src/programs/mdrun/repl_ex.c.preplumed
+++ b/patches/gromacs-5.0.5.diff/src/programs/mdrun/repl_ex.c.preplumed
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2012,2013,2014, by the GROMACS development team, led by
+ * Copyright (c) 2011,2012,2013,2014,2015, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -400,7 +400,7 @@ gmx_repl_ex_t init_replica_exchange(FILE *fplog,
     snew(re->order, re->nrepl);
     for (i = 0; i < re->nrepl; i++)
     {
-        snew(re->cyclic[i], re->nrepl);
+        snew(re->cyclic[i], re->nrepl+1);
         snew(re->order[i], re->nrepl);
     }
     /* allocate space for the functions storing the data for the replicas */
-- 
GitLab