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 * Green Red Orange Magenta Azure Cyan Skyblue
29 static char *SRCID_enxio_c
= "$Id$";
39 real t
; /* Time frame */
40 int step
; /* MD step */
41 int nre
; /* Number of energies */
42 int ndisre
; /* Number of disre blocks */
43 int nuser
; /* User definable number */
44 int e_size
; /* Size (in bytes) of energies */
45 int d_size
; /* Size (in bytes) of disre blocks */
46 int u_size
; /* Size (in bytes) of user blocks */
49 static void wr_ener_nms(FILE *out
,int nre
,char *nms
[])
53 fprintf(out
,"%d\n",nre
);
54 for(i
=0; (i
<nre
); i
++)
55 fprintf(out
,"%s\n",nms
[i
]);
58 static void rd_ener_nms(FILE *in
,int *nre
,char ***nm
)
64 if (sscanf(line
,"%d",nre
) == 0) {
69 for(i
=0; (i
< (*nre
)); i
++) {
72 (*nm
)[i
]=strdup(line
);
76 static void edr_nms(XDR
*xdr
,int *nre
,char ***nms
)
83 if (!xdr_int(xdr
,nre
)) {
90 for(i
=0; (i
<*nre
); i
++)
91 xdr_string(xdr
,&(NM
[i
]),NM
[i
] ? strlen(NM
[i
]) : STRLEN
);
95 static bool do_eheader(int fp
,t_eheader
*eh
,bool *bOK
)
97 bool bRead
= fio_getread(fp
);
100 if (!do_real(eh
->t
)) return FALSE
;
101 if (!do_int (eh
->step
)) *bOK
= FALSE
;
102 if (!do_int (eh
->nre
)) *bOK
= FALSE
;
103 if (!do_int (eh
->ndisre
)) *bOK
= FALSE
;
104 if (!do_int (eh
->nuser
)) *bOK
= FALSE
;
105 if (!do_int (eh
->e_size
)) *bOK
= FALSE
;
106 if (!do_int (eh
->d_size
)) *bOK
= FALSE
;
107 if (!do_int (eh
->u_size
)) *bOK
= FALSE
;
112 void do_enxnms(int fp
,int *nre
,char ***nms
)
116 bRead
= fio_getread(fp
);
117 if (fio_getftp(fp
) == efEDR
) {
119 edr_nms(fio_getxdr(fp
),nre
,nms
);
122 rd_ener_nms(fio_getfp(fp
),nre
,nms
);
124 wr_ener_nms(fio_getfp(fp
),*nre
,*nms
);
127 void close_enx(int fp
)
132 static bool empty_file(char *fn
)
139 fread(&dum
,sizeof(dum
),1,fp
);
148 int open_enx(char *fn
,char *mode
)
157 fp
=fio_open(fn
,mode
);
159 fio_setprecision(fp
,FALSE
);
160 do_enxnms(fp
,&nre
,&nm
);
162 do_eheader(fp
,eh
,&bDum
);
164 /* Now check whether this file is in single precision */
165 if (((eh
->e_size
&& (eh
->nre
== nre
) && (nre
*4*sizeof(float) == eh
->e_size
)) ||
166 (eh
->d_size
&& (eh
->ndisre
*sizeof(float)*2+sizeof(int) == eh
->d_size
)))){
167 fprintf(stderr
,"Opened %s as single precision energy file\n",fn
);
168 for(i
=0; (i
<nre
); i
++)
175 fio_setprecision(fp
,TRUE
);
176 do_enxnms(fp
,&nre
,&nm
);
177 do_eheader(fp
,eh
,&bDum
);
178 if (((eh
->e_size
&& (eh
->nre
== nre
) && (nre
*4*sizeof(double) == eh
->e_size
)) ||
179 (eh
->d_size
&& (eh
->ndisre
*sizeof(double)*2+sizeof(int) == eh
->d_size
))))
180 fprintf(stderr
,"Opened %s as double precision energy file\n",fn
);
183 fatal_error(0,"File %s is empty",fn
);
185 fatal_error(0,"Energy file %s not recognized, maybe different CPU?",
188 for(i
=0; (i
<nre
); i
++)
196 fp
= fio_open(fn
,mode
);
203 bool do_enx(int fp
,real
*t
,int *step
,int *nre
,t_energy ener
[],
204 int *ndr
,t_drblock
*drblock
)
212 bRead
= fio_getread(fp
);
217 eh
.ndisre
= drblock
? (drblock
->ndr
) : 0;
219 eh
.e_size
= (*nre
)*sizeof(ener
[0].e
)*4;
220 eh
.d_size
= eh
.ndisre
?
221 (drblock
->ndr
*(sizeof(drblock
->rav
[0])+sizeof(drblock
->rt
[0]))) : 0;
226 if (!do_eheader(fp
,&eh
,&bOK
)) {
228 fprintf(stderr
,"\rLast frame read %d ",framenr
-1);
230 fprintf(stderr
,"\nWARNING: Incomplete frame: nr %6d time %8.3f\n",
236 if ( ( framenr
<10 ) || ( framenr
%10 == 0) )
237 fprintf(stderr
,"\rReading frame %6d time %8.3f ",framenr
,eh
.t
);
243 for(i
=0; (i
<*nre
); i
++) {
244 bOK
= bOK
&& do_real(ener
[i
].e
);
246 if((tmp
/(*step
+1))<GMX_REAL_EPS
)
248 bOK
= bOK
&& do_real(tmp
);
251 bOK
= bOK
&& do_real(tmp
);
253 bOK
= bOK
&& do_real(ener
[i
].e2sum
);
256 if (drblock
->ndr
== 0) {
257 snew(drblock
->rav
,eh
.ndisre
);
258 snew(drblock
->rt
,eh
.ndisre
);
259 drblock
->ndr
= eh
.ndisre
;
261 ndo_real(drblock
->rav
,drblock
->ndr
,bOK1
);
263 ndo_real(drblock
->rt
,drblock
->ndr
,bOK1
);
273 fatal_error(0,"Can't handle user blocks");
277 fprintf(stderr
,"\nLast frame read %d ",framenr
-1);
278 fprintf(stderr
,"\nWARNING: Incomplete frame: nr %6d time %8.3f \n",
281 fatal_error(-1,"could not write energies");