in Documents/NamdSample/namd210/lib/replica/FEP_wca/wham/wham-fep.cpp [167:224]
void wham(void)
{
int i, j, k, t, Converged=0, icycle;
double arg1, arg2, argmax=0.0, Bot_i, Top_i, diff, *pDataTmp, kbt_Inv;
kbt_Inv = 1.0/kbt;
pDataTmp = new double[nb_wind+1];
for(icycle=1; icycle<=NCYCLE; icycle++) {
for(k=0; k<=nb_wind; k++) {
F[k]=0.0;
for(i=0; i<=nb_wind; i++) {
for(t=0; t<NPoints[i]; t++) {
arg1 = (-lambda[k]*epprtd[i][t])*kbt_Inv;
argmax = arg1;
for(j=0; j<=nb_wind; j++) {
arg2 = (F2[j]-lambda[j]*epprtd[i][t])*kbt_Inv;
if(arg2 > argmax) argmax = arg2;
pDataTmp[j] = arg2;
}
Top_i = exp(arg1-argmax);
Bot_i = 0.0;
for(j=0; j<=nb_wind; j++) {
arg2 = pDataTmp[j]-argmax;
Bot_i = Bot_i + NPoints[j] * exp(arg2);
}
F[k] = F[k] + Top_i / Bot_i;
}
}
}
Converged = 1;
for(k=0; k<=nb_wind; k++) {
F[k] = -kbt*log( F[k] );
// printf("window %d: F(k) = %.5lf\n", k+1, F[k]);
diff = fabs( F2[k] - F[k] );
F2[k] = F[k] - F[0];
if(diff > TOL) Converged = 0;
}
if(Converged) {
printf("\nConverged at step: %d\n", icycle);
delete []pDataTmp;
return;
}
}
printf("\nFail to converge in %d steps.\n", NCYCLE);
delete []pDataTmp;
}