ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/DumpWriter.cpp
Revision: 437
Committed: Fri Mar 28 22:34:02 2003 UTC (21 years, 3 months ago) by chuckv
File size: 13535 byte(s)
Log Message:
bug fix in DumpWriter.cpp

File Contents

# User Rev Content
1 mmeineke 377 #include <cstring>
2     #include <iostream>
3     #include <fstream>
4    
5     #ifdef IS_MPI
6     #include <mpi.h>
7 gezelter 416 #include <mpi++.h>
8 mmeineke 377 #include "mpiSimulation.hpp"
9 chuckv 436 #define TAKE_THIS_TAG_CHAR 1
10     #define TAKE_THIS_TAG_INT 2
11 mmeineke 377 #endif //is_mpi
12    
13     #include "ReadWrite.hpp"
14     #include "simError.h"
15    
16     DumpWriter::DumpWriter( SimInfo* the_entry_plug ){
17    
18     entry_plug = the_entry_plug;
19    
20     #ifdef IS_MPI
21     if(worldRank == 0 ){
22     #endif // is_mpi
23    
24    
25    
26     strcpy( outName, entry_plug->sampleName );
27    
28     outFile.open(outName, ios::out | ios::trunc );
29    
30     if( !outFile ){
31    
32     sprintf( painCave.errMsg,
33     "Could not open \"%s\" for dump output.\n",
34     outName);
35     painCave.isFatal = 1;
36     simError();
37     }
38    
39     //outFile.setf( ios::scientific );
40    
41     #ifdef IS_MPI
42     }
43    
44     sprintf( checkPointMsg,
45     "Sucessfully opened output file for dumping.\n");
46     MPIcheckPoint();
47     #endif // is_mpi
48     }
49    
50     DumpWriter::~DumpWriter( ){
51    
52     #ifdef IS_MPI
53     if(worldRank == 0 ){
54     #endif // is_mpi
55    
56     outFile.close();
57    
58     #ifdef IS_MPI
59     }
60     #endif // is_mpi
61     }
62    
63     void DumpWriter::writeDump( double currentTime ){
64    
65     const int BUFFERSIZE = 2000;
66     char tempBuffer[BUFFERSIZE];
67     char writeLine[BUFFERSIZE];
68    
69 gezelter 419 int i, j, which_node, done, game_over, which_atom, local_index;
70 mmeineke 377 double q[4];
71     DirectionalAtom* dAtom;
72     int nAtoms = entry_plug->n_atoms;
73     Atom** atoms = entry_plug->atoms;
74    
75    
76     #ifndef IS_MPI
77    
78     outFile << nAtoms << "\n";
79    
80     outFile << currentTime << "\t"
81     << entry_plug->box_x << "\t"
82     << entry_plug->box_y << "\t"
83     << entry_plug->box_z << "\n";
84    
85     for( i=0; i<nAtoms; i++ ){
86    
87    
88     sprintf( tempBuffer,
89     "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
90     atoms[i]->getType(),
91     atoms[i]->getX(),
92     atoms[i]->getY(),
93     atoms[i]->getZ(),
94     atoms[i]->get_vx(),
95     atoms[i]->get_vy(),
96     atoms[i]->get_vz());
97     strcpy( writeLine, tempBuffer );
98    
99     if( atoms[i]->isDirectional() ){
100    
101     dAtom = (DirectionalAtom *)atoms[i];
102     dAtom->getQ( q );
103    
104     sprintf( tempBuffer,
105     "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
106     q[0],
107     q[1],
108     q[2],
109     q[3],
110     dAtom->getJx(),
111     dAtom->getJy(),
112     dAtom->getJz());
113     strcat( writeLine, tempBuffer );
114     }
115     else
116     strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
117    
118     outFile << writeLine;
119     }
120     outFile.flush();
121    
122     #else // is_mpi
123 gezelter 416
124     MPI::Status istatus;
125     int *AtomToProcMap = mpiSim->getAtomToProcMap();
126 gezelter 415
127 mmeineke 377 // write out header and node 0's coordinates
128 gezelter 415
129 mmeineke 377 if( worldRank == 0 ){
130     outFile << mpiSim->getTotAtoms() << "\n";
131 gezelter 415
132 mmeineke 377 outFile << currentTime << "\t"
133     << entry_plug->box_x << "\t"
134     << entry_plug->box_y << "\t"
135     << entry_plug->box_z << "\n";
136 chuckv 434 outFile.flush();
137 gezelter 416 for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
138 gezelter 417 // Get the Node number which has this atom;
139 mmeineke 377
140 gezelter 415 which_node = AtomToProcMap[i];
141    
142 chuckv 436 if (which_node == 0 ) {
143 mmeineke 377
144 chuckv 436 which_atom = i;
145     local_index=-1;
146     for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
147     if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
148     }
149     if (local_index != -1) {
150     //format the line
151     sprintf( tempBuffer,
152     "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
153     atoms[local_index]->getType(),
154     atoms[local_index]->getX(),
155     atoms[local_index]->getY(),
156     atoms[local_index]->getZ(),
157     atoms[local_index]->get_vx(),
158     atoms[local_index]->get_vy(),
159     atoms[local_index]->get_vz()); // check here.
160     strcpy( writeLine, tempBuffer );
161 mmeineke 377
162 chuckv 436 if( atoms[local_index]->isDirectional() ){
163    
164     dAtom = (DirectionalAtom *)atoms[local_index];
165     dAtom->getQ( q );
166    
167     sprintf( tempBuffer,
168     "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
169     q[0],
170     q[1],
171     q[2],
172     q[3],
173     dAtom->getJx(),
174     dAtom->getJy(),
175     dAtom->getJz());
176     strcat( writeLine, tempBuffer );
177    
178     }
179     else
180     strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
181     }
182     else {
183     strcpy( writeLine, "ATOM NOT FOUND ON THIS PROCESSOR");
184     }
185     }
186     else {
187 gezelter 415
188 chuckv 436 //std::cerr << "node 0: sending node " << which_node << " request for atom " << i << "\n";
189     MPI::COMM_WORLD.Send(&i, 1, MPI_INT, which_node, TAKE_THIS_TAG_INT);
190     //std::cerr << "node 0: sent!\n";
191 gezelter 416 MPI::COMM_WORLD.Recv(writeLine, BUFFERSIZE, MPI_CHAR, which_node,
192 chuckv 436 TAKE_THIS_TAG_CHAR, istatus);
193     //std::cerr << "node 0: got this line: " << writeLine;
194 mmeineke 377 }
195 gezelter 415
196 mmeineke 377 outFile << writeLine;
197 chuckv 434 outFile.flush();
198 mmeineke 377 }
199    
200 gezelter 415 // kill everyone off:
201 gezelter 416 game_over = -1;
202     for (j = 0; j < mpiSim->getNumberProcessors(); j++) {
203 chuckv 436 MPI::COMM_WORLD.Send(&game_over, 1, MPI_INT, j, TAKE_THIS_TAG_INT);
204 mmeineke 377 }
205    
206 gezelter 415 } else {
207    
208     done = 0;
209     while (!done) {
210 chuckv 436 //std::cerr << "node: " << mpiSim->getMyNode() << " Waiting for receive \n";
211 gezelter 416 MPI::COMM_WORLD.Recv(&which_atom, 1, MPI_INT, 0,
212 chuckv 436 TAKE_THIS_TAG_INT, istatus);
213     //std::cerr << "node: " << mpiSim->getMyNode() << " got request for atom " << which_atom << "\n";
214 gezelter 416 if (which_atom == -1) {
215 gezelter 415 done=1;
216     continue;
217     } else {
218 gezelter 419 local_index=-1;
219 chuckv 436 for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
220 gezelter 419 if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
221     }
222     if (local_index != -1) {
223     //format the line
224     sprintf( tempBuffer,
225     "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
226     atoms[local_index]->getType(),
227     atoms[local_index]->getX(),
228     atoms[local_index]->getY(),
229     atoms[local_index]->getZ(),
230     atoms[local_index]->get_vx(),
231     atoms[local_index]->get_vy(),
232     atoms[local_index]->get_vz()); // check here.
233     strcpy( writeLine, tempBuffer );
234 mmeineke 377
235 gezelter 419 if( atoms[local_index]->isDirectional() ){
236    
237     dAtom = (DirectionalAtom *)atoms[local_index];
238     dAtom->getQ( q );
239    
240     sprintf( tempBuffer,
241     "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
242     q[0],
243     q[1],
244     q[2],
245     q[3],
246     dAtom->getJx(),
247     dAtom->getJy(),
248     dAtom->getJz());
249     strcat( writeLine, tempBuffer );
250     }
251     else
252     strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
253 chuckv 436 // std::cerr << "node: " << mpiSim->getMyNode() << " sending this line" << writeLine;
254 gezelter 419 MPI::COMM_WORLD.Send(writeLine, BUFFERSIZE, MPI_CHAR, 0,
255 chuckv 436 TAKE_THIS_TAG_CHAR);
256 gezelter 419 } else {
257     strcpy( writeLine, "ATOM NOT FOUND ON THIS PROCESSOR");
258     MPI::COMM_WORLD.Send(writeLine, BUFFERSIZE, MPI_CHAR, 0,
259 chuckv 436 TAKE_THIS_TAG_CHAR);
260 gezelter 419 }
261 mmeineke 377 }
262     }
263 gezelter 415 }
264     outFile.flush();
265     sprintf( checkPointMsg,
266     "Sucessfully took a dump.\n");
267     MPIcheckPoint();
268 mmeineke 377 #endif // is_mpi
269     }
270    
271     void DumpWriter::writeFinal(){
272 gezelter 416
273 mmeineke 377 char finalName[500];
274     ofstream finalOut;
275 gezelter 416
276     const int BUFFERSIZE = 2000;
277     char tempBuffer[BUFFERSIZE];
278     char writeLine[BUFFERSIZE];
279    
280     double q[4];
281     DirectionalAtom* dAtom;
282     int nAtoms = entry_plug->n_atoms;
283     Atom** atoms = entry_plug->atoms;
284 gezelter 419 int i, j, which_node, done, game_over, which_atom, local_index;
285 mmeineke 377
286 gezelter 416
287 mmeineke 377 #ifdef IS_MPI
288     if(worldRank == 0 ){
289     #endif // is_mpi
290    
291     strcpy( finalName, entry_plug->finalName );
292    
293     finalOut.open( finalName, ios::out | ios::trunc );
294     if( !finalOut ){
295     sprintf( painCave.errMsg,
296     "Could not open \"%s\" for final dump output.\n",
297     finalName );
298     painCave.isFatal = 1;
299     simError();
300     }
301    
302     // finalOut.setf( ios::scientific );
303    
304     #ifdef IS_MPI
305     }
306    
307     sprintf(checkPointMsg,"Opened file for final configuration\n");
308     MPIcheckPoint();
309    
310     #endif //is_mpi
311    
312 gezelter 415
313 mmeineke 377 #ifndef IS_MPI
314    
315     finalOut << nAtoms << "\n";
316    
317     finalOut << entry_plug->box_x << "\t"
318     << entry_plug->box_y << "\t"
319     << entry_plug->box_z << "\n";
320 gezelter 416
321 mmeineke 377 for( i=0; i<nAtoms; i++ ){
322    
323     sprintf( tempBuffer,
324     "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
325     atoms[i]->getType(),
326     atoms[i]->getX(),
327     atoms[i]->getY(),
328     atoms[i]->getZ(),
329     atoms[i]->get_vx(),
330     atoms[i]->get_vy(),
331     atoms[i]->get_vz());
332     strcpy( writeLine, tempBuffer );
333    
334     if( atoms[i]->isDirectional() ){
335    
336     dAtom = (DirectionalAtom *)atoms[i];
337     dAtom->getQ( q );
338    
339     sprintf( tempBuffer,
340     "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
341     q[0],
342     q[1],
343     q[2],
344     q[3],
345     dAtom->getJx(),
346     dAtom->getJy(),
347     dAtom->getJz());
348     strcat( writeLine, tempBuffer );
349     }
350     else
351     strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
352    
353     finalOut << writeLine;
354     }
355     finalOut.flush();
356 gezelter 415 finalOut.close();
357 mmeineke 377
358     #else // is_mpi
359 gezelter 415
360 gezelter 416 MPI::Status istatus;
361     int *AtomToProcMap = mpiSim->getAtomToProcMap();
362    
363 mmeineke 377 // write out header and node 0's coordinates
364 gezelter 415
365 mmeineke 377 if( worldRank == 0 ){
366     finalOut << mpiSim->getTotAtoms() << "\n";
367 gezelter 415
368 mmeineke 377 finalOut << entry_plug->box_x << "\t"
369 gezelter 415 << entry_plug->box_y << "\t"
370     << entry_plug->box_z << "\n";
371 mmeineke 377
372 gezelter 416 for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
373 gezelter 415 // Get the Node number which has this molecule:
374 mmeineke 377
375 gezelter 415 which_node = AtomToProcMap[i];
376    
377 gezelter 416 if (which_node == mpiSim->getMyNode()) {
378 chuckv 437
379     which_atom = i;
380     local_index=-1;
381     for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
382     if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
383     }
384     if (local_index != -1) {
385     sprintf( tempBuffer,
386     "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
387     atoms[local_index]->getType(),
388     atoms[local_index]->getX(),
389     atoms[local_index]->getY(),
390     atoms[local_index]->getZ(),
391     atoms[local_index]->get_vx(),
392     atoms[local_index]->get_vy(),
393     atoms[local_index]->get_vz());
394     strcpy( writeLine, tempBuffer );
395 mmeineke 377
396 chuckv 437 if( atoms[local_index]->isDirectional() ){
397    
398     dAtom = (DirectionalAtom *)atoms[local_index];
399     dAtom->getQ( q );
400    
401     sprintf( tempBuffer,
402     "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
403     q[0],
404     q[1],
405     q[2],
406     q[3],
407     dAtom->getJx(),
408     dAtom->getJy(),
409     dAtom->getJz());
410     strcat( writeLine, tempBuffer );
411     }
412     else
413     strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
414     }
415     else {
416     strcpy( writeLine, "ATOM NOT FOUND ON THIS PROCESSOR");
417     }
418    
419 gezelter 415 } else {
420    
421 chuckv 436 MPI::COMM_WORLD.Send(&i, 1, MPI_INT, which_node, TAKE_THIS_TAG_INT);
422 gezelter 416 MPI::COMM_WORLD.Recv(writeLine, BUFFERSIZE, MPI_CHAR, which_node,
423 chuckv 436 TAKE_THIS_TAG_CHAR, istatus);
424 mmeineke 377 }
425 gezelter 415
426 mmeineke 377 finalOut << writeLine;
427     }
428    
429 gezelter 415 // kill everyone off:
430 gezelter 416 game_over = -1;
431     for (j = 0; j < mpiSim->getNumberProcessors(); j++) {
432 chuckv 436 MPI::COMM_WORLD.Send(&game_over, 1, MPI_INT, j, TAKE_THIS_TAG_INT);
433 mmeineke 377 }
434    
435 gezelter 415 } else {
436    
437     done = 0;
438     while (!done) {
439 gezelter 416 MPI::COMM_WORLD.Recv(&which_atom, 1, MPI_INT, 0,
440 chuckv 436 TAKE_THIS_TAG_INT, istatus);
441 mmeineke 377
442 gezelter 416 if (which_atom == -1) {
443 gezelter 415 done=1;
444     continue;
445     } else {
446 mmeineke 377
447 gezelter 419 local_index=-1;
448     for (j=0; j < mpiSim->getMyNlocal(); j++) {
449     if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
450     }
451     if (local_index != -1) {
452    
453     //format the line
454     sprintf( tempBuffer,
455     "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
456     atoms[local_index]->getType(),
457     atoms[local_index]->getX(),
458     atoms[local_index]->getY(),
459     atoms[local_index]->getZ(),
460     atoms[local_index]->get_vx(),
461     atoms[local_index]->get_vy(),
462     atoms[local_index]->get_vz()); // check here.
463     strcpy( writeLine, tempBuffer );
464 mmeineke 377
465 gezelter 419 if( atoms[local_index]->isDirectional() ){
466    
467     dAtom = (DirectionalAtom *)atoms[local_index];
468     dAtom->getQ( q );
469 mmeineke 377
470 gezelter 419 sprintf( tempBuffer,
471     "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
472     q[0],
473     q[1],
474     q[2],
475     q[3],
476     dAtom->getJx(),
477     dAtom->getJy(),
478     dAtom->getJz());
479     strcat( writeLine, tempBuffer );
480     }
481     else
482     strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
483    
484     MPI::COMM_WORLD.Send(writeLine, BUFFERSIZE, MPI_CHAR, 0,
485 chuckv 436 TAKE_THIS_TAG_CHAR);
486 gezelter 419 } else {
487     strcpy( writeLine, "ATOM NOT FOUND ON THIS PROCESSOR");
488     MPI::COMM_WORLD.Send(writeLine, BUFFERSIZE, MPI_CHAR, 0,
489 chuckv 436 TAKE_THIS_TAG_CHAR);
490 gezelter 419 }
491 mmeineke 377 }
492     }
493 gezelter 419 }
494 gezelter 415 finalOut.flush();
495     sprintf( checkPointMsg,
496     "Sucessfully took a dump.\n");
497     MPIcheckPoint();
498 mmeineke 377
499 gezelter 415 if( worldRank == 0 ) finalOut.close();
500 mmeineke 377 #endif // is_mpi
501     }