4 * This source code is part of
8 * GROningen MAchine for Chemical Simulations
12 * Copyright (c) 1991-1999
13 * BIOSON Research Institute, Dept. of Biophysical Chemistry
14 * University of Groningen, The Netherlands
17 * GROMACS: A message-passing parallel molecular dynamics implementation
18 * H.J.C. Berendsen, D. van der Spoel and R. van Drunen
19 * Comp. Phys. Comm. 91, 43-56 (1995)
21 * Also check out our WWW page:
22 * http://md.chem.rug.nl/~gmx
27 * GRowing Old MAkes el Chrono Sweat
29 static char *SRCID_ebin_c
= "$Id$";
43 static real
rms_ener(t_energy
*e
,int nsteps
)
48 rms
=sqrt(e
->eav
/nsteps
);
51 if (fabs(rms
/eav
) < 1e-6)
66 int get_ebin_space(t_ebin
*eb
,int nener
,char *enm
[])
73 srenew(eb
->e
,eb
->nener
);
74 srenew(eb
->enm
,eb
->nener
);
75 for(i
=index
; (i
<eb
->nener
); i
++) {
80 eb
->enm
[i
]=strdup(enm
[i
-index
]);
85 void add_ebin(t_ebin
*eb
,int index
,int nener
,real ener
[],int step
)
88 double e
,sum
,sigma
,invmm
;
91 if ((index
+nener
> eb
->nener
) || (index
< 0))
92 fatal_error(0,"%s-%d: Energies out of range: index=%d nener=%d maxener=%d",
93 __FILE__
,__LINE__
,index
,nener
,eb
->nener
);
97 invmm
= (1.0/(double)m
)/((double)m
+1.0);
103 for(i
=0; (i
<nener
); i
++) {
104 /* Value for this component */
107 /* first update sigma, then sum */
109 eg
[i
].eav
+= sqr(eg
[i
].esum
- m
*e
)*invmm
;;
114 void pr_ebin(FILE *fp
,t_ebin
*eb
,int index
,int nener
,int nperline
,
115 int prmode
,int tsteps
,bool bPrHead
)
121 fatal_error(0,"Invalid index in pr_ebin: %d",index
);
126 for(i
=index
; (i
<nener
); ) {
129 for(j
=0; (j
<nperline
) && (i
<nener
); j
++,i
++)
130 fprintf(fp
,"%15s",eb
->enm
[i
]);
134 for(j
=0; (j
<nperline
) && (i
<nener
); j
++,i
++) {
135 if (prmode
== eprNORMAL
)
137 else if (prmode
== eprRMS
)
138 ee
=rms_ener(&(eb
->e
[i
]),tsteps
);
139 else if (prmode
== eprAVER
)
140 ee
=eb
->e
[i
].esum
/tsteps
;
142 fatal_error(0,"Invalid print mode %d in pr_ebin",prmode
);
144 fprintf(fp
," %12.5e",ee
);
151 int main(int argc
,char *argv
[])
160 char *ce
[NE
],*ct
[NT
],*cs
[NS
];
161 real e
[NE
],t
[NT
],s
[NS
];
165 for(i
=0; (i
<NE
); i
++) {
167 sprintf(buf
,"e%d",i
);
170 ie
=get_ebin_space(eb
,NE
,ce
);
171 add_ebin(eb
,ie
,NE
,e
,0);
172 for(i
=0; (i
<NS
); i
++) {
174 sprintf(buf
,"s%d",i
);
177 is
=get_ebin_space(eb
,NS
,cs
);
178 add_ebin(eb
,is
,NS
,s
,0);
179 for(i
=0; (i
<NT
); i
++) {
181 sprintf(buf
,"t%d",i
);
184 it
=get_ebin_space(eb
,NT
,ct
);
185 add_ebin(eb
,it
,NT
,t
,0);
188 pr_ebin(stdout
,eb
,0,-1,5,eprNORMAL
,1);
190 printf("Average:\n");
191 pr_ebin(stdout
,eb
,ie
,NE
,5,eprAVER
,1);
192 pr_ebin(stdout
,eb
,is
,NS
,3,eprAVER
,1);
193 pr_ebin(stdout
,eb
,it
,NT
,4,eprAVER
,1);
196 pr_ebin(stdout
,eb
,0,-1,5,eprRMS
,1);