3e98f0f69c442d96b1ea27d8b71a99196ff75cea
[alexxy/gromacs.git] / include / enxio.h
1 /*
2  * 
3  *                This source code is part of
4  * 
5  *                 G   R   O   M   A   C   S
6  * 
7  *          GROningen MAchine for Chemical Simulations
8  * 
9  *                        VERSION 3.2.0
10  * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
11  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
12  * Copyright (c) 2001-2004, The GROMACS development team,
13  * check out http://www.gromacs.org for more information.
14
15  * This program is free software; you can redistribute it and/or
16  * modify it under the terms of the GNU General Public License
17  * as published by the Free Software Foundation; either version 2
18  * of the License, or (at your option) any later version.
19  * 
20  * If you want to redistribute modifications, please consider that
21  * scientific software is very special. Version control is crucial -
22  * bugs must be traceable. We will be happy to consider code for
23  * inclusion in the official distribution, but derived work must not
24  * be called official GROMACS. Details are found in the README & COPYING
25  * files - if they are missing, get the official version at www.gromacs.org.
26  * 
27  * To help us fund GROMACS development, we humbly ask that you cite
28  * the papers on the package - you can find them in the top README file.
29  * 
30  * For more info, check our website at http://www.gromacs.org
31  * 
32  * And Hey:
33  * Gromacs Runs On Most of All Computer Systems
34  */
35
36 #ifndef _enxio_h
37 #define _enxio_h
38 #include "visibility.h"
39 #include "sysstuff.h"
40 #include "typedefs.h"
41 #include "pbc.h"
42 #include "gmxfio.h"
43
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47
48   /**************************************************************
49    * These are the base datatypes + functions for reading and 
50    * writing energy files (.edr). They are either called directly 
51    * (as in the processing tools), or indirectly through mdebin.c 
52    * during mdrun.
53    *
54    * The routines in the corresponding c-file enxio.c
55    * are based on the lower level routines in gmxfio.c.
56    * The file pointer returned from open_enx
57    * can also be used with the routines in gmxfio.h
58    *
59    **************************************************************/
60   
61   typedef struct {
62     char *name;
63     char *unit;
64   } gmx_enxnm_t;
65   
66   /* 
67    * Index for the IDs of additional blocks in the energy file.
68    * Blocks can be added without sacrificing backward and forward
69    * compatibility of the energy files.
70    *
71    * For backward compatibility, the order of these should not be changed.
72    */
73   enum {
74     enxOR,     /* Time and ensemble averaged data for orientation restraints */
75     enxORI,    /* Instantaneous data for orientation restraints              */
76     enxORT,    /* Order tensor(s) for orientation restraints                 */
77     enxDISRE,  /* Distance restraint blocks                                  */
78
79     enxDHCOLL, /* Data about the free energy blocks in this frame.           */
80     enxDHHIST, /* BAR histogram                                              */
81     enxDH,     /* BAR raw delta H data                                       */
82
83     enxNR      /* Total number of extra blocks in the current code,
84                 * note that the enxio code can read files written by
85                 * future code which contain more blocks.
86                 */
87   };
88
89   /* names for the above enum */
90 GMX_LIBGMX_EXPORT
91   extern const char *enx_block_id_name[];
92
93
94   /* the subblocks that are contained in energy file blocks. Each of these
95      has a number of values of a single data type in a .edr file. */
96   typedef struct
97   {
98       int nr;               /* number of items in subblock */
99       xdr_datatype type;    /* the block type */
100
101       /* the values: pointers for each type */
102       float*             fval;
103       double*            dval;
104       int*               ival;
105       gmx_large_int_t*   lval;
106       unsigned char*     cval;
107       char**             sval;
108
109       /* the allocated sizes, defined separately. 
110          (nonzero sizes can be free()d later): */
111       int fval_alloc;
112       int dval_alloc;
113       int ival_alloc;
114       int lval_alloc;
115       int cval_alloc;
116       int sval_alloc; 
117   } t_enxsubblock;
118
119
120   /* the energy file blocks. Each block contains a number of sub-blocks
121      of a single type that contain the actual data. */
122   typedef struct t_enxblock{
123       int id;               /* block id, from the enx enums above */
124       int nsub;             /* number of subblocks */
125       t_enxsubblock *sub;   /* the subblocks */
126       int nsub_alloc;       /* number of allocated subblocks */
127   } t_enxblock;
128  
129
130   /* The frames that are read/written */
131   typedef struct {
132     double   t;             /* Timestamp of this frame                       */
133     gmx_large_int_t step;   /* MD step                                       */
134     gmx_large_int_t nsteps; /* The number of steps between frames            */
135     double   dt;            /* The MD time step                              */
136     int      nsum;          /* The number of terms for the sums in ener      */
137     int      nre;           /* Number of energies                            */
138     int      e_size;        /* Size (in bytes) of energies                   */
139     int      e_alloc;       /* Allocated size (in elements) of ener          */
140     t_energy *ener;         /* The energies                                  */
141     int      nblock;        /* Number of following energy blocks             */
142     t_enxblock *block;      /* The blocks                                    */
143     int      nblock_alloc;  /* The number of blocks allocated                */
144   } t_enxframe;
145
146   /* file handle */
147   typedef struct ener_file *ener_file_t;
148
149   /* 
150    * An energy file is read like this:
151    *
152    * ener_file_t fp;
153    * t_enxframe *fr;
154    *
155    * fp = open_enx(...);
156    * do_enxnms(fp,...);
157    * snew(fr,1);
158    * while (do_enx(fp,fr)) {
159    * ...
160    * }
161    * free_enxframe(fr);
162    * sfree(fr);
163    */
164   /* New energy reading and writing interface */
165
166
167   /* initialize a pre-allocated frame */
168 GMX_LIBGMX_EXPORT
169   void init_enxframe(t_enxframe *ef);
170   /* delete a frame's memory (except the ef itself) */
171 GMX_LIBGMX_EXPORT
172   void free_enxframe(t_enxframe *ef);
173
174
175 GMX_LIBGMX_EXPORT
176   ener_file_t open_enx(const char *fn,const char *mode);
177
178 GMX_LIBGMX_EXPORT
179   t_fileio *enx_file_pointer(const ener_file_t ef);
180
181 GMX_LIBGMX_EXPORT
182   void close_enx(ener_file_t ef);
183   
184 GMX_LIBGMX_EXPORT
185   void do_enxnms(ener_file_t ef,int *nre,gmx_enxnm_t **enms);
186   
187 GMX_LIBGMX_EXPORT
188   void free_enxnms(int n,gmx_enxnm_t *nms);
189   /* Frees nms and all strings in it */
190
191 GMX_LIBGMX_EXPORT
192   gmx_bool do_enx(ener_file_t ef,t_enxframe *fr);
193   /* Reads enx_frames, memory in fr is (re)allocated if necessary */
194
195 GMX_LIBGMX_EXPORT
196   void get_enx_state(const char *fn, real t,
197                             gmx_groups_t *groups, t_inputrec *ir,
198                             t_state *state);
199   /*
200    * Reads state variables from enx file fn at time t.
201    * atoms and ir are required for determining which things must be read.
202    * Currently pcoupl and tcoupl state are read from enx.
203    */
204
205
206   /* block funtions */
207
208   /* allocate n blocks to a frame (if neccesary). Don't touch existing blocks */
209 GMX_LIBGMX_EXPORT
210   void add_blocks_enxframe(t_enxframe *ef, int n);
211
212   /* find a block by id number; if prev!=NULL, it searches from 
213      that block's next block. 
214      Returns NULL if no block is found with the given id. */
215 GMX_LIBGMX_EXPORT
216   t_enxblock *find_block_id_enxframe(t_enxframe *ef, int id, t_enxblock *prev);
217
218
219    /* allocate n subblocks to a block (if neccesary). Don't touch existing 
220       subbblocks. */
221 GMX_LIBGMX_EXPORT
222   void add_subblocks_enxblock(t_enxblock *eb, int n);
223
224
225   
226 #ifdef __cplusplus
227 }
228 #endif
229
230 #endif  /* _enerio_h */