ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/DumpWriter.cpp
Revision: 829
Committed: Tue Oct 28 16:03:37 2003 UTC (20 years, 8 months ago) by gezelter
File size: 15246 byte(s)
Log Message:
replace c++ header stuff with more portable c header stuff
Also, mod file fixes and portability changes
Some fortran changes will need to be reversed.

File Contents

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