ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/DumpWriter.cpp
Revision: 919
Committed: Sat Jan 10 02:15:35 2004 UTC (20 years, 6 months ago) by tim
File size: 22400 byte(s)
Log Message:
Fix a bug of declaration of tagub

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 cout << "master" <<endl;
164 /* code to find maximum tag value */
165
166 int tagub, flag, MAXTAG;
167 MPI_Attr_get(MPI_COMM_WORLD, MPI_TAG_UB, &tagub, &flag);
168 if (flag) {
169 MAXTAG = tagub;
170 } else {
171 MAXTAG = 32767;
172 }
173
174 int haveError;
175
176 MPI_Status istatus;
177 int *AtomToProcMap = mpiSim->getAtomToProcMap();
178
179 // write out header and node 0's coordinates
180
181 if( worldRank == 0 ){
182
183 // Node 0 needs a list of the magic potatoes for each processor;
184
185 nProc = mpiSim->getNumberProcessors();
186 potatoes = new int[nProc];
187
188 for (i = 0; i < nProc; i++)
189 potatoes[i] = 0;
190
191 outFile << mpiSim->getTotAtoms() << "\n";
192
193 outFile << currentTime << ";\t"
194 << entry_plug->Hmat[0][0] << "\t"
195 << entry_plug->Hmat[1][0] << "\t"
196 << entry_plug->Hmat[2][0] << ";\t"
197
198 << entry_plug->Hmat[0][1] << "\t"
199 << entry_plug->Hmat[1][1] << "\t"
200 << entry_plug->Hmat[2][1] << ";\t"
201
202 << entry_plug->Hmat[0][2] << "\t"
203 << entry_plug->Hmat[1][2] << "\t"
204 << entry_plug->Hmat[2][2] << ";";
205
206 outFile << entry_plug->the_integrator->getAdditionalParameters();
207 outFile << endl;
208 outFile.flush();
209
210 for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
211
212 // Get the Node number which has this atom;
213
214 which_node = AtomToProcMap[i];
215
216 if (which_node != 0) {
217
218 if (potatoes[which_node] + 3 >= MAXTAG) {
219 // The potato was going to exceed the maximum value,
220 // so wrap this processor potato back to 0:
221
222 potatoes[which_node] = 0;
223 MPI_Send(0, 1, MPI_INT, which_node, 0, MPI_COMM_WORLD);
224
225 }
226
227 myPotato = potatoes[which_node];
228
229 MPI_Recv(MPIatomTypeString, MINIBUFFERSIZE, MPI_CHAR, which_node,
230 myPotato, MPI_COMM_WORLD, &istatus);
231
232 strncpy(atomTypeString, MPIatomTypeString, MINIBUFFERSIZE);
233
234 // Null terminate the atomTypeString just in case:
235
236 atomTypeString[strlen(atomTypeString) - 1] = '\0';
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 strncpy(atomTypeString, MPIatomTypeString, MINIBUFFERSIZE);
665
666 // Null terminate the atomTypeString just in case:
667
668 atomTypeString[strlen(atomTypeString) - 1] = '\0';
669
670 myPotato++;
671
672 MPI_Recv(&isDirectional, 1, MPI_INT, which_node,
673 myPotato, MPI_COMM_WORLD, &istatus);
674
675 myPotato++;
676
677 if (isDirectional) {
678 MPI_Recv(atomData13, 13, MPI_DOUBLE, which_node,
679 myPotato, MPI_COMM_WORLD, &istatus);
680 } else {
681 MPI_Recv(atomData6, 6, MPI_DOUBLE, which_node,
682 myPotato, MPI_COMM_WORLD, &istatus);
683 }
684
685 myPotato++;
686 potatoes[which_node] = myPotato;
687
688 } else {
689
690 haveError = 0;
691 which_atom = i;
692 local_index=-1;
693
694 for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
695 if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
696 }
697
698 if (local_index != -1) {
699
700 atomTypeString = atoms[local_index]->getType();
701
702 atoms[local_index]->getPos(pos);
703 atoms[local_index]->getVel(vel);
704
705 atomData6[0] = pos[0];
706 atomData6[1] = pos[1];
707 atomData6[2] = pos[2];
708
709 atomData6[3] = vel[0];
710 atomData6[4] = vel[1];
711 atomData6[5] = vel[2];
712
713 isDirectional = 0;
714
715 if( atoms[local_index]->isDirectional() ){
716
717 isDirectional = 1;
718
719 dAtom = (DirectionalAtom *)atoms[local_index];
720 dAtom->getQ( q );
721
722 for (int j = 0; j < 6 ; j++)
723 atomData13[j] = atomData6[j];
724
725 atomData13[6] = q[0];
726 atomData13[7] = q[1];
727 atomData13[8] = q[2];
728 atomData13[9] = q[3];
729
730 atomData13[10] = dAtom->getJx();
731 atomData13[11] = dAtom->getJy();
732 atomData13[12] = dAtom->getJz();
733 }
734
735 } else {
736 sprintf(painCave.errMsg,
737 "Atom %d not found on processor %d\n",
738 i, worldRank );
739 haveError= 1;
740 simError();
741 }
742
743 if(haveError) DieDieDie();
744
745 // If we've survived to here, format the line:
746
747 if (!isDirectional) {
748
749 sprintf( tempBuffer,
750 "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
751 atomTypeString,
752 atomData6[0],
753 atomData6[1],
754 atomData6[2],
755 atomData6[3],
756 atomData6[4],
757 atomData6[5]);
758
759 strcpy( writeLine, tempBuffer );
760 strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
761
762 } else {
763
764 sprintf( tempBuffer,
765 "%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",
766 atomTypeString,
767 atomData13[0],
768 atomData13[1],
769 atomData13[2],
770 atomData13[3],
771 atomData13[4],
772 atomData13[5],
773 atomData13[6],
774 atomData13[7],
775 atomData13[8],
776 atomData13[9],
777 atomData13[10],
778 atomData13[11],
779 atomData13[12]);
780
781 strcat( writeLine, tempBuffer );
782
783 }
784
785 finalOut << writeLine;
786 finalOut.flush();
787 }
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