ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/DumpWriter.cpp
Revision: 926
Committed: Mon Jan 12 20:37:59 2004 UTC (20 years, 5 months ago) by tim
File size: 21409 byte(s)
Log Message:
Dumpwriter only write out the atoms on master nodes

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 }
314 // If we've survived to here, format the line:
315
316 if (!isDirectional) {
317
318 sprintf( tempBuffer,
319 "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
320 atomTypeString,
321 atomData6[0],
322 atomData6[1],
323 atomData6[2],
324 atomData6[3],
325 atomData6[4],
326 atomData6[5]);
327
328 strcpy( writeLine, tempBuffer );
329 strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
330
331 } else {
332
333 sprintf( tempBuffer,
334 "%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",
335 atomTypeString,
336 atomData13[0],
337 atomData13[1],
338 atomData13[2],
339 atomData13[3],
340 atomData13[4],
341 atomData13[5],
342 atomData13[6],
343 atomData13[7],
344 atomData13[8],
345 atomData13[9],
346 atomData13[10],
347 atomData13[11],
348 atomData13[12]);
349
350 strcat( writeLine, tempBuffer );
351
352 }
353
354 outFile << writeLine;
355 outFile.flush();
356 }
357
358
359 outFile.flush();
360 sprintf( checkPointMsg,
361 "Sucessfully took a dump.\n");
362 MPIcheckPoint();
363 delete[] potatoes;
364 } else {
365
366 // worldRank != 0, so I'm a remote node.
367
368 // Set my magic potato to 0:
369
370 myPotato = 0;
371
372 for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
373
374 // Am I the node which has this atom?
375
376 if (AtomToProcMap[i] == worldRank) {
377
378 if (myPotato + 3 >= MAXTAG) {
379
380 // The potato was going to exceed the maximum value,
381 // so wrap this processor potato back to 0 (and block until
382 // node 0 says we can go:
383
384 MPI_Recv(&myPotato, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &istatus);
385
386 }
387 which_atom = i;
388 local_index=-1;
389 for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
390 if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
391 }
392 if (local_index != -1) {
393
394 atomTypeString = atoms[local_index]->getType();
395
396 atoms[local_index]->getPos(pos);
397 atoms[local_index]->getVel(vel);
398
399 atomData6[0] = pos[0];
400 atomData6[1] = pos[1];
401 atomData6[2] = pos[2];
402
403 atomData6[3] = vel[0];
404 atomData6[4] = vel[1];
405 atomData6[5] = vel[2];
406
407 isDirectional = 0;
408
409 if( atoms[local_index]->isDirectional() ){
410
411 isDirectional = 1;
412
413 dAtom = (DirectionalAtom *)atoms[local_index];
414 dAtom->getQ( q );
415
416 for (int j = 0; j < 6 ; j++)
417 atomData13[j] = atomData6[j];
418
419 atomData13[6] = q[0];
420 atomData13[7] = q[1];
421 atomData13[8] = q[2];
422 atomData13[9] = q[3];
423
424 atomData13[10] = dAtom->getJx();
425 atomData13[11] = dAtom->getJy();
426 atomData13[12] = dAtom->getJz();
427 }
428
429 } else {
430 sprintf(painCave.errMsg,
431 "Atom %d not found on processor %d\n",
432 i, worldRank );
433 haveError= 1;
434 simError();
435 }
436
437 strncpy(MPIatomTypeString, atomTypeString, MINIBUFFERSIZE);
438
439 // null terminate the string before sending (just in case):
440 MPIatomTypeString[MINIBUFFERSIZE-1] = '\0';
441
442 MPI_Send(MPIatomTypeString, MINIBUFFERSIZE, MPI_CHAR, 0,
443 myPotato, MPI_COMM_WORLD);
444
445 myPotato++;
446
447 MPI_Send(&isDirectional, 1, MPI_INT, 0,
448 myPotato, MPI_COMM_WORLD);
449
450 myPotato++;
451
452 if (isDirectional) {
453
454 MPI_Send(atomData13, 13, MPI_DOUBLE, 0,
455 myPotato, MPI_COMM_WORLD);
456
457 } else {
458
459 MPI_Send(atomData6, 6, MPI_DOUBLE, 0,
460 myPotato, MPI_COMM_WORLD);
461 }
462
463 myPotato++;
464 }
465 }
466
467 sprintf( checkPointMsg,
468 "Sucessfully took a dump.\n");
469 MPIcheckPoint();
470
471 }
472
473 #endif // is_mpi
474 }
475
476 void DumpWriter::writeFinal(double finalTime){
477
478 char finalName[500];
479 ofstream finalOut;
480
481 const int BUFFERSIZE = 2000;
482 const int MINIBUFFERSIZE = 100;
483 char tempBuffer[BUFFERSIZE];
484 char writeLine[BUFFERSIZE];
485
486 double q[4];
487 DirectionalAtom* dAtom;
488 Atom** atoms = entry_plug->atoms;
489 int i;
490 #ifdef IS_MPI
491
492 int *potatoes;
493 int myPotato;
494
495 int nProc;
496 int j, which_node, done, which_atom, local_index;
497 double atomData6[6];
498 double atomData13[13];
499 int isDirectional;
500 char* atomTypeString;
501 char MPIatomTypeString[MINIBUFFERSIZE];
502
503 #else //is_mpi
504 int nAtoms = entry_plug->n_atoms;
505 #endif //is_mpi
506
507 double pos[3], vel[3];
508
509 #ifdef IS_MPI
510 if(worldRank == 0 ){
511 #endif // is_mpi
512
513 strcpy( finalName, entry_plug->finalName );
514
515 finalOut.open( finalName, ios::out | ios::trunc );
516 if( !finalOut ){
517 sprintf( painCave.errMsg,
518 "Could not open \"%s\" for final dump output.\n",
519 finalName );
520 painCave.isFatal = 1;
521 simError();
522 }
523
524 // finalOut.setf( ios::scientific );
525
526 #ifdef IS_MPI
527 }
528
529 sprintf(checkPointMsg,"Opened file for final configuration\n");
530 MPIcheckPoint();
531
532 #endif //is_mpi
533
534
535 #ifndef IS_MPI
536
537 finalOut << nAtoms << "\n";
538
539 finalOut << finalTime << ";\t"
540 << entry_plug->Hmat[0][0] << "\t"
541 << entry_plug->Hmat[1][0] << "\t"
542 << entry_plug->Hmat[2][0] << ";\t"
543
544 << entry_plug->Hmat[0][1] << "\t"
545 << entry_plug->Hmat[1][1] << "\t"
546 << entry_plug->Hmat[2][1] << ";\t"
547
548 << entry_plug->Hmat[0][2] << "\t"
549 << entry_plug->Hmat[1][2] << "\t"
550 << entry_plug->Hmat[2][2] << ";";
551
552 //write out additional parameters, such as chi and eta
553 finalOut << entry_plug->the_integrator->getAdditionalParameters();
554 finalOut << endl;
555
556 for( i=0; i<nAtoms; i++ ){
557
558 atoms[i]->getPos(pos);
559 atoms[i]->getVel(vel);
560
561 sprintf( tempBuffer,
562 "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
563 atoms[i]->getType(),
564 pos[0],
565 pos[1],
566 pos[2],
567 vel[0],
568 vel[1],
569 vel[2]);
570 strcpy( writeLine, tempBuffer );
571
572 if( atoms[i]->isDirectional() ){
573
574 dAtom = (DirectionalAtom *)atoms[i];
575 dAtom->getQ( q );
576
577 sprintf( tempBuffer,
578 "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
579 q[0],
580 q[1],
581 q[2],
582 q[3],
583 dAtom->getJx(),
584 dAtom->getJy(),
585 dAtom->getJz());
586 strcat( writeLine, tempBuffer );
587 }
588 else
589 strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
590
591 finalOut << writeLine;
592 }
593 finalOut.flush();
594 finalOut.close();
595
596 #else // is_mpi
597
598 /* code to find maximum tag value */
599 int *tagub, flag, MAXTAG;
600 MPI_Attr_get(MPI_COMM_WORLD, MPI_TAG_UB, &tagub, &flag);
601 if (flag) {
602 MAXTAG = *tagub;
603 } else {
604 MAXTAG = 32767;
605 }
606
607 int haveError;
608
609 MPI_Status istatus;
610 int *AtomToProcMap = mpiSim->getAtomToProcMap();
611
612 // write out header and node 0's coordinates
613
614 if( worldRank == 0 ){
615
616 // Node 0 needs a list of the magic potatoes for each processor;
617
618 nProc = mpiSim->getNumberProcessors();
619 potatoes = new int[nProc];
620
621 for (i = 0; i < nProc; i++)
622 potatoes[i] = 0;
623
624 finalOut << mpiSim->getTotAtoms() << "\n";
625
626 finalOut << finalTime << ";\t"
627 << entry_plug->Hmat[0][0] << "\t"
628 << entry_plug->Hmat[1][0] << "\t"
629 << entry_plug->Hmat[2][0] << ";\t"
630
631 << entry_plug->Hmat[0][1] << "\t"
632 << entry_plug->Hmat[1][1] << "\t"
633 << entry_plug->Hmat[2][1] << ";\t"
634
635 << entry_plug->Hmat[0][2] << "\t"
636 << entry_plug->Hmat[1][2] << "\t"
637 << entry_plug->Hmat[2][2] << ";";
638
639 finalOut << entry_plug->the_integrator->getAdditionalParameters();
640 finalOut << endl;
641 finalOut.flush();
642
643 for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
644
645 // Get the Node number which has this atom;
646
647 which_node = AtomToProcMap[i];
648
649 if (which_node != 0) {
650
651 if (potatoes[which_node] + 3 >= MAXTAG) {
652 // The potato was going to exceed the maximum value,
653 // so wrap this processor potato back to 0:
654
655 potatoes[which_node] = 0;
656 MPI_Send(0, 1, MPI_INT, which_node, 0, MPI_COMM_WORLD);
657
658 }
659
660 myPotato = potatoes[which_node];
661
662 MPI_Recv(MPIatomTypeString, MINIBUFFERSIZE, MPI_CHAR, which_node,
663 myPotato, MPI_COMM_WORLD, &istatus);
664
665 atomTypeString = MPIatomTypeString;
666
667 myPotato++;
668
669 MPI_Recv(&isDirectional, 1, MPI_INT, which_node,
670 myPotato, MPI_COMM_WORLD, &istatus);
671
672 myPotato++;
673
674 if (isDirectional) {
675 MPI_Recv(atomData13, 13, MPI_DOUBLE, which_node,
676 myPotato, MPI_COMM_WORLD, &istatus);
677 } else {
678 printf("inside \n");
679 MPI_Recv(atomData6, 6, MPI_DOUBLE, which_node,
680 myPotato, MPI_COMM_WORLD, &istatus);
681 }
682
683 myPotato++;
684 potatoes[which_node] = myPotato;
685
686 } else {
687
688 haveError = 0;
689 which_atom = i;
690 local_index=-1;
691
692 for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
693 if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
694 }
695
696 if (local_index != -1) {
697
698 atomTypeString = atoms[local_index]->getType();
699
700 atoms[local_index]->getPos(pos);
701 atoms[local_index]->getVel(vel);
702
703 atomData6[0] = pos[0];
704 atomData6[1] = pos[1];
705 atomData6[2] = pos[2];
706
707 atomData6[3] = vel[0];
708 atomData6[4] = vel[1];
709 atomData6[5] = vel[2];
710
711 isDirectional = 0;
712
713 if( atoms[local_index]->isDirectional() ){
714
715 isDirectional = 1;
716
717 dAtom = (DirectionalAtom *)atoms[local_index];
718 dAtom->getQ( q );
719
720 for (int j = 0; j < 6 ; j++)
721 atomData13[j] = atomData6[j];
722
723 atomData13[6] = q[0];
724 atomData13[7] = q[1];
725 atomData13[8] = q[2];
726 atomData13[9] = q[3];
727
728 atomData13[10] = dAtom->getJx();
729 atomData13[11] = dAtom->getJy();
730 atomData13[12] = dAtom->getJz();
731 }
732
733 } else {
734 sprintf(painCave.errMsg,
735 "Atom %d not found on processor %d\n",
736 i, worldRank );
737 haveError= 1;
738 simError();
739 }
740
741 if(haveError) DieDieDie();
742
743 }
744
745
746 // If we've survived to here, format the line:
747
748 if (!isDirectional) {
749
750 sprintf( tempBuffer,
751 "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
752 atomTypeString,
753 atomData6[0],
754 atomData6[1],
755 atomData6[2],
756 atomData6[3],
757 atomData6[4],
758 atomData6[5]);
759
760 strcpy( writeLine, tempBuffer );
761 strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
762
763 } else {
764
765 sprintf( tempBuffer,
766 "%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",
767 atomTypeString,
768 atomData13[0],
769 atomData13[1],
770 atomData13[2],
771 atomData13[3],
772 atomData13[4],
773 atomData13[5],
774 atomData13[6],
775 atomData13[7],
776 atomData13[8],
777 atomData13[9],
778 atomData13[10],
779 atomData13[11],
780 atomData13[12]);
781
782 strcat( writeLine, tempBuffer );
783
784 }
785
786 finalOut << writeLine;
787 finalOut.flush();
788 }
789
790 finalOut.flush();
791 sprintf( checkPointMsg,
792 "Sucessfully took a dump.\n");
793 delete[] potatoes;
794
795 MPIcheckPoint();
796
797 } else {
798
799 // worldRank != 0, so I'm a remote node.
800
801 // Set my magic potato to 0:
802
803 myPotato = 0;
804
805 for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
806
807 // Am I the node which has this atom?
808
809 if (AtomToProcMap[i] == worldRank) {
810
811 if (myPotato + 3 >= MAXTAG) {
812
813 // The potato was going to exceed the maximum value,
814 // so wrap this processor potato back to 0 (and block until
815 // node 0 says we can go:
816
817 MPI_Recv(&myPotato, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &istatus);
818
819 }
820 which_atom = i;
821 local_index=-1;
822 for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
823 if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
824 }
825 if (local_index != -1) {
826
827 atomTypeString = atoms[local_index]->getType();
828
829 atoms[local_index]->getPos(pos);
830 atoms[local_index]->getVel(vel);
831
832 atomData6[0] = pos[0];
833 atomData6[1] = pos[1];
834 atomData6[2] = pos[2];
835
836 atomData6[3] = vel[0];
837 atomData6[4] = vel[1];
838 atomData6[5] = vel[2];
839
840 isDirectional = 0;
841
842 if( atoms[local_index]->isDirectional() ){
843
844 isDirectional = 1;
845
846 dAtom = (DirectionalAtom *)atoms[local_index];
847 dAtom->getQ( q );
848
849 for (int j = 0; j < 6 ; j++)
850 atomData13[j] = atomData6[j];
851
852 atomData13[6] = q[0];
853 atomData13[7] = q[1];
854 atomData13[8] = q[2];
855 atomData13[9] = q[3];
856
857 atomData13[10] = dAtom->getJx();
858 atomData13[11] = dAtom->getJy();
859 atomData13[12] = dAtom->getJz();
860 }
861
862 } else {
863 sprintf(painCave.errMsg,
864 "Atom %d not found on processor %d\n",
865 i, worldRank );
866 haveError= 1;
867 simError();
868 }
869
870 strncpy(MPIatomTypeString, atomTypeString, MINIBUFFERSIZE);
871
872 // null terminate the string before sending (just in case):
873 MPIatomTypeString[MINIBUFFERSIZE-1] = '\0';
874
875 MPI_Send(MPIatomTypeString, MINIBUFFERSIZE, MPI_CHAR, 0,
876 myPotato, MPI_COMM_WORLD);
877
878 myPotato++;
879
880 MPI_Send(&isDirectional, 1, MPI_INT, 0,
881 myPotato, MPI_COMM_WORLD);
882
883 myPotato++;
884
885 if (isDirectional) {
886
887 MPI_Send(atomData13, 13, MPI_DOUBLE, 0,
888 myPotato, MPI_COMM_WORLD);
889
890 } else {
891
892 MPI_Send(atomData6, 6, MPI_DOUBLE, 0,
893 myPotato, MPI_COMM_WORLD);
894 }
895
896 myPotato++;
897 }
898 }
899
900 sprintf( checkPointMsg,
901 "Sucessfully took a dump.\n");
902 MPIcheckPoint();
903
904 }
905
906 if( worldRank == 0 ) finalOut.close();
907 #endif // is_mpi
908 }
909
910
911
912 #ifdef IS_MPI
913
914 // a couple of functions to let us escape the write loop
915
916 void dWrite::DieDieDie( void ){
917
918 MPI_Finalize();
919 exit (0);
920 }
921
922 #endif //is_mpi