ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/DumpWriter.cpp
Revision: 670
Committed: Thu Aug 7 21:47:18 2003 UTC (20 years, 11 months ago) by mmeineke
File size: 15044 byte(s)
Log Message:
switched SimInfo to use a system configuration from SimState rather than arrays from Atom

File Contents

# User Rev Content
1 mmeineke 377 #include <cstring>
2     #include <iostream>
3     #include <fstream>
4    
5     #ifdef IS_MPI
6     #include <mpi.h>
7     #include "mpiSimulation.hpp"
8 chuckv 436 #define TAKE_THIS_TAG_CHAR 1
9     #define TAKE_THIS_TAG_INT 2
10 mmeineke 440
11     namespace dWrite{
12     void nodeZeroError( void );
13     void anonymousNodeDie( void );
14     }
15    
16     using namespace dWrite;
17 mmeineke 377 #endif //is_mpi
18    
19     #include "ReadWrite.hpp"
20     #include "simError.h"
21    
22     DumpWriter::DumpWriter( SimInfo* the_entry_plug ){
23    
24     entry_plug = the_entry_plug;
25    
26     #ifdef IS_MPI
27     if(worldRank == 0 ){
28     #endif // is_mpi
29    
30     strcpy( outName, entry_plug->sampleName );
31    
32     outFile.open(outName, ios::out | ios::trunc );
33    
34     if( !outFile ){
35    
36     sprintf( painCave.errMsg,
37     "Could not open \"%s\" for dump output.\n",
38     outName);
39     painCave.isFatal = 1;
40     simError();
41     }
42 mmeineke 469
43 mmeineke 377 //outFile.setf( ios::scientific );
44    
45     #ifdef IS_MPI
46     }
47    
48     sprintf( checkPointMsg,
49     "Sucessfully opened output file for dumping.\n");
50     MPIcheckPoint();
51     #endif // is_mpi
52     }
53    
54     DumpWriter::~DumpWriter( ){
55    
56     #ifdef IS_MPI
57     if(worldRank == 0 ){
58     #endif // is_mpi
59    
60     outFile.close();
61    
62     #ifdef IS_MPI
63     }
64     #endif // is_mpi
65     }
66    
67     void DumpWriter::writeDump( double currentTime ){
68    
69     const int BUFFERSIZE = 2000;
70     char tempBuffer[BUFFERSIZE];
71     char writeLine[BUFFERSIZE];
72    
73 mmeineke 450 int i, j, which_node, done, which_atom, local_index;
74 mmeineke 377 double q[4];
75     DirectionalAtom* dAtom;
76     int nAtoms = entry_plug->n_atoms;
77     Atom** atoms = entry_plug->atoms;
78 mmeineke 670
79     double pos[3], vel[3];
80 mmeineke 377
81    
82     #ifndef IS_MPI
83    
84     outFile << nAtoms << "\n";
85    
86 mmeineke 586 outFile << currentTime << ";\t"
87 mmeineke 590 << entry_plug->Hmat[0][0] << "\t"
88     << entry_plug->Hmat[1][0] << "\t"
89     << entry_plug->Hmat[2][0] << ";\t"
90 mmeineke 572
91 mmeineke 590 << entry_plug->Hmat[0][1] << "\t"
92     << entry_plug->Hmat[1][1] << "\t"
93     << entry_plug->Hmat[2][1] << ";\t"
94 mmeineke 572
95 mmeineke 590 << entry_plug->Hmat[0][2] << "\t"
96     << entry_plug->Hmat[1][2] << "\t"
97     << entry_plug->Hmat[2][2] << ";\n";
98 mmeineke 377
99     for( i=0; i<nAtoms; i++ ){
100    
101 mmeineke 670 atoms[i]->getPos(pos);
102     atoms[i]->getVel(vel);
103 mmeineke 377
104     sprintf( tempBuffer,
105     "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
106     atoms[i]->getType(),
107 mmeineke 670 pos[0],
108     pos[1],
109     pos[2],
110     vel[0],
111     vel[1],
112     vel[2]);
113 mmeineke 377 strcpy( writeLine, tempBuffer );
114    
115     if( atoms[i]->isDirectional() ){
116    
117     dAtom = (DirectionalAtom *)atoms[i];
118     dAtom->getQ( q );
119    
120     sprintf( tempBuffer,
121     "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
122     q[0],
123     q[1],
124     q[2],
125     q[3],
126     dAtom->getJx(),
127     dAtom->getJy(),
128     dAtom->getJz());
129     strcat( writeLine, tempBuffer );
130     }
131     else
132     strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
133    
134     outFile << writeLine;
135     }
136     outFile.flush();
137    
138     #else // is_mpi
139 gezelter 416
140 mmeineke 440 // first thing first, suspend fatalities.
141     painCave.isEventLoop = 1;
142    
143     int myStatus; // 1 = wakeup & success; 0 = error; -1 = AllDone
144     int haveError;
145    
146 mmeineke 447 MPI_Status istatus;
147 gezelter 416 int *AtomToProcMap = mpiSim->getAtomToProcMap();
148 gezelter 415
149 mmeineke 377 // write out header and node 0's coordinates
150 gezelter 415
151 mmeineke 377 if( worldRank == 0 ){
152     outFile << mpiSim->getTotAtoms() << "\n";
153 mmeineke 572
154 gezelter 591 outFile << currentTime << ";\t"
155     << entry_plug->Hmat[0][0] << "\t"
156     << entry_plug->Hmat[1][0] << "\t"
157     << entry_plug->Hmat[2][0] << ";\t"
158 mmeineke 572
159 gezelter 591 << entry_plug->Hmat[0][1] << "\t"
160     << entry_plug->Hmat[1][1] << "\t"
161     << entry_plug->Hmat[2][1] << ";\t"
162 mmeineke 572
163 gezelter 591 << entry_plug->Hmat[0][2] << "\t"
164     << entry_plug->Hmat[1][2] << "\t"
165     << entry_plug->Hmat[2][2] << ";\n";
166    
167 chuckv 434 outFile.flush();
168 gezelter 416 for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
169 gezelter 417 // Get the Node number which has this atom;
170 mmeineke 377
171 gezelter 415 which_node = AtomToProcMap[i];
172    
173 chuckv 436 if (which_node == 0 ) {
174 mmeineke 377
175 mmeineke 440 haveError = 0;
176 chuckv 436 which_atom = i;
177     local_index=-1;
178     for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
179     if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
180     }
181     if (local_index != -1) {
182     //format the line
183 mmeineke 670
184     atoms[local_index]->getPos(pos);
185     atoms[local_index]->getVel(vel);
186    
187 chuckv 436 sprintf( tempBuffer,
188     "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
189     atoms[local_index]->getType(),
190 mmeineke 670 pos[0],
191     pos[1],
192     pos[2],
193     vel[0],
194     vel[1],
195     vel[2]); // check here.
196 chuckv 436 strcpy( writeLine, tempBuffer );
197 mmeineke 377
198 chuckv 436 if( atoms[local_index]->isDirectional() ){
199    
200     dAtom = (DirectionalAtom *)atoms[local_index];
201     dAtom->getQ( q );
202    
203     sprintf( tempBuffer,
204     "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
205     q[0],
206     q[1],
207     q[2],
208     q[3],
209     dAtom->getJx(),
210     dAtom->getJy(),
211     dAtom->getJz());
212     strcat( writeLine, tempBuffer );
213    
214     }
215     else
216     strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
217     }
218     else {
219 mmeineke 440 sprintf(painCave.errMsg,
220     "Atom %d not found on processor %d\n",
221     i, worldRank );
222     haveError= 1;
223     simError();
224 chuckv 436 }
225 mmeineke 440
226     if(haveError) nodeZeroError();
227    
228     }
229 chuckv 436 else {
230 mmeineke 440 myStatus = 1;
231 mmeineke 447 MPI_Send(&myStatus, 1, MPI_INT, which_node,
232     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
233     MPI_Send(&i, 1, MPI_INT, which_node, TAKE_THIS_TAG_INT,
234     MPI_COMM_WORLD);
235     MPI_Recv(writeLine, BUFFERSIZE, MPI_CHAR, which_node,
236     TAKE_THIS_TAG_CHAR, MPI_COMM_WORLD, &istatus);
237     MPI_Recv(&myStatus, 1, MPI_INT, which_node,
238     TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
239 mmeineke 440
240     if(!myStatus) nodeZeroError();
241    
242 mmeineke 377 }
243 gezelter 415
244 mmeineke 377 outFile << writeLine;
245 chuckv 434 outFile.flush();
246 mmeineke 377 }
247    
248 gezelter 415 // kill everyone off:
249 mmeineke 440 myStatus = -1;
250 gezelter 416 for (j = 0; j < mpiSim->getNumberProcessors(); j++) {
251 mmeineke 447 MPI_Send(&myStatus, 1, MPI_INT, j,
252     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
253 mmeineke 377 }
254    
255 gezelter 415 } else {
256    
257     done = 0;
258     while (!done) {
259 mmeineke 440
260 mmeineke 447 MPI_Recv(&myStatus, 1, MPI_INT, 0,
261     TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
262 mmeineke 440
263     if(!myStatus) anonymousNodeDie();
264    
265     if(myStatus < 0) break;
266    
267 mmeineke 447 MPI_Recv(&which_atom, 1, MPI_INT, 0,
268     TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
269 mmeineke 440
270     myStatus = 1;
271     local_index=-1;
272     for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
273     if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
274     }
275     if (local_index != -1) {
276     //format the line
277 mmeineke 670
278     atoms[local_index]->getPos(pos);
279     atoms[local_index]->getVel(vel);
280    
281 mmeineke 440 sprintf( tempBuffer,
282     "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
283     atoms[local_index]->getType(),
284 mmeineke 670 pos[0],
285     pos[1],
286     pos[2],
287     vel[0],
288     vel[1],
289     vel[2]); // check here.
290 mmeineke 440 strcpy( writeLine, tempBuffer );
291    
292     if( atoms[local_index]->isDirectional() ){
293 mmeineke 377
294 mmeineke 440 dAtom = (DirectionalAtom *)atoms[local_index];
295     dAtom->getQ( q );
296    
297     sprintf( tempBuffer,
298     "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
299     q[0],
300     q[1],
301     q[2],
302     q[3],
303     dAtom->getJx(),
304     dAtom->getJy(),
305     dAtom->getJz());
306     strcat( writeLine, tempBuffer );
307     }
308     else{
309     strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
310     }
311     }
312     else {
313     sprintf(painCave.errMsg,
314     "Atom %d not found on processor %d\n",
315     which_atom, worldRank );
316     myStatus = 0;
317     simError();
318    
319     strcpy( writeLine, "Hello, I'm an error.\n");
320 mmeineke 377 }
321 mmeineke 440
322 mmeineke 447 MPI_Send(writeLine, BUFFERSIZE, MPI_CHAR, 0,
323     TAKE_THIS_TAG_CHAR, MPI_COMM_WORLD);
324     MPI_Send( &myStatus, 1, MPI_INT, 0,
325     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
326 mmeineke 377 }
327 gezelter 415 }
328     outFile.flush();
329     sprintf( checkPointMsg,
330     "Sucessfully took a dump.\n");
331     MPIcheckPoint();
332 mmeineke 440
333     // last thing last, enable fatalities.
334     painCave.isEventLoop = 0;
335    
336 mmeineke 377 #endif // is_mpi
337     }
338    
339 mmeineke 572 void DumpWriter::writeFinal(double finalTime){
340 gezelter 416
341 mmeineke 377 char finalName[500];
342     ofstream finalOut;
343 gezelter 416
344     const int BUFFERSIZE = 2000;
345     char tempBuffer[BUFFERSIZE];
346     char writeLine[BUFFERSIZE];
347    
348     double q[4];
349     DirectionalAtom* dAtom;
350     int nAtoms = entry_plug->n_atoms;
351     Atom** atoms = entry_plug->atoms;
352 gezelter 419 int i, j, which_node, done, game_over, which_atom, local_index;
353 mmeineke 377
354 mmeineke 670 double pos[3], vel[3];
355 gezelter 416
356 mmeineke 377 #ifdef IS_MPI
357     if(worldRank == 0 ){
358     #endif // is_mpi
359    
360     strcpy( finalName, entry_plug->finalName );
361    
362     finalOut.open( finalName, ios::out | ios::trunc );
363     if( !finalOut ){
364     sprintf( painCave.errMsg,
365     "Could not open \"%s\" for final dump output.\n",
366     finalName );
367     painCave.isFatal = 1;
368     simError();
369     }
370    
371     // finalOut.setf( ios::scientific );
372    
373     #ifdef IS_MPI
374     }
375    
376     sprintf(checkPointMsg,"Opened file for final configuration\n");
377     MPIcheckPoint();
378    
379     #endif //is_mpi
380    
381 gezelter 415
382 mmeineke 377 #ifndef IS_MPI
383    
384     finalOut << nAtoms << "\n";
385    
386 gezelter 591 finalOut << finalTime << ";\t"
387 mmeineke 590 << entry_plug->Hmat[0][0] << "\t"
388     << entry_plug->Hmat[1][0] << "\t"
389 gezelter 591 << entry_plug->Hmat[2][0] << ";\t"
390 mmeineke 572
391 mmeineke 590 << entry_plug->Hmat[0][1] << "\t"
392     << entry_plug->Hmat[1][1] << "\t"
393 gezelter 591 << entry_plug->Hmat[2][1] << ";\t"
394 mmeineke 572
395 mmeineke 590 << entry_plug->Hmat[0][2] << "\t"
396     << entry_plug->Hmat[1][2] << "\t"
397 gezelter 591 << entry_plug->Hmat[2][2] << ";\n";
398 gezelter 416
399 mmeineke 377 for( i=0; i<nAtoms; i++ ){
400    
401 mmeineke 670 atoms[i]->getPos(pos);
402     atoms[i]->getVel(vel);
403    
404 mmeineke 377 sprintf( tempBuffer,
405     "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
406     atoms[i]->getType(),
407 mmeineke 670 pos[0],
408     pos[1],
409     pos[2],
410     vel[0],
411     vel[1],
412     vel[2]);
413 mmeineke 377 strcpy( writeLine, tempBuffer );
414    
415     if( atoms[i]->isDirectional() ){
416    
417     dAtom = (DirectionalAtom *)atoms[i];
418     dAtom->getQ( q );
419    
420     sprintf( tempBuffer,
421     "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
422     q[0],
423     q[1],
424     q[2],
425     q[3],
426     dAtom->getJx(),
427     dAtom->getJy(),
428     dAtom->getJz());
429     strcat( writeLine, tempBuffer );
430     }
431     else
432     strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
433    
434     finalOut << writeLine;
435     }
436     finalOut.flush();
437 gezelter 415 finalOut.close();
438 mmeineke 377
439     #else // is_mpi
440 gezelter 415
441 mmeineke 440 // first thing first, suspend fatalities.
442     painCave.isEventLoop = 1;
443    
444     int myStatus; // 1 = wakeup & success; 0 = error; -1 = AllDone
445     int haveError;
446    
447 mmeineke 447 MPI_Status istatus;
448 gezelter 416 int *AtomToProcMap = mpiSim->getAtomToProcMap();
449    
450 mmeineke 377 // write out header and node 0's coordinates
451 gezelter 415
452 mmeineke 440 haveError = 0;
453 mmeineke 377 if( worldRank == 0 ){
454     finalOut << mpiSim->getTotAtoms() << "\n";
455 gezelter 415
456 gezelter 591 finalOut << finalTime << ";\t"
457     << entry_plug->Hmat[0][0] << "\t"
458     << entry_plug->Hmat[1][0] << "\t"
459     << entry_plug->Hmat[2][0] << ";\t"
460 mmeineke 572
461 gezelter 591 << entry_plug->Hmat[0][1] << "\t"
462     << entry_plug->Hmat[1][1] << "\t"
463     << entry_plug->Hmat[2][1] << ";\t"
464 mmeineke 572
465 gezelter 591 << entry_plug->Hmat[0][2] << "\t"
466     << entry_plug->Hmat[1][2] << "\t"
467     << entry_plug->Hmat[2][2] << ";\n";
468 mmeineke 377
469 gezelter 416 for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
470 gezelter 415 // Get the Node number which has this molecule:
471 mmeineke 377
472 gezelter 415 which_node = AtomToProcMap[i];
473    
474 gezelter 416 if (which_node == mpiSim->getMyNode()) {
475 chuckv 437
476     which_atom = i;
477     local_index=-1;
478     for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
479     if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
480     }
481 mmeineke 670 if (local_index != -1) {
482    
483     atoms[local_index]->getPos(pos);
484     atoms[local_index]->getVel(vel);
485    
486 chuckv 437 sprintf( tempBuffer,
487     "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
488     atoms[local_index]->getType(),
489 mmeineke 670 pos[0],
490     pos[1],
491     pos[2],
492     vel[0],
493     vel[1],
494     vel[2]);
495 chuckv 437 strcpy( writeLine, tempBuffer );
496 mmeineke 377
497 chuckv 437 if( atoms[local_index]->isDirectional() ){
498    
499     dAtom = (DirectionalAtom *)atoms[local_index];
500     dAtom->getQ( q );
501    
502     sprintf( tempBuffer,
503     "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
504     q[0],
505     q[1],
506     q[2],
507     q[3],
508     dAtom->getJx(),
509     dAtom->getJy(),
510     dAtom->getJz());
511     strcat( writeLine, tempBuffer );
512     }
513     else
514     strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
515     }
516     else {
517 mmeineke 440 sprintf(painCave.errMsg,
518     "Atom %d not found on processor %d\n",
519     i, worldRank );
520     haveError= 1;
521     simError();
522 chuckv 437 }
523 mmeineke 440
524     if(haveError) nodeZeroError();
525 chuckv 437
526 mmeineke 440 }
527     else {
528 gezelter 415
529 mmeineke 440 myStatus = 1;
530 mmeineke 447 MPI_Send(&myStatus, 1, MPI_INT, which_node,
531     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
532     MPI_Send(&i, 1, MPI_INT, which_node, TAKE_THIS_TAG_INT,
533     MPI_COMM_WORLD);
534     MPI_Recv(writeLine, BUFFERSIZE, MPI_CHAR, which_node,
535     TAKE_THIS_TAG_CHAR, MPI_COMM_WORLD, &istatus);
536     MPI_Recv(&myStatus, 1, MPI_INT, which_node,
537     TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
538 mmeineke 440
539     if(!myStatus) nodeZeroError();
540 mmeineke 377 }
541 gezelter 415
542 mmeineke 377 finalOut << writeLine;
543     }
544    
545 gezelter 415 // kill everyone off:
546 mmeineke 440 myStatus = -1;
547     for (j = 0; j < mpiSim->getNumberProcessors(); j++) {
548 mmeineke 447 MPI_Send(&myStatus, 1, MPI_INT, j,
549     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
550 mmeineke 377 }
551    
552 gezelter 415 } else {
553    
554     done = 0;
555     while (!done) {
556 mmeineke 440
557 mmeineke 447 MPI_Recv(&myStatus, 1, MPI_INT, 0,
558     TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
559 mmeineke 440
560     if(!myStatus) anonymousNodeDie();
561    
562     if(myStatus < 0) break;
563    
564 mmeineke 447 MPI_Recv(&which_atom, 1, MPI_INT, 0,
565     TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
566 mmeineke 440
567     myStatus = 1;
568     local_index=-1;
569     for (j=0; j < mpiSim->getMyNlocal(); j++) {
570     if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
571     }
572     if (local_index != -1) {
573 mmeineke 377
574 mmeineke 670 atoms[local_index]->getPos(pos);
575     atoms[local_index]->getVel(vel);
576    
577 mmeineke 440 //format the line
578     sprintf( tempBuffer,
579     "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
580     atoms[local_index]->getType(),
581 mmeineke 670 pos[0],
582     pos[1],
583     pos[2],
584     vel[0],
585     vel[1],
586     vel[2]); // check here.
587 mmeineke 440 strcpy( writeLine, tempBuffer );
588    
589     if( atoms[local_index]->isDirectional() ){
590 mmeineke 377
591 mmeineke 440 dAtom = (DirectionalAtom *)atoms[local_index];
592     dAtom->getQ( q );
593    
594     sprintf( tempBuffer,
595     "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
596     q[0],
597     q[1],
598     q[2],
599     q[3],
600     dAtom->getJx(),
601     dAtom->getJy(),
602     dAtom->getJz());
603     strcat( writeLine, tempBuffer );
604     }
605     else{
606     strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
607     }
608     }
609     else {
610     sprintf(painCave.errMsg,
611     "Atom %d not found on processor %d\n",
612     which_atom, worldRank );
613     myStatus = 0;
614     simError();
615    
616     strcpy( writeLine, "Hello, I'm an error.\n");
617 mmeineke 377 }
618 mmeineke 440
619 mmeineke 447 MPI_Send(writeLine, BUFFERSIZE, MPI_CHAR, 0,
620     TAKE_THIS_TAG_CHAR, MPI_COMM_WORLD);
621     MPI_Send( &myStatus, 1, MPI_INT, 0,
622     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
623 mmeineke 377 }
624 gezelter 419 }
625 gezelter 415 finalOut.flush();
626     sprintf( checkPointMsg,
627     "Sucessfully took a dump.\n");
628     MPIcheckPoint();
629 mmeineke 440
630 gezelter 415 if( worldRank == 0 ) finalOut.close();
631 mmeineke 377 #endif // is_mpi
632     }
633 mmeineke 440
634    
635    
636     #ifdef IS_MPI
637    
638     // a couple of functions to let us escape the write loop
639    
640     void dWrite::nodeZeroError( void ){
641     int j, myStatus;
642    
643     myStatus = 0;
644     for (j = 0; j < mpiSim->getNumberProcessors(); j++) {
645 mmeineke 447 MPI_Send( &myStatus, 1, MPI_INT, j,
646     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
647 mmeineke 440 }
648    
649    
650     MPI_Finalize();
651     exit (0);
652    
653     }
654    
655     void dWrite::anonymousNodeDie( void ){
656    
657     MPI_Finalize();
658     exit (0);
659     }
660    
661     #endif //is_mpi