ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/DumpWriter.cpp
Revision: 483
Committed: Wed Apr 9 04:06:43 2003 UTC (21 years, 2 months ago) by gezelter
File size: 14198 byte(s)
Log Message:
fixes for NPT and NVT

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