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

# 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 tim 919 cout << "master" <<endl;
164 chuckv 913 /* code to find maximum tag value */
165 tim 919
166     int tagub, flag, MAXTAG;
167 chuckv 913 MPI_Attr_get(MPI_COMM_WORLD, MPI_TAG_UB, &tagub, &flag);
168     if (flag) {
169 tim 919 MAXTAG = tagub;
170 chuckv 913 } else {
171     MAXTAG = 32767;
172 gezelter 916 }
173 mmeineke 440
174     int haveError;
175    
176 mmeineke 447 MPI_Status istatus;
177 gezelter 416 int *AtomToProcMap = mpiSim->getAtomToProcMap();
178 tim 837
179 mmeineke 377 // write out header and node 0's coordinates
180 tim 837
181 mmeineke 377 if( worldRank == 0 ){
182 gezelter 916
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 mmeineke 377 outFile << mpiSim->getTotAtoms() << "\n";
192 tim 837
193     outFile << currentTime << ";\t"
194 gezelter 591 << entry_plug->Hmat[0][0] << "\t"
195     << entry_plug->Hmat[1][0] << "\t"
196     << entry_plug->Hmat[2][0] << ";\t"
197 tim 837
198 gezelter 591 << entry_plug->Hmat[0][1] << "\t"
199     << entry_plug->Hmat[1][1] << "\t"
200     << entry_plug->Hmat[2][1] << ";\t"
201 tim 837
202 gezelter 591 << entry_plug->Hmat[0][2] << "\t"
203     << entry_plug->Hmat[1][2] << "\t"
204 tim 837 << entry_plug->Hmat[2][2] << ";";
205    
206     outFile << entry_plug->the_integrator->getAdditionalParameters();
207     outFile << endl;
208 chuckv 434 outFile.flush();
209 chuckv 913
210 gezelter 416 for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
211 chuckv 913
212 gezelter 417 // Get the Node number which has this atom;
213 chuckv 913
214 tim 837 which_node = AtomToProcMap[i];
215 chuckv 913
216 gezelter 907 if (which_node != 0) {
217 gezelter 916
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 gezelter 907
229 gezelter 910 MPI_Recv(MPIatomTypeString, MINIBUFFERSIZE, MPI_CHAR, which_node,
230 gezelter 916 myPotato, MPI_COMM_WORLD, &istatus);
231 gezelter 907
232 gezelter 910 strncpy(atomTypeString, MPIatomTypeString, MINIBUFFERSIZE);
233 gezelter 912
234     // Null terminate the atomTypeString just in case:
235 gezelter 910
236 gezelter 912 atomTypeString[strlen(atomTypeString) - 1] = '\0';
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 gezelter 910 strncpy(atomTypeString, MPIatomTypeString, MINIBUFFERSIZE);
665 gezelter 907
666 gezelter 916 // Null terminate the atomTypeString just in case:
667 gezelter 907
668 gezelter 916 atomTypeString[strlen(atomTypeString) - 1] = '\0';
669 gezelter 907
670 gezelter 916 myPotato++;
671 gezelter 907
672 gezelter 916 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 gezelter 907 }
684 gezelter 916
685     myPotato++;
686     potatoes[which_node] = myPotato;
687 gezelter 907
688     } else {
689    
690     haveError = 0;
691 chuckv 437 which_atom = i;
692 tim 837 local_index=-1;
693 gezelter 916
694 chuckv 437 for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
695     if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
696     }
697 gezelter 916
698 tim 837 if (local_index != -1) {
699 gezelter 916
700 gezelter 907 atomTypeString = atoms[local_index]->getType();
701    
702 mmeineke 670 atoms[local_index]->getPos(pos);
703 gezelter 916 atoms[local_index]->getVel(vel);
704 tim 837
705 gezelter 916 atomData6[0] = pos[0];
706     atomData6[1] = pos[1];
707     atomData6[2] = pos[2];
708 tim 837
709 gezelter 916 atomData6[3] = vel[0];
710     atomData6[4] = vel[1];
711     atomData6[5] = vel[2];
712 gezelter 907
713     isDirectional = 0;
714 tim 837
715 gezelter 907 if( atoms[local_index]->isDirectional() ){
716 tim 837
717 gezelter 907 isDirectional = 1;
718    
719     dAtom = (DirectionalAtom *)atoms[local_index];
720     dAtom->getQ( q );
721 gezelter 916
722     for (int j = 0; j < 6 ; j++)
723     atomData13[j] = atomData6[j];
724 gezelter 907
725 gezelter 916 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 gezelter 907 }
734 gezelter 916
735 gezelter 907 } else {
736 mmeineke 440 sprintf(painCave.errMsg,
737     "Atom %d not found on processor %d\n",
738     i, worldRank );
739     haveError= 1;
740     simError();
741 tim 837 }
742 gezelter 916
743 gezelter 907 if(haveError) DieDieDie();
744 gezelter 916
745 gezelter 907 // If we've survived to here, format the line:
746    
747 gezelter 916 if (!isDirectional) {
748 tim 837
749 gezelter 916 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 tim 837
762 gezelter 916 } else {
763    
764 gezelter 907 sprintf( tempBuffer,
765 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",
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 gezelter 907 strcat( writeLine, tempBuffer );
782 gezelter 916
783 gezelter 907 }
784 gezelter 916
785 gezelter 907 finalOut << writeLine;
786     finalOut.flush();
787     }
788 mmeineke 377 }
789    
790 gezelter 907 finalOut.flush();
791     sprintf( checkPointMsg,
792     "Sucessfully took a dump.\n");
793 tim 919 delete[] potatoes;
794    
795 gezelter 907 MPIcheckPoint();
796    
797 gezelter 415 } else {
798 tim 837
799 gezelter 907 // worldRank != 0, so I'm a remote node.
800 gezelter 916
801     // Set my magic potato to 0:
802    
803     myPotato = 0;
804 gezelter 907
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 mmeineke 440
811 gezelter 916 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 tim 919 which_atom = i;
821 gezelter 907 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 tim 837
829 gezelter 907 atoms[local_index]->getPos(pos);
830     atoms[local_index]->getVel(vel);
831 tim 837
832 gezelter 916 atomData6[0] = pos[0];
833     atomData6[1] = pos[1];
834     atomData6[2] = pos[2];
835 tim 837
836 gezelter 916 atomData6[3] = vel[0];
837     atomData6[4] = vel[1];
838     atomData6[5] = vel[2];
839 gezelter 907
840     isDirectional = 0;
841 tim 837
842 gezelter 907 if( atoms[local_index]->isDirectional() ){
843 mmeineke 377
844 gezelter 907 isDirectional = 1;
845    
846     dAtom = (DirectionalAtom *)atoms[local_index];
847     dAtom->getQ( q );
848    
849 gezelter 916 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 mmeineke 670
857 gezelter 916 atomData13[10] = dAtom->getJx();
858     atomData13[11] = dAtom->getJy();
859     atomData13[12] = dAtom->getJz();
860 gezelter 907 }
861 tim 837
862 gezelter 907 } else {
863     sprintf(painCave.errMsg,
864     "Atom %d not found on processor %d\n",
865     i, worldRank );
866     haveError= 1;
867     simError();
868     }
869 tim 837
870 gezelter 916 strncpy(MPIatomTypeString, atomTypeString, MINIBUFFERSIZE);
871 tim 837
872 gezelter 916 // null terminate the string before sending (just in case):
873     MPIatomTypeString[MINIBUFFERSIZE-1] = '\0';
874 tim 837
875 gezelter 910 MPI_Send(MPIatomTypeString, MINIBUFFERSIZE, MPI_CHAR, 0,
876 gezelter 916 myPotato, MPI_COMM_WORLD);
877 gezelter 907
878 gezelter 916 myPotato++;
879    
880 gezelter 907 MPI_Send(&isDirectional, 1, MPI_INT, 0,
881 gezelter 916 myPotato, MPI_COMM_WORLD);
882 gezelter 907
883 gezelter 916 myPotato++;
884    
885 gezelter 907 if (isDirectional) {
886    
887 gezelter 916 MPI_Send(atomData13, 13, MPI_DOUBLE, 0,
888     myPotato, MPI_COMM_WORLD);
889 gezelter 907
890 gezelter 916 } else {
891    
892     MPI_Send(atomData6, 6, MPI_DOUBLE, 0,
893     myPotato, MPI_COMM_WORLD);
894 gezelter 907 }
895 gezelter 916
896     myPotato++;
897 mmeineke 377 }
898 gezelter 907 }
899 mmeineke 440
900 gezelter 907 sprintf( checkPointMsg,
901 gezelter 916 "Sucessfully took a dump.\n");
902 gezelter 907 MPIcheckPoint();
903    
904 gezelter 916 }
905 gezelter 907
906 tim 837 if( worldRank == 0 ) finalOut.close();
907 mmeineke 377 #endif // is_mpi
908     }
909 mmeineke 440
910    
911    
912     #ifdef IS_MPI
913    
914     // a couple of functions to let us escape the write loop
915    
916 gezelter 907 void dWrite::DieDieDie( void ){
917 tim 837
918 mmeineke 440 MPI_Finalize();
919     exit (0);
920     }
921    
922     #endif //is_mpi