ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/DumpWriter.cpp
Revision: 920
Committed: Sat Jan 10 09:46:47 2004 UTC (20 years, 6 months ago) by tim
File size: 22288 byte(s)
Log Message:
tagub is not a bug. Just roll it back
fix a bug of copying string to a pointer
Still have Seg fault, it looks like a random MPI seg fault in totalview

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
11 namespace dWrite{
12 void DieDieDie( void );
13 }
14
15 using namespace dWrite;
16 #endif //is_mpi
17
18 #include "ReadWrite.hpp"
19 #include "simError.h"
20
21 DumpWriter::DumpWriter( SimInfo* the_entry_plug ){
22
23 entry_plug = the_entry_plug;
24
25 #ifdef IS_MPI
26 if(worldRank == 0 ){
27 #endif // is_mpi
28
29 strcpy( outName, entry_plug->sampleName );
30
31 outFile.open(outName, ios::out | ios::trunc );
32
33 if( !outFile ){
34
35 sprintf( painCave.errMsg,
36 "Could not open \"%s\" for dump output.\n",
37 outName);
38 painCave.isFatal = 1;
39 simError();
40 }
41
42 //outFile.setf( ios::scientific );
43
44 #ifdef IS_MPI
45 }
46
47 sprintf( checkPointMsg,
48 "Sucessfully opened output file for dumping.\n");
49 MPIcheckPoint();
50 #endif // is_mpi
51 }
52
53 DumpWriter::~DumpWriter( ){
54
55 #ifdef IS_MPI
56 if(worldRank == 0 ){
57 #endif // is_mpi
58
59 outFile.close();
60
61 #ifdef IS_MPI
62 }
63 #endif // is_mpi
64 }
65
66 void DumpWriter::writeDump( double currentTime ){
67
68 const int BUFFERSIZE = 2000;
69 const int MINIBUFFERSIZE = 100;
70
71 char tempBuffer[BUFFERSIZE];
72 char writeLine[BUFFERSIZE];
73
74 int i;
75
76 #ifdef IS_MPI
77
78 int *potatoes;
79 int myPotato;
80
81 int nProc;
82 int j, which_node, done, which_atom, local_index;
83 double atomData6[6];
84 double atomData13[13];
85 int isDirectional;
86 char* atomTypeString;
87 char MPIatomTypeString[MINIBUFFERSIZE];
88
89 #else //is_mpi
90 int nAtoms = entry_plug->n_atoms;
91 #endif //is_mpi
92
93 double q[4];
94 DirectionalAtom* dAtom;
95 Atom** atoms = entry_plug->atoms;
96 double pos[3], vel[3];
97
98 // write current frame to the eor file
99
100 this->writeFinal( currentTime );
101
102 #ifndef IS_MPI
103
104 outFile << nAtoms << "\n";
105
106 outFile << currentTime << ";\t"
107 << entry_plug->Hmat[0][0] << "\t"
108 << entry_plug->Hmat[1][0] << "\t"
109 << entry_plug->Hmat[2][0] << ";\t"
110
111 << entry_plug->Hmat[0][1] << "\t"
112 << entry_plug->Hmat[1][1] << "\t"
113 << entry_plug->Hmat[2][1] << ";\t"
114
115 << entry_plug->Hmat[0][2] << "\t"
116 << entry_plug->Hmat[1][2] << "\t"
117 << entry_plug->Hmat[2][2] << ";";
118 //write out additional parameters, such as chi and eta
119 outFile << entry_plug->the_integrator->getAdditionalParameters();
120 outFile << endl;
121
122 for( i=0; i<nAtoms; i++ ){
123
124 atoms[i]->getPos(pos);
125 atoms[i]->getVel(vel);
126
127 sprintf( tempBuffer,
128 "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
129 atoms[i]->getType(),
130 pos[0],
131 pos[1],
132 pos[2],
133 vel[0],
134 vel[1],
135 vel[2]);
136 strcpy( writeLine, tempBuffer );
137
138 if( atoms[i]->isDirectional() ){
139
140 dAtom = (DirectionalAtom *)atoms[i];
141 dAtom->getQ( q );
142
143 sprintf( tempBuffer,
144 "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
145 q[0],
146 q[1],
147 q[2],
148 q[3],
149 dAtom->getJx(),
150 dAtom->getJy(),
151 dAtom->getJz());
152 strcat( writeLine, tempBuffer );
153 }
154 else
155 strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
156
157 outFile << writeLine;
158 }
159 outFile.flush();
160
161 #else // is_mpi
162
163 /* code to find maximum tag value */
164
165 int *tagub, flag, MAXTAG;
166 MPI_Attr_get(MPI_COMM_WORLD, MPI_TAG_UB, &tagub, &flag);
167 if (flag) {
168 MAXTAG = *tagub;
169 } else {
170 MAXTAG = 32767;
171 }
172
173 int haveError;
174
175 MPI_Status istatus;
176 int *AtomToProcMap = mpiSim->getAtomToProcMap();
177
178 // write out header and node 0's coordinates
179
180 if( worldRank == 0 ){
181
182 // Node 0 needs a list of the magic potatoes for each processor;
183
184 nProc = mpiSim->getNumberProcessors();
185 potatoes = new int[nProc];
186
187 for (i = 0; i < nProc; i++)
188 potatoes[i] = 0;
189
190 outFile << mpiSim->getTotAtoms() << "\n";
191
192 outFile << currentTime << ";\t"
193 << entry_plug->Hmat[0][0] << "\t"
194 << entry_plug->Hmat[1][0] << "\t"
195 << entry_plug->Hmat[2][0] << ";\t"
196
197 << entry_plug->Hmat[0][1] << "\t"
198 << entry_plug->Hmat[1][1] << "\t"
199 << entry_plug->Hmat[2][1] << ";\t"
200
201 << entry_plug->Hmat[0][2] << "\t"
202 << entry_plug->Hmat[1][2] << "\t"
203 << entry_plug->Hmat[2][2] << ";";
204
205 outFile << entry_plug->the_integrator->getAdditionalParameters();
206 outFile << endl;
207 outFile.flush();
208
209 for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
210
211 // Get the Node number which has this atom;
212
213 which_node = AtomToProcMap[i];
214
215 if (which_node != 0) {
216
217 if (potatoes[which_node] + 3 >= MAXTAG) {
218 // The potato was going to exceed the maximum value,
219 // so wrap this processor potato back to 0:
220
221 potatoes[which_node] = 0;
222 MPI_Send(0, 1, MPI_INT, which_node, 0, MPI_COMM_WORLD);
223
224 }
225
226 myPotato = potatoes[which_node];
227
228 MPI_Recv(MPIatomTypeString, MINIBUFFERSIZE, MPI_CHAR, which_node,
229 myPotato, MPI_COMM_WORLD, &istatus);
230
231 //strncpy(atomTypeString, MPIatomTypeString, MINIBUFFERSIZE);
232
233 // Null terminate the atomTypeString just in case:
234
235 //atomTypeString[strlen(atomTypeString) - 1] = '\0';
236 atomTypeString = MPIatomTypeString;
237
238 myPotato++;
239
240 MPI_Recv(&isDirectional, 1, MPI_INT, which_node,
241 myPotato, MPI_COMM_WORLD, &istatus);
242
243 myPotato++;
244
245 if (isDirectional) {
246 MPI_Recv(atomData13, 13, MPI_DOUBLE, which_node,
247 myPotato, MPI_COMM_WORLD, &istatus);
248 } else {
249 MPI_Recv(atomData6, 6, MPI_DOUBLE, which_node,
250 myPotato, MPI_COMM_WORLD, &istatus);
251 }
252
253 myPotato++;
254 potatoes[which_node] = myPotato;
255
256 } else {
257
258 haveError = 0;
259 which_atom = i;
260 local_index=-1;
261
262 for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
263 if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
264 }
265
266 if (local_index != -1) {
267
268 atomTypeString = atoms[local_index]->getType();
269
270 atoms[local_index]->getPos(pos);
271 atoms[local_index]->getVel(vel);
272
273 atomData6[0] = pos[0];
274 atomData6[1] = pos[1];
275 atomData6[2] = pos[2];
276
277 atomData6[3] = vel[0];
278 atomData6[4] = vel[1];
279 atomData6[5] = vel[2];
280
281 isDirectional = 0;
282
283 if( atoms[local_index]->isDirectional() ){
284
285 isDirectional = 1;
286
287 dAtom = (DirectionalAtom *)atoms[local_index];
288 dAtom->getQ( q );
289
290 for (int j = 0; j < 6 ; j++)
291 atomData13[j] = atomData6[j];
292
293 atomData13[6] = q[0];
294 atomData13[7] = q[1];
295 atomData13[8] = q[2];
296 atomData13[9] = q[3];
297
298 atomData13[10] = dAtom->getJx();
299 atomData13[11] = dAtom->getJy();
300 atomData13[12] = dAtom->getJz();
301 }
302
303 } else {
304 sprintf(painCave.errMsg,
305 "Atom %d not found on processor %d\n",
306 i, worldRank );
307 haveError= 1;
308 simError();
309 }
310
311 if(haveError) DieDieDie();
312
313 // If we've survived to here, format the line:
314
315 if (!isDirectional) {
316
317 sprintf( tempBuffer,
318 "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
319 atomTypeString,
320 atomData6[0],
321 atomData6[1],
322 atomData6[2],
323 atomData6[3],
324 atomData6[4],
325 atomData6[5]);
326
327 strcpy( writeLine, tempBuffer );
328 strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
329
330 } else {
331
332 sprintf( tempBuffer,
333 "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
334 atomTypeString,
335 atomData13[0],
336 atomData13[1],
337 atomData13[2],
338 atomData13[3],
339 atomData13[4],
340 atomData13[5],
341 atomData13[6],
342 atomData13[7],
343 atomData13[8],
344 atomData13[9],
345 atomData13[10],
346 atomData13[11],
347 atomData13[12]);
348
349 strcat( writeLine, tempBuffer );
350
351 }
352
353 outFile << writeLine;
354 outFile.flush();
355 }
356 }
357
358 outFile.flush();
359 sprintf( checkPointMsg,
360 "Sucessfully took a dump.\n");
361 MPIcheckPoint();
362 delete[] potatoes;
363 } else {
364
365 // worldRank != 0, so I'm a remote node.
366
367 // Set my magic potato to 0:
368
369 myPotato = 0;
370
371 for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
372
373 // Am I the node which has this atom?
374
375 if (AtomToProcMap[i] == worldRank) {
376
377 if (myPotato + 3 >= MAXTAG) {
378
379 // The potato was going to exceed the maximum value,
380 // so wrap this processor potato back to 0 (and block until
381 // node 0 says we can go:
382
383 MPI_Recv(&myPotato, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &istatus);
384
385 }
386 which_atom = i;
387 local_index=-1;
388 for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
389 if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
390 }
391 if (local_index != -1) {
392
393 atomTypeString = atoms[local_index]->getType();
394
395 atoms[local_index]->getPos(pos);
396 atoms[local_index]->getVel(vel);
397
398 atomData6[0] = pos[0];
399 atomData6[1] = pos[1];
400 atomData6[2] = pos[2];
401
402 atomData6[3] = vel[0];
403 atomData6[4] = vel[1];
404 atomData6[5] = vel[2];
405
406 isDirectional = 0;
407
408 if( atoms[local_index]->isDirectional() ){
409
410 isDirectional = 1;
411
412 dAtom = (DirectionalAtom *)atoms[local_index];
413 dAtom->getQ( q );
414
415 for (int j = 0; j < 6 ; j++)
416 atomData13[j] = atomData6[j];
417
418 atomData13[6] = q[0];
419 atomData13[7] = q[1];
420 atomData13[8] = q[2];
421 atomData13[9] = q[3];
422
423 atomData13[10] = dAtom->getJx();
424 atomData13[11] = dAtom->getJy();
425 atomData13[12] = dAtom->getJz();
426 }
427
428 } else {
429 sprintf(painCave.errMsg,
430 "Atom %d not found on processor %d\n",
431 i, worldRank );
432 haveError= 1;
433 simError();
434 }
435
436 strncpy(MPIatomTypeString, atomTypeString, MINIBUFFERSIZE);
437
438 // null terminate the string before sending (just in case):
439 MPIatomTypeString[MINIBUFFERSIZE-1] = '\0';
440
441 MPI_Send(MPIatomTypeString, MINIBUFFERSIZE, MPI_CHAR, 0,
442 myPotato, MPI_COMM_WORLD);
443
444 myPotato++;
445
446 MPI_Send(&isDirectional, 1, MPI_INT, 0,
447 myPotato, MPI_COMM_WORLD);
448
449 myPotato++;
450
451 if (isDirectional) {
452
453 MPI_Send(atomData13, 13, MPI_DOUBLE, 0,
454 myPotato, MPI_COMM_WORLD);
455
456 } else {
457
458 MPI_Send(atomData6, 6, MPI_DOUBLE, 0,
459 myPotato, MPI_COMM_WORLD);
460 }
461
462 myPotato++;
463 }
464 }
465
466 sprintf( checkPointMsg,
467 "Sucessfully took a dump.\n");
468 MPIcheckPoint();
469
470 }
471
472 #endif // is_mpi
473 }
474
475 void DumpWriter::writeFinal(double finalTime){
476
477 char finalName[500];
478 ofstream finalOut;
479
480 const int BUFFERSIZE = 2000;
481 const int MINIBUFFERSIZE = 100;
482 char tempBuffer[BUFFERSIZE];
483 char writeLine[BUFFERSIZE];
484
485 double q[4];
486 DirectionalAtom* dAtom;
487 Atom** atoms = entry_plug->atoms;
488 int i;
489 #ifdef IS_MPI
490
491 int *potatoes;
492 int myPotato;
493
494 int nProc;
495 int j, which_node, done, which_atom, local_index;
496 double atomData6[6];
497 double atomData13[13];
498 int isDirectional;
499 char* atomTypeString;
500 char MPIatomTypeString[MINIBUFFERSIZE];
501
502 #else //is_mpi
503 int nAtoms = entry_plug->n_atoms;
504 #endif //is_mpi
505
506 double pos[3], vel[3];
507
508 #ifdef IS_MPI
509 if(worldRank == 0 ){
510 #endif // is_mpi
511
512 strcpy( finalName, entry_plug->finalName );
513
514 finalOut.open( finalName, ios::out | ios::trunc );
515 if( !finalOut ){
516 sprintf( painCave.errMsg,
517 "Could not open \"%s\" for final dump output.\n",
518 finalName );
519 painCave.isFatal = 1;
520 simError();
521 }
522
523 // finalOut.setf( ios::scientific );
524
525 #ifdef IS_MPI
526 }
527
528 sprintf(checkPointMsg,"Opened file for final configuration\n");
529 MPIcheckPoint();
530
531 #endif //is_mpi
532
533
534 #ifndef IS_MPI
535
536 finalOut << nAtoms << "\n";
537
538 finalOut << finalTime << ";\t"
539 << entry_plug->Hmat[0][0] << "\t"
540 << entry_plug->Hmat[1][0] << "\t"
541 << entry_plug->Hmat[2][0] << ";\t"
542
543 << entry_plug->Hmat[0][1] << "\t"
544 << entry_plug->Hmat[1][1] << "\t"
545 << entry_plug->Hmat[2][1] << ";\t"
546
547 << entry_plug->Hmat[0][2] << "\t"
548 << entry_plug->Hmat[1][2] << "\t"
549 << entry_plug->Hmat[2][2] << ";";
550
551 //write out additional parameters, such as chi and eta
552 finalOut << entry_plug->the_integrator->getAdditionalParameters();
553 finalOut << endl;
554
555 for( i=0; i<nAtoms; i++ ){
556
557 atoms[i]->getPos(pos);
558 atoms[i]->getVel(vel);
559
560 sprintf( tempBuffer,
561 "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
562 atoms[i]->getType(),
563 pos[0],
564 pos[1],
565 pos[2],
566 vel[0],
567 vel[1],
568 vel[2]);
569 strcpy( writeLine, tempBuffer );
570
571 if( atoms[i]->isDirectional() ){
572
573 dAtom = (DirectionalAtom *)atoms[i];
574 dAtom->getQ( q );
575
576 sprintf( tempBuffer,
577 "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
578 q[0],
579 q[1],
580 q[2],
581 q[3],
582 dAtom->getJx(),
583 dAtom->getJy(),
584 dAtom->getJz());
585 strcat( writeLine, tempBuffer );
586 }
587 else
588 strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
589
590 finalOut << writeLine;
591 }
592 finalOut.flush();
593 finalOut.close();
594
595 #else // is_mpi
596
597 /* code to find maximum tag value */
598 int *tagub, flag, MAXTAG;
599 MPI_Attr_get(MPI_COMM_WORLD, MPI_TAG_UB, &tagub, &flag);
600 if (flag) {
601 MAXTAG = *tagub;
602 } else {
603 MAXTAG = 32767;
604 }
605
606 int haveError;
607
608 MPI_Status istatus;
609 int *AtomToProcMap = mpiSim->getAtomToProcMap();
610
611 // write out header and node 0's coordinates
612
613 if( worldRank == 0 ){
614
615 // Node 0 needs a list of the magic potatoes for each processor;
616
617 nProc = mpiSim->getNumberProcessors();
618 potatoes = new int[nProc];
619
620 for (i = 0; i < nProc; i++)
621 potatoes[i] = 0;
622
623 finalOut << mpiSim->getTotAtoms() << "\n";
624
625 finalOut << finalTime << ";\t"
626 << entry_plug->Hmat[0][0] << "\t"
627 << entry_plug->Hmat[1][0] << "\t"
628 << entry_plug->Hmat[2][0] << ";\t"
629
630 << entry_plug->Hmat[0][1] << "\t"
631 << entry_plug->Hmat[1][1] << "\t"
632 << entry_plug->Hmat[2][1] << ";\t"
633
634 << entry_plug->Hmat[0][2] << "\t"
635 << entry_plug->Hmat[1][2] << "\t"
636 << entry_plug->Hmat[2][2] << ";";
637
638 finalOut << entry_plug->the_integrator->getAdditionalParameters();
639 finalOut << endl;
640 finalOut.flush();
641
642 for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
643
644 // Get the Node number which has this atom;
645
646 which_node = AtomToProcMap[i];
647
648 if (which_node != 0) {
649
650 if (potatoes[which_node] + 3 >= MAXTAG) {
651 // The potato was going to exceed the maximum value,
652 // so wrap this processor potato back to 0:
653
654 potatoes[which_node] = 0;
655 MPI_Send(0, 1, MPI_INT, which_node, 0, MPI_COMM_WORLD);
656
657 }
658
659 myPotato = potatoes[which_node];
660
661 MPI_Recv(MPIatomTypeString, MINIBUFFERSIZE, MPI_CHAR, which_node,
662 myPotato, MPI_COMM_WORLD, &istatus);
663
664 atomTypeString = MPIatomTypeString;
665
666 myPotato++;
667
668 MPI_Recv(&isDirectional, 1, MPI_INT, which_node,
669 myPotato, MPI_COMM_WORLD, &istatus);
670
671 myPotato++;
672
673 if (isDirectional) {
674 MPI_Recv(atomData13, 13, MPI_DOUBLE, which_node,
675 myPotato, MPI_COMM_WORLD, &istatus);
676 } else {
677 MPI_Recv(atomData6, 6, MPI_DOUBLE, which_node,
678 myPotato, MPI_COMM_WORLD, &istatus);
679 }
680
681 myPotato++;
682 potatoes[which_node] = myPotato;
683
684 } else {
685
686 haveError = 0;
687 which_atom = i;
688 local_index=-1;
689
690 for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
691 if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
692 }
693
694 if (local_index != -1) {
695
696 atomTypeString = atoms[local_index]->getType();
697
698 atoms[local_index]->getPos(pos);
699 atoms[local_index]->getVel(vel);
700
701 atomData6[0] = pos[0];
702 atomData6[1] = pos[1];
703 atomData6[2] = pos[2];
704
705 atomData6[3] = vel[0];
706 atomData6[4] = vel[1];
707 atomData6[5] = vel[2];
708
709 isDirectional = 0;
710
711 if( atoms[local_index]->isDirectional() ){
712
713 isDirectional = 1;
714
715 dAtom = (DirectionalAtom *)atoms[local_index];
716 dAtom->getQ( q );
717
718 for (int j = 0; j < 6 ; j++)
719 atomData13[j] = atomData6[j];
720
721 atomData13[6] = q[0];
722 atomData13[7] = q[1];
723 atomData13[8] = q[2];
724 atomData13[9] = q[3];
725
726 atomData13[10] = dAtom->getJx();
727 atomData13[11] = dAtom->getJy();
728 atomData13[12] = dAtom->getJz();
729 }
730
731 } else {
732 sprintf(painCave.errMsg,
733 "Atom %d not found on processor %d\n",
734 i, worldRank );
735 haveError= 1;
736 simError();
737 }
738
739 if(haveError) DieDieDie();
740
741 // If we've survived to here, format the line:
742
743 if (!isDirectional) {
744
745 sprintf( tempBuffer,
746 "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
747 atomTypeString,
748 atomData6[0],
749 atomData6[1],
750 atomData6[2],
751 atomData6[3],
752 atomData6[4],
753 atomData6[5]);
754
755 strcpy( writeLine, tempBuffer );
756 strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
757
758 } else {
759
760 sprintf( tempBuffer,
761 "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
762 atomTypeString,
763 atomData13[0],
764 atomData13[1],
765 atomData13[2],
766 atomData13[3],
767 atomData13[4],
768 atomData13[5],
769 atomData13[6],
770 atomData13[7],
771 atomData13[8],
772 atomData13[9],
773 atomData13[10],
774 atomData13[11],
775 atomData13[12]);
776
777 strcat( writeLine, tempBuffer );
778
779 }
780
781 finalOut << writeLine;
782 finalOut.flush();
783 }
784 }
785
786 finalOut.flush();
787 sprintf( checkPointMsg,
788 "Sucessfully took a dump.\n");
789 delete[] potatoes;
790
791 MPIcheckPoint();
792
793 } else {
794
795 // worldRank != 0, so I'm a remote node.
796
797 // Set my magic potato to 0:
798
799 myPotato = 0;
800
801 for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
802
803 // Am I the node which has this atom?
804
805 if (AtomToProcMap[i] == worldRank) {
806
807 if (myPotato + 3 >= MAXTAG) {
808
809 // The potato was going to exceed the maximum value,
810 // so wrap this processor potato back to 0 (and block until
811 // node 0 says we can go:
812
813 MPI_Recv(&myPotato, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &istatus);
814
815 }
816 which_atom = i;
817 local_index=-1;
818 for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
819 if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
820 }
821 if (local_index != -1) {
822
823 atomTypeString = atoms[local_index]->getType();
824
825 atoms[local_index]->getPos(pos);
826 atoms[local_index]->getVel(vel);
827
828 atomData6[0] = pos[0];
829 atomData6[1] = pos[1];
830 atomData6[2] = pos[2];
831
832 atomData6[3] = vel[0];
833 atomData6[4] = vel[1];
834 atomData6[5] = vel[2];
835
836 isDirectional = 0;
837
838 if( atoms[local_index]->isDirectional() ){
839
840 isDirectional = 1;
841
842 dAtom = (DirectionalAtom *)atoms[local_index];
843 dAtom->getQ( q );
844
845 for (int j = 0; j < 6 ; j++)
846 atomData13[j] = atomData6[j];
847
848 atomData13[6] = q[0];
849 atomData13[7] = q[1];
850 atomData13[8] = q[2];
851 atomData13[9] = q[3];
852
853 atomData13[10] = dAtom->getJx();
854 atomData13[11] = dAtom->getJy();
855 atomData13[12] = dAtom->getJz();
856 }
857
858 } else {
859 sprintf(painCave.errMsg,
860 "Atom %d not found on processor %d\n",
861 i, worldRank );
862 haveError= 1;
863 simError();
864 }
865
866 strncpy(MPIatomTypeString, atomTypeString, MINIBUFFERSIZE);
867
868 // null terminate the string before sending (just in case):
869 MPIatomTypeString[MINIBUFFERSIZE-1] = '\0';
870
871 MPI_Send(MPIatomTypeString, MINIBUFFERSIZE, MPI_CHAR, 0,
872 myPotato, MPI_COMM_WORLD);
873
874 myPotato++;
875
876 MPI_Send(&isDirectional, 1, MPI_INT, 0,
877 myPotato, MPI_COMM_WORLD);
878
879 myPotato++;
880
881 if (isDirectional) {
882
883 MPI_Send(atomData13, 13, MPI_DOUBLE, 0,
884 myPotato, MPI_COMM_WORLD);
885
886 } else {
887
888 MPI_Send(atomData6, 6, MPI_DOUBLE, 0,
889 myPotato, MPI_COMM_WORLD);
890 }
891
892 myPotato++;
893 }
894 }
895
896 sprintf( checkPointMsg,
897 "Sucessfully took a dump.\n");
898 MPIcheckPoint();
899
900 }
901
902 if( worldRank == 0 ) finalOut.close();
903 #endif // is_mpi
904 }
905
906
907
908 #ifdef IS_MPI
909
910 // a couple of functions to let us escape the write loop
911
912 void dWrite::DieDieDie( void ){
913
914 MPI_Finalize();
915 exit (0);
916 }
917
918 #endif //is_mpi