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
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 };
"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"
};
snew(enerhist->dht,1);
enerhist->dht->ndh = NULL;
enerhist->dht->dh = NULL;
+ enerhist->dht->start_lambda_set=FALSE;
}
}
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);
{
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) );
}
}
}
}
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
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);
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;
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 ) )
{
{
/* 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);