From 8af4258a4da8d7c0946d13886ce408257c40d29b Mon Sep 17 00:00:00 2001
From: Carlo Camilloni <carlo.camilloni@gmail.com>
Date: Fri, 24 Apr 2015 15:20:57 +0200
Subject: [PATCH] gromacs 4.5

- updated patch to include api version
- updated patch to inclide virial fix
- updated patch to gromacs 4.5.7
---
 ...macs-4.5.5.config => gromacs-4.5.7.config} |   0
 ...{gromacs-4.5.5.diff => gromacs-4.5.7.diff} | 172 ++++++++++--------
 2 files changed, 101 insertions(+), 71 deletions(-)
 rename patches/{gromacs-4.5.5.config => gromacs-4.5.7.config} (100%)
 rename patches/{gromacs-4.5.5.diff => gromacs-4.5.7.diff} (70%)

diff --git a/patches/gromacs-4.5.5.config b/patches/gromacs-4.5.7.config
similarity index 100%
rename from patches/gromacs-4.5.5.config
rename to patches/gromacs-4.5.7.config
diff --git a/patches/gromacs-4.5.5.diff b/patches/gromacs-4.5.7.diff
similarity index 70%
rename from patches/gromacs-4.5.5.diff
rename to patches/gromacs-4.5.7.diff
index d4d422de4..8eeb506ac 100644
--- a/patches/gromacs-4.5.5.diff
+++ b/patches/gromacs-4.5.7.diff
@@ -18,7 +18,24 @@ patch -u -l -b -F 5 --suffix=.preplumed "./src/kernel/md.c" << \EOF_EOF
  #endif
  #ifdef GMX_THREADS
  #include "tmpi.h"
-@@ -427,13 +433,14 @@
+@@ -193,10 +199,16 @@
+ #ifdef GMX_FAHCORE
+     /* Temporary addition for FAHCORE checkpointing */
+     int chkpt_ret;
+ #endif
+ 
++    /* PLUMED */
++    int plumedNeedsEnergy=0;
++    int plumedWantsToStop=0;
++    matrix plumed_vir;
++    /* END PLUMED */
++
+     /* Check for special mdrun options */
+     bRerunMD = (Flags & MD_RERUN);
+     bIonize  = (Flags & MD_IONIZE);
+     bFFscan  = (Flags & MD_FFSCAN);
+     bAppend  = (Flags & MD_APPENDFILES);
+@@ -440,13 +452,14 @@
          check_nst_param(fplog,cr,"nstcalcenergy",ir->nstcalcenergy,
                          "repl_ex_nst",&repl_ex_nst);
          /* This check needs to happen before inter-simulation
@@ -34,116 +51,129 @@ patch -u -l -b -F 5 --suffix=.preplumed "./src/kernel/md.c" << \EOF_EOF
      {
          if (mdatoms->cFREEZE && (state->flags & (1<<estV)))
          {
-@@ -574,10 +581,55 @@
+@@ -588,10 +601,57 @@
              }
          }
          fprintf(fplog,"\n");
      }
  
-+/* PLUMED */
-+  if(plumedswitch){
-+    if(cr->ms && cr->ms->nsim>1) {
-+      if(MASTER(cr)) plumed_cmd(plumedmain,"GREX setMPIIntercomm",&cr->ms->mpi_comm_masters);
++    /* PLUMED */
++    if(plumedswitch){
++      /* detect plumed API version */
++      int pversion=0;
++      plumed_cmd(plumedmain,"getApiVersion",&pversion);
++      /* setting kbT is only implemented with api>1) */
++      real kbT=ir->opts.ref_t[0]*BOLTZ;
++      if(pversion>1) plumed_cmd(plumedmain,"setKbT",&kbT);
++
++      if(cr->ms && cr->ms->nsim>1) {
++        if(MASTER(cr)) plumed_cmd(plumedmain,"GREX setMPIIntercomm",&cr->ms->mpi_comm_masters);
++        if(PAR(cr)){
++          if(DOMAINDECOMP(cr)) {
++            plumed_cmd(plumedmain,"GREX setMPIIntracomm",&cr->dd->mpi_comm_all);
++          }else{
++            plumed_cmd(plumedmain,"GREX setMPIIntracomm",&cr->mpi_comm_mysim);
++          }
++        }
++        plumed_cmd(plumedmain,"GREX init",NULL);
++      }
 +      if(PAR(cr)){
 +        if(DOMAINDECOMP(cr)) {
-+          plumed_cmd(plumedmain,"GREX setMPIIntracomm",&cr->dd->mpi_comm_all);
++          plumed_cmd(plumedmain,"setMPIComm",&cr->dd->mpi_comm_all);
 +        }else{
-+          plumed_cmd(plumedmain,"GREX setMPIIntracomm",&cr->mpi_comm_mysim);
++          plumed_cmd(plumedmain,"setMPIComm",&cr->mpi_comm_mysim);
 +        }
 +      }
-+      plumed_cmd(plumedmain,"GREX init",NULL);
-+    }
-+
-+    if(PAR(cr)){
-+      if(DOMAINDECOMP(cr)) {
-+        plumed_cmd(plumedmain,"setMPIComm",&cr->dd->mpi_comm_all);
-+      }else{
-+        plumed_cmd(plumedmain,"setMPIComm",&cr->mpi_comm_mysim);
-+      }
-+    }
++      plumed_cmd(plumedmain,"setNatoms",&top_global->natoms);
++      plumed_cmd(plumedmain,"setMDEngine","gromacs");
++      plumed_cmd(plumedmain,"setLog",fplog);
++      real real_delta_t;
++      real_delta_t=ir->delta_t;
++      plumed_cmd(plumedmain,"setTimestep",&real_delta_t);
++      plumed_cmd(plumedmain,"init",NULL);
 +
-+    plumed_cmd(plumedmain,"setNatoms",&top_global->natoms);
-+    plumed_cmd(plumedmain,"setMDEngine","gromacs");
-+    plumed_cmd(plumedmain,"setLog",fplog);
-+    real real_delta_t;
-+    real_delta_t=ir->delta_t;
-+    plumed_cmd(plumedmain,"setTimestep",&real_delta_t);
-+
-+    plumed_cmd(plumedmain,"init",NULL);
-+
-+
-+    if(PAR(cr)){
-+      if(DOMAINDECOMP(cr)) {
-+        plumed_cmd(plumedmain,"setAtomsNlocal",&cr->dd->nat_home);
-+        plumed_cmd(plumedmain,"setAtomsGatindex",cr->dd->gatindex);
-+      }else{
-+        plumed_cmd(plumedmain,"setAtomsNlocal",&mdatoms->homenr);
-+        plumed_cmd(plumedmain,"setAtomsContiguous",&mdatoms->start);
++      if(PAR(cr)){
++        if(DOMAINDECOMP(cr)) {
++          plumed_cmd(plumedmain,"setAtomsNlocal",&cr->dd->nat_home);
++          plumed_cmd(plumedmain,"setAtomsGatindex",cr->dd->gatindex);
++        }else{
++          plumed_cmd(plumedmain,"setAtomsNlocal",&mdatoms->homenr);
++          plumed_cmd(plumedmain,"setAtomsContiguous",&mdatoms->start);
++        }
 +      }
 +    }
-+  }
-+/* END PLUMED */
-+
++    /* END PLUMED */
 +
      /* Set and write start time */
      runtime_start(runtime);
      print_date_and_time(fplog,cr->nodeid,"Started mdrun",runtime);
      wallcycle_start(wcycle,ewcRUN);
      if (fplog)
-@@ -884,10 +936,17 @@
+@@ -898,10 +958,17 @@
                                      state,&f,mdatoms,top,fr,
                                      vsite,shellfc,constr,
                                      nrnb,wcycle,do_verbose);
                  wallcycle_stop(wcycle,ewcDOMDEC);
                  /* If using an iterative integrator, reallocate space to match the decomposition */
-+/* PLUMED */
-+        if(plumedswitch){
-+          plumed_cmd(plumedmain,"setAtomsNlocal",&cr->dd->nat_home);
-+          plumed_cmd(plumedmain,"setAtomsGatindex",cr->dd->gatindex);
-+        }
-+/* END PLUMED */
 +
++                /* PLUMED */
++                if(plumedswitch){
++                  plumed_cmd(plumedmain,"setAtomsNlocal",&cr->dd->nat_home);
++                  plumed_cmd(plumedmain,"setAtomsGatindex",cr->dd->gatindex);
++                }
++                /* END PLUMED */
              }
          }
  
          if (MASTER(cr) && do_log && !bFFscan)
          {
-@@ -1010,16 +1069,40 @@
+@@ -1038,16 +1105,50 @@
               * in do_force.
               * This is parallellized as well, and does communication too. 
               * Check comments in sim_util.c
               */
          
 +
-+ /* PLUMED */
-+       if(plumedswitch){
-+         long int lstep=step; plumed_cmd(plumedmain,"setStepLong",&lstep);
-+         plumed_cmd(plumedmain,"setPositions",&state->x[mdatoms->start][0]);
-+         plumed_cmd(plumedmain,"setMasses",&mdatoms->massT[mdatoms->start]);
-+         plumed_cmd(plumedmain,"setCharges",&mdatoms->chargeA[mdatoms->start]);
-+         plumed_cmd(plumedmain,"setBox",&state->box[0][0]);
-+
-+         plumed_cmd(plumedmain,"prepareCalc",NULL);
-+       }
-+ /* END PLUMED */
-+
++            /* PLUMED */
++            plumedNeedsEnergy=0;
++            if(plumedswitch){
++              long int lstep=step; plumed_cmd(plumedmain,"setStepLong",&lstep);
++              plumed_cmd(plumedmain,"setPositions",&state->x[mdatoms->start][0]);
++              plumed_cmd(plumedmain,"setMasses",&mdatoms->massT[mdatoms->start]);
++              plumed_cmd(plumedmain,"setCharges",&mdatoms->chargeA[mdatoms->start]);
++              plumed_cmd(plumedmain,"setBox",&state->box[0][0]);
++              plumed_cmd(plumedmain,"prepareCalc",NULL);
++              plumed_cmd(plumedmain,"setStopFlag",&plumedWantsToStop);
++              plumed_cmd(plumedmain,"setForces",&f[mdatoms->start][0]);
++              plumed_cmd(plumedmain,"isEnergyNeeded",&plumedNeedsEnergy);
++              clear_mat(plumed_vir);
++              plumed_cmd(plumedmain,"setVirial",&plumed_vir[0][0]);
++            }
++            /* END PLUMED */
              do_force(fplog,cr,ir,step,nrnb,wcycle,top,top_global,groups,
                       state->box,state->x,&state->hist,
                       f,force_vir,mdatoms,enerd,fcd,
                       state->lambda,graph,
                       fr,vsite,mu_tot,t,outf->fp_field,ed,bBornRadii,
-                      (bNS ? GMX_FORCE_NS : 0) | force_flags);
-+ /* PLUMED */
-+       if(plumedswitch){
-+         plumed_cmd(plumedmain,"setEnergy",&enerd->term[F_EPOT]);
-+         plumed_cmd(plumedmain,"setForces",&f[mdatoms->start][0]);
-+         plumed_cmd(plumedmain,"setVirial",&force_vir[0][0]);
-+         plumed_cmd(plumedmain,"performCalc",NULL);
-+         if ((repl_ex_nst > 0) && (step > 0) && !bLastStep &&
-+            do_per_step(step,repl_ex_nst)) plumed_cmd(plumedmain,"GREX savePositions",NULL);
-+       }
-+ /* END PLUMED */
-+
+-                     (bNS ? GMX_FORCE_NS : 0) | force_flags);
++                     (plumedNeedsEnergy? GMX_FORCE_ENERGY : 0) |(bNS ? GMX_FORCE_NS : 0) | force_flags);
++            /* PLUMED */
++            if(plumedswitch){
++              if(plumedNeedsEnergy){
++                msmul(force_vir,2.0,plumed_vir);
++                plumed_cmd(plumedmain,"setEnergy",&enerd->term[F_EPOT]);
++                plumed_cmd(plumedmain,"performCalc",NULL);
++                msmul(plumed_vir,0.5,force_vir);
++              } else {
++                msmul(plumed_vir,0.5,plumed_vir);
++                plumed_cmd(plumedmain,"performCalc",NULL);
++                m_add(force_vir,plumed_vir,force_vir);
++              }
++              if ((repl_ex_nst > 0) && (step > 0) && !bLastStep &&
++                 do_per_step(step,repl_ex_nst)) plumed_cmd(plumedmain,"GREX savePositions",NULL);
++              if(plumedWantsToStop) ir->nsteps=step_rel+1;
++            }
++            /* END PLUMED */
          }
      
          GMX_BARRIER(cr->mpi_comm_mygroup);
@@ -182,7 +212,7 @@ patch -u -l -b -F 5 --suffix=.preplumed "./src/kernel/mdrun.c" << \EOF_EOF
  #define NFILE asize(fnm)
  
    /* Command line options ! */
-@@ -662,16 +669,52 @@
+@@ -663,16 +670,52 @@
  
    ddxyz[XX] = (int)(realddxyz[XX] + 0.5);
    ddxyz[YY] = (int)(realddxyz[YY] + 0.5);
-- 
GitLab