ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/DumpWriter.cpp
Revision: 469
Committed: Mon Apr 7 20:06:31 2003 UTC (21 years, 3 months ago) by mmeineke
File size: 14284 byte(s)
Log Message:
bug fixes

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     #include "mpiSimulation.hpp"
8 chuckv 436 #define TAKE_THIS_TAG_CHAR 1
9     #define TAKE_THIS_TAG_INT 2
10 mmeineke 440
11     namespace dWrite{
12     void nodeZeroError( void );
13     void anonymousNodeDie( void );
14     }
15    
16     using namespace dWrite;
17 mmeineke 377 #endif //is_mpi
18    
19     #include "ReadWrite.hpp"
20     #include "simError.h"
21    
22     DumpWriter::DumpWriter( SimInfo* the_entry_plug ){
23    
24     entry_plug = the_entry_plug;
25    
26 mmeineke 469 std::cerr << "Look at me I'm a freebird!\n";
27    
28 mmeineke 377 #ifdef IS_MPI
29     if(worldRank == 0 ){
30     #endif // is_mpi
31    
32    
33    
34     strcpy( outName, entry_plug->sampleName );
35    
36     outFile.open(outName, ios::out | ios::trunc );
37    
38     if( !outFile ){
39    
40     sprintf( painCave.errMsg,
41     "Could not open \"%s\" for dump output.\n",
42     outName);
43     painCave.isFatal = 1;
44     simError();
45     }
46 mmeineke 469
47     std::cerr << "me TOO!\n";
48    
49 mmeineke 377 //outFile.setf( ios::scientific );
50    
51     #ifdef IS_MPI
52     }
53    
54     sprintf( checkPointMsg,
55     "Sucessfully opened output file for dumping.\n");
56     MPIcheckPoint();
57     #endif // is_mpi
58     }
59    
60     DumpWriter::~DumpWriter( ){
61    
62     #ifdef IS_MPI
63     if(worldRank == 0 ){
64     #endif // is_mpi
65    
66     outFile.close();
67    
68     #ifdef IS_MPI
69     }
70     #endif // is_mpi
71     }
72    
73     void DumpWriter::writeDump( double currentTime ){
74    
75     const int BUFFERSIZE = 2000;
76     char tempBuffer[BUFFERSIZE];
77     char writeLine[BUFFERSIZE];
78    
79 mmeineke 450 int i, j, which_node, done, which_atom, local_index;
80 mmeineke 377 double q[4];
81     DirectionalAtom* dAtom;
82     int nAtoms = entry_plug->n_atoms;
83     Atom** atoms = entry_plug->atoms;
84    
85    
86     #ifndef IS_MPI
87    
88     outFile << nAtoms << "\n";
89    
90     outFile << currentTime << "\t"
91     << entry_plug->box_x << "\t"
92     << entry_plug->box_y << "\t"
93     << entry_plug->box_z << "\n";
94    
95     for( i=0; i<nAtoms; i++ ){
96    
97    
98     sprintf( tempBuffer,
99     "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
100     atoms[i]->getType(),
101     atoms[i]->getX(),
102     atoms[i]->getY(),
103     atoms[i]->getZ(),
104     atoms[i]->get_vx(),
105     atoms[i]->get_vy(),
106     atoms[i]->get_vz());
107     strcpy( writeLine, tempBuffer );
108    
109     if( atoms[i]->isDirectional() ){
110    
111     dAtom = (DirectionalAtom *)atoms[i];
112     dAtom->getQ( q );
113    
114     sprintf( tempBuffer,
115     "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
116     q[0],
117     q[1],
118     q[2],
119     q[3],
120     dAtom->getJx(),
121     dAtom->getJy(),
122     dAtom->getJz());
123     strcat( writeLine, tempBuffer );
124     }
125     else
126     strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
127    
128     outFile << writeLine;
129     }
130     outFile.flush();
131    
132     #else // is_mpi
133 gezelter 416
134 mmeineke 440 // first thing first, suspend fatalities.
135     painCave.isEventLoop = 1;
136    
137     int myStatus; // 1 = wakeup & success; 0 = error; -1 = AllDone
138     int haveError;
139    
140 mmeineke 447 MPI_Status istatus;
141 gezelter 416 int *AtomToProcMap = mpiSim->getAtomToProcMap();
142 gezelter 415
143 mmeineke 377 // write out header and node 0's coordinates
144 gezelter 415
145 mmeineke 377 if( worldRank == 0 ){
146     outFile << mpiSim->getTotAtoms() << "\n";
147 gezelter 415
148 mmeineke 377 outFile << currentTime << "\t"
149     << entry_plug->box_x << "\t"
150     << entry_plug->box_y << "\t"
151     << entry_plug->box_z << "\n";
152 chuckv 434 outFile.flush();
153 gezelter 416 for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
154 gezelter 417 // Get the Node number which has this atom;
155 mmeineke 377
156 gezelter 415 which_node = AtomToProcMap[i];
157    
158 chuckv 436 if (which_node == 0 ) {
159 mmeineke 377
160 mmeineke 440 haveError = 0;
161 chuckv 436 which_atom = i;
162     local_index=-1;
163     for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
164     if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
165     }
166     if (local_index != -1) {
167     //format the line
168     sprintf( tempBuffer,
169     "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
170     atoms[local_index]->getType(),
171     atoms[local_index]->getX(),
172     atoms[local_index]->getY(),
173     atoms[local_index]->getZ(),
174     atoms[local_index]->get_vx(),
175     atoms[local_index]->get_vy(),
176     atoms[local_index]->get_vz()); // check here.
177     strcpy( writeLine, tempBuffer );
178 mmeineke 377
179 chuckv 436 if( atoms[local_index]->isDirectional() ){
180    
181     dAtom = (DirectionalAtom *)atoms[local_index];
182     dAtom->getQ( q );
183    
184     sprintf( tempBuffer,
185     "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
186     q[0],
187     q[1],
188     q[2],
189     q[3],
190     dAtom->getJx(),
191     dAtom->getJy(),
192     dAtom->getJz());
193     strcat( writeLine, tempBuffer );
194    
195     }
196     else
197     strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
198     }
199     else {
200 mmeineke 440 sprintf(painCave.errMsg,
201     "Atom %d not found on processor %d\n",
202     i, worldRank );
203     haveError= 1;
204     simError();
205 chuckv 436 }
206 mmeineke 440
207     if(haveError) nodeZeroError();
208    
209     }
210 chuckv 436 else {
211 mmeineke 440 myStatus = 1;
212 mmeineke 447 MPI_Send(&myStatus, 1, MPI_INT, which_node,
213     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
214     MPI_Send(&i, 1, MPI_INT, which_node, TAKE_THIS_TAG_INT,
215     MPI_COMM_WORLD);
216     MPI_Recv(writeLine, BUFFERSIZE, MPI_CHAR, which_node,
217     TAKE_THIS_TAG_CHAR, MPI_COMM_WORLD, &istatus);
218     MPI_Recv(&myStatus, 1, MPI_INT, which_node,
219     TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
220 mmeineke 440
221     if(!myStatus) nodeZeroError();
222    
223 mmeineke 377 }
224 gezelter 415
225 mmeineke 377 outFile << writeLine;
226 chuckv 434 outFile.flush();
227 mmeineke 377 }
228    
229 gezelter 415 // kill everyone off:
230 mmeineke 440 myStatus = -1;
231 gezelter 416 for (j = 0; j < mpiSim->getNumberProcessors(); j++) {
232 mmeineke 447 MPI_Send(&myStatus, 1, MPI_INT, j,
233     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
234 mmeineke 377 }
235    
236 gezelter 415 } else {
237    
238     done = 0;
239     while (!done) {
240 mmeineke 440
241 mmeineke 447 MPI_Recv(&myStatus, 1, MPI_INT, 0,
242     TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
243 mmeineke 440
244     if(!myStatus) anonymousNodeDie();
245    
246     if(myStatus < 0) break;
247    
248 mmeineke 447 MPI_Recv(&which_atom, 1, MPI_INT, 0,
249     TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
250 mmeineke 440
251     myStatus = 1;
252     local_index=-1;
253     for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
254     if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
255     }
256     if (local_index != -1) {
257     //format the line
258     sprintf( tempBuffer,
259     "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
260     atoms[local_index]->getType(),
261     atoms[local_index]->getX(),
262     atoms[local_index]->getY(),
263     atoms[local_index]->getZ(),
264     atoms[local_index]->get_vx(),
265     atoms[local_index]->get_vy(),
266     atoms[local_index]->get_vz()); // check here.
267     strcpy( writeLine, tempBuffer );
268    
269     if( atoms[local_index]->isDirectional() ){
270 mmeineke 377
271 mmeineke 440 dAtom = (DirectionalAtom *)atoms[local_index];
272     dAtom->getQ( q );
273    
274     sprintf( tempBuffer,
275     "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
276     q[0],
277     q[1],
278     q[2],
279     q[3],
280     dAtom->getJx(),
281     dAtom->getJy(),
282     dAtom->getJz());
283     strcat( writeLine, tempBuffer );
284     }
285     else{
286     strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
287     }
288     }
289     else {
290     sprintf(painCave.errMsg,
291     "Atom %d not found on processor %d\n",
292     which_atom, worldRank );
293     myStatus = 0;
294     simError();
295    
296     strcpy( writeLine, "Hello, I'm an error.\n");
297 mmeineke 377 }
298 mmeineke 440
299 mmeineke 447 MPI_Send(writeLine, BUFFERSIZE, MPI_CHAR, 0,
300     TAKE_THIS_TAG_CHAR, MPI_COMM_WORLD);
301     MPI_Send( &myStatus, 1, MPI_INT, 0,
302     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
303 mmeineke 377 }
304 gezelter 415 }
305     outFile.flush();
306     sprintf( checkPointMsg,
307     "Sucessfully took a dump.\n");
308     MPIcheckPoint();
309 mmeineke 440
310     // last thing last, enable fatalities.
311     painCave.isEventLoop = 0;
312    
313 mmeineke 377 #endif // is_mpi
314     }
315    
316     void DumpWriter::writeFinal(){
317 gezelter 416
318 mmeineke 377 char finalName[500];
319     ofstream finalOut;
320 gezelter 416
321     const int BUFFERSIZE = 2000;
322     char tempBuffer[BUFFERSIZE];
323     char writeLine[BUFFERSIZE];
324    
325     double q[4];
326     DirectionalAtom* dAtom;
327     int nAtoms = entry_plug->n_atoms;
328     Atom** atoms = entry_plug->atoms;
329 gezelter 419 int i, j, which_node, done, game_over, which_atom, local_index;
330 mmeineke 377
331 gezelter 416
332 mmeineke 377 #ifdef IS_MPI
333     if(worldRank == 0 ){
334     #endif // is_mpi
335    
336     strcpy( finalName, entry_plug->finalName );
337    
338     finalOut.open( finalName, ios::out | ios::trunc );
339     if( !finalOut ){
340     sprintf( painCave.errMsg,
341     "Could not open \"%s\" for final dump output.\n",
342     finalName );
343     painCave.isFatal = 1;
344     simError();
345     }
346    
347     // finalOut.setf( ios::scientific );
348    
349     #ifdef IS_MPI
350     }
351    
352     sprintf(checkPointMsg,"Opened file for final configuration\n");
353     MPIcheckPoint();
354    
355     #endif //is_mpi
356    
357 gezelter 415
358 mmeineke 377 #ifndef IS_MPI
359    
360     finalOut << nAtoms << "\n";
361    
362     finalOut << entry_plug->box_x << "\t"
363     << entry_plug->box_y << "\t"
364     << entry_plug->box_z << "\n";
365 gezelter 416
366 mmeineke 377 for( i=0; i<nAtoms; i++ ){
367    
368     sprintf( tempBuffer,
369     "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
370     atoms[i]->getType(),
371     atoms[i]->getX(),
372     atoms[i]->getY(),
373     atoms[i]->getZ(),
374     atoms[i]->get_vx(),
375     atoms[i]->get_vy(),
376     atoms[i]->get_vz());
377     strcpy( writeLine, tempBuffer );
378    
379     if( atoms[i]->isDirectional() ){
380    
381     dAtom = (DirectionalAtom *)atoms[i];
382     dAtom->getQ( q );
383    
384     sprintf( tempBuffer,
385     "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
386     q[0],
387     q[1],
388     q[2],
389     q[3],
390     dAtom->getJx(),
391     dAtom->getJy(),
392     dAtom->getJz());
393     strcat( writeLine, tempBuffer );
394     }
395     else
396     strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
397    
398     finalOut << writeLine;
399     }
400     finalOut.flush();
401 gezelter 415 finalOut.close();
402 mmeineke 377
403     #else // is_mpi
404 gezelter 415
405 mmeineke 440 // first thing first, suspend fatalities.
406     painCave.isEventLoop = 1;
407    
408     int myStatus; // 1 = wakeup & success; 0 = error; -1 = AllDone
409     int haveError;
410    
411 mmeineke 447 MPI_Status istatus;
412 gezelter 416 int *AtomToProcMap = mpiSim->getAtomToProcMap();
413    
414 mmeineke 377 // write out header and node 0's coordinates
415 gezelter 415
416 mmeineke 440 haveError = 0;
417 mmeineke 377 if( worldRank == 0 ){
418     finalOut << mpiSim->getTotAtoms() << "\n";
419 gezelter 415
420 mmeineke 377 finalOut << entry_plug->box_x << "\t"
421 gezelter 415 << entry_plug->box_y << "\t"
422     << entry_plug->box_z << "\n";
423 mmeineke 377
424 gezelter 416 for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
425 gezelter 415 // Get the Node number which has this molecule:
426 mmeineke 377
427 gezelter 415 which_node = AtomToProcMap[i];
428    
429 gezelter 416 if (which_node == mpiSim->getMyNode()) {
430 chuckv 437
431     which_atom = i;
432     local_index=-1;
433     for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
434     if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
435     }
436     if (local_index != -1) {
437     sprintf( tempBuffer,
438     "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
439     atoms[local_index]->getType(),
440     atoms[local_index]->getX(),
441     atoms[local_index]->getY(),
442     atoms[local_index]->getZ(),
443     atoms[local_index]->get_vx(),
444     atoms[local_index]->get_vy(),
445     atoms[local_index]->get_vz());
446     strcpy( writeLine, tempBuffer );
447 mmeineke 377
448 chuckv 437 if( atoms[local_index]->isDirectional() ){
449    
450     dAtom = (DirectionalAtom *)atoms[local_index];
451     dAtom->getQ( q );
452    
453     sprintf( tempBuffer,
454     "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
455     q[0],
456     q[1],
457     q[2],
458     q[3],
459     dAtom->getJx(),
460     dAtom->getJy(),
461     dAtom->getJz());
462     strcat( writeLine, tempBuffer );
463     }
464     else
465     strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
466     }
467     else {
468 mmeineke 440 sprintf(painCave.errMsg,
469     "Atom %d not found on processor %d\n",
470     i, worldRank );
471     haveError= 1;
472     simError();
473 chuckv 437 }
474 mmeineke 440
475     if(haveError) nodeZeroError();
476 chuckv 437
477 mmeineke 440 }
478     else {
479 gezelter 415
480 mmeineke 440 myStatus = 1;
481 mmeineke 447 MPI_Send(&myStatus, 1, MPI_INT, which_node,
482     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
483     MPI_Send(&i, 1, MPI_INT, which_node, TAKE_THIS_TAG_INT,
484     MPI_COMM_WORLD);
485     MPI_Recv(writeLine, BUFFERSIZE, MPI_CHAR, which_node,
486     TAKE_THIS_TAG_CHAR, MPI_COMM_WORLD, &istatus);
487     MPI_Recv(&myStatus, 1, MPI_INT, which_node,
488     TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
489 mmeineke 440
490     if(!myStatus) nodeZeroError();
491 mmeineke 377 }
492 gezelter 415
493 mmeineke 377 finalOut << writeLine;
494     }
495    
496 gezelter 415 // kill everyone off:
497 mmeineke 440 myStatus = -1;
498     for (j = 0; j < mpiSim->getNumberProcessors(); j++) {
499 mmeineke 447 MPI_Send(&myStatus, 1, MPI_INT, j,
500     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
501 mmeineke 377 }
502    
503 gezelter 415 } else {
504    
505     done = 0;
506     while (!done) {
507 mmeineke 440
508 mmeineke 447 MPI_Recv(&myStatus, 1, MPI_INT, 0,
509     TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
510 mmeineke 440
511     if(!myStatus) anonymousNodeDie();
512    
513     if(myStatus < 0) break;
514    
515 mmeineke 447 MPI_Recv(&which_atom, 1, MPI_INT, 0,
516     TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
517 mmeineke 440
518     myStatus = 1;
519     local_index=-1;
520     for (j=0; j < mpiSim->getMyNlocal(); j++) {
521     if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
522     }
523     if (local_index != -1) {
524 mmeineke 377
525 mmeineke 440 //format the line
526     sprintf( tempBuffer,
527     "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
528     atoms[local_index]->getType(),
529     atoms[local_index]->getX(),
530     atoms[local_index]->getY(),
531     atoms[local_index]->getZ(),
532     atoms[local_index]->get_vx(),
533     atoms[local_index]->get_vy(),
534     atoms[local_index]->get_vz()); // check here.
535     strcpy( writeLine, tempBuffer );
536    
537     if( atoms[local_index]->isDirectional() ){
538 mmeineke 377
539 mmeineke 440 dAtom = (DirectionalAtom *)atoms[local_index];
540     dAtom->getQ( q );
541    
542     sprintf( tempBuffer,
543     "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
544     q[0],
545     q[1],
546     q[2],
547     q[3],
548     dAtom->getJx(),
549     dAtom->getJy(),
550     dAtom->getJz());
551     strcat( writeLine, tempBuffer );
552     }
553     else{
554     strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
555     }
556     }
557     else {
558     sprintf(painCave.errMsg,
559     "Atom %d not found on processor %d\n",
560     which_atom, worldRank );
561     myStatus = 0;
562     simError();
563    
564     strcpy( writeLine, "Hello, I'm an error.\n");
565 mmeineke 377 }
566 mmeineke 440
567 mmeineke 447 MPI_Send(writeLine, BUFFERSIZE, MPI_CHAR, 0,
568     TAKE_THIS_TAG_CHAR, MPI_COMM_WORLD);
569     MPI_Send( &myStatus, 1, MPI_INT, 0,
570     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
571 mmeineke 377 }
572 gezelter 419 }
573 gezelter 415 finalOut.flush();
574     sprintf( checkPointMsg,
575     "Sucessfully took a dump.\n");
576     MPIcheckPoint();
577 mmeineke 440
578 gezelter 415 if( worldRank == 0 ) finalOut.close();
579 mmeineke 377 #endif // is_mpi
580     }
581 mmeineke 440
582    
583    
584     #ifdef IS_MPI
585    
586     // a couple of functions to let us escape the write loop
587    
588     void dWrite::nodeZeroError( void ){
589     int j, myStatus;
590    
591     myStatus = 0;
592     for (j = 0; j < mpiSim->getNumberProcessors(); j++) {
593 mmeineke 447 MPI_Send( &myStatus, 1, MPI_INT, j,
594     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
595 mmeineke 440 }
596    
597    
598     MPI_Finalize();
599     exit (0);
600    
601     }
602    
603     void dWrite::anonymousNodeDie( void ){
604    
605     MPI_Finalize();
606     exit (0);
607     }
608    
609     #endif //is_mpi