NAMD
Output.h
Go to the documentation of this file.
1 
7 /*
8  This object outputs the data collected on the master node
9 */
10 
11 #ifndef OUTPUT_H
12 #define OUTPUT_H
13 
14 #include "common.h"
15 #include <string>
16 #include <map>
17 
18 class Vector;
19 class FloatVector;
20 class Lattice;
21 class ReplicaDcdInitMsg;
22 class ReplicaDcdDataMsg;
23 
24 // semaphore "steps", must be negative
25 #define FILE_OUTPUT -1
26 #define END_OF_RUN -2
27 #define EVAL_MEASURE -3
28 #define FORCE_OUTPUT -4
29 
30 #define OUTPUT_SINGLE_FILE 1
31 #define OUTPUT_MAGIC_NUMBER 123456
32 #define OUTPUT_FILE_VERSION 1.00
33 
34 
35 class Output
36 {
37 
38 private:
39 
40 friend class SimParameters;
41 
42  // output coords to dcd file
43  // Pass non-NULL Lattice to include unit cell in the timesteps.
44  int output_dcdfile(int, int, FloatVector *, const Lattice *, int dcdIndex);
45  void output_veldcdfile(int, int, FloatVector *); // output velocities to
46  // dcd file
47  void output_forcedcdfile(int, int, FloatVector *); // output forces to
48  // dcd file
49 
50  void output_restart_coordinates(Vector *, int, int);
51  // output coords to
52  // restart file
53  void output_restart_velocities(int, int, Vector *);
54  // output velocities to
55  // restart file
56  void output_final_coordinates(Vector *, int, int);// output final coordinates
57  void output_final_velocities(int, int, Vector *); // output final coordinates
58  void output_forces(int, int, Vector *); // output forces
59 
60  void scale_vels(Vector *, int, Real); // scale velocity vectors before output
61  void scale_fvels(FloatVector *, int, Real); // scale velocity vectors before output / IMD send
62  void write_binary_file(char *, int, Vector *); // Write a binary restart file with
63  // coordinates or velocities
64 
65  struct replicaDcdFile {
66  std::string filename;
67  int fileid;
68  replicaDcdFile() : fileid(0) { ; }
69  };
70  std::map<int,replicaDcdFile> replicaDcdFiles;
71  std::map<std::pair<int,uint16_t>,replicaDcdFile> replicaDcdSelectFiles;
72  int replicaDcdActive;
73  int replicaDcdIndex;
74 
75 public :
76  Output(); // Constructor
77  ~Output(); // Destructor
78  void energy(int, BigReal *); // Output energies
79 
94  static std::pair<int,int> coordinateNeeded(int timestep);
108  void coordinate(int timestep, int n, Vector *coor,
109  FloatVector *fcoor, Lattice &lattice);
122  static int velocityNeeded(int timestep);
140  void velocity(int timestep, int n, Vector *vel, FloatVector *fvel);
153  static int forceNeeded(int timestep);
171  void force(int timestep, int n, Vector *frc, FloatVector *ffrc);
172 
173  void replicaDcdOff() { replicaDcdActive = 0; }
174  void setReplicaDcdIndex(int index);
175  void replicaDcdInit(int index, const char *filename);
176  void replicaDcdSelectInit(int index, const char *tag, const char *filename);
179 };
180 
181 #ifdef MEM_OPT_VERSION
182 class ParOutput{
183 private:
184  void output_veldcdfile_master(int timestep, int n);
185  void output_veldcdfile_slave(int timestep, int fID, int tID, Vector *vecs);
186  void output_restart_velocities_master(int timestep, int n);
187  void output_restart_velocities_slave(int timestep, int fID, int tID, Vector *vecs, int64 offset);
188  void output_final_velocities_master(int n);
189  void output_final_velocities_slave(int fID, int tID, Vector *vecs, int64 offset);
190 
191  void output_forcedcdfile_master(int timestep, int n);
192  void output_forcedcdfile_slave(int timestep, int fID, int tID, Vector *vecs);
193  void output_forces_master(int n);
194  void output_forces_slave(int fID, int tID, Vector *vecs, int64 offset);
195  void output_dcdfile_master(int timestep, int n, const Lattice *lat, int tag);
196  void output_dcdfile_slave(int timestep, int fID, int tID, FloatVector *fvecs, int tag);
197  void output_restart_coordinates_master(int timestep, int n);
198  void output_restart_coordinates_slave(int timestep, int fID, int tID, Vector *vecs, int64 offset);
199  void output_final_coordinates_master(int n);
200  void output_final_coordinates_slave(int fID, int tID, Vector *vecs, int64 offset);
201 
202  void write_binary_file_master(char *fname, int n);
203  void write_binary_file_slave(char *fname, int fID, int tID, Vector *vecs, int64 offset);
204 
205  #if !OUTPUT_SINGLE_FILE
206  char *buildFileName(OUTPUTFILETYPE type, int timestep=-9999);
207  #endif
208 
209  int dcdFileID;
210  Bool dcdFirst;
211  float *dcdX, *dcdY, *dcdZ;
212  size_t dcdAllocSize;
213  int veldcdFileID;
214  Bool veldcdFirst;
215  float *veldcdX, *veldcdY, *veldcdZ;
216  int forcedcdFileID;
217  Bool forcedcdFirst;
218  float *forcedcdX, *forcedcdY, *forcedcdZ;
219  Bool cleanUpXYZ;
220  int outputID; //the sequence of this output
221  Bool parFirst[16];
222  int parFileid[16]; // File id for the dcd file
223  off_t dcdSelectionOffsets[16]; // each dcdselection file offset
224  size_t dcdSelectionLocalSize[16]; // number of points per dcdselection
225  std::vector<uint32> dcdSelectionMap[16]; //local offset -> global idx map
226 public:
227  ParOutput(int oid=-1){
228  dcdFileID=veldcdFileID=-99999;
229  forcedcdFileID=-99999;
230  dcdFirst=veldcdFirst=TRUE;
231  forcedcdFirst=TRUE;
232  dcdX=dcdY=dcdZ=veldcdX=veldcdY=veldcdZ=NULL;
233  forcedcdX=forcedcdY=forcedcdZ=NULL;
234  outputID=oid;
235  cleanUpXYZ=true;
236  for(int i=0;i<16;i++)
237  parFirst[i]=true;
238  dcdAllocSize=0;
239  }
240  ~ParOutput() {}
241 
242  void velocityMaster(int timestep, int n);
243  void velocitySlave(int timestep, int fID, int tID, Vector *vecs);
244 
245  void forceMaster(int timestep, int n);
246  void forceSlave(int timestep, int fID, int tID, Vector *vecs);
247 
248  void coordinateMaster(int timestep, int n, Lattice &lat);
249  void coordinateSlave(int timestep, int fID, int tID, Vector *vecs, FloatVector *fvecs);
250  void setDcdSelectionParams(int index, off_t offset, size_t size, std::vector<uint32> map );
251 };
252 #endif
253 
254 #endif
255 
void setReplicaDcdIndex(int index)
Definition: Output.C:883
void force(int timestep, int n, Vector *frc, FloatVector *ffrc)
Produce appropriate force for the current timestep.
Definition: Output.C:646
Definition: Vector.h:72
~Output()
Definition: Output.C:181
float Real
Definition: common.h:118
void replicaDcdOff()
Definition: Output.h:173
void replicaDcdSelectInit(int index, const char *tag, const char *filename)
Definition: Output.C:900
void recvReplicaDcdInit(ReplicaDcdInitMsg *msg)
Definition: Output.C:914
Definition: Output.h:35
static std::pair< int, int > coordinateNeeded(int timestep)
Check if the step requires to output the coordinates.
Definition: Output.C:185
void replicaDcdInit(int index, const char *filename)
Definition: Output.C:888
void velocity(int timestep, int n, Vector *vel, FloatVector *fvel)
Produce appropriate velocity for the current timestep.
Definition: Output.C:541
void coordinate(int timestep, int n, Vector *coor, FloatVector *fcoor, Lattice &lattice)
Produce appropriate coordinate output for the current timestep.
Definition: Output.C:334
int Bool
Definition: common.h:142
void recvReplicaDcdData(ReplicaDcdDataMsg *msg)
Definition: Output.C:925
static int forceNeeded(int timestep)
Check if the step requires to output the forces.
Definition: Output.C:612
void energy(int, BigReal *)
OUTPUTFILETYPE
Definition: common.h:240
Output()
Definition: Output.C:171
static int velocityNeeded(int timestep)
Check if the step requires to output the velocities.
Definition: Output.C:502
int64_t int64
Definition: common.h:39
#define TRUE
Definition: common.h:128
double BigReal
Definition: common.h:123