ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/DumpWriter.cpp
Revision: 927
Committed: Mon Jan 12 22:54:42 2004 UTC (20 years, 5 months ago) by tim
File size: 21384 byte(s)
Log Message:
fix a bug in copying string

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 strcpy( 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 MPI_Recv(atomData6, 6, MPI_DOUBLE, which_node,
679 myPotato, MPI_COMM_WORLD, &istatus);
680 }
681
682 myPotato++;
683 potatoes[which_node] = myPotato;
684
685 } else {
686
687 haveError = 0;
688 which_atom = i;
689 local_index=-1;
690
691 for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
692 if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
693 }
694
695 if (local_index != -1) {
696
697 atomTypeString = atoms[local_index]->getType();
698
699 atoms[local_index]->getPos(pos);
700 atoms[local_index]->getVel(vel);
701
702 atomData6[0] = pos[0];
703 atomData6[1] = pos[1];
704 atomData6[2] = pos[2];
705
706 atomData6[3] = vel[0];
707 atomData6[4] = vel[1];
708 atomData6[5] = vel[2];
709
710 isDirectional = 0;
711
712 if( atoms[local_index]->isDirectional() ){
713
714 isDirectional = 1;
715
716 dAtom = (DirectionalAtom *)atoms[local_index];
717 dAtom->getQ( q );
718
719 for (int j = 0; j < 6 ; j++)
720 atomData13[j] = atomData6[j];
721
722 atomData13[6] = q[0];
723 atomData13[7] = q[1];
724 atomData13[8] = q[2];
725 atomData13[9] = q[3];
726
727 atomData13[10] = dAtom->getJx();
728 atomData13[11] = dAtom->getJy();
729 atomData13[12] = dAtom->getJz();
730 }
731
732 } else {
733 sprintf(painCave.errMsg,
734 "Atom %d not found on processor %d\n",
735 i, worldRank );
736 haveError= 1;
737 simError();
738 }
739
740 if(haveError) DieDieDie();
741
742 }
743
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 strcpy( writeLine, tempBuffer );
782
783 }
784
785 finalOut << writeLine;
786 finalOut.flush();
787 }
788
789 finalOut.flush();
790 sprintf( checkPointMsg,
791 "Sucessfully took a dump.\n");
792 delete[] potatoes;
793
794 MPIcheckPoint();
795
796 } else {
797
798 // worldRank != 0, so I'm a remote node.
799
800 // Set my magic potato to 0:
801
802 myPotato = 0;
803
804 for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
805
806 // Am I the node which has this atom?
807
808 if (AtomToProcMap[i] == worldRank) {
809
810 if (myPotato + 3 >= MAXTAG) {
811
812 // The potato was going to exceed the maximum value,
813 // so wrap this processor potato back to 0 (and block until
814 // node 0 says we can go:
815
816 MPI_Recv(&myPotato, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &istatus);
817
818 }
819 which_atom = i;
820 local_index=-1;
821 for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
822 if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
823 }
824 if (local_index != -1) {
825
826 atomTypeString = atoms[local_index]->getType();
827
828 atoms[local_index]->getPos(pos);
829 atoms[local_index]->getVel(vel);
830
831 atomData6[0] = pos[0];
832 atomData6[1] = pos[1];
833 atomData6[2] = pos[2];
834
835 atomData6[3] = vel[0];
836 atomData6[4] = vel[1];
837 atomData6[5] = vel[2];
838
839 isDirectional = 0;
840
841 if( atoms[local_index]->isDirectional() ){
842
843 isDirectional = 1;
844
845 dAtom = (DirectionalAtom *)atoms[local_index];
846 dAtom->getQ( q );
847
848 for (int j = 0; j < 6 ; j++)
849 atomData13[j] = atomData6[j];
850
851 atomData13[6] = q[0];
852 atomData13[7] = q[1];
853 atomData13[8] = q[2];
854 atomData13[9] = q[3];
855
856 atomData13[10] = dAtom->getJx();
857 atomData13[11] = dAtom->getJy();
858 atomData13[12] = dAtom->getJz();
859 }
860
861 } else {
862 sprintf(painCave.errMsg,
863 "Atom %d not found on processor %d\n",
864 i, worldRank );
865 haveError= 1;
866 simError();
867 }
868
869 strncpy(MPIatomTypeString, atomTypeString, MINIBUFFERSIZE);
870
871 // null terminate the string before sending (just in case):
872 MPIatomTypeString[MINIBUFFERSIZE-1] = '\0';
873
874 MPI_Send(MPIatomTypeString, MINIBUFFERSIZE, MPI_CHAR, 0,
875 myPotato, MPI_COMM_WORLD);
876
877 myPotato++;
878
879 MPI_Send(&isDirectional, 1, MPI_INT, 0,
880 myPotato, MPI_COMM_WORLD);
881
882 myPotato++;
883
884 if (isDirectional) {
885
886 MPI_Send(atomData13, 13, MPI_DOUBLE, 0,
887 myPotato, MPI_COMM_WORLD);
888
889 } else {
890
891 MPI_Send(atomData6, 6, MPI_DOUBLE, 0,
892 myPotato, MPI_COMM_WORLD);
893 }
894
895 myPotato++;
896 }
897 }
898
899 sprintf( checkPointMsg,
900 "Sucessfully took a dump.\n");
901 MPIcheckPoint();
902
903 }
904
905 if( worldRank == 0 ) finalOut.close();
906 #endif // is_mpi
907 }
908
909
910
911 #ifdef IS_MPI
912
913 // a couple of functions to let us escape the write loop
914
915 void dWrite::DieDieDie( void ){
916
917 MPI_Finalize();
918 exit (0);
919 }
920
921 #endif //is_mpi