Code beautification with uncrustify
[alexxy/gromacs.git] / src / gromacs / mdlib / mdebin.c
1 /* -*- mode: c; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; c-file-style: "stroustrup"; -*-
2  *
3  *
4  *                This source code is part of
5  *
6  *                 G   R   O   M   A   C   S
7  *
8  *          GROningen MAchine for Chemical Simulations
9  *
10  *                        VERSION 3.2.0
11  * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
12  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
13  * Copyright (c) 2001-2004, The GROMACS development team,
14  * check out http://www.gromacs.org for more information.
15
16  * This program is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU General Public License
18  * as published by the Free Software Foundation; either version 2
19  * of the License, or (at your option) any later version.
20  *
21  * If you want to redistribute modifications, please consider that
22  * scientific software is very special. Version control is crucial -
23  * bugs must be traceable. We will be happy to consider code for
24  * inclusion in the official distribution, but derived work must not
25  * be called official GROMACS. Details are found in the README & COPYING
26  * files - if they are missing, get the official version at www.gromacs.org.
27  *
28  * To help us fund GROMACS development, we humbly ask that you cite
29  * the papers on the package - you can find them in the top README file.
30  *
31  * For more info, check our website at http://www.gromacs.org
32  *
33  * And Hey:
34  * GROwing Monsters And Cloning Shrimps
35  */
36 #ifdef HAVE_CONFIG_H
37 #include <config.h>
38 #endif
39
40 #include <string.h>
41 #include <float.h>
42 #include "typedefs.h"
43 #include "string2.h"
44 #include "mdebin.h"
45 #include "smalloc.h"
46 #include "physics.h"
47 #include "enxio.h"
48 #include "vec.h"
49 #include "disre.h"
50 #include "main.h"
51 #include "network.h"
52 #include "names.h"
53 #include "orires.h"
54 #include "constr.h"
55 #include "mtop_util.h"
56 #include "xvgr.h"
57 #include "gmxfio.h"
58 #include "macros.h"
59 #include "mdrun.h"
60 #include "mdebin_bar.h"
61
62
63 static const char *conrmsd_nm[] = { "Constr. rmsd", "Constr.2 rmsd" };
64
65 static const char *boxs_nm[] = { "Box-X", "Box-Y", "Box-Z" };
66
67 static const char *tricl_boxs_nm[] = {
68     "Box-XX", "Box-YY", "Box-ZZ",
69     "Box-YX", "Box-ZX", "Box-ZY"
70 };
71
72 static const char *vol_nm[] = { "Volume" };
73
74 static const char *dens_nm[] = {"Density" };
75
76 static const char *pv_nm[] = {"pV" };
77
78 static const char *enthalpy_nm[] = {"Enthalpy" };
79
80 static const char *boxvel_nm[] = {
81     "Box-Vel-XX", "Box-Vel-YY", "Box-Vel-ZZ",
82     "Box-Vel-YX", "Box-Vel-ZX", "Box-Vel-ZY"
83 };
84
85 #define NBOXS asize(boxs_nm)
86 #define NTRICLBOXS asize(tricl_boxs_nm)
87
88 t_mdebin *init_mdebin(ener_file_t       fp_ene,
89                       const gmx_mtop_t *mtop,
90                       const t_inputrec *ir,
91                       FILE             *fp_dhdl)
92 {
93     const char         *ener_nm[F_NRE];
94     static const char  *vir_nm[] = {
95         "Vir-XX", "Vir-XY", "Vir-XZ",
96         "Vir-YX", "Vir-YY", "Vir-YZ",
97         "Vir-ZX", "Vir-ZY", "Vir-ZZ"
98     };
99     static const char  *sv_nm[] = {
100         "ShakeVir-XX", "ShakeVir-XY", "ShakeVir-XZ",
101         "ShakeVir-YX", "ShakeVir-YY", "ShakeVir-YZ",
102         "ShakeVir-ZX", "ShakeVir-ZY", "ShakeVir-ZZ"
103     };
104     static const char  *fv_nm[] = {
105         "ForceVir-XX", "ForceVir-XY", "ForceVir-XZ",
106         "ForceVir-YX", "ForceVir-YY", "ForceVir-YZ",
107         "ForceVir-ZX", "ForceVir-ZY", "ForceVir-ZZ"
108     };
109     static const char  *pres_nm[] = {
110         "Pres-XX", "Pres-XY", "Pres-XZ",
111         "Pres-YX", "Pres-YY", "Pres-YZ",
112         "Pres-ZX", "Pres-ZY", "Pres-ZZ"
113     };
114     static const char  *surft_nm[] = {
115         "#Surf*SurfTen"
116     };
117     static const char  *mu_nm[] = {
118         "Mu-X", "Mu-Y", "Mu-Z"
119     };
120     static const char  *vcos_nm[] = {
121         "2CosZ*Vel-X"
122     };
123     static const char  *visc_nm[] = {
124         "1/Viscosity"
125     };
126     static const char  *baro_nm[] = {
127         "Barostat"
128     };
129
130     char              **grpnms;
131     const gmx_groups_t *groups;
132     char              **gnm;
133     char                buf[256];
134     const char         *bufi;
135     t_mdebin           *md;
136     int                 i, j, ni, nj, n, nh, k, kk, ncon, nset;
137     gmx_bool            bBHAM, bNoseHoover, b14;
138
139     snew(md, 1);
140
141     md->bVir   = TRUE;
142     md->bPress = TRUE;
143     md->bSurft = TRUE;
144     md->bMu    = TRUE;
145
146     if (EI_DYNAMICS(ir->eI))
147     {
148         md->delta_t = ir->delta_t;
149     }
150     else
151     {
152         md->delta_t = 0;
153     }
154
155     groups = &mtop->groups;
156
157     bBHAM = (mtop->ffparams.functype[0] == F_BHAM);
158     b14   = (gmx_mtop_ftype_count(mtop, F_LJ14) > 0 ||
159              gmx_mtop_ftype_count(mtop, F_LJC14_Q) > 0);
160
161     ncon           = gmx_mtop_ftype_count(mtop, F_CONSTR);
162     nset           = gmx_mtop_ftype_count(mtop, F_SETTLE);
163     md->bConstr    = (ncon > 0 || nset > 0);
164     md->bConstrVir = FALSE;
165     if (md->bConstr)
166     {
167         if (ncon > 0 && ir->eConstrAlg == econtLINCS)
168         {
169             if (ir->eI == eiSD2)
170             {
171                 md->nCrmsd = 2;
172             }
173             else
174             {
175                 md->nCrmsd = 1;
176             }
177         }
178         md->bConstrVir = (getenv("GMX_CONSTRAINTVIR") != NULL);
179     }
180     else
181     {
182         md->nCrmsd = 0;
183     }
184
185     /* Energy monitoring */
186     for (i = 0; i < egNR; i++)
187     {
188         md->bEInd[i] = FALSE;
189     }
190
191     /* Even though the OpenMM build has moved to contrib, it's not
192      * practical to move/remove this code fragment, because of the
193      * fundamental mess that is the GROMACS library structure. */
194 #ifndef GMX_OPENMM
195     for (i = 0; i < F_NRE; i++)
196     {
197         md->bEner[i] = FALSE;
198         if (i == F_LJ)
199         {
200             md->bEner[i] = !bBHAM;
201         }
202         else if (i == F_BHAM)
203         {
204             md->bEner[i] = bBHAM;
205         }
206         else if (i == F_EQM)
207         {
208             md->bEner[i] = ir->bQMMM;
209         }
210         else if (i == F_COUL_LR)
211         {
212             md->bEner[i] = (ir->rcoulomb > ir->rlist);
213         }
214         else if (i == F_LJ_LR)
215         {
216             md->bEner[i] = (!bBHAM && ir->rvdw > ir->rlist);
217         }
218         else if (i == F_BHAM_LR)
219         {
220             md->bEner[i] = (bBHAM && ir->rvdw > ir->rlist);
221         }
222         else if (i == F_RF_EXCL)
223         {
224             md->bEner[i] = (EEL_RF(ir->coulombtype) && ir->coulombtype != eelRF_NEC && ir->cutoff_scheme == ecutsGROUP);
225         }
226         else if (i == F_COUL_RECIP)
227         {
228             md->bEner[i] = EEL_FULL(ir->coulombtype);
229         }
230         else if (i == F_LJ14)
231         {
232             md->bEner[i] = b14;
233         }
234         else if (i == F_COUL14)
235         {
236             md->bEner[i] = b14;
237         }
238         else if (i == F_LJC14_Q || i == F_LJC_PAIRS_NB)
239         {
240             md->bEner[i] = FALSE;
241         }
242         else if ((i == F_DVDL_COUL && ir->fepvals->separate_dvdl[efptCOUL]) ||
243                  (i == F_DVDL_VDW  && ir->fepvals->separate_dvdl[efptVDW]) ||
244                  (i == F_DVDL_BONDED && ir->fepvals->separate_dvdl[efptBONDED]) ||
245                  (i == F_DVDL_RESTRAINT && ir->fepvals->separate_dvdl[efptRESTRAINT]) ||
246                  (i == F_DKDL && ir->fepvals->separate_dvdl[efptMASS]) ||
247                  (i == F_DVDL && ir->fepvals->separate_dvdl[efptFEP]))
248         {
249             md->bEner[i] = (ir->efep != efepNO);
250         }
251         else if ((interaction_function[i].flags & IF_VSITE) ||
252                  (i == F_CONSTR) || (i == F_CONSTRNC) || (i == F_SETTLE))
253         {
254             md->bEner[i] = FALSE;
255         }
256         else if ((i == F_COUL_SR) || (i == F_EPOT) || (i == F_PRES)  || (i == F_EQM))
257         {
258             md->bEner[i] = TRUE;
259         }
260         else if ((i == F_GBPOL) && ir->implicit_solvent == eisGBSA)
261         {
262             md->bEner[i] = TRUE;
263         }
264         else if ((i == F_NPSOLVATION) && ir->implicit_solvent == eisGBSA && (ir->sa_algorithm != esaNO))
265         {
266             md->bEner[i] = TRUE;
267         }
268         else if ((i == F_GB12) || (i == F_GB13) || (i == F_GB14))
269         {
270             md->bEner[i] = FALSE;
271         }
272         else if ((i == F_ETOT) || (i == F_EKIN) || (i == F_TEMP))
273         {
274             md->bEner[i] = EI_DYNAMICS(ir->eI);
275         }
276         else if (i == F_DISPCORR || i == F_PDISPCORR)
277         {
278             md->bEner[i] = (ir->eDispCorr != edispcNO);
279         }
280         else if (i == F_DISRESVIOL)
281         {
282             md->bEner[i] = (gmx_mtop_ftype_count(mtop, F_DISRES) > 0);
283         }
284         else if (i == F_ORIRESDEV)
285         {
286             md->bEner[i] = (gmx_mtop_ftype_count(mtop, F_ORIRES) > 0);
287         }
288         else if (i == F_CONNBONDS)
289         {
290             md->bEner[i] = FALSE;
291         }
292         else if (i == F_COM_PULL)
293         {
294             md->bEner[i] = (ir->ePull == epullUMBRELLA || ir->ePull == epullCONST_F || ir->bRot);
295         }
296         else if (i == F_ECONSERVED)
297         {
298             md->bEner[i] = ((ir->etc == etcNOSEHOOVER || ir->etc == etcVRESCALE) &&
299                             (ir->epc == epcNO || ir->epc == epcMTTK));
300         }
301         else
302         {
303             md->bEner[i] = (gmx_mtop_ftype_count(mtop, i) > 0);
304         }
305     }
306 #else
307     /* OpenMM always produces only the following 4 energy terms */
308     md->bEner[F_EPOT] = TRUE;
309     md->bEner[F_EKIN] = TRUE;
310     md->bEner[F_ETOT] = TRUE;
311     md->bEner[F_TEMP] = TRUE;
312 #endif
313
314     /* for adress simulations, most energy terms are not meaningfull, and thus disabled*/
315     if (ir->bAdress && !debug)
316     {
317         for (i = 0; i < F_NRE; i++)
318         {
319             md->bEner[i] = FALSE;
320             if (i == F_EKIN)
321             {
322                 md->bEner[i] = TRUE;
323             }
324             if (i == F_TEMP)
325             {
326                 md->bEner[i] = TRUE;
327             }
328         }
329         md->bVir   = FALSE;
330         md->bPress = FALSE;
331         md->bSurft = FALSE;
332         md->bMu    = FALSE;
333     }
334
335     md->f_nre = 0;
336     for (i = 0; i < F_NRE; i++)
337     {
338         if (md->bEner[i])
339         {
340             ener_nm[md->f_nre] = interaction_function[i].longname;
341             md->f_nre++;
342         }
343     }
344
345     md->epc            = ir->epc;
346     md->bDiagPres      = !TRICLINIC(ir->ref_p);
347     md->ref_p          = (ir->ref_p[XX][XX]+ir->ref_p[YY][YY]+ir->ref_p[ZZ][ZZ])/DIM;
348     md->bTricl         = TRICLINIC(ir->compress) || TRICLINIC(ir->deform);
349     md->bDynBox        = DYNAMIC_BOX(*ir);
350     md->etc            = ir->etc;
351     md->bNHC_trotter   = IR_NVT_TROTTER(ir);
352     md->bPrintNHChains = ir->bPrintNHChains;
353     md->bMTTK          = (IR_NPT_TROTTER(ir) || IR_NPH_TROTTER(ir));
354     md->bMu            = NEED_MUTOT(*ir);
355
356     md->ebin  = mk_ebin();
357     /* Pass NULL for unit to let get_ebin_space determine the units
358      * for interaction_function[i].longname
359      */
360     md->ie    = get_ebin_space(md->ebin, md->f_nre, ener_nm, NULL);
361     if (md->nCrmsd)
362     {
363         /* This should be called directly after the call for md->ie,
364          * such that md->iconrmsd follows directly in the list.
365          */
366         md->iconrmsd = get_ebin_space(md->ebin, md->nCrmsd, conrmsd_nm, "");
367     }
368     if (md->bDynBox)
369     {
370         md->ib    = get_ebin_space(md->ebin,
371                                    md->bTricl ? NTRICLBOXS : NBOXS,
372                                    md->bTricl ? tricl_boxs_nm : boxs_nm,
373                                    unit_length);
374         md->ivol  = get_ebin_space(md->ebin, 1, vol_nm,  unit_volume);
375         md->idens = get_ebin_space(md->ebin, 1, dens_nm, unit_density_SI);
376         if (md->bDiagPres)
377         {
378             md->ipv       = get_ebin_space(md->ebin, 1, pv_nm,   unit_energy);
379             md->ienthalpy = get_ebin_space(md->ebin, 1, enthalpy_nm,   unit_energy);
380         }
381     }
382     if (md->bConstrVir)
383     {
384         md->isvir = get_ebin_space(md->ebin, asize(sv_nm), sv_nm, unit_energy);
385         md->ifvir = get_ebin_space(md->ebin, asize(fv_nm), fv_nm, unit_energy);
386     }
387     if (md->bVir)
388     {
389         md->ivir   = get_ebin_space(md->ebin, asize(vir_nm), vir_nm, unit_energy);
390     }
391     if (md->bPress)
392     {
393         md->ipres  = get_ebin_space(md->ebin, asize(pres_nm), pres_nm, unit_pres_bar);
394     }
395     if (md->bSurft)
396     {
397         md->isurft = get_ebin_space(md->ebin, asize(surft_nm), surft_nm,
398                                     unit_surft_bar);
399     }
400     if (md->epc == epcPARRINELLORAHMAN || md->epc == epcMTTK)
401     {
402         md->ipc = get_ebin_space(md->ebin, md->bTricl ? 6 : 3,
403                                  boxvel_nm, unit_vel);
404     }
405     if (md->bMu)
406     {
407         md->imu    = get_ebin_space(md->ebin, asize(mu_nm), mu_nm, unit_dipole_D);
408     }
409     if (ir->cos_accel != 0)
410     {
411         md->ivcos = get_ebin_space(md->ebin, asize(vcos_nm), vcos_nm, unit_vel);
412         md->ivisc = get_ebin_space(md->ebin, asize(visc_nm), visc_nm,
413                                    unit_invvisc_SI);
414     }
415
416     /* Energy monitoring */
417     for (i = 0; i < egNR; i++)
418     {
419         md->bEInd[i] = FALSE;
420     }
421     md->bEInd[egCOULSR] = TRUE;
422     md->bEInd[egLJSR  ] = TRUE;
423
424     if (ir->rcoulomb > ir->rlist)
425     {
426         md->bEInd[egCOULLR] = TRUE;
427     }
428     if (!bBHAM)
429     {
430         if (ir->rvdw > ir->rlist)
431         {
432             md->bEInd[egLJLR]   = TRUE;
433         }
434     }
435     else
436     {
437         md->bEInd[egLJSR]   = FALSE;
438         md->bEInd[egBHAMSR] = TRUE;
439         if (ir->rvdw > ir->rlist)
440         {
441             md->bEInd[egBHAMLR]   = TRUE;
442         }
443     }
444     if (b14)
445     {
446         md->bEInd[egLJ14]   = TRUE;
447         md->bEInd[egCOUL14] = TRUE;
448     }
449     md->nEc = 0;
450     for (i = 0; (i < egNR); i++)
451     {
452         if (md->bEInd[i])
453         {
454             md->nEc++;
455         }
456     }
457
458     n = groups->grps[egcENER].nr;
459     /* for adress simulations, most energy terms are not meaningfull, and thus disabled*/
460     if (!ir->bAdress)
461     {
462         /*standard simulation*/
463         md->nEg = n;
464         md->nE  = (n*(n+1))/2;
465     }
466     else if (!debug)
467     {
468         /*AdResS simulation*/
469         md->nU    = 0;
470         md->nEg   = 0;
471         md->nE    = 0;
472         md->nEc   = 0;
473         md->isvir = FALSE;
474     }
475     snew(md->igrp, md->nE);
476     if (md->nE > 1)
477     {
478         n = 0;
479         snew(gnm, md->nEc);
480         for (k = 0; (k < md->nEc); k++)
481         {
482             snew(gnm[k], STRLEN);
483         }
484         for (i = 0; (i < groups->grps[egcENER].nr); i++)
485         {
486             ni = groups->grps[egcENER].nm_ind[i];
487             for (j = i; (j < groups->grps[egcENER].nr); j++)
488             {
489                 nj = groups->grps[egcENER].nm_ind[j];
490                 for (k = kk = 0; (k < egNR); k++)
491                 {
492                     if (md->bEInd[k])
493                     {
494                         sprintf(gnm[kk], "%s:%s-%s", egrp_nm[k],
495                                 *(groups->grpname[ni]), *(groups->grpname[nj]));
496                         kk++;
497                     }
498                 }
499                 md->igrp[n] = get_ebin_space(md->ebin, md->nEc,
500                                              (const char **)gnm, unit_energy);
501                 n++;
502             }
503         }
504         for (k = 0; (k < md->nEc); k++)
505         {
506             sfree(gnm[k]);
507         }
508         sfree(gnm);
509
510         if (n != md->nE)
511         {
512             gmx_incons("Number of energy terms wrong");
513         }
514     }
515
516     md->nTC  = groups->grps[egcTC].nr;
517     md->nNHC = ir->opts.nhchainlength; /* shorthand for number of NH chains */
518     if (md->bMTTK)
519     {
520         md->nTCP = 1;  /* assume only one possible coupling system for barostat
521                           for now */
522     }
523     else
524     {
525         md->nTCP = 0;
526     }
527     if (md->etc == etcNOSEHOOVER)
528     {
529         if (md->bNHC_trotter)
530         {
531             md->mde_n = 2*md->nNHC*md->nTC;
532         }
533         else
534         {
535             md->mde_n = 2*md->nTC;
536         }
537         if (md->epc == epcMTTK)
538         {
539             md->mdeb_n = 2*md->nNHC*md->nTCP;
540         }
541     }
542     else
543     {
544         md->mde_n  = md->nTC;
545         md->mdeb_n = 0;
546     }
547
548     snew(md->tmp_r, md->mde_n);
549     snew(md->tmp_v, md->mde_n);
550     snew(md->grpnms, md->mde_n);
551     grpnms = md->grpnms;
552
553     for (i = 0; (i < md->nTC); i++)
554     {
555         ni = groups->grps[egcTC].nm_ind[i];
556         sprintf(buf, "T-%s", *(groups->grpname[ni]));
557         grpnms[i] = strdup(buf);
558     }
559     md->itemp = get_ebin_space(md->ebin, md->nTC, (const char **)grpnms,
560                                unit_temp_K);
561
562     if (md->etc == etcNOSEHOOVER)
563     {
564         if (md->bPrintNHChains)
565         {
566             if (md->bNHC_trotter)
567             {
568                 for (i = 0; (i < md->nTC); i++)
569                 {
570                     ni   = groups->grps[egcTC].nm_ind[i];
571                     bufi = *(groups->grpname[ni]);
572                     for (j = 0; (j < md->nNHC); j++)
573                     {
574                         sprintf(buf, "Xi-%d-%s", j, bufi);
575                         grpnms[2*(i*md->nNHC+j)] = strdup(buf);
576                         sprintf(buf, "vXi-%d-%s", j, bufi);
577                         grpnms[2*(i*md->nNHC+j)+1] = strdup(buf);
578                     }
579                 }
580                 md->itc = get_ebin_space(md->ebin, md->mde_n,
581                                          (const char **)grpnms, unit_invtime);
582                 if (md->bMTTK)
583                 {
584                     for (i = 0; (i < md->nTCP); i++)
585                     {
586                         bufi = baro_nm[0];  /* All barostat DOF's together for now. */
587                         for (j = 0; (j < md->nNHC); j++)
588                         {
589                             sprintf(buf, "Xi-%d-%s", j, bufi);
590                             grpnms[2*(i*md->nNHC+j)] = strdup(buf);
591                             sprintf(buf, "vXi-%d-%s", j, bufi);
592                             grpnms[2*(i*md->nNHC+j)+1] = strdup(buf);
593                         }
594                     }
595                     md->itcb = get_ebin_space(md->ebin, md->mdeb_n,
596                                               (const char **)grpnms, unit_invtime);
597                 }
598             }
599             else
600             {
601                 for (i = 0; (i < md->nTC); i++)
602                 {
603                     ni   = groups->grps[egcTC].nm_ind[i];
604                     bufi = *(groups->grpname[ni]);
605                     sprintf(buf, "Xi-%s", bufi);
606                     grpnms[2*i] = strdup(buf);
607                     sprintf(buf, "vXi-%s", bufi);
608                     grpnms[2*i+1] = strdup(buf);
609                 }
610                 md->itc = get_ebin_space(md->ebin, md->mde_n,
611                                          (const char **)grpnms, unit_invtime);
612             }
613         }
614     }
615     else if (md->etc == etcBERENDSEN || md->etc == etcYES ||
616              md->etc == etcVRESCALE)
617     {
618         for (i = 0; (i < md->nTC); i++)
619         {
620             ni = groups->grps[egcTC].nm_ind[i];
621             sprintf(buf, "Lamb-%s", *(groups->grpname[ni]));
622             grpnms[i] = strdup(buf);
623         }
624         md->itc = get_ebin_space(md->ebin, md->mde_n, (const char **)grpnms, "");
625     }
626
627     sfree(grpnms);
628
629
630     md->nU = groups->grps[egcACC].nr;
631     if (md->nU > 1)
632     {
633         snew(grpnms, 3*md->nU);
634         for (i = 0; (i < md->nU); i++)
635         {
636             ni = groups->grps[egcACC].nm_ind[i];
637             sprintf(buf, "Ux-%s", *(groups->grpname[ni]));
638             grpnms[3*i+XX] = strdup(buf);
639             sprintf(buf, "Uy-%s", *(groups->grpname[ni]));
640             grpnms[3*i+YY] = strdup(buf);
641             sprintf(buf, "Uz-%s", *(groups->grpname[ni]));
642             grpnms[3*i+ZZ] = strdup(buf);
643         }
644         md->iu = get_ebin_space(md->ebin, 3*md->nU, (const char **)grpnms, unit_vel);
645         sfree(grpnms);
646     }
647
648     if (fp_ene)
649     {
650         do_enxnms(fp_ene, &md->ebin->nener, &md->ebin->enm);
651     }
652
653     md->print_grpnms = NULL;
654
655     /* check whether we're going to write dh histograms */
656     md->dhc = NULL;
657     if (ir->fepvals->separate_dhdl_file == esepdhdlfileNO)
658     {
659         /* Currently dh histograms are only written with dynamics */
660         if (EI_DYNAMICS(ir->eI))
661         {
662             snew(md->dhc, 1);
663
664             mde_delta_h_coll_init(md->dhc, ir);
665         }
666         md->fp_dhdl = NULL;
667         snew(md->dE, ir->fepvals->n_lambda);
668     }
669     else
670     {
671         md->fp_dhdl = fp_dhdl;
672         snew(md->dE, ir->fepvals->n_lambda);
673     }
674     if (ir->bSimTemp)
675     {
676         int i;
677         snew(md->temperatures, ir->fepvals->n_lambda);
678         for (i = 0; i < ir->fepvals->n_lambda; i++)
679         {
680             md->temperatures[i] = ir->simtempvals->temperatures[i];
681         }
682     }
683     return md;
684 }
685
686 /* print a lambda vector to a string
687    fep = the inputrec's FEP input data
688    i = the index of the lambda vector
689    get_native_lambda = whether to print the native lambda
690    get_names = whether to print the names rather than the values
691    str = the pre-allocated string buffer to print to. */
692 static void print_lambda_vector(t_lambda *fep, int i,
693                                 gmx_bool get_native_lambda, gmx_bool get_names,
694                                 char *str)
695 {
696     size_t nps = 0, np;
697     int    j, k = 0;
698     int    Nsep = 0;
699
700     for (j = 0; j < efptNR; j++)
701     {
702         if (fep->separate_dvdl[j])
703         {
704             Nsep++;
705         }
706     }
707     str[0] = 0; /* reset the string */
708     if (Nsep > 1)
709     {
710         str += sprintf(str, "("); /* set the opening parenthesis*/
711     }
712     for (j = 0; j < efptNR; j++)
713     {
714         if (fep->separate_dvdl[j])
715         {
716             double lam;
717             if (!get_names)
718             {
719                 if (get_native_lambda && fep->init_lambda >= 0)
720                 {
721                     str += sprintf(str, "%.4f", fep->init_lambda);
722                 }
723                 else
724                 {
725                     str += sprintf(str, "%.4f", fep->all_lambda[j][i]);
726                 }
727             }
728             else
729             {
730                 str += sprintf(str, "%s", efpt_singular_names[j]);
731             }
732             /* print comma for the next item */
733             if (k < Nsep-1)
734             {
735                 str += sprintf(str, ", ");
736             }
737             k++;
738         }
739     }
740     if (Nsep > 1)
741     {
742         /* and add the closing parenthesis */
743         str += sprintf(str, ")");
744     }
745 }
746
747
748 extern FILE *open_dhdl(const char *filename, const t_inputrec *ir,
749                        const output_env_t oenv)
750 {
751     FILE       *fp;
752     const char *dhdl = "dH/d\\lambda", *deltag = "\\DeltaH", *lambda = "\\lambda",
753     *lambdastate     = "\\lambda state", *remain = "remaining";
754     char        title[STRLEN], label_x[STRLEN], label_y[STRLEN];
755     int         i, np, nps, nsets, nsets_de, nsetsbegin;
756     int         n_lambda_terms = 0;
757     t_lambda   *fep            = ir->fepvals; /* for simplicity */
758     t_expanded *expand         = ir->expandedvals;
759     char      **setname;
760     char        buf[STRLEN], lambda_vec_str[STRLEN], lambda_name_str[STRLEN];
761     int         bufplace = 0;
762
763     int         nsets_dhdl = 0;
764     int         s          = 0;
765     int         nsetsextend;
766     gmx_bool    write_pV = FALSE;
767
768     /* count the number of different lambda terms */
769     for (i = 0; i < efptNR; i++)
770     {
771         if (fep->separate_dvdl[i])
772         {
773             n_lambda_terms++;
774         }
775     }
776
777     if (fep->n_lambda == 0)
778     {
779         sprintf(title, "%s", dhdl);
780         sprintf(label_x, "Time (ps)");
781         sprintf(label_y, "%s (%s %s)",
782                 dhdl, unit_energy, "[\\lambda]\\S-1\\N");
783     }
784     else
785     {
786         sprintf(title, "%s and %s", dhdl, deltag);
787         sprintf(label_x, "Time (ps)");
788         sprintf(label_y, "%s and %s (%s %s)",
789                 dhdl, deltag, unit_energy, "[\\8l\\4]\\S-1\\N");
790     }
791     fp = gmx_fio_fopen(filename, "w+");
792     xvgr_header(fp, title, label_x, label_y, exvggtXNY, oenv);
793
794     if (!(ir->bSimTemp))
795     {
796         bufplace = sprintf(buf, "T = %g (K) ",
797                            ir->opts.ref_t[0]);
798     }
799     if (ir->efep != efepSLOWGROWTH)
800     {
801         if ( (fep->init_lambda >= 0)  && (n_lambda_terms == 1 ))
802         {
803             /* compatibility output */
804             sprintf(&(buf[bufplace]), "%s = %.4f", lambda, fep->init_lambda);
805         }
806         else
807         {
808             print_lambda_vector(fep, fep->init_fep_state, TRUE, FALSE,
809                                 lambda_vec_str);
810             print_lambda_vector(fep, fep->init_fep_state, TRUE, TRUE,
811                                 lambda_name_str);
812             sprintf(&(buf[bufplace]), "%s %d: %s = %s",
813                     lambdastate, fep->init_fep_state,
814                     lambda_name_str, lambda_vec_str);
815         }
816     }
817     xvgr_subtitle(fp, buf, oenv);
818
819
820     nsets_dhdl = 0;
821     if (fep->dhdl_derivatives == edhdlderivativesYES)
822     {
823         nsets_dhdl = n_lambda_terms;
824     }
825     /* count the number of delta_g states */
826     nsets_de = fep->lambda_stop_n - fep->lambda_start_n;
827
828     nsets = nsets_dhdl + nsets_de; /* dhdl + fep differences */
829
830     if (fep->n_lambda > 0 && (expand->elmcmove > elmcmoveNO))
831     {
832         nsets += 1;   /*add fep state for expanded ensemble */
833     }
834
835     if (fep->bPrintEnergy)
836     {
837         nsets += 1;  /* add energy to the dhdl as well */
838     }
839
840     nsetsextend = nsets;
841     if ((ir->epc != epcNO) && (fep->n_lambda > 0) && (fep->init_lambda < 0))
842     {
843         nsetsextend += 1; /* for PV term, other terms possible if required for
844                              the reduced potential (only needed with foreign
845                              lambda, and only output when init_lambda is not
846                              set in order to maintain compatibility of the
847                              dhdl.xvg file) */
848         write_pV     = TRUE;
849     }
850     snew(setname, nsetsextend);
851
852     if (expand->elmcmove > elmcmoveNO)
853     {
854         /* state for the fep_vals, if we have alchemical sampling */
855         sprintf(buf, "%s", "Thermodynamic state");
856         setname[s] = strdup(buf);
857         s         += 1;
858     }
859
860     if (fep->bPrintEnergy)
861     {
862         sprintf(buf, "%s (%s)", "Energy", unit_energy);
863         setname[s] = strdup(buf);
864         s         += 1;
865     }
866
867     if (fep->dhdl_derivatives == edhdlderivativesYES)
868     {
869         for (i = 0; i < efptNR; i++)
870         {
871             if (fep->separate_dvdl[i])
872             {
873
874                 if ( (fep->init_lambda >= 0)  && (n_lambda_terms == 1 ))
875                 {
876                     /* compatibility output */
877                     sprintf(buf, "%s %s %.4f", dhdl, lambda, fep->init_lambda);
878                 }
879                 else
880                 {
881                     double lam = fep->init_lambda;
882                     if (fep->init_lambda < 0)
883                     {
884                         lam = fep->all_lambda[i][fep->init_fep_state];
885                     }
886                     sprintf(buf, "%s %s = %.4f", dhdl, efpt_singular_names[i],
887                             lam);
888                 }
889                 setname[s] = strdup(buf);
890                 s         += 1;
891             }
892         }
893     }
894
895     if (fep->n_lambda > 0)
896     {
897         /* g_bar has to determine the lambda values used in this simulation
898          * from this xvg legend.
899          */
900
901         if (expand->elmcmove > elmcmoveNO)
902         {
903             nsetsbegin = 1;  /* for including the expanded ensemble */
904         }
905         else
906         {
907             nsetsbegin = 0;
908         }
909
910         if (fep->bPrintEnergy)
911         {
912             nsetsbegin += 1;
913         }
914         nsetsbegin += nsets_dhdl;
915
916         for (i = fep->lambda_start_n; i < fep->lambda_stop_n; i++)
917         {
918             print_lambda_vector(fep, i, FALSE, FALSE, lambda_vec_str);
919             if ( (fep->init_lambda >= 0)  && (n_lambda_terms == 1 ))
920             {
921                 /* for compatible dhdl.xvg files */
922                 nps = sprintf(buf, "%s %s %s", deltag, lambda, lambda_vec_str);
923             }
924             else
925             {
926                 nps = sprintf(buf, "%s %s to %s", deltag, lambda, lambda_vec_str);
927             }
928
929             if (ir->bSimTemp)
930             {
931                 /* print the temperature for this state if doing simulated annealing */
932                 sprintf(&buf[nps], "T = %g (%s)",
933                         ir->simtempvals->temperatures[s-(nsetsbegin)],
934                         unit_temp_K);
935             }
936             setname[s] = strdup(buf);
937             s++;
938         }
939         if (write_pV)
940         {
941             np                     = sprintf(buf, "pV (%s)", unit_energy);
942             setname[nsetsextend-1] = strdup(buf);  /* the first entry after
943                                                       nsets */
944         }
945
946         xvgr_legend(fp, nsetsextend, (const char **)setname, oenv);
947
948         for (s = 0; s < nsetsextend; s++)
949         {
950             sfree(setname[s]);
951         }
952         sfree(setname);
953     }
954
955     return fp;
956 }
957
958 static void copy_energy(t_mdebin *md, real e[], real ecpy[])
959 {
960     int i, j;
961
962     for (i = j = 0; (i < F_NRE); i++)
963     {
964         if (md->bEner[i])
965         {
966             ecpy[j++] = e[i];
967         }
968     }
969     if (j != md->f_nre)
970     {
971         gmx_incons("Number of energy terms wrong");
972     }
973 }
974
975 void upd_mdebin(t_mdebin       *md,
976                 gmx_bool        bDoDHDL,
977                 gmx_bool        bSum,
978                 double          time,
979                 real            tmass,
980                 gmx_enerdata_t *enerd,
981                 t_state        *state,
982                 t_lambda       *fep,
983                 t_expanded     *expand,
984                 matrix          box,
985                 tensor          svir,
986                 tensor          fvir,
987                 tensor          vir,
988                 tensor          pres,
989                 gmx_ekindata_t *ekind,
990                 rvec            mu_tot,
991                 gmx_constr_t    constr)
992 {
993     int    i, j, k, kk, m, n, gid;
994     real   crmsd[2], tmp6[6];
995     real   bs[NTRICLBOXS], vol, dens, pv, enthalpy;
996     real   eee[egNR];
997     real   ecopy[F_NRE];
998     double store_dhdl[efptNR];
999     real   store_energy = 0;
1000     real   tmp;
1001
1002     /* Do NOT use the box in the state variable, but the separate box provided
1003      * as an argument. This is because we sometimes need to write the box from
1004      * the last timestep to match the trajectory frames.
1005      */
1006     copy_energy(md, enerd->term, ecopy);
1007     add_ebin(md->ebin, md->ie, md->f_nre, ecopy, bSum);
1008     if (md->nCrmsd)
1009     {
1010         crmsd[0] = constr_rmsd(constr, FALSE);
1011         if (md->nCrmsd > 1)
1012         {
1013             crmsd[1] = constr_rmsd(constr, TRUE);
1014         }
1015         add_ebin(md->ebin, md->iconrmsd, md->nCrmsd, crmsd, FALSE);
1016     }
1017     if (md->bDynBox)
1018     {
1019         int nboxs;
1020         if (md->bTricl)
1021         {
1022             bs[0] = box[XX][XX];
1023             bs[1] = box[YY][YY];
1024             bs[2] = box[ZZ][ZZ];
1025             bs[3] = box[YY][XX];
1026             bs[4] = box[ZZ][XX];
1027             bs[5] = box[ZZ][YY];
1028             nboxs = NTRICLBOXS;
1029         }
1030         else
1031         {
1032             bs[0] = box[XX][XX];
1033             bs[1] = box[YY][YY];
1034             bs[2] = box[ZZ][ZZ];
1035             nboxs = NBOXS;
1036         }
1037         vol  = box[XX][XX]*box[YY][YY]*box[ZZ][ZZ];
1038         dens = (tmass*AMU)/(vol*NANO*NANO*NANO);
1039         add_ebin(md->ebin, md->ib, nboxs, bs, bSum);
1040         add_ebin(md->ebin, md->ivol, 1, &vol, bSum);
1041         add_ebin(md->ebin, md->idens, 1, &dens, bSum);
1042
1043         if (md->bDiagPres)
1044         {
1045             /* This is pV (in kJ/mol).  The pressure is the reference pressure,
1046                not the instantaneous pressure */
1047             pv = vol*md->ref_p/PRESFAC;
1048
1049             add_ebin(md->ebin, md->ipv, 1, &pv, bSum);
1050             enthalpy = pv + enerd->term[F_ETOT];
1051             add_ebin(md->ebin, md->ienthalpy, 1, &enthalpy, bSum);
1052         }
1053     }
1054     if (md->bConstrVir)
1055     {
1056         add_ebin(md->ebin, md->isvir, 9, svir[0], bSum);
1057         add_ebin(md->ebin, md->ifvir, 9, fvir[0], bSum);
1058     }
1059     if (md->bVir)
1060     {
1061         add_ebin(md->ebin, md->ivir, 9, vir[0], bSum);
1062     }
1063     if (md->bPress)
1064     {
1065         add_ebin(md->ebin, md->ipres, 9, pres[0], bSum);
1066     }
1067     if (md->bSurft)
1068     {
1069         tmp = (pres[ZZ][ZZ]-(pres[XX][XX]+pres[YY][YY])*0.5)*box[ZZ][ZZ];
1070         add_ebin(md->ebin, md->isurft, 1, &tmp, bSum);
1071     }
1072     if (md->epc == epcPARRINELLORAHMAN || md->epc == epcMTTK)
1073     {
1074         tmp6[0] = state->boxv[XX][XX];
1075         tmp6[1] = state->boxv[YY][YY];
1076         tmp6[2] = state->boxv[ZZ][ZZ];
1077         tmp6[3] = state->boxv[YY][XX];
1078         tmp6[4] = state->boxv[ZZ][XX];
1079         tmp6[5] = state->boxv[ZZ][YY];
1080         add_ebin(md->ebin, md->ipc, md->bTricl ? 6 : 3, tmp6, bSum);
1081     }
1082     if (md->bMu)
1083     {
1084         add_ebin(md->ebin, md->imu, 3, mu_tot, bSum);
1085     }
1086     if (ekind && ekind->cosacc.cos_accel != 0)
1087     {
1088         vol  = box[XX][XX]*box[YY][YY]*box[ZZ][ZZ];
1089         dens = (tmass*AMU)/(vol*NANO*NANO*NANO);
1090         add_ebin(md->ebin, md->ivcos, 1, &(ekind->cosacc.vcos), bSum);
1091         /* 1/viscosity, unit 1/(kg m^-1 s^-1) */
1092         tmp = 1/(ekind->cosacc.cos_accel/(ekind->cosacc.vcos*PICO)
1093                  *dens*vol*sqr(box[ZZ][ZZ]*NANO/(2*M_PI)));
1094         add_ebin(md->ebin, md->ivisc, 1, &tmp, bSum);
1095     }
1096     if (md->nE > 1)
1097     {
1098         n = 0;
1099         for (i = 0; (i < md->nEg); i++)
1100         {
1101             for (j = i; (j < md->nEg); j++)
1102             {
1103                 gid = GID(i, j, md->nEg);
1104                 for (k = kk = 0; (k < egNR); k++)
1105                 {
1106                     if (md->bEInd[k])
1107                     {
1108                         eee[kk++] = enerd->grpp.ener[k][gid];
1109                     }
1110                 }
1111                 add_ebin(md->ebin, md->igrp[n], md->nEc, eee, bSum);
1112                 n++;
1113             }
1114         }
1115     }
1116
1117     if (ekind)
1118     {
1119         for (i = 0; (i < md->nTC); i++)
1120         {
1121             md->tmp_r[i] = ekind->tcstat[i].T;
1122         }
1123         add_ebin(md->ebin, md->itemp, md->nTC, md->tmp_r, bSum);
1124
1125         if (md->etc == etcNOSEHOOVER)
1126         {
1127             /* whether to print Nose-Hoover chains: */
1128             if (md->bPrintNHChains)
1129             {
1130                 if (md->bNHC_trotter)
1131                 {
1132                     for (i = 0; (i < md->nTC); i++)
1133                     {
1134                         for (j = 0; j < md->nNHC; j++)
1135                         {
1136                             k                = i*md->nNHC+j;
1137                             md->tmp_r[2*k]   = state->nosehoover_xi[k];
1138                             md->tmp_r[2*k+1] = state->nosehoover_vxi[k];
1139                         }
1140                     }
1141                     add_ebin(md->ebin, md->itc, md->mde_n, md->tmp_r, bSum);
1142
1143                     if (md->bMTTK)
1144                     {
1145                         for (i = 0; (i < md->nTCP); i++)
1146                         {
1147                             for (j = 0; j < md->nNHC; j++)
1148                             {
1149                                 k                = i*md->nNHC+j;
1150                                 md->tmp_r[2*k]   = state->nhpres_xi[k];
1151                                 md->tmp_r[2*k+1] = state->nhpres_vxi[k];
1152                             }
1153                         }
1154                         add_ebin(md->ebin, md->itcb, md->mdeb_n, md->tmp_r, bSum);
1155                     }
1156                 }
1157                 else
1158                 {
1159                     for (i = 0; (i < md->nTC); i++)
1160                     {
1161                         md->tmp_r[2*i]   = state->nosehoover_xi[i];
1162                         md->tmp_r[2*i+1] = state->nosehoover_vxi[i];
1163                     }
1164                     add_ebin(md->ebin, md->itc, md->mde_n, md->tmp_r, bSum);
1165                 }
1166             }
1167         }
1168         else if (md->etc == etcBERENDSEN || md->etc == etcYES ||
1169                  md->etc == etcVRESCALE)
1170         {
1171             for (i = 0; (i < md->nTC); i++)
1172             {
1173                 md->tmp_r[i] = ekind->tcstat[i].lambda;
1174             }
1175             add_ebin(md->ebin, md->itc, md->nTC, md->tmp_r, bSum);
1176         }
1177     }
1178
1179     if (ekind && md->nU > 1)
1180     {
1181         for (i = 0; (i < md->nU); i++)
1182         {
1183             copy_rvec(ekind->grpstat[i].u, md->tmp_v[i]);
1184         }
1185         add_ebin(md->ebin, md->iu, 3*md->nU, md->tmp_v[0], bSum);
1186     }
1187
1188     ebin_increase_count(md->ebin, bSum);
1189
1190     /* BAR + thermodynamic integration values */
1191     if ((md->fp_dhdl || md->dhc) && bDoDHDL)
1192     {
1193         for (i = 0; i < enerd->n_lambda-1; i++)
1194         {
1195             /* zero for simulated tempering */
1196             md->dE[i] = enerd->enerpart_lambda[i+1]-enerd->enerpart_lambda[0];
1197             if (md->temperatures != NULL)
1198             {
1199                 /* MRS: is this right, given the way we have defined the exchange probabilities? */
1200                 /* is this even useful to have at all? */
1201                 md->dE[i] += (md->temperatures[i]/
1202                               md->temperatures[state->fep_state]-1.0)*
1203                     enerd->term[F_EKIN];
1204             }
1205         }
1206
1207         if (md->fp_dhdl)
1208         {
1209             fprintf(md->fp_dhdl, "%.4f", time);
1210             /* the current free energy state */
1211
1212             /* print the current state if we are doing expanded ensemble */
1213             if (expand->elmcmove > elmcmoveNO)
1214             {
1215                 fprintf(md->fp_dhdl, " %4d", state->fep_state);
1216             }
1217             /* total energy (for if the temperature changes */
1218             if (fep->bPrintEnergy)
1219             {
1220                 store_energy = enerd->term[F_ETOT];
1221                 fprintf(md->fp_dhdl, " %#.8g", store_energy);
1222             }
1223
1224             if (fep->dhdl_derivatives == edhdlderivativesYES)
1225             {
1226                 for (i = 0; i < efptNR; i++)
1227                 {
1228                     if (fep->separate_dvdl[i])
1229                     {
1230                         /* assumes F_DVDL is first */
1231                         fprintf(md->fp_dhdl, " %#.8g", enerd->term[F_DVDL+i]);
1232                     }
1233                 }
1234             }
1235             for (i = fep->lambda_start_n; i < fep->lambda_stop_n; i++)
1236             {
1237                 fprintf(md->fp_dhdl, " %#.8g", md->dE[i]);
1238             }
1239             if ((md->epc != epcNO)  &&
1240                 (enerd->n_lambda > 0) &&
1241                 (fep->init_lambda < 0))
1242             {
1243                 fprintf(md->fp_dhdl, " %#.8g", pv);  /* PV term only needed when
1244                                                         there are alternate state
1245                                                         lambda and we're not in
1246                                                         compatibility mode */
1247             }
1248             fprintf(md->fp_dhdl, "\n");
1249             /* and the binary free energy output */
1250         }
1251         if (md->dhc && bDoDHDL)
1252         {
1253             int idhdl = 0;
1254             for (i = 0; i < efptNR; i++)
1255             {
1256                 if (fep->separate_dvdl[i])
1257                 {
1258                     /* assumes F_DVDL is first */
1259                     store_dhdl[idhdl] = enerd->term[F_DVDL+i];
1260                     idhdl            += 1;
1261                 }
1262             }
1263             store_energy = enerd->term[F_ETOT];
1264             /* store_dh is dE */
1265             mde_delta_h_coll_add_dh(md->dhc,
1266                                     (double)state->fep_state,
1267                                     store_energy,
1268                                     pv,
1269                                     store_dhdl,
1270                                     md->dE + fep->lambda_start_n,
1271                                     time);
1272         }
1273     }
1274 }
1275
1276
1277 void upd_mdebin_step(t_mdebin *md)
1278 {
1279     ebin_increase_count(md->ebin, FALSE);
1280 }
1281
1282 static void npr(FILE *log, int n, char c)
1283 {
1284     for (; (n > 0); n--)
1285     {
1286         fprintf(log, "%c", c);
1287     }
1288 }
1289
1290 static void pprint(FILE *log, const char *s, t_mdebin *md)
1291 {
1292     char CHAR = '#';
1293     int  slen;
1294     char buf1[22], buf2[22];
1295
1296     slen = strlen(s);
1297     fprintf(log, "\t<======  ");
1298     npr(log, slen, CHAR);
1299     fprintf(log, "  ==>\n");
1300     fprintf(log, "\t<====  %s  ====>\n", s);
1301     fprintf(log, "\t<==  ");
1302     npr(log, slen, CHAR);
1303     fprintf(log, "  ======>\n\n");
1304
1305     fprintf(log, "\tStatistics over %s steps using %s frames\n",
1306             gmx_step_str(md->ebin->nsteps_sim, buf1),
1307             gmx_step_str(md->ebin->nsum_sim, buf2));
1308     fprintf(log, "\n");
1309 }
1310
1311 void print_ebin_header(FILE *log, gmx_large_int_t steps, double time, real lambda)
1312 {
1313     char buf[22];
1314
1315     fprintf(log, "   %12s   %12s   %12s\n"
1316             "   %12s   %12.5f   %12.5f\n\n",
1317             "Step", "Time", "Lambda", gmx_step_str(steps, buf), time, lambda);
1318 }
1319
1320 void print_ebin(ener_file_t fp_ene, gmx_bool bEne, gmx_bool bDR, gmx_bool bOR,
1321                 FILE *log,
1322                 gmx_large_int_t step, double time,
1323                 int mode, gmx_bool bCompact,
1324                 t_mdebin *md, t_fcdata *fcd,
1325                 gmx_groups_t *groups, t_grpopts *opts)
1326 {
1327     /*static char **grpnms=NULL;*/
1328     char         buf[246];
1329     int          i, j, n, ni, nj, ndr, nor, b;
1330     int          ndisre = 0;
1331     real        *disre_rm3tav, *disre_rt;
1332
1333     /* these are for the old-style blocks (1 subblock, only reals), because
1334        there can be only one per ID for these */
1335     int          nr[enxNR];
1336     int          id[enxNR];
1337     real        *block[enxNR];
1338
1339     /* temporary arrays for the lambda values to write out */
1340     double      enxlambda_data[2];
1341
1342     t_enxframe  fr;
1343
1344     switch (mode)
1345     {
1346         case eprNORMAL:
1347             init_enxframe(&fr);
1348             fr.t            = time;
1349             fr.step         = step;
1350             fr.nsteps       = md->ebin->nsteps;
1351             fr.dt           = md->delta_t;
1352             fr.nsum         = md->ebin->nsum;
1353             fr.nre          = (bEne) ? md->ebin->nener : 0;
1354             fr.ener         = md->ebin->e;
1355             ndisre          = bDR ? fcd->disres.npair : 0;
1356             disre_rm3tav    = fcd->disres.rm3tav;
1357             disre_rt        = fcd->disres.rt;
1358             /* Optional additional old-style (real-only) blocks. */
1359             for (i = 0; i < enxNR; i++)
1360             {
1361                 nr[i] = 0;
1362             }
1363             if (fcd->orires.nr > 0 && bOR)
1364             {
1365                 diagonalize_orires_tensors(&(fcd->orires));
1366                 nr[enxOR]     = fcd->orires.nr;
1367                 block[enxOR]  = fcd->orires.otav;
1368                 id[enxOR]     = enxOR;
1369                 nr[enxORI]    = (fcd->orires.oinsl != fcd->orires.otav) ?
1370                     fcd->orires.nr : 0;
1371                 block[enxORI] = fcd->orires.oinsl;
1372                 id[enxORI]    = enxORI;
1373                 nr[enxORT]    = fcd->orires.nex*12;
1374                 block[enxORT] = fcd->orires.eig;
1375                 id[enxORT]    = enxORT;
1376             }
1377
1378             /* whether we are going to wrte anything out: */
1379             if (fr.nre || ndisre || nr[enxOR] || nr[enxORI])
1380             {
1381
1382                 /* the old-style blocks go first */
1383                 fr.nblock = 0;
1384                 for (i = 0; i < enxNR; i++)
1385                 {
1386                     if (nr[i] > 0)
1387                     {
1388                         fr.nblock = i + 1;
1389                     }
1390                 }
1391                 add_blocks_enxframe(&fr, fr.nblock);
1392                 for (b = 0; b < fr.nblock; b++)
1393                 {
1394                     add_subblocks_enxblock(&(fr.block[b]), 1);
1395                     fr.block[b].id        = id[b];
1396                     fr.block[b].sub[0].nr = nr[b];
1397 #ifndef GMX_DOUBLE
1398                     fr.block[b].sub[0].type = xdr_datatype_float;
1399                     fr.block[b].sub[0].fval = block[b];
1400 #else
1401                     fr.block[b].sub[0].type = xdr_datatype_double;
1402                     fr.block[b].sub[0].dval = block[b];
1403 #endif
1404                 }
1405
1406                 /* check for disre block & fill it. */
1407                 if (ndisre > 0)
1408                 {
1409                     int db = fr.nblock;
1410                     fr.nblock += 1;
1411                     add_blocks_enxframe(&fr, fr.nblock);
1412
1413                     add_subblocks_enxblock(&(fr.block[db]), 2);
1414                     fr.block[db].id        = enxDISRE;
1415                     fr.block[db].sub[0].nr = ndisre;
1416                     fr.block[db].sub[1].nr = ndisre;
1417 #ifndef GMX_DOUBLE
1418                     fr.block[db].sub[0].type = xdr_datatype_float;
1419                     fr.block[db].sub[1].type = xdr_datatype_float;
1420                     fr.block[db].sub[0].fval = disre_rt;
1421                     fr.block[db].sub[1].fval = disre_rm3tav;
1422 #else
1423                     fr.block[db].sub[0].type = xdr_datatype_double;
1424                     fr.block[db].sub[1].type = xdr_datatype_double;
1425                     fr.block[db].sub[0].dval = disre_rt;
1426                     fr.block[db].sub[1].dval = disre_rm3tav;
1427 #endif
1428                 }
1429                 /* here we can put new-style blocks */
1430
1431                 /* Free energy perturbation blocks */
1432                 if (md->dhc)
1433                 {
1434                     mde_delta_h_coll_handle_block(md->dhc, &fr, fr.nblock);
1435                 }
1436
1437                 /* we can now free & reset the data in the blocks */
1438                 if (md->dhc)
1439                 {
1440                     mde_delta_h_coll_reset(md->dhc);
1441                 }
1442
1443                 /* do the actual I/O */
1444                 do_enx(fp_ene, &fr);
1445                 gmx_fio_check_file_position(enx_file_pointer(fp_ene));
1446                 if (fr.nre)
1447                 {
1448                     /* We have stored the sums, so reset the sum history */
1449                     reset_ebin_sums(md->ebin);
1450                 }
1451             }
1452             free_enxframe(&fr);
1453             break;
1454         case eprAVER:
1455             if (log)
1456             {
1457                 pprint(log, "A V E R A G E S", md);
1458             }
1459             break;
1460         case eprRMS:
1461             if (log)
1462             {
1463                 pprint(log, "R M S - F L U C T U A T I O N S", md);
1464             }
1465             break;
1466         default:
1467             gmx_fatal(FARGS, "Invalid print mode (%d)", mode);
1468     }
1469
1470     if (log)
1471     {
1472         for (i = 0; i < opts->ngtc; i++)
1473         {
1474             if (opts->annealing[i] != eannNO)
1475             {
1476                 fprintf(log, "Current ref_t for group %s: %8.1f\n",
1477                         *(groups->grpname[groups->grps[egcTC].nm_ind[i]]),
1478                         opts->ref_t[i]);
1479             }
1480         }
1481         if (mode == eprNORMAL && fcd->orires.nr > 0)
1482         {
1483             print_orires_log(log, &(fcd->orires));
1484         }
1485         fprintf(log, "   Energies (%s)\n", unit_energy);
1486         pr_ebin(log, md->ebin, md->ie, md->f_nre+md->nCrmsd, 5, mode, TRUE);
1487         fprintf(log, "\n");
1488
1489         if (!bCompact)
1490         {
1491             if (md->bDynBox)
1492             {
1493                 pr_ebin(log, md->ebin, md->ib, md->bTricl ? NTRICLBOXS : NBOXS, 5,
1494                         mode, TRUE);
1495                 fprintf(log, "\n");
1496             }
1497             if (md->bConstrVir)
1498             {
1499                 fprintf(log, "   Constraint Virial (%s)\n", unit_energy);
1500                 pr_ebin(log, md->ebin, md->isvir, 9, 3, mode, FALSE);
1501                 fprintf(log, "\n");
1502                 fprintf(log, "   Force Virial (%s)\n", unit_energy);
1503                 pr_ebin(log, md->ebin, md->ifvir, 9, 3, mode, FALSE);
1504                 fprintf(log, "\n");
1505             }
1506             if (md->bVir)
1507             {
1508                 fprintf(log, "   Total Virial (%s)\n", unit_energy);
1509                 pr_ebin(log, md->ebin, md->ivir, 9, 3, mode, FALSE);
1510                 fprintf(log, "\n");
1511             }
1512             if (md->bPress)
1513             {
1514                 fprintf(log, "   Pressure (%s)\n", unit_pres_bar);
1515                 pr_ebin(log, md->ebin, md->ipres, 9, 3, mode, FALSE);
1516                 fprintf(log, "\n");
1517             }
1518             if (md->bMu)
1519             {
1520                 fprintf(log, "   Total Dipole (%s)\n", unit_dipole_D);
1521                 pr_ebin(log, md->ebin, md->imu, 3, 3, mode, FALSE);
1522                 fprintf(log, "\n");
1523             }
1524
1525             if (md->nE > 1)
1526             {
1527                 if (md->print_grpnms == NULL)
1528                 {
1529                     snew(md->print_grpnms, md->nE);
1530                     n = 0;
1531                     for (i = 0; (i < md->nEg); i++)
1532                     {
1533                         ni = groups->grps[egcENER].nm_ind[i];
1534                         for (j = i; (j < md->nEg); j++)
1535                         {
1536                             nj = groups->grps[egcENER].nm_ind[j];
1537                             sprintf(buf, "%s-%s", *(groups->grpname[ni]),
1538                                     *(groups->grpname[nj]));
1539                             md->print_grpnms[n++] = strdup(buf);
1540                         }
1541                     }
1542                 }
1543                 sprintf(buf, "Epot (%s)", unit_energy);
1544                 fprintf(log, "%15s   ", buf);
1545                 for (i = 0; (i < egNR); i++)
1546                 {
1547                     if (md->bEInd[i])
1548                     {
1549                         fprintf(log, "%12s   ", egrp_nm[i]);
1550                     }
1551                 }
1552                 fprintf(log, "\n");
1553                 for (i = 0; (i < md->nE); i++)
1554                 {
1555                     fprintf(log, "%15s", md->print_grpnms[i]);
1556                     pr_ebin(log, md->ebin, md->igrp[i], md->nEc, md->nEc, mode,
1557                             FALSE);
1558                 }
1559                 fprintf(log, "\n");
1560             }
1561             if (md->nTC > 1)
1562             {
1563                 pr_ebin(log, md->ebin, md->itemp, md->nTC, 4, mode, TRUE);
1564                 fprintf(log, "\n");
1565             }
1566             if (md->nU > 1)
1567             {
1568                 fprintf(log, "%15s   %12s   %12s   %12s\n",
1569                         "Group", "Ux", "Uy", "Uz");
1570                 for (i = 0; (i < md->nU); i++)
1571                 {
1572                     ni = groups->grps[egcACC].nm_ind[i];
1573                     fprintf(log, "%15s", *groups->grpname[ni]);
1574                     pr_ebin(log, md->ebin, md->iu+3*i, 3, 3, mode, FALSE);
1575                 }
1576                 fprintf(log, "\n");
1577             }
1578         }
1579     }
1580
1581 }
1582
1583 void update_energyhistory(energyhistory_t * enerhist, t_mdebin * mdebin)
1584 {
1585     int i;
1586
1587     enerhist->nsteps     = mdebin->ebin->nsteps;
1588     enerhist->nsum       = mdebin->ebin->nsum;
1589     enerhist->nsteps_sim = mdebin->ebin->nsteps_sim;
1590     enerhist->nsum_sim   = mdebin->ebin->nsum_sim;
1591     enerhist->nener      = mdebin->ebin->nener;
1592
1593     if (mdebin->ebin->nsum > 0)
1594     {
1595         /* Check if we need to allocate first */
1596         if (enerhist->ener_ave == NULL)
1597         {
1598             snew(enerhist->ener_ave, enerhist->nener);
1599             snew(enerhist->ener_sum, enerhist->nener);
1600         }
1601
1602         for (i = 0; i < enerhist->nener; i++)
1603         {
1604             enerhist->ener_ave[i] = mdebin->ebin->e[i].eav;
1605             enerhist->ener_sum[i] = mdebin->ebin->e[i].esum;
1606         }
1607     }
1608
1609     if (mdebin->ebin->nsum_sim > 0)
1610     {
1611         /* Check if we need to allocate first */
1612         if (enerhist->ener_sum_sim == NULL)
1613         {
1614             snew(enerhist->ener_sum_sim, enerhist->nener);
1615         }
1616
1617         for (i = 0; i < enerhist->nener; i++)
1618         {
1619             enerhist->ener_sum_sim[i] = mdebin->ebin->e_sim[i].esum;
1620         }
1621     }
1622     if (mdebin->dhc)
1623     {
1624         mde_delta_h_coll_update_energyhistory(mdebin->dhc, enerhist);
1625     }
1626 }
1627
1628 void restore_energyhistory_from_state(t_mdebin        * mdebin,
1629                                       energyhistory_t * enerhist)
1630 {
1631     int i;
1632
1633     if ((enerhist->nsum > 0 || enerhist->nsum_sim > 0) &&
1634         mdebin->ebin->nener != enerhist->nener)
1635     {
1636         gmx_fatal(FARGS, "Mismatch between number of energies in run input (%d) and checkpoint file (%d).",
1637                   mdebin->ebin->nener, enerhist->nener);
1638     }
1639
1640     mdebin->ebin->nsteps     = enerhist->nsteps;
1641     mdebin->ebin->nsum       = enerhist->nsum;
1642     mdebin->ebin->nsteps_sim = enerhist->nsteps_sim;
1643     mdebin->ebin->nsum_sim   = enerhist->nsum_sim;
1644
1645     for (i = 0; i < mdebin->ebin->nener; i++)
1646     {
1647         mdebin->ebin->e[i].eav  =
1648             (enerhist->nsum > 0 ? enerhist->ener_ave[i] : 0);
1649         mdebin->ebin->e[i].esum =
1650             (enerhist->nsum > 0 ? enerhist->ener_sum[i] : 0);
1651         mdebin->ebin->e_sim[i].esum =
1652             (enerhist->nsum_sim > 0 ? enerhist->ener_sum_sim[i] : 0);
1653     }
1654     if (mdebin->dhc)
1655     {
1656         mde_delta_h_coll_restore_energyhistory(mdebin->dhc, enerhist);
1657     }
1658 }