2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2012, The GROMACS development team,
6 * check out http://www.gromacs.org for more information.
7 * Copyright (c) 2012, by the GROMACS development team, led by
8 * David van der Spoel, Berk Hess, Erik Lindahl, and including many
9 * others, as listed in the AUTHORS file in the top-level source
10 * directory and at http://www.gromacs.org.
12 * GROMACS is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU Lesser General Public License
14 * as published by the Free Software Foundation; either version 2.1
15 * of the License, or (at your option) any later version.
17 * GROMACS is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * Lesser General Public License for more details.
22 * You should have received a copy of the GNU Lesser General Public
23 * License along with GROMACS; if not, see
24 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
25 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 * If you want to redistribute modifications to GROMACS, please
28 * consider that scientific software is very special. Version
29 * control is crucial - bugs must be traceable. We will be happy to
30 * consider code for inclusion in the official distribution, but
31 * derived work must not be called official GROMACS. Details are found
32 * in the README & COPYING files - if they are missing, get the
33 * official version at http://www.gromacs.org.
35 * To help us fund GROMACS development, we humbly ask that you cite
36 * the research papers on the package. Check out http://www.gromacs.org.
43 #include<catamount/dclock.h>
49 #ifdef HAVE_SYS_TIME_H
62 #include "chargegroup.h"
83 #include "gmx_random.h"
86 #include "gmx_wallcycle.h"
95 void GenerateGibbsProbabilities(real *ene, real *p_k, real *pks, int minfep, int maxfep) {
101 maxene = ene[minfep];
102 /* find the maximum value */
103 for (i=minfep;i<=maxfep;i++)
110 /* find the denominator */
111 for (i=minfep;i<=maxfep;i++)
113 *pks += exp(ene[i]-maxene);
116 for (i=minfep;i<=maxfep;i++)
118 p_k[i] = exp(ene[i]-maxene) / *pks;
122 void GenerateWeightedGibbsProbabilities(real *ene, real *p_k, real *pks, int nlim, real *nvals,real delta) {
130 for (i=0;i<nlim;i++) {
132 /* add the delta, since we need to make sure it's greater than zero, and
133 we need a non-arbitrary number? */
134 nene[i] = ene[i] + log(nvals[i]+delta);
136 nene[i] = ene[i] + log(nvals[i]);
140 /* find the maximum value */
144 if (nene[i] > maxene) {
149 /* subtract off the maximum, avoiding overflow */
155 /* find the denominator */
158 *pks += exp(nene[i]);
164 p_k[i] = exp(nene[i]) / *pks;
169 real do_logsum(int N, real *a_n) {
172 /* log(\sum_{i=0}^(N-1) exp[a_n]) */
177 /* compute maximum argument to exp(.) */
182 maxarg = max(maxarg,a_n[i]);
185 /* compute sum of exp(a_n - maxarg) */
189 sum = sum + exp(a_n[i] - maxarg);
192 /* compute log sum */
193 logsum = log(sum) + maxarg;
197 int FindMinimum(real *min_metric, int N) {
203 min_val = min_metric[0];
205 for (nval=0; nval<N; nval++)
207 if (min_metric[nval] < min_val)
209 min_val = min_metric[nval];
216 static gmx_bool CheckHistogramRatios(int nhisto, real *histo, real ratio)
224 for (i=0;i<nhisto;i++)
231 /* no samples! is bad!*/
235 nmean /= (real)nhisto;
238 for (i=0;i<nhisto;i++)
240 /* make sure that all points are in the ratio < x < 1/ratio range */
241 if (!((histo[i]/nmean < 1.0/ratio) && (histo[i]/nmean > ratio)))
250 static gmx_bool CheckIfDoneEquilibrating(int nlim, t_expanded *expand, df_history_t *dfhist, gmx_large_int_t step)
254 gmx_bool bDoneEquilibrating=TRUE;
257 /* assume we have equilibrated the weights, then check to see if any of the conditions are not met */
259 /* calculate the total number of samples */
260 switch (expand->elmceq)
263 /* We have not equilibrated, and won't, ever. */
266 /* we have equilibrated -- we're done */
269 /* first, check if we are equilibrating by steps, if we're still under */
270 if (step < expand->equil_steps)
272 bDoneEquilibrating = FALSE;
279 totalsamples += dfhist->n_at_lam[i];
281 if (totalsamples < expand->equil_samples)
283 bDoneEquilibrating = FALSE;
289 if (dfhist->n_at_lam[i] < expand->equil_n_at_lam) /* we are still doing the initial sweep, so we're definitely not
292 bDoneEquilibrating = FALSE;
298 if (EWL(expand->elamstats)) /* This check is in readir as well, but
301 if (dfhist->wl_delta > expand->equil_wl_delta)
303 bDoneEquilibrating = FALSE;
308 /* we can use the flatness as a judge of good weights, as long as
309 we're not doing minvar, or Wang-Landau.
310 But turn off for now until we figure out exactly how we do this.
313 if (!(EWL(expand->elamstats) || expand->elamstats==elamstatsMINVAR))
315 /* we want to use flatness -avoiding- the forced-through samples. Plus, we need to convert to
316 floats for this histogram function. */
322 modhisto[i] = 1.0*(dfhist->n_at_lam[i]-expand->lmc_forced_nstart);
324 bIfFlat = CheckHistogramRatios(nlim,modhisto,expand->equil_ratio);
328 bDoneEquilibrating = FALSE;
332 bDoneEquilibrating = TRUE;
334 /* one last case to go though, if we are doing slow growth to get initial values, we haven't finished equilibrating */
336 if (expand->lmc_forced_nstart > 0)
340 if (dfhist->n_at_lam[i] < expand->lmc_forced_nstart) /* we are still doing the initial sweep, so we're definitely not
343 bDoneEquilibrating = FALSE;
348 return bDoneEquilibrating;
351 static gmx_bool UpdateWeights(int nlim, t_expanded *expand, df_history_t *dfhist,
352 int fep_state, real *scaled_lamee, real *weighted_lamee, gmx_large_int_t step)
354 real maxdiff = 0.000000001;
355 gmx_bool bSufficientSamples;
356 int i, k, n, nz, indexi, indexk, min_n, max_n, nlam, totali;
357 int n0,np1,nm1,nval,min_nvalm,min_nvalp,maxc;
358 real omega_m1_0,omega_p1_m1,omega_m1_p1,omega_p1_0,clam_osum;
359 real de,de_function,dr,denom,maxdr,pks=0;
360 real min_val,cnval,zero_sum_weights;
361 real *omegam_array, *weightsm_array, *omegap_array, *weightsp_array, *varm_array, *varp_array, *dwp_array, *dwm_array;
362 real clam_varm, clam_varp, clam_weightsm, clam_weightsp, clam_minvar;
363 real *lam_weights, *lam_minvar_corr, *lam_variance, *lam_dg, *p_k;
364 real *numweighted_lamee, *logfrac;
366 real chi_m1_0,chi_p1_0,chi_m2_0,chi_p2_0,chi_p1_m1,chi_p2_m1,chi_m1_p1,chi_m2_p1;
368 /* if we have equilibrated the weights, exit now */
374 if (CheckIfDoneEquilibrating(nlim,expand,dfhist,step))
376 dfhist->bEquil = TRUE;
377 /* zero out the visited states so we know how many equilibrated states we have
381 dfhist->n_at_lam[i] = 0;
386 /* If we reached this far, we have not equilibrated yet, keep on
387 going resetting the weights */
389 if (EWL(expand->elamstats))
391 if (expand->elamstats==elamstatsWL) /* Standard Wang-Landau */
393 dfhist->sum_weights[fep_state] -= dfhist->wl_delta;
394 dfhist->wl_histo[fep_state] += 1.0;
396 else if (expand->elamstats==elamstatsWWL) /* Weighted Wang-Landau */
400 /* first increment count */
401 GenerateGibbsProbabilities(weighted_lamee,p_k,&pks,0,nlim-1);
402 for (i=0;i<nlim;i++) {
403 dfhist->wl_histo[i] += p_k[i];
406 /* then increment weights (uses count) */
408 GenerateWeightedGibbsProbabilities(weighted_lamee,p_k,&pks,nlim,dfhist->wl_histo,dfhist->wl_delta);
412 dfhist->sum_weights[i] -= dfhist->wl_delta*p_k[i];
414 /* Alternate definition, using logarithms. Shouldn't make very much difference! */
419 di = 1+dfhist->wl_delta*p_k[i];
420 dfhist->sum_weights[i] -= log(di);
426 zero_sum_weights = dfhist->sum_weights[0];
429 dfhist->sum_weights[i] -= zero_sum_weights;
433 if (expand->elamstats==elamstatsBARKER || expand->elamstats==elamstatsMETROPOLIS || expand->elamstats==elamstatsMINVAR) {
435 de_function = 0; /* to get rid of warnings, but this value will not be used because of the logic */
436 maxc = 2*expand->c_range+1;
439 snew(lam_variance,nlim);
441 snew(omegap_array,maxc);
442 snew(weightsp_array,maxc);
443 snew(varp_array,maxc);
444 snew(dwp_array,maxc);
446 snew(omegam_array,maxc);
447 snew(weightsm_array,maxc);
448 snew(varm_array,maxc);
449 snew(dwm_array,maxc);
451 /* unpack the current lambdas -- we will only update 2 of these */
453 for (i=0;i<nlim-1;i++)
454 { /* only through the second to last */
455 lam_dg[i] = dfhist->sum_dg[i+1] - dfhist->sum_dg[i];
456 lam_variance[i] = pow(dfhist->sum_variance[i+1],2) - pow(dfhist->sum_variance[i],2);
459 /* accumulate running averages */
460 for (nval = 0; nval<maxc; nval++)
462 /* constants for later use */
463 cnval = (real)(nval-expand->c_range);
464 /* actually, should be able to rewrite it w/o exponential, for better numerical stability */
467 de = exp(cnval - (scaled_lamee[fep_state]-scaled_lamee[fep_state-1]));
468 if (expand->elamstats==elamstatsBARKER || expand->elamstats==elamstatsMINVAR)
470 de_function = 1.0/(1.0+de);
472 else if (expand->elamstats==elamstatsMETROPOLIS)
480 de_function = 1.0/de;
483 dfhist->accum_m[fep_state][nval] += de_function;
484 dfhist->accum_m2[fep_state][nval] += de_function*de_function;
487 if (fep_state < nlim-1)
489 de = exp(-cnval + (scaled_lamee[fep_state+1]-scaled_lamee[fep_state]));
490 if (expand->elamstats==elamstatsBARKER || expand->elamstats==elamstatsMINVAR)
492 de_function = 1.0/(1.0+de);
494 else if (expand->elamstats==elamstatsMETROPOLIS)
502 de_function = 1.0/de;
505 dfhist->accum_p[fep_state][nval] += de_function;
506 dfhist->accum_p2[fep_state][nval] += de_function*de_function;
509 /* Metropolis transition and Barker transition (unoptimized Bennett) acceptance weight determination */
511 n0 = dfhist->n_at_lam[fep_state];
512 if (fep_state > 0) {nm1 = dfhist->n_at_lam[fep_state-1];} else {nm1 = 0;}
513 if (fep_state < nlim-1) {np1 = dfhist->n_at_lam[fep_state+1];} else {np1 = 0;}
515 /* logic SHOULD keep these all set correctly whatever the logic, but apparently it can't figure it out. */
516 chi_m1_0=chi_p1_0=chi_m2_0=chi_p2_0=chi_p1_m1=chi_p2_m1=chi_m1_p1=chi_m2_p1=0;
520 chi_m1_0 = dfhist->accum_m[fep_state][nval]/n0;
521 chi_p1_0 = dfhist->accum_p[fep_state][nval]/n0;
522 chi_m2_0 = dfhist->accum_m2[fep_state][nval]/n0;
523 chi_p2_0 = dfhist->accum_p2[fep_state][nval]/n0;
526 if ((fep_state > 0 ) && (nm1 > 0))
528 chi_p1_m1 = dfhist->accum_p[fep_state-1][nval]/nm1;
529 chi_p2_m1 = dfhist->accum_p2[fep_state-1][nval]/nm1;
532 if ((fep_state < nlim-1) && (np1 > 0))
534 chi_m1_p1 = dfhist->accum_m[fep_state+1][nval]/np1;
535 chi_m2_p1 = dfhist->accum_m2[fep_state+1][nval]/np1;
549 omega_m1_0 = chi_m2_0/(chi_m1_0*chi_m1_0) - 1.0;
553 omega_p1_m1 = chi_p2_m1/(chi_p1_m1*chi_p1_m1) - 1.0;
555 if ((n0 > 0) && (nm1 > 0))
557 clam_weightsm = (log(chi_m1_0) - log(chi_p1_m1)) + cnval;
558 clam_varm = (1.0/n0)*(omega_m1_0) + (1.0/nm1)*(omega_p1_m1);
562 if (fep_state < nlim-1)
566 omega_p1_0 = chi_p2_0/(chi_p1_0*chi_p1_0) - 1.0;
570 omega_m1_p1 = chi_m2_p1/(chi_m1_p1*chi_m1_p1) - 1.0;
572 if ((n0 > 0) && (np1 > 0))
574 clam_weightsp = (log(chi_m1_p1) - log(chi_p1_0)) + cnval;
575 clam_varp = (1.0/np1)*(omega_m1_p1) + (1.0/n0)*(omega_p1_0);
581 omegam_array[nval] = omega_m1_0;
585 omegam_array[nval] = 0;
587 weightsm_array[nval] = clam_weightsm;
588 varm_array[nval] = clam_varm;
591 dwm_array[nval] = fabs( (cnval + log((1.0*n0)/nm1)) - lam_dg[fep_state-1] );
595 dwm_array[nval] = fabs( cnval - lam_dg[fep_state-1] );
600 omegap_array[nval] = omega_p1_0;
604 omegap_array[nval] = 0;
606 weightsp_array[nval] = clam_weightsp;
607 varp_array[nval] = clam_varp;
608 if ((np1 > 0) && (n0 > 0))
610 dwp_array[nval] = fabs( (cnval + log((1.0*np1)/n0)) - lam_dg[fep_state] );
614 dwp_array[nval] = fabs( cnval - lam_dg[fep_state] );
619 /* find the C's closest to the old weights value */
621 min_nvalm = FindMinimum(dwm_array,maxc);
622 omega_m1_0 = omegam_array[min_nvalm];
623 clam_weightsm = weightsm_array[min_nvalm];
624 clam_varm = varm_array[min_nvalm];
626 min_nvalp = FindMinimum(dwp_array,maxc);
627 omega_p1_0 = omegap_array[min_nvalp];
628 clam_weightsp = weightsp_array[min_nvalp];
629 clam_varp = varp_array[min_nvalp];
631 clam_osum = omega_m1_0 + omega_p1_0;
635 clam_minvar = 0.5*log(clam_osum);
640 lam_dg[fep_state-1] = clam_weightsm;
641 lam_variance[fep_state-1] = clam_varm;
644 if (fep_state < nlim-1)
646 lam_dg[fep_state] = clam_weightsp;
647 lam_variance[fep_state] = clam_varp;
650 if (expand->elamstats==elamstatsMINVAR)
652 bSufficientSamples = TRUE;
653 /* make sure they are all past a threshold */
656 if (dfhist->n_at_lam[i] < expand->minvarmin)
658 bSufficientSamples = FALSE;
661 if (bSufficientSamples)
663 dfhist->sum_minvar[fep_state] = clam_minvar;
668 dfhist->sum_minvar[i]+=(expand->minvar_const-clam_minvar);
670 expand->minvar_const = clam_minvar;
671 dfhist->sum_minvar[fep_state] = 0.0;
675 dfhist->sum_minvar[fep_state] -= expand->minvar_const;
680 /* we need to rezero minvar now, since it could change at fep_state = 0 */
681 dfhist->sum_dg[0] = 0.0;
682 dfhist->sum_variance[0] = 0.0;
683 dfhist->sum_weights[0] = dfhist->sum_dg[0] + dfhist->sum_minvar[0]; /* should be zero */
687 dfhist->sum_dg[i] = lam_dg[i-1] + dfhist->sum_dg[i-1];
688 dfhist->sum_variance[i] = sqrt(lam_variance[i-1] + pow(dfhist->sum_variance[i-1],2));
689 dfhist->sum_weights[i] = dfhist->sum_dg[i] + dfhist->sum_minvar[i];
696 sfree(weightsm_array);
701 sfree(weightsp_array);
708 static int ChooseNewLambda(FILE *log, int nlim, t_expanded *expand, df_history_t *dfhist, int fep_state, real *weighted_lamee, real *p_k, gmx_rng_t rng)
710 /* Choose new lambda value, and update transition matrix */
712 int i,ifep,jfep,minfep,maxfep,lamnew,lamtrial,starting_fep_state;
713 real r1,r2,pks,de_old,de_new,de,trialprob,tprob=0;
715 real *propose,*accept,*remainder;
717 gmx_bool bRestricted;
719 starting_fep_state = fep_state;
720 lamnew = fep_state; /* so that there is a default setting -- stays the same */
722 if (!EWL(expand->elamstats)) /* ignore equilibrating the weights if using WL */
724 if ((expand->lmc_forced_nstart > 0) && (dfhist->n_at_lam[nlim-1] <= expand->lmc_forced_nstart))
726 /* Use a marching method to run through the lambdas and get preliminary free energy data,
727 before starting 'free' sampling. We start free sampling when we have enough at each lambda */
729 /* if we have enough at this lambda, move on to the next one */
731 if (dfhist->n_at_lam[fep_state] == expand->lmc_forced_nstart)
733 lamnew = fep_state+1;
734 if (lamnew == nlim) /* whoops, stepped too far! */
749 snew(remainder,nlim);
751 for (i=0;i<expand->lmc_repeats;i++)
754 for(ifep=0;ifep<nlim;ifep++)
760 if ((expand->elmcmove==elmcmoveGIBBS) || (expand->elmcmove==elmcmoveMETGIBBS))
763 /* use the Gibbs sampler, with restricted range */
764 if (expand->gibbsdeltalam < 0)
772 minfep = fep_state - expand->gibbsdeltalam;
773 maxfep = fep_state + expand->gibbsdeltalam;
784 GenerateGibbsProbabilities(weighted_lamee,p_k,&pks,minfep,maxfep);
786 if (expand->elmcmove == elmcmoveGIBBS)
788 for (ifep=minfep;ifep<=maxfep;ifep++)
790 propose[ifep] = p_k[ifep];
794 r1 = gmx_rng_uniform_real(rng);
795 for (lamnew=minfep;lamnew<=maxfep;lamnew++)
797 if (r1 <= p_k[lamnew])
804 else if (expand->elmcmove==elmcmoveMETGIBBS)
807 /* Metropolized Gibbs sampling */
808 for (ifep=minfep;ifep<=maxfep;ifep++)
810 remainder[ifep] = 1 - p_k[ifep];
813 /* find the proposal probabilities */
815 if (remainder[fep_state] == 0) {
816 /* only the current state has any probability */
817 /* we have to stay at the current state */
820 for (ifep=minfep;ifep<=maxfep;ifep++)
822 if (ifep != fep_state)
824 propose[ifep] = p_k[ifep]/remainder[fep_state];
832 r1 = gmx_rng_uniform_real(rng);
833 for (lamtrial=minfep;lamtrial<=maxfep;lamtrial++)
835 pnorm = p_k[lamtrial]/remainder[fep_state];
836 if (lamtrial!=fep_state)
846 /* we have now selected lamtrial according to p(lamtrial)/1-p(fep_state) */
848 /* trial probability is min{1,\frac{1 - p(old)}{1-p(new)} MRS 1/8/2008 */
849 trialprob = (remainder[fep_state])/(remainder[lamtrial]);
850 if (trialprob < tprob)
854 r2 = gmx_rng_uniform_real(rng);
865 /* now figure out the acceptance probability for each */
866 for (ifep=minfep;ifep<=maxfep;ifep++)
869 if (remainder[ifep] != 0) {
870 trialprob = (remainder[fep_state])/(remainder[ifep]);
874 trialprob = 1.0; /* this state is the only choice! */
876 if (trialprob < tprob)
880 /* probability for fep_state=0, but that's fine, it's never proposed! */
881 accept[ifep] = tprob;
887 /* it's possible some rounding is failing */
888 if (remainder[fep_state] < 2.0e-15)
890 /* probably numerical rounding error -- no state other than the original has weight */
895 /* probably not a numerical issue */
897 int nerror = 200+(maxfep-minfep+1)*60;
899 snew(errorstr,nerror);
900 /* if its greater than maxfep, then something went wrong -- probably underflow in the calculation
901 of sum weights. Generated detailed info for failure */
902 loc += sprintf(errorstr,"Something wrong in choosing new lambda state with a Gibbs move -- probably underflow in weight determination.\nDenominator is: %3d%17.10e\n i dE numerator weights\n",0,pks);
903 for (ifep=minfep;ifep<=maxfep;ifep++)
905 loc += sprintf(&errorstr[loc],"%3d %17.10e%17.10e%17.10e\n",ifep,weighted_lamee[ifep],p_k[ifep],dfhist->sum_weights[ifep]);
907 gmx_fatal(FARGS,errorstr);
911 else if ((expand->elmcmove==elmcmoveMETROPOLIS) || (expand->elmcmove==elmcmoveBARKER))
913 /* use the metropolis sampler with trial +/- 1 */
914 r1 = gmx_rng_uniform_real(rng);
917 if (fep_state == 0) {
918 lamtrial = fep_state;
922 lamtrial = fep_state-1;
927 if (fep_state == nlim-1) {
928 lamtrial = fep_state;
932 lamtrial = fep_state+1;
936 de = weighted_lamee[lamtrial] - weighted_lamee[fep_state];
937 if (expand->elmcmove==elmcmoveMETROPOLIS)
941 if (trialprob < tprob)
945 propose[fep_state] = 0;
946 propose[lamtrial] = 1.0; /* note that this overwrites the above line if fep_state = ntrial, which only occurs at the ends */
947 accept[fep_state] = 1.0; /* doesn't actually matter, never proposed unless fep_state = ntrial, in which case it's 1.0 anyway */
948 accept[lamtrial] = tprob;
951 else if (expand->elmcmove==elmcmoveBARKER)
953 tprob = 1.0/(1.0+exp(-de));
955 propose[fep_state] = (1-tprob);
956 propose[lamtrial] += tprob; /* we add, to account for the fact that at the end, they might be the same point */
957 accept[fep_state] = 1.0;
958 accept[lamtrial] = 1.0;
961 r2 = gmx_rng_uniform_real(rng);
969 for (ifep=0;ifep<nlim;ifep++)
971 dfhist->Tij[fep_state][ifep] += propose[ifep]*accept[ifep];
972 dfhist->Tij[fep_state][fep_state] += propose[ifep]*(1.0-accept[ifep]);
977 dfhist->Tij_empirical[starting_fep_state][lamnew] += 1.0;
986 /* print out the weights to the log, along with current state */
987 extern void PrintFreeEnergyInfoToFile(FILE *outfile, t_lambda *fep, t_expanded *expand, t_simtemp *simtemp, df_history_t *dfhist,
988 int nlam, int frequency, gmx_large_int_t step)
990 int nlim,i,ifep,jfep;
991 real dw,dg,dv,dm,Tprint;
993 const char *print_names[efptNR] = {" FEPL","MassL","CoulL"," VdwL","BondL","RestT","Temp.(K)"};
994 gmx_bool bSimTemp = FALSE;
996 nlim = fep->n_lambda;
997 if (simtemp != NULL) {
1001 if (mod(step,frequency)==0)
1003 fprintf(outfile," MC-lambda information\n");
1004 if (EWL(expand->elamstats) && (!(dfhist->bEquil))) {
1005 fprintf(outfile," Wang-Landau incrementor is: %11.5g\n",dfhist->wl_delta);
1007 fprintf(outfile," N");
1008 for (i=0;i<efptNR;i++)
1010 if (fep->separate_dvdl[i])
1012 fprintf(outfile,"%7s",print_names[i]);
1014 else if ((i == efptTEMPERATURE) && bSimTemp)
1016 fprintf(outfile,"%10s",print_names[i]); /* more space for temperature formats */
1019 fprintf(outfile," Count ");
1020 if (expand->elamstats==elamstatsMINVAR)
1022 fprintf(outfile,"W(in kT) G(in kT) dG(in kT) dV(in kT)\n");
1026 fprintf(outfile,"G(in kT) dG(in kT)\n");
1028 for (ifep=0;ifep<nlim;ifep++)
1039 dw = dfhist->sum_weights[ifep+1] - dfhist->sum_weights[ifep];
1040 dg = dfhist->sum_dg[ifep+1] - dfhist->sum_dg[ifep];
1041 dv = sqrt(pow(dfhist->sum_variance[ifep+1],2) - pow(dfhist->sum_variance[ifep],2));
1042 dm = dfhist->sum_minvar[ifep+1] - dfhist->sum_minvar[ifep];
1045 fprintf(outfile,"%3d",(ifep+1));
1046 for (i=0;i<efptNR;i++)
1048 if (fep->separate_dvdl[i])
1050 fprintf(outfile,"%7.3f",fep->all_lambda[i][ifep]);
1051 } else if (i == efptTEMPERATURE && bSimTemp)
1053 fprintf(outfile,"%9.3f",simtemp->temperatures[ifep]);
1056 if (EWL(expand->elamstats) && (!(dfhist->bEquil))) /* if performing WL and still haven't equilibrated */
1058 if (expand->elamstats == elamstatsWL)
1060 fprintf(outfile," %8d",(int)dfhist->wl_histo[ifep]);
1062 fprintf(outfile," %8.3f",dfhist->wl_histo[ifep]);
1065 else /* we have equilibrated weights */
1067 fprintf(outfile," %8d",dfhist->n_at_lam[ifep]);
1069 if (expand->elamstats==elamstatsMINVAR)
1071 fprintf(outfile," %10.5f %10.5f %10.5f %10.5f",dfhist->sum_weights[ifep],dfhist->sum_dg[ifep],dg,dv);
1075 fprintf(outfile," %10.5f %10.5f",dfhist->sum_weights[ifep],dw);
1078 fprintf(outfile," <<\n");
1082 fprintf(outfile," \n");
1085 fprintf(outfile,"\n");
1087 if ((mod(step,expand->nstTij)==0) && (expand->nstTij > 0) && (step > 0))
1089 fprintf(outfile," Transition Matrix\n");
1090 for (ifep=0;ifep<nlim;ifep++)
1092 fprintf(outfile,"%12d",(ifep+1));
1094 fprintf(outfile,"\n");
1095 for (ifep=0;ifep<nlim;ifep++)
1097 for (jfep=0;jfep<nlim;jfep++)
1099 if (dfhist->n_at_lam[ifep] > 0)
1101 if (expand->bSymmetrizedTMatrix)
1103 Tprint = (dfhist->Tij[ifep][jfep]+dfhist->Tij[jfep][ifep])/(dfhist->n_at_lam[ifep]+dfhist->n_at_lam[jfep]);
1105 Tprint = (dfhist->Tij[ifep][jfep])/(dfhist->n_at_lam[ifep]);
1112 fprintf(outfile,"%12.8f",Tprint);
1114 fprintf(outfile,"%3d\n",(ifep+1));
1117 fprintf(outfile," Empirical Transition Matrix\n");
1118 for (ifep=0;ifep<nlim;ifep++)
1120 fprintf(outfile,"%12d",(ifep+1));
1122 fprintf(outfile,"\n");
1123 for (ifep=0;ifep<nlim;ifep++)
1125 for (jfep=0;jfep<nlim;jfep++)
1127 if (dfhist->n_at_lam[ifep] > 0)
1129 if (expand->bSymmetrizedTMatrix)
1131 Tprint = (dfhist->Tij_empirical[ifep][jfep]+dfhist->Tij_empirical[jfep][ifep])/(dfhist->n_at_lam[ifep]+dfhist->n_at_lam[jfep]);
1133 Tprint = dfhist->Tij_empirical[ifep][jfep]/(dfhist->n_at_lam[ifep]);
1140 fprintf(outfile,"%12.8f",Tprint);
1142 fprintf(outfile,"%3d\n",(ifep+1));
1148 extern void get_mc_state(gmx_rng_t rng,t_state *state)
1150 gmx_rng_get_state(rng,state->mc_rng,state->mc_rngi);
1153 extern void set_mc_state(gmx_rng_t rng,t_state *state)
1155 gmx_rng_set_state(rng,state->mc_rng,state->mc_rngi[0]);
1158 extern int ExpandedEnsembleDynamics(FILE *log,t_inputrec *ir, gmx_enerdata_t *enerd,
1159 t_state *state, t_extmass *MassQ, df_history_t *dfhist,
1160 gmx_large_int_t step, gmx_rng_t mcrng,
1161 rvec *v, t_mdatoms *mdatoms)
1163 real *pfep_lamee,*p_k, *scaled_lamee, *weighted_lamee;
1164 int i,nlam,nlim,lamnew,totalsamples;
1165 real oneovert,maxscaled=0,maxweighted=0;
1168 double *temperature_lambdas;
1169 gmx_bool bIfReset,bSwitchtoOneOverT,bDoneEquilibrating=FALSE;
1171 expand = ir->expandedvals;
1172 simtemp = ir->simtempvals;
1173 nlim = ir->fepvals->n_lambda;
1174 nlam = state->fep_state;
1176 snew(scaled_lamee,nlim);
1177 snew(weighted_lamee,nlim);
1178 snew(pfep_lamee,nlim);
1181 if (expand->bInit_weights) /* if initialized weights, we need to fill them in */
1183 dfhist->wl_delta = expand->init_wl_delta; /* MRS -- this would fit better somewhere else? */
1184 for (i=0;i<nlim;i++) {
1185 dfhist->sum_weights[i] = expand->init_lambda_weights[i];
1186 dfhist->sum_dg[i] = expand->init_lambda_weights[i];
1188 expand->bInit_weights = FALSE;
1191 /* update the count at the current lambda*/
1192 dfhist->n_at_lam[nlam]++;
1194 /* need to calculate the PV term somewhere, but not needed here? Not until there's a lambda state that's
1195 pressure controlled.*/
1198 where does this PV term go?
1199 for (i=0;i<nlim;i++)
1201 fep_lamee[i] += pVTerm;
1205 /* determine the minimum value to avoid overflow. Probably a better way to do this */
1206 /* we don't need to include the pressure term, since the volume is the same between the two.
1207 is there some term we are neglecting, however? */
1209 if (ir->efep != efepNO)
1211 for (i=0;i<nlim;i++)
1215 /* Note -- this assumes no mass changes, since kinetic energy is not added . . . */
1216 scaled_lamee[i] = (enerd->enerpart_lambda[i+1]-enerd->enerpart_lambda[0])/(simtemp->temperatures[i]*BOLTZ)
1217 + enerd->term[F_EPOT]*(1.0/(simtemp->temperatures[i])- 1.0/(simtemp->temperatures[nlam]))/BOLTZ;
1221 scaled_lamee[i] = (enerd->enerpart_lambda[i+1]-enerd->enerpart_lambda[0])/(expand->mc_temp*BOLTZ);
1222 /* mc_temp is currently set to the system reft unless otherwise defined */
1225 /* save these energies for printing, so they don't get overwritten by the next step */
1226 /* they aren't overwritten in the non-free energy case, but we always print with these
1231 for (i=0;i<nlim;i++) {
1232 scaled_lamee[i] = enerd->term[F_EPOT]*(1.0/simtemp->temperatures[i] - 1.0/simtemp->temperatures[nlam])/BOLTZ;
1237 for (i=0;i<nlim;i++) {
1238 pfep_lamee[i] = scaled_lamee[i];
1240 weighted_lamee[i] = dfhist->sum_weights[i] - scaled_lamee[i];
1243 maxscaled = scaled_lamee[i];
1244 maxweighted = weighted_lamee[i];
1248 if (scaled_lamee[i] > maxscaled)
1250 maxscaled = scaled_lamee[i];
1252 if (weighted_lamee[i] > maxweighted)
1254 maxweighted = weighted_lamee[i];
1259 for (i=0;i<nlim;i++)
1261 scaled_lamee[i] -= maxscaled;
1262 weighted_lamee[i] -= maxweighted;
1265 /* update weights - we decide whether or not to actually do this inside */
1267 bDoneEquilibrating = UpdateWeights(nlim,expand,dfhist,nlam,scaled_lamee,weighted_lamee,step);
1268 if (bDoneEquilibrating)
1271 fprintf(log,"\nStep %d: Weights have equilibrated, using criteria: %s\n",(int)step,elmceq_names[expand->elmceq]);
1275 lamnew = ChooseNewLambda(log,nlim,expand,dfhist,nlam,weighted_lamee,p_k,mcrng);
1276 /* if using simulated tempering, we need to adjust the temperatures */
1277 if (ir->bSimTemp && (lamnew != nlam)) /* only need to change the temperatures if we change the state */
1282 int nstart, nend, gt;
1284 snew(buf_ngtc,ir->opts.ngtc);
1286 for (i=0;i<ir->opts.ngtc;i++) {
1287 if (ir->opts.ref_t[i] > 0) {
1288 told = ir->opts.ref_t[i];
1289 ir->opts.ref_t[i] = simtemp->temperatures[lamnew];
1290 buf_ngtc[i] = sqrt(ir->opts.ref_t[i]/told); /* using the buffer as temperature scaling */
1294 /* we don't need to manipulate the ekind information, as it isn't due to be reset until the next step anyway */
1296 nstart = mdatoms->start;
1297 nend = nstart + mdatoms->homenr;
1298 for (n=nstart; n<nend; n++)
1303 gt = mdatoms->cTC[n];
1305 for(d=0; d<DIM; d++)
1307 v[n][d] *= buf_ngtc[gt];
1311 if (IR_NPT_TROTTER(ir) || IR_NPH_TROTTER(ir) || IR_NVT_TROTTER(ir)) {
1312 /* we need to recalculate the masses if the temperature has changed */
1313 init_npt_masses(ir,state,MassQ,FALSE);
1314 for (i=0;i<state->nnhpres;i++)
1316 for (j=0;j<ir->opts.nhchainlength;j++)
1318 state->nhpres_vxi[i+j] *= buf_ngtc[i];
1321 for (i=0;i<ir->opts.ngtc;i++)
1323 for (j=0;j<ir->opts.nhchainlength;j++)
1325 state->nosehoover_vxi[i+j] *= buf_ngtc[i];
1332 /* now check on the Wang-Landau updating critera */
1334 if (EWL(expand->elamstats))
1336 bSwitchtoOneOverT = FALSE;
1337 if (expand->bWLoneovert) {
1339 for (i=0;i<nlim;i++)
1341 totalsamples += dfhist->n_at_lam[i];
1343 oneovert = (1.0*nlim)/totalsamples;
1344 /* oneovert has decreasd by a bit since last time, so we actually make sure its within one of this number */
1345 /* switch to 1/t incrementing when wl_delta has decreased at least once, and wl_delta is now less than 1/t */
1346 if ((dfhist->wl_delta <= ((totalsamples)/(totalsamples-1.00001))*oneovert) &&
1347 (dfhist->wl_delta < expand->init_wl_delta))
1349 bSwitchtoOneOverT = TRUE;
1352 if (bSwitchtoOneOverT) {
1353 dfhist->wl_delta = oneovert; /* now we reduce by this each time, instead of only at flatness */
1355 bIfReset = CheckHistogramRatios(nlim,dfhist->wl_histo,expand->wl_ratio);
1358 for (i=0;i<nlim;i++)
1360 dfhist->wl_histo[i] = 0;
1362 dfhist->wl_delta *= expand->wl_scale;
1364 fprintf(log,"\nStep %d: weights are now:",(int)step);
1365 for (i=0;i<nlim;i++)
1367 fprintf(log," %.5f",dfhist->sum_weights[i]);
1374 sfree(scaled_lamee);
1375 sfree(weighted_lamee);