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

# User Rev Content
1 mmeineke 723 #define _FILE_OFFSET_BITS 64
2    
3 gezelter 829 #include <string.h>
4 mmeineke 377 #include <iostream>
5     #include <fstream>
6    
7     #ifdef IS_MPI
8     #include <mpi.h>
9     #include "mpiSimulation.hpp"
10 mmeineke 440
11     namespace dWrite{
12 gezelter 907 void DieDieDie( void );
13 mmeineke 440 }
14    
15     using namespace dWrite;
16 mmeineke 377 #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 tim 837
29 mmeineke 377 strcpy( outName, entry_plug->sampleName );
30 tim 837
31 mmeineke 377 outFile.open(outName, ios::out | ios::trunc );
32 tim 837
33 mmeineke 377 if( !outFile ){
34 tim 837
35 mmeineke 377 sprintf( painCave.errMsg,
36     "Could not open \"%s\" for dump output.\n",
37     outName);
38     painCave.isFatal = 1;
39     simError();
40     }
41 mmeineke 469
42 mmeineke 377 //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 tim 837
68 mmeineke 377 const int BUFFERSIZE = 2000;
69 gezelter 912 const int MINIBUFFERSIZE = 100;
70 gezelter 907
71 mmeineke 377 char tempBuffer[BUFFERSIZE];
72     char writeLine[BUFFERSIZE];
73    
74 mmeineke 787 int i;
75 gezelter 916
76 mmeineke 787 #ifdef IS_MPI
77 gezelter 916
78     int *potatoes;
79     int myPotato;
80    
81     int nProc;
82 mmeineke 787 int j, which_node, done, which_atom, local_index;
83 gezelter 916 double atomData6[6];
84     double atomData13[13];
85 gezelter 907 int isDirectional;
86     char* atomTypeString;
87 gezelter 910 char MPIatomTypeString[MINIBUFFERSIZE];
88 gezelter 916
89 mmeineke 787 #else //is_mpi
90     int nAtoms = entry_plug->n_atoms;
91     #endif //is_mpi
92    
93 mmeineke 377 double q[4];
94     DirectionalAtom* dAtom;
95     Atom** atoms = entry_plug->atoms;
96 mmeineke 670 double pos[3], vel[3];
97 tim 837
98 mmeineke 804 // write current frame to the eor file
99 mmeineke 377
100 mmeineke 804 this->writeFinal( currentTime );
101    
102 mmeineke 377 #ifndef IS_MPI
103 tim 837
104 mmeineke 377 outFile << nAtoms << "\n";
105 tim 837
106     outFile << currentTime << ";\t"
107 mmeineke 590 << entry_plug->Hmat[0][0] << "\t"
108     << entry_plug->Hmat[1][0] << "\t"
109     << entry_plug->Hmat[2][0] << ";\t"
110 mmeineke 572
111 mmeineke 590 << entry_plug->Hmat[0][1] << "\t"
112     << entry_plug->Hmat[1][1] << "\t"
113     << entry_plug->Hmat[2][1] << ";\t"
114 mmeineke 572
115 mmeineke 590 << entry_plug->Hmat[0][2] << "\t"
116     << entry_plug->Hmat[1][2] << "\t"
117 tim 837 << 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 mmeineke 377 for( i=0; i<nAtoms; i++ ){
123 tim 837
124 mmeineke 670 atoms[i]->getPos(pos);
125     atoms[i]->getVel(vel);
126 mmeineke 377
127     sprintf( tempBuffer,
128     "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
129     atoms[i]->getType(),
130 mmeineke 670 pos[0],
131     pos[1],
132     pos[2],
133     vel[0],
134     vel[1],
135     vel[2]);
136 mmeineke 377 strcpy( writeLine, tempBuffer );
137    
138     if( atoms[i]->isDirectional() ){
139 tim 837
140 mmeineke 377 dAtom = (DirectionalAtom *)atoms[i];
141     dAtom->getQ( q );
142 tim 837
143 mmeineke 377 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 tim 837
157 mmeineke 377 outFile << writeLine;
158     }
159     outFile.flush();
160    
161     #else // is_mpi
162 gezelter 416
163 chuckv 913 /* code to find maximum tag value */
164 tim 919
165 tim 920 int *tagub, flag, MAXTAG;
166 chuckv 913 MPI_Attr_get(MPI_COMM_WORLD, MPI_TAG_UB, &tagub, &flag);
167     if (flag) {
168 tim 920 MAXTAG = *tagub;
169 chuckv 913 } else {
170     MAXTAG = 32767;
171 gezelter 916 }
172 mmeineke 440
173     int haveError;
174    
175 mmeineke 447 MPI_Status istatus;
176 gezelter 416 int *AtomToProcMap = mpiSim->getAtomToProcMap();
177 tim 837
178 mmeineke 377 // write out header and node 0's coordinates
179 tim 837
180 mmeineke 377 if( worldRank == 0 ){
181 gezelter 916
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 mmeineke 377 outFile << mpiSim->getTotAtoms() << "\n";
191 tim 837
192     outFile << currentTime << ";\t"
193 gezelter 591 << entry_plug->Hmat[0][0] << "\t"
194     << entry_plug->Hmat[1][0] << "\t"
195     << entry_plug->Hmat[2][0] << ";\t"
196 tim 837
197 gezelter 591 << entry_plug->Hmat[0][1] << "\t"
198     << entry_plug->Hmat[1][1] << "\t"
199     << entry_plug->Hmat[2][1] << ";\t"
200 tim 837
201 gezelter 591 << entry_plug->Hmat[0][2] << "\t"
202     << entry_plug->Hmat[1][2] << "\t"
203 tim 837 << entry_plug->Hmat[2][2] << ";";
204    
205     outFile << entry_plug->the_integrator->getAdditionalParameters();
206     outFile << endl;
207 chuckv 434 outFile.flush();
208 chuckv 913
209 gezelter 416 for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
210 chuckv 913
211 gezelter 417 // Get the Node number which has this atom;
212 chuckv 913
213 tim 837 which_node = AtomToProcMap[i];
214 chuckv 913
215 gezelter 907 if (which_node != 0) {
216 gezelter 916
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 gezelter 907
228 gezelter 910 MPI_Recv(MPIatomTypeString, MINIBUFFERSIZE, MPI_CHAR, which_node,
229 gezelter 916 myPotato, MPI_COMM_WORLD, &istatus);
230 gezelter 907
231 tim 920 //strncpy(atomTypeString, MPIatomTypeString, MINIBUFFERSIZE);
232 gezelter 912
233     // Null terminate the atomTypeString just in case:
234 gezelter 910
235 tim 920 //atomTypeString[strlen(atomTypeString) - 1] = '\0';
236     atomTypeString = MPIatomTypeString;
237    
238 gezelter 916 myPotato++;
239    
240 gezelter 907 MPI_Recv(&isDirectional, 1, MPI_INT, which_node,
241 gezelter 916 myPotato, MPI_COMM_WORLD, &istatus);
242    
243     myPotato++;
244 gezelter 907
245 gezelter 916 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 gezelter 907 }
252 gezelter 916
253     myPotato++;
254     potatoes[which_node] = myPotato;
255 gezelter 907
256     } else {
257    
258 mmeineke 440 haveError = 0;
259 chuckv 436 which_atom = i;
260 tim 837 local_index=-1;
261 gezelter 916
262 chuckv 436 for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
263     if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
264     }
265 gezelter 916
266 chuckv 436 if (local_index != -1) {
267 gezelter 916
268 gezelter 907 atomTypeString = atoms[local_index]->getType();
269    
270 mmeineke 670 atoms[local_index]->getPos(pos);
271 gezelter 916 atoms[local_index]->getVel(vel);
272 mmeineke 670
273 gezelter 916 atomData6[0] = pos[0];
274     atomData6[1] = pos[1];
275     atomData6[2] = pos[2];
276 tim 837
277 gezelter 916 atomData6[3] = vel[0];
278     atomData6[4] = vel[1];
279     atomData6[5] = vel[2];
280 gezelter 907
281     isDirectional = 0;
282    
283 chuckv 436 if( atoms[local_index]->isDirectional() ){
284 tim 837
285 gezelter 907 isDirectional = 1;
286    
287 chuckv 436 dAtom = (DirectionalAtom *)atoms[local_index];
288     dAtom->getQ( q );
289 gezelter 916
290     for (int j = 0; j < 6 ; j++)
291     atomData13[j] = atomData6[j];
292 gezelter 907
293 gezelter 916 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 gezelter 907 }
302 gezelter 916
303 gezelter 907 } else {
304 mmeineke 440 sprintf(painCave.errMsg,
305     "Atom %d not found on processor %d\n",
306     i, worldRank );
307     haveError= 1;
308     simError();
309 tim 837 }
310 gezelter 916
311 gezelter 907 if(haveError) DieDieDie();
312 gezelter 916
313 gezelter 907 // If we've survived to here, format the line:
314    
315 gezelter 916 if (!isDirectional) {
316 mmeineke 440
317 gezelter 916 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 tim 837
330 gezelter 916 } else {
331    
332 gezelter 907 sprintf( tempBuffer,
333 gezelter 916 "%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 gezelter 907 strcat( writeLine, tempBuffer );
350 gezelter 916
351 gezelter 907 }
352 gezelter 916
353 gezelter 907 outFile << writeLine;
354     outFile.flush();
355     }
356 mmeineke 377 }
357    
358 gezelter 907 outFile.flush();
359     sprintf( checkPointMsg,
360     "Sucessfully took a dump.\n");
361     MPIcheckPoint();
362 tim 919 delete[] potatoes;
363 gezelter 415 } else {
364 tim 837
365 gezelter 907 // worldRank != 0, so I'm a remote node.
366 gezelter 916
367     // Set my magic potato to 0:
368    
369     myPotato = 0;
370 gezelter 907
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 tim 837
377 gezelter 916 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 tim 919 which_atom = i;
387     local_index=-1;
388 gezelter 907 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 mmeineke 440
395 gezelter 907 atoms[local_index]->getPos(pos);
396     atoms[local_index]->getVel(vel);
397 tim 837
398 gezelter 916 atomData6[0] = pos[0];
399     atomData6[1] = pos[1];
400     atomData6[2] = pos[2];
401 mmeineke 440
402 gezelter 916 atomData6[3] = vel[0];
403     atomData6[4] = vel[1];
404     atomData6[5] = vel[2];
405 gezelter 907
406     isDirectional = 0;
407 tim 837
408 gezelter 907 if( atoms[local_index]->isDirectional() ){
409 mmeineke 670
410 gezelter 907 isDirectional = 1;
411    
412     dAtom = (DirectionalAtom *)atoms[local_index];
413     dAtom->getQ( q );
414    
415 gezelter 916 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 mmeineke 670
423 gezelter 916 atomData13[10] = dAtom->getJx();
424     atomData13[11] = dAtom->getJy();
425     atomData13[12] = dAtom->getJz();
426 gezelter 907 }
427 tim 837
428 gezelter 907 } else {
429     sprintf(painCave.errMsg,
430     "Atom %d not found on processor %d\n",
431     i, worldRank );
432     haveError= 1;
433     simError();
434     }
435 tim 837
436 gezelter 910 strncpy(MPIatomTypeString, atomTypeString, MINIBUFFERSIZE);
437    
438 gezelter 912 // null terminate the string before sending (just in case):
439     MPIatomTypeString[MINIBUFFERSIZE-1] = '\0';
440    
441 gezelter 910 MPI_Send(MPIatomTypeString, MINIBUFFERSIZE, MPI_CHAR, 0,
442 gezelter 916 myPotato, MPI_COMM_WORLD);
443 gezelter 907
444 gezelter 916 myPotato++;
445    
446 gezelter 907 MPI_Send(&isDirectional, 1, MPI_INT, 0,
447 gezelter 916 myPotato, MPI_COMM_WORLD);
448 gezelter 907
449 gezelter 916 myPotato++;
450    
451 gezelter 907 if (isDirectional) {
452    
453 gezelter 916 MPI_Send(atomData13, 13, MPI_DOUBLE, 0,
454     myPotato, MPI_COMM_WORLD);
455 gezelter 907
456 gezelter 916 } else {
457    
458     MPI_Send(atomData6, 6, MPI_DOUBLE, 0,
459     myPotato, MPI_COMM_WORLD);
460 gezelter 907 }
461 gezelter 916
462     myPotato++;
463 mmeineke 377 }
464 gezelter 907 }
465 mmeineke 440
466 gezelter 907 sprintf( checkPointMsg,
467     "Sucessfully took a dump.\n");
468     MPIcheckPoint();
469    
470 gezelter 916 }
471 gezelter 907
472 mmeineke 377 #endif // is_mpi
473     }
474    
475 mmeineke 572 void DumpWriter::writeFinal(double finalTime){
476 gezelter 416
477 mmeineke 377 char finalName[500];
478     ofstream finalOut;
479 gezelter 416
480     const int BUFFERSIZE = 2000;
481 gezelter 912 const int MINIBUFFERSIZE = 100;
482 gezelter 416 char tempBuffer[BUFFERSIZE];
483 tim 837 char writeLine[BUFFERSIZE];
484 gezelter 416
485     double q[4];
486     DirectionalAtom* dAtom;
487 mmeineke 787 Atom** atoms = entry_plug->atoms;
488     int i;
489     #ifdef IS_MPI
490 gezelter 916
491     int *potatoes;
492     int myPotato;
493    
494     int nProc;
495 mmeineke 787 int j, which_node, done, which_atom, local_index;
496 gezelter 916 double atomData6[6];
497     double atomData13[13];
498 gezelter 907 int isDirectional;
499     char* atomTypeString;
500 gezelter 910 char MPIatomTypeString[MINIBUFFERSIZE];
501 gezelter 916
502 mmeineke 787 #else //is_mpi
503 gezelter 416 int nAtoms = entry_plug->n_atoms;
504 mmeineke 787 #endif //is_mpi
505 tim 837
506 mmeineke 670 double pos[3], vel[3];
507 tim 837
508 mmeineke 377 #ifdef IS_MPI
509     if(worldRank == 0 ){
510     #endif // is_mpi
511 tim 837
512 mmeineke 377 strcpy( finalName, entry_plug->finalName );
513 tim 837
514 mmeineke 377 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 tim 837
523 mmeineke 377 // finalOut.setf( ios::scientific );
524 tim 837
525 mmeineke 377 #ifdef IS_MPI
526     }
527 tim 837
528 mmeineke 377 sprintf(checkPointMsg,"Opened file for final configuration\n");
529 tim 837 MPIcheckPoint();
530    
531 mmeineke 377 #endif //is_mpi
532    
533 tim 837
534 mmeineke 377 #ifndef IS_MPI
535 tim 837
536 mmeineke 377 finalOut << nAtoms << "\n";
537 tim 837
538 gezelter 591 finalOut << finalTime << ";\t"
539 mmeineke 590 << entry_plug->Hmat[0][0] << "\t"
540     << entry_plug->Hmat[1][0] << "\t"
541 gezelter 591 << entry_plug->Hmat[2][0] << ";\t"
542 tim 837
543 mmeineke 590 << entry_plug->Hmat[0][1] << "\t"
544     << entry_plug->Hmat[1][1] << "\t"
545 gezelter 591 << entry_plug->Hmat[2][1] << ";\t"
546 tim 837
547 mmeineke 590 << entry_plug->Hmat[0][2] << "\t"
548     << entry_plug->Hmat[1][2] << "\t"
549 tim 837 << 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 mmeineke 377 for( i=0; i<nAtoms; i++ ){
556 tim 837
557 mmeineke 670 atoms[i]->getPos(pos);
558     atoms[i]->getVel(vel);
559 tim 837
560 mmeineke 377 sprintf( tempBuffer,
561     "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
562     atoms[i]->getType(),
563 mmeineke 670 pos[0],
564     pos[1],
565     pos[2],
566     vel[0],
567     vel[1],
568     vel[2]);
569 mmeineke 377 strcpy( writeLine, tempBuffer );
570    
571     if( atoms[i]->isDirectional() ){
572 tim 837
573 mmeineke 377 dAtom = (DirectionalAtom *)atoms[i];
574     dAtom->getQ( q );
575 tim 837
576 mmeineke 377 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 tim 837
590 mmeineke 377 finalOut << writeLine;
591     }
592     finalOut.flush();
593 gezelter 415 finalOut.close();
594 mmeineke 377
595     #else // is_mpi
596 tim 837
597 gezelter 916 /* 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 mmeineke 440
606     int haveError;
607    
608 mmeineke 447 MPI_Status istatus;
609 gezelter 416 int *AtomToProcMap = mpiSim->getAtomToProcMap();
610    
611 mmeineke 377 // write out header and node 0's coordinates
612 tim 837
613 mmeineke 377 if( worldRank == 0 ){
614 gezelter 916
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 mmeineke 377 finalOut << mpiSim->getTotAtoms() << "\n";
624 tim 837
625 gezelter 591 finalOut << finalTime << ";\t"
626 gezelter 907 << entry_plug->Hmat[0][0] << "\t"
627     << entry_plug->Hmat[1][0] << "\t"
628     << entry_plug->Hmat[2][0] << ";\t"
629 tim 837
630 gezelter 907 << entry_plug->Hmat[0][1] << "\t"
631     << entry_plug->Hmat[1][1] << "\t"
632     << entry_plug->Hmat[2][1] << ";\t"
633 tim 837
634 gezelter 907 << entry_plug->Hmat[0][2] << "\t"
635     << entry_plug->Hmat[1][2] << "\t"
636     << entry_plug->Hmat[2][2] << ";";
637 tim 837
638     finalOut << entry_plug->the_integrator->getAdditionalParameters();
639     finalOut << endl;
640 gezelter 907 finalOut.flush();
641 gezelter 916
642 gezelter 416 for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
643 gezelter 916
644 gezelter 907 // Get the Node number which has this atom;
645 gezelter 916
646 tim 837 which_node = AtomToProcMap[i];
647 gezelter 916
648     if (which_node != 0) {
649 tim 837
650 gezelter 916 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 gezelter 907
661 gezelter 910 MPI_Recv(MPIatomTypeString, MINIBUFFERSIZE, MPI_CHAR, which_node,
662 gezelter 916 myPotato, MPI_COMM_WORLD, &istatus);
663 gezelter 907
664 tim 920 atomTypeString = MPIatomTypeString;
665    
666 gezelter 916 myPotato++;
667 gezelter 907
668 gezelter 916 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 gezelter 907 }
680 gezelter 916
681     myPotato++;
682     potatoes[which_node] = myPotato;
683 gezelter 907
684     } else {
685    
686     haveError = 0;
687 chuckv 437 which_atom = i;
688 tim 837 local_index=-1;
689 gezelter 916
690 chuckv 437 for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
691     if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
692     }
693 gezelter 916
694 tim 837 if (local_index != -1) {
695 gezelter 916
696 gezelter 907 atomTypeString = atoms[local_index]->getType();
697    
698 mmeineke 670 atoms[local_index]->getPos(pos);
699 gezelter 916 atoms[local_index]->getVel(vel);
700 tim 837
701 gezelter 916 atomData6[0] = pos[0];
702     atomData6[1] = pos[1];
703     atomData6[2] = pos[2];
704 tim 837
705 gezelter 916 atomData6[3] = vel[0];
706     atomData6[4] = vel[1];
707     atomData6[5] = vel[2];
708 gezelter 907
709     isDirectional = 0;
710 tim 837
711 gezelter 907 if( atoms[local_index]->isDirectional() ){
712 tim 837
713 gezelter 907 isDirectional = 1;
714    
715     dAtom = (DirectionalAtom *)atoms[local_index];
716     dAtom->getQ( q );
717 gezelter 916
718     for (int j = 0; j < 6 ; j++)
719     atomData13[j] = atomData6[j];
720 gezelter 907
721 gezelter 916 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 gezelter 907 }
730 gezelter 916
731 gezelter 907 } else {
732 mmeineke 440 sprintf(painCave.errMsg,
733     "Atom %d not found on processor %d\n",
734     i, worldRank );
735     haveError= 1;
736     simError();
737 tim 837 }
738 gezelter 916
739 gezelter 907 if(haveError) DieDieDie();
740 gezelter 916
741 gezelter 907 // If we've survived to here, format the line:
742    
743 gezelter 916 if (!isDirectional) {
744 tim 837
745 gezelter 916 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 tim 837
758 gezelter 916 } else {
759    
760 gezelter 907 sprintf( tempBuffer,
761 gezelter 916 "%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 gezelter 907 strcat( writeLine, tempBuffer );
778 gezelter 916
779 gezelter 907 }
780 gezelter 916
781 gezelter 907 finalOut << writeLine;
782     finalOut.flush();
783     }
784 mmeineke 377 }
785    
786 gezelter 907 finalOut.flush();
787     sprintf( checkPointMsg,
788     "Sucessfully took a dump.\n");
789 tim 919 delete[] potatoes;
790    
791 gezelter 907 MPIcheckPoint();
792    
793 gezelter 415 } else {
794 tim 837
795 gezelter 907 // worldRank != 0, so I'm a remote node.
796 gezelter 916
797     // Set my magic potato to 0:
798    
799     myPotato = 0;
800 gezelter 907
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 mmeineke 440
807 gezelter 916 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 tim 919 which_atom = i;
817 gezelter 907 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 tim 837
825 gezelter 907 atoms[local_index]->getPos(pos);
826     atoms[local_index]->getVel(vel);
827 tim 837
828 gezelter 916 atomData6[0] = pos[0];
829     atomData6[1] = pos[1];
830     atomData6[2] = pos[2];
831 tim 837
832 gezelter 916 atomData6[3] = vel[0];
833     atomData6[4] = vel[1];
834     atomData6[5] = vel[2];
835 gezelter 907
836     isDirectional = 0;
837 tim 837
838 gezelter 907 if( atoms[local_index]->isDirectional() ){
839 mmeineke 377
840 gezelter 907 isDirectional = 1;
841    
842     dAtom = (DirectionalAtom *)atoms[local_index];
843     dAtom->getQ( q );
844    
845 gezelter 916 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 mmeineke 670
853 gezelter 916 atomData13[10] = dAtom->getJx();
854     atomData13[11] = dAtom->getJy();
855     atomData13[12] = dAtom->getJz();
856 gezelter 907 }
857 tim 837
858 gezelter 907 } else {
859     sprintf(painCave.errMsg,
860     "Atom %d not found on processor %d\n",
861     i, worldRank );
862     haveError= 1;
863     simError();
864     }
865 tim 837
866 gezelter 916 strncpy(MPIatomTypeString, atomTypeString, MINIBUFFERSIZE);
867 tim 837
868 gezelter 916 // null terminate the string before sending (just in case):
869     MPIatomTypeString[MINIBUFFERSIZE-1] = '\0';
870 tim 837
871 gezelter 910 MPI_Send(MPIatomTypeString, MINIBUFFERSIZE, MPI_CHAR, 0,
872 gezelter 916 myPotato, MPI_COMM_WORLD);
873 gezelter 907
874 gezelter 916 myPotato++;
875    
876 gezelter 907 MPI_Send(&isDirectional, 1, MPI_INT, 0,
877 gezelter 916 myPotato, MPI_COMM_WORLD);
878 gezelter 907
879 gezelter 916 myPotato++;
880    
881 gezelter 907 if (isDirectional) {
882    
883 gezelter 916 MPI_Send(atomData13, 13, MPI_DOUBLE, 0,
884     myPotato, MPI_COMM_WORLD);
885 gezelter 907
886 gezelter 916 } else {
887    
888     MPI_Send(atomData6, 6, MPI_DOUBLE, 0,
889     myPotato, MPI_COMM_WORLD);
890 gezelter 907 }
891 gezelter 916
892     myPotato++;
893 mmeineke 377 }
894 gezelter 907 }
895 mmeineke 440
896 gezelter 907 sprintf( checkPointMsg,
897 gezelter 916 "Sucessfully took a dump.\n");
898 gezelter 907 MPIcheckPoint();
899    
900 gezelter 916 }
901 gezelter 907
902 tim 837 if( worldRank == 0 ) finalOut.close();
903 mmeineke 377 #endif // is_mpi
904     }
905 mmeineke 440
906    
907    
908     #ifdef IS_MPI
909    
910     // a couple of functions to let us escape the write loop
911    
912 gezelter 907 void dWrite::DieDieDie( void ){
913 tim 837
914 mmeineke 440 MPI_Finalize();
915     exit (0);
916     }
917    
918     #endif //is_mpi