Merge branch release-4-6 into master
[alexxy/gromacs.git] / src / gromacs / gmxlib / typedefs.c
index 825c73c27fe37c54dba1a26c7af91f62c848e3ab..c4747e78b2c8f183a09c1712a7d29e4d3148ab49 100644 (file)
@@ -622,7 +622,7 @@ void init_state(t_state *state, int natoms, int ngtc, int nnhpres, int nhchainle
     zero_history(&state->hist);
     zero_ekinstate(&state->ekinstate);
     init_energyhistory(&state->enerhist);
-    init_df_history(&state->dfhist, nlambda, 0);
+    init_df_history(&state->dfhist,nlambda);
     state->ddp_count       = 0;
     state->ddp_count_cg_gl = 0;
     state->cg_gl           = NULL;
@@ -923,41 +923,43 @@ real max_cutoff(real cutoff1, real cutoff2)
     }
 }
 
-extern void init_df_history(df_history_t *dfhist, int nlambda, real wl_delta)
+void init_df_history(df_history_t *dfhist, int nlambda)
 {
     int i;
 
-    dfhist->bEquil   = 0;
     dfhist->nlambda  = nlambda;
-    dfhist->wl_delta = wl_delta;
-    snew(dfhist->sum_weights, dfhist->nlambda);
-    snew(dfhist->sum_dg, dfhist->nlambda);
-    snew(dfhist->sum_minvar, dfhist->nlambda);
-    snew(dfhist->sum_variance, dfhist->nlambda);
-    snew(dfhist->n_at_lam, dfhist->nlambda);
-    snew(dfhist->wl_histo, dfhist->nlambda);
-
-    /* allocate transition matrices here */
-    snew(dfhist->Tij, dfhist->nlambda);
-    snew(dfhist->Tij_empirical, dfhist->nlambda);
-
-    for (i = 0; i < dfhist->nlambda; i++)
-    {
-        snew(dfhist->Tij[i], dfhist->nlambda);
-        snew(dfhist->Tij_empirical[i], dfhist->nlambda);
-    }
-
-    snew(dfhist->accum_p, dfhist->nlambda);
-    snew(dfhist->accum_m, dfhist->nlambda);
-    snew(dfhist->accum_p2, dfhist->nlambda);
-    snew(dfhist->accum_m2, dfhist->nlambda);
+    dfhist->bEquil   = 0;
+    dfhist->wl_delta = 0;
 
-    for (i = 0; i < dfhist->nlambda; i++)
+    if (nlambda > 0)
     {
-        snew((dfhist->accum_p)[i], dfhist->nlambda);
-        snew((dfhist->accum_m)[i], dfhist->nlambda);
-        snew((dfhist->accum_p2)[i], dfhist->nlambda);
-        snew((dfhist->accum_m2)[i], dfhist->nlambda);
+        snew(dfhist->sum_weights, dfhist->nlambda);
+        snew(dfhist->sum_dg, dfhist->nlambda);
+        snew(dfhist->sum_minvar, dfhist->nlambda);
+        snew(dfhist->sum_variance, dfhist->nlambda);
+        snew(dfhist->n_at_lam, dfhist->nlambda);
+        snew(dfhist->wl_histo, dfhist->nlambda);
+
+        /* allocate transition matrices here */
+        snew(dfhist->Tij, dfhist->nlambda);
+        snew(dfhist->Tij_empirical, dfhist->nlambda);
+
+        /* allocate accumulators for various transition matrix
+           free energy methods here */
+        snew(dfhist->accum_p, dfhist->nlambda);
+        snew(dfhist->accum_m, dfhist->nlambda);
+        snew(dfhist->accum_p2, dfhist->nlambda);
+        snew(dfhist->accum_m2, dfhist->nlambda);
+
+        for (i = 0; i < dfhist->nlambda; i++)
+        {
+            snew(dfhist->Tij[i], dfhist->nlambda);
+            snew(dfhist->Tij_empirical[i], dfhist->nlambda);
+            snew((dfhist->accum_p)[i], dfhist->nlambda);
+            snew((dfhist->accum_m)[i], dfhist->nlambda);
+            snew((dfhist->accum_p2)[i], dfhist->nlambda);
+            snew((dfhist->accum_m2)[i], dfhist->nlambda);
+        }
     }
 }
 
@@ -965,9 +967,12 @@ extern void copy_df_history(df_history_t *df_dest, df_history_t *df_source)
 {
     int i, j;
 
-    init_df_history(df_dest, df_source->nlambda, df_source->wl_delta);
+    /* Currently, there should not be any difference in nlambda between the two,
+       but this is included for completeness for potential later functionality */
     df_dest->nlambda = df_source->nlambda;
     df_dest->bEquil  = df_source->bEquil;
+    df_dest->wl_delta = df_source->wl_delta;
+
     for (i = 0; i < df_dest->nlambda; i++)
     {
         df_dest->sum_weights[i]  = df_source->sum_weights[i];
@@ -976,18 +981,46 @@ extern void copy_df_history(df_history_t *df_dest, df_history_t *df_source)
         df_dest->sum_variance[i] = df_source->sum_variance[i];
         df_dest->n_at_lam[i]     = df_source->n_at_lam[i];
         df_dest->wl_histo[i]     = df_source->wl_histo[i];
-        df_dest->accum_p[i]      = df_source->accum_p[i];
-        df_dest->accum_m[i]      = df_source->accum_m[i];
-        df_dest->accum_p2[i]     = df_source->accum_p2[i];
-        df_dest->accum_m2[i]     = df_source->accum_m2[i];
     }
 
     for (i = 0; i < df_dest->nlambda; i++)
     {
         for (j = 0; j < df_dest->nlambda; j++)
         {
+            df_dest->accum_p[i][j]      = df_source->accum_p[i][j];
+            df_dest->accum_m[i][j]      = df_source->accum_m[i][j];
+            df_dest->accum_p2[i][j]     = df_source->accum_p2[i][j];
+            df_dest->accum_m2[i][j]     = df_source->accum_m2[i][j];
             df_dest->Tij[i][j]            = df_source->Tij[i][j];
             df_dest->Tij_empirical[i][j]  = df_source->Tij_empirical[i][j];
         }
     }
 }
+
+void done_df_history(df_history_t *dfhist)
+{
+    int i;
+
+    if (dfhist->nlambda > 0)
+    {
+        sfree(dfhist->n_at_lam);
+        sfree(dfhist->wl_histo);
+        sfree(dfhist->sum_weights);
+        sfree(dfhist->sum_dg);
+        sfree(dfhist->sum_minvar);
+        sfree(dfhist->sum_variance);
+
+        for (i=0;i<dfhist->nlambda;i++)
+        {
+            sfree(dfhist->Tij[i]);
+            sfree(dfhist->Tij_empirical[i]);
+            sfree(dfhist->accum_p[i]);
+            sfree(dfhist->accum_m[i]);
+            sfree(dfhist->accum_p2[i]);
+            sfree(dfhist->accum_m2[i]);
+        }
+    }
+    dfhist->bEquil   = 0;
+    dfhist->nlambda  = 0;
+    dfhist->wl_delta = 0;
+}