Checkpoints backward-compatible + more consistency checks in g_bar.
authorSander Pronk <pronk@cbr.su.se>
Fri, 17 Sep 2010 11:35:50 +0000 (13:35 +0200)
committerSander Pronk <pronk@cbr.su.se>
Fri, 17 Sep 2010 11:35:50 +0000 (13:35 +0200)
include/types/state.h
src/gmxlib/checkpoint.c
src/mdlib/mdebin_bar.c
src/tools/gmx_bar.c

index 4501d1849f9cf3c49a06d4d94cda551e0f02b62b..4e753e7efe863855fba335cd782cea4d15ff5b86 100644 (file)
@@ -108,6 +108,9 @@ typedef struct
 
     double start_time;     /* the start time of these energy diff blocks */
     double start_lambda;   /* lambda at start time */
+
+    gmx_bool start_lambda_set; /* whether the lambda value is set. Here
+                                  For backward-compatibility. */
 } delta_h_history_t; 
 
 typedef struct
index 9015a3e7e4c0f3bd62395f6baab316359a21986c..0d0b74a5db4e2b86fc8840dbd46499c0bb418991 100644 (file)
@@ -101,7 +101,8 @@ enum { eenhENERGY_N, eenhENERGY_AVER, eenhENERGY_SUM, eenhENERGY_NSUM,
        eenhENERGY_SUM_SIM, eenhENERGY_NSUM_SIM,
        eenhENERGY_NSTEPS, eenhENERGY_NSTEPS_SIM, 
        eenhENERGY_DELTA_H_NN,
-       eenhENERGY_DELTA_H_LIST, eenhENERGY_DELTA_H_STARTTIME, 
+       eenhENERGY_DELTA_H_LIST, 
+       eenhENERGY_DELTA_H_STARTTIME, 
        eenhENERGY_DELTA_H_STARTLAMBDA, 
        eenhNR };
 
@@ -111,7 +112,8 @@ const char *eenh_names[eenhNR]=
     "energy_sum_sim", "energy_nsum_sim",
     "energy_nsteps", "energy_nsteps_sim", 
     "energy_delta_h_nn",
-    "energy_delta_h_list", "energy_delta_h_start_time", 
+    "energy_delta_h_list", 
+    "energy_delta_h_start_time", 
     "energy_delta_h_start_lambda"
 };
 
@@ -957,6 +959,7 @@ static int do_cpt_enerhist(XDR *xd,gmx_bool bRead,
             snew(enerhist->dht,1);
             enerhist->dht->ndh = NULL;
             enerhist->dht->dh = NULL;
+            enerhist->dht->start_lambda_set=FALSE;
         }
     }
 
@@ -996,6 +999,7 @@ static int do_cpt_enerhist(XDR *xd,gmx_bool bRead,
                     ret=do_cpte_double(xd, 2, i, fflags, &(enerhist->dht->start_time), list); break;
                 case eenhENERGY_DELTA_H_STARTLAMBDA: 
                     ret=do_cpte_double(xd, 2, i, fflags, &(enerhist->dht->start_lambda), list); break;
+                    enerhist->dht->start_lambda_set=TRUE;
                 default:
                     gmx_fatal(FARGS,"Unknown energy history entry %d\n"
                               "You are probably reading a new checkpoint file with old code",i);
@@ -1226,7 +1230,8 @@ void write_checkpoint(const char *fn,gmx_bool bNumberAndKeep,
         {
             flags_enh |= ( (1<< eenhENERGY_DELTA_H_NN) |
                            (1<< eenhENERGY_DELTA_H_LIST) | 
-                           (1<< eenhENERGY_DELTA_H_STARTTIME) );
+                           (1<< eenhENERGY_DELTA_H_STARTTIME) |
+                           (1<< eenhENERGY_DELTA_H_STARTLAMBDA) );
         }
     }
 
index 28543c2dfd7f0d81215a26ea05970f45d1658871..e48ee52efa7eb8bc62eb8c15818a97277a646720 100644 (file)
@@ -484,7 +484,8 @@ void mde_delta_h_coll_restore_energyhistory(t_mde_delta_h_coll *dhc,
         }
     }
     dhc->start_time=enerhist->dht->start_time;
-    dhc->start_lambda=enerhist->dht->start_lambda;
+    if (enerhist->dht->start_lambda_set)
+        dhc->start_lambda=enerhist->dht->start_lambda;
     if (dhc->dh[0].ndh > 0)
         dhc->start_time_set=TRUE;
     else
index e04534298441a2ff2a071292002bd2baed8df748..6e8c00109802c5cbfcc8718bd544211c1175680a 100644 (file)
@@ -2116,13 +2116,10 @@ static void read_edr_rawdh_block(samples_t **smp, int *ndu, t_enxblock *blk,
     s=*smp;
 
     /* now double check */
-    if (! lambda_same(s->native_lambda, native_lambda) ||
-        ! lambda_same(s->foreign_lambda, foreign_lambda) ||
-        (  (derivative!=0) != (s->derivative!=0) ) )
+    if ( ! lambda_same(s->foreign_lambda, foreign_lambda) ||
+         (  (derivative!=0) != (s->derivative!=0) ) )
     {
-        fprintf(stderr, "Got native lambda=%g, expected: %g\n", 
-                s->native_lambda, native_lambda);
-        fprintf(stderr, "Got native lambda=%g, expected: %g\n", 
+        fprintf(stderr, "Got foreign lambda=%g, expected: %g\n", 
                 s->foreign_lambda, foreign_lambda);
         fprintf(stderr, "Got derivative=%d, derivative: %d\n", 
                 derivative, s->derivative);
@@ -2319,14 +2316,13 @@ static void read_barsim_edr(char *fn, real *temp, lambda_t *lambda_head)
 
                 if (delta_lambda>0)
                 {
-                    gmx_fatal(FARGS, "Lambda values change in %s: can't apply BAR method", fn);
+                    gmx_fatal(FARGS, "Lambda values not constant in %s: can't apply BAR method", fn);
                 }
                 if ( ( *temp != rtemp) && (*temp > 0) )
                 {
                     gmx_fatal(FARGS,"Temperature in file %s different from earlier files or setting\n", fn);
                 }
                 *temp=rtemp;
-                native_lambda=start_lambda;
 
                 if (first_t < 0)
                     first_t=start_time;
@@ -2344,6 +2340,12 @@ static void read_barsim_edr(char *fn, real *temp, lambda_t *lambda_head)
 
         if (nsamples > 0)
         {
+            /* check the native lambda */
+            if (!lambda_same(start_lambda, native_lambda) )
+            {
+                gmx_fatal(FARGS, "Native lambda not constant in file %s: started at %g, and becomes %g at time %g", 
+                          fn, native_lambda, start_lambda, start_time);
+            }
             /* check the number of samples against the previous number */
             if ( ((nblocks_raw+nblocks_hist)!=nsamples) || (nlam!=1 ) )
             {
@@ -2373,6 +2375,7 @@ static void read_barsim_edr(char *fn, real *temp, lambda_t *lambda_head)
         {
             /* this is the first round; allocate the associated data 
                structures */
+            native_lambda=start_lambda;
             nsamples=nblocks_raw+nblocks_hist;
             snew(nhists, nsamples);
             snew(npts, nsamples);