ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/InitializeFromFile.cpp
Revision: 1268
Committed: Fri Jun 11 17:16:21 2004 UTC (20 years ago) by tim
File size: 16156 byte(s)
Log Message:
roll in progress

File Contents

# User Rev Content
1 gezelter 830 #define _FILE_OFFSET_BITS 64
2 mmeineke 377 #include <iostream>
3 gezelter 829 #include <math.h>
4 mmeineke 377
5     #include <stdio.h>
6     #include <stdlib.h>
7     #include <string.h>
8     #include <unistd.h>
9     #include <sys/types.h>
10     #include <sys/stat.h>
11    
12     #include "ReadWrite.hpp"
13     #include "simError.h"
14 tim 837 #include "GenericData.hpp"
15 mmeineke 377
16     #ifdef IS_MPI
17 gezelter 417 #include <mpi.h>
18 mmeineke 377 #include "mpiSimulation.hpp"
19 tim 1130 #define TAKE_THIS_TAG_CHAR 3134
20     #define TAKE_THIS_TAG_INT 3135
21 chuckv 436
22 mmeineke 440 namespace initFile{
23     void nodeZeroError( void );
24     void anonymousNodeDie( void );
25     }
26 chuckv 436
27 mmeineke 440 using namespace initFile;
28    
29 mmeineke 377 #endif // is_mpi
30    
31 tim 689 InitializeFromFile::InitializeFromFile( char *in_name ){
32    
33 mmeineke 377 #ifdef IS_MPI
34     if (worldRank == 0) {
35     #endif
36    
37     c_in_file = fopen(in_name, "r");
38     if(c_in_file == NULL){
39     sprintf(painCave.errMsg,
40     "Cannot open file: %s\n", in_name);
41     painCave.isFatal = 1;
42     simError();
43     }
44 tim 837
45 mmeineke 377 strcpy( c_in_name, in_name);
46     #ifdef IS_MPI
47     }
48 mmeineke 874 else{
49     sprintf( c_in_name, "mpiNodeParser_%d", worldRank );
50     }
51    
52     strcpy( checkPointMsg, "Infile opened for reading successfully." );
53 mmeineke 377 MPIcheckPoint();
54     #endif
55 tim 837 return;
56 mmeineke 377 }
57    
58 tim 689 InitializeFromFile::~InitializeFromFile( ){
59 mmeineke 377 #ifdef IS_MPI
60     if (worldRank == 0) {
61     #endif
62     int error;
63     error = fclose( c_in_file );
64     if( error ){
65     sprintf( painCave.errMsg,
66     "Error closing %s\n", c_in_name );
67     simError();
68     }
69     #ifdef IS_MPI
70     }
71     strcpy( checkPointMsg, "Infile closed successfully." );
72     MPIcheckPoint();
73     #endif
74    
75     return;
76     }
77    
78    
79 mmeineke 641 void InitializeFromFile :: readInit( SimInfo* the_simnfo ){
80 mmeineke 377
81 mmeineke 787 int i, j;
82 tim 837
83 mmeineke 787 #ifdef IS_MPI
84     int done, which_node, which_atom; // loop counter
85     #endif //is_mpi
86 mmeineke 377
87     const int BUFFERSIZE = 2000; // size of the read buffer
88 tim 1108 int nTotObjs; // the number of atoms
89 tim 837 char read_buffer[BUFFERSIZE]; //the line buffer for reading
90 mmeineke 377
91 tim 837 char *eof_test; // ptr to see when we reach the end of the file
92 mmeineke 377 char *parseErr;
93 mmeineke 787
94 tim 1108 vector<StuntDouble*> integrableObjects;
95    
96 mmeineke 586 simnfo = the_simnfo;
97 mmeineke 377
98    
99     #ifndef IS_MPI
100     eof_test = fgets(read_buffer, sizeof(read_buffer), c_in_file);
101     if( eof_test == NULL ){
102     sprintf( painCave.errMsg,
103     "InitializeFromFile error: error reading 1st line of \"%s\"\n",
104     c_in_name );
105     painCave.isFatal = 1;
106     simError();
107     }
108    
109 tim 1108 nTotObjs = atoi( read_buffer );
110 mmeineke 377
111 tim 1108 if( nTotObjs != simnfo->getTotIntegrableObjects() ){
112 mmeineke 377 sprintf( painCave.errMsg,
113     "Initialize from File error. %s n_atoms, %d, "
114     "does not match the BASS file's n_atoms, %d.\n",
115 tim 1108 c_in_name, nTotObjs, simnfo->getTotIntegrableObjects());
116 mmeineke 377 painCave.isFatal = 1;
117     simError();
118     }
119 tim 837
120     //read the box mat from the comment line
121    
122 mmeineke 377 eof_test = fgets(read_buffer, sizeof(read_buffer), c_in_file);
123     if(eof_test == NULL){
124     sprintf( painCave.errMsg,
125     "error in reading commment in %s\n", c_in_name);
126     painCave.isFatal = 1;
127     simError();
128     }
129    
130 tim 837 parseErr = parseCommentLine( read_buffer, simnfo);
131 mmeineke 586 if( parseErr != NULL ){
132     strcpy( painCave.errMsg, parseErr );
133     painCave.isFatal = 1;
134     simError();
135     }
136    
137 tim 837 //parse dump lines
138 mmeineke 586
139 tim 1108 for( i=0; i < simnfo->n_mol; i++){
140 mmeineke 586
141 tim 1108 integrableObjects = (simnfo->molecules[i]).getIntegrableObjects();
142 mmeineke 377
143 tim 1113 for(j = 0; j < integrableObjects.size(); j++){
144 tim 837
145 tim 1108 eof_test = fgets(read_buffer, sizeof(read_buffer), c_in_file);
146     if(eof_test == NULL){
147     sprintf(painCave.errMsg,
148     "error in reading file %s\n"
149     "natoms = %d; index = %d\n"
150     "error reading the line from the file.\n",
151     c_in_name, nTotObjs, i );
152     painCave.isFatal = 1;
153     simError();
154     }
155    
156 tim 1113 parseErr = parseDumpLine( read_buffer, integrableObjects[j]);
157 tim 1108 if( parseErr != NULL ){
158     strcpy( painCave.errMsg, parseErr );
159     painCave.isFatal = 1;
160     simError();
161     }
162 tim 1113 }
163 mmeineke 377 }
164    
165     // MPI Section of code..........
166     #else //IS_MPI
167    
168 chuckv 436 // first thing first, suspend fatalities.
169     painCave.isEventLoop = 1;
170    
171     int myStatus; // 1 = wakeup & success; 0 = error; -1 = AllDone
172     int haveError;
173 tim 837
174 mmeineke 447 MPI_Status istatus;
175 tim 1108 int *MolToProcMap = mpiSim->getMolToProcMap();
176     int localIndex;
177     int nCurObj;
178 tim 1129 int nItems;
179 mmeineke 377
180 tim 1129 nTotObjs = simnfo->getTotIntegrableObjects();
181 chuckv 436 haveError = 0;
182 mmeineke 377 if (worldRank == 0) {
183 chuckv 436
184 mmeineke 377 eof_test = fgets(read_buffer, sizeof(read_buffer), c_in_file);
185     if( eof_test == NULL ){
186     sprintf( painCave.errMsg,
187 mmeineke 787 "Error reading 1st line of %s \n ",c_in_name);
188 chuckv 436 haveError = 1;
189 mmeineke 377 simError();
190     }
191 tim 837
192 tim 1129 nItems = atoi( read_buffer );
193 tim 837
194 tim 1108 // Check to see that the number of integrable objects in the intial configuration file is the
195 mmeineke 377 // same as declared in simBass.
196 tim 837
197 tim 1129 if( nTotObjs != nItems){
198 mmeineke 377 sprintf( painCave.errMsg,
199     "Initialize from File error. %s n_atoms, %d, "
200     "does not match the BASS file's n_atoms, %d.\n",
201 tim 1108 c_in_name, nTotObjs, simnfo->getTotIntegrableObjects());
202 chuckv 436 haveError= 1;
203 mmeineke 377 simError();
204     }
205 tim 837
206     //read the boxMat from the comment line
207    
208 mmeineke 377 eof_test = fgets(read_buffer, sizeof(read_buffer), c_in_file);
209     if(eof_test == NULL){
210     sprintf( painCave.errMsg,
211     "error in reading commment in %s\n", c_in_name);
212 mmeineke 586 haveError = 1;
213 mmeineke 377 simError();
214     }
215 tim 837
216     //Every single processor will parse the comment line by itself
217     //By using this way, we might lose some efficiency, but if we want to add
218     //more parameters into comment line, we only need to modify function
219     //parseCommentLine
220    
221     MPI_Bcast(read_buffer, BUFFERSIZE, MPI_CHAR, 0, MPI_COMM_WORLD);
222    
223 tim 1130
224 tim 837 parseErr = parseCommentLine( read_buffer, simnfo);
225    
226 mmeineke 586 if( parseErr != NULL ){
227     strcpy( painCave.errMsg, parseErr );
228     haveError = 1;
229     simError();
230     }
231    
232 gezelter 1203 for (i=0 ; i < mpiSim->getNMolGlobal(); i++) {
233 tim 1108 which_node = MolToProcMap[i];
234     if(which_node == 0){
235     //molecules belong to master node
236 gezelter 417
237 tim 1108 localIndex = mpiSim->getGlobalToLocalMol(i);
238    
239     if(localIndex == -1) {
240     strcpy(painCave.errMsg, "Molecule not found on node 0!");
241     haveError = 1;
242     simError();
243 mmeineke 377 }
244 tim 837
245 tim 1108 integrableObjects = (simnfo->molecules[localIndex]).getIntegrableObjects();
246     for(j=0; j < integrableObjects.size(); j++){
247    
248     eof_test = fgets(read_buffer, sizeof(read_buffer), c_in_file);
249     if(eof_test == NULL){
250     sprintf(painCave.errMsg,
251     "error in reading file %s\n"
252     "natoms = %d; index = %d\n"
253     "error reading the line from the file.\n",
254     c_in_name, nTotObjs, i );
255     haveError= 1;
256     simError();
257     }
258    
259     if(haveError) nodeZeroError();
260 chuckv 436
261 tim 1129 parseDumpLine(read_buffer, integrableObjects[j]);
262 tim 1108
263     }
264    
265    
266 tim 837 }
267 tim 1108 else{
268     //molecule belongs to slave nodes
269 tim 837
270 tim 1129 MPI_Recv(&nCurObj, 1, MPI_INT, which_node,
271 tim 1108 TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
272 tim 1131
273 tim 1130 for(j=0; j < nCurObj; j++){
274 tim 1108
275     eof_test = fgets(read_buffer, sizeof(read_buffer), c_in_file);
276     if(eof_test == NULL){
277     sprintf(painCave.errMsg,
278     "error in reading file %s\n"
279     "natoms = %d; index = %d\n"
280     "error reading the line from the file.\n",
281     c_in_name, nTotObjs, i );
282     haveError= 1;
283     simError();
284     }
285    
286     if(haveError) nodeZeroError();
287 tim 837
288 tim 1108 MPI_Send(read_buffer, BUFFERSIZE, MPI_CHAR, which_node,
289     TAKE_THIS_TAG_CHAR, MPI_COMM_WORLD);
290 tim 1131
291 tim 1108 }
292 tim 837
293 mmeineke 377 }
294 tim 1108
295 mmeineke 377 }
296 tim 1108
297     }
298     else{
299     //actions taken at slave nodes
300 tim 1129
301     MPI_Bcast(read_buffer, BUFFERSIZE, MPI_CHAR, 0, MPI_COMM_WORLD);
302    
303     parseErr = parseCommentLine( read_buffer, simnfo);
304    
305     if( parseErr != NULL ){
306     strcpy( painCave.errMsg, parseErr );
307     haveError = 1;
308     simError();
309     }
310    
311 gezelter 1203 for (i=0 ; i < mpiSim->getNMolGlobal(); i++) {
312 tim 1108 which_node = MolToProcMap[i];
313    
314     if(which_node == worldRank){
315     //molecule with global index i belongs to this processor
316    
317     localIndex = mpiSim->getGlobalToLocalMol(i);
318 tim 837
319 tim 1108 if(localIndex == -1) {
320     sprintf(painCave.errMsg, "Molecule not found on node %d\n", worldRank);
321     haveError = 1;
322     simError();
323     }
324 mmeineke 586
325 tim 1108 integrableObjects = (simnfo->molecules[localIndex]).getIntegrableObjects();
326 tim 837
327 tim 1108 nCurObj = integrableObjects.size();
328    
329 tim 1129 MPI_Send(&nCurObj, 1, MPI_INT, 0,
330     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
331 tim 837
332 tim 1108 for(j = 0; j < integrableObjects.size(); j++){
333 tim 837
334 tim 1108 MPI_Recv(read_buffer, BUFFERSIZE, MPI_CHAR, 0,
335     TAKE_THIS_TAG_CHAR, MPI_COMM_WORLD, &istatus);
336 tim 837
337 tim 1108 parseErr = parseDumpLine(read_buffer, integrableObjects[j]);
338 chuckv 436
339 tim 1108 if( parseErr != NULL ){
340     strcpy( painCave.errMsg, parseErr );
341     simError();
342     }
343 tim 837
344 tim 1108 }
345    
346 mmeineke 377 }
347 tim 1108
348     }
349 tim 837
350 mmeineke 377 }
351     #endif
352     }
353    
354 tim 1108 char* InitializeFromFile::parseDumpLine(char* readLine, StuntDouble* sd){
355 mmeineke 377
356 tim 837 char *foo; // the pointer to the current string token
357    
358 mmeineke 670 double pos[3]; // position place holders
359     double vel[3]; // velocity placeholders
360 mmeineke 377 double q[4]; // the quaternions
361 gezelter 1097 double ji[3]; // angular velocity placeholders;
362 mmeineke 377 double qSqr, qLength; // needed to normalize the quaternion vector.
363 tim 837
364    
365 mmeineke 377 // set the string tokenizer
366 tim 837
367 mmeineke 377 foo = strtok(readLine, " ,;\t");
368 tim 837
369 mmeineke 377 // check the atom name to the current atom
370 tim 837
371 tim 1108 if( strcmp( foo, sd->getType() ) ){
372 mmeineke 377 sprintf( painCave.errMsg,
373 tim 1108 "Initialize from file error. Does not"
374 mmeineke 377 " match the BASS atom %s.\n",
375 tim 1108 sd->getType() );
376 mmeineke 377 return strdup( painCave.errMsg );
377     }
378 tim 837
379 mmeineke 377 // get the positions
380    
381     foo = strtok(NULL, " ,;\t");
382     if(foo == NULL){
383     sprintf( painCave.errMsg,
384 tim 1108 "error in reading postition x from %s\n",
385     c_in_name);
386 mmeineke 377 return strdup( painCave.errMsg );
387     }
388 mmeineke 670 pos[0] = atof( foo );
389 tim 837
390 mmeineke 377 foo = strtok(NULL, " ,;\t");
391     if(foo == NULL){
392     sprintf( painCave.errMsg,
393 tim 1108 "error in reading postition y from %s\n",
394     c_in_name);
395 mmeineke 377 return strdup( painCave.errMsg );
396     }
397 mmeineke 670 pos[1] = atof( foo );
398 tim 837
399 mmeineke 377 foo = strtok(NULL, " ,;\t");
400     if(foo == NULL){
401     sprintf( painCave.errMsg,
402 tim 1108 "error in reading postition z from %s\n",
403     c_in_name);
404 mmeineke 377 return strdup( painCave.errMsg );
405     }
406 tim 837 pos[2] = atof( foo );
407 mmeineke 377
408    
409     // get the velocities
410    
411     foo = strtok(NULL, " ,;\t");
412     if(foo == NULL){
413     sprintf( painCave.errMsg,
414 tim 1108 "error in reading velocity x from %s\n",
415     c_in_name );
416 mmeineke 377 return strdup( painCave.errMsg );
417     }
418 mmeineke 670 vel[0] = atof( foo );
419 tim 837
420 mmeineke 377 foo = strtok(NULL, " ,;\t");
421     if(foo == NULL){
422     sprintf( painCave.errMsg,
423 tim 1108 "error in reading velocity x from %s\n",
424     c_in_name );
425 mmeineke 377 return strdup( painCave.errMsg );
426     }
427 mmeineke 670 vel[1] = atof( foo );
428 tim 837
429 mmeineke 377 foo = strtok(NULL, " ,;\t");
430     if(foo == NULL){
431     sprintf( painCave.errMsg,
432 tim 1108 "error in reading velocity x from %s\n",
433     c_in_name );
434 mmeineke 377 return strdup( painCave.errMsg );
435     }
436 mmeineke 670 vel[2] = atof( foo );
437 tim 837
438    
439 tim 1108 // add the positions and velocities to the atom
440    
441     sd->setPos( pos );
442     sd->setVel( vel );
443    
444     if (!sd->isDirectional())
445     return NULL;
446    
447 mmeineke 377 // get the quaternions
448 tim 837
449 tim 1108 if( sd->isDirectional() ){
450 tim 837
451 mmeineke 377 foo = strtok(NULL, " ,;\t");
452     if(foo == NULL){
453 tim 1108 sprintf( painCave.errMsg,
454     "error in reading velocity x from %s\n",
455     c_in_name );
456 mmeineke 377 return strdup( painCave.errMsg );
457     }
458     q[0] = atof( foo );
459 tim 837
460 mmeineke 377 foo = strtok(NULL, " ,;\t");
461     if(foo == NULL){
462     sprintf( painCave.errMsg,
463 tim 1108 "error in reading velocity x from %s\n",
464     c_in_name );
465 mmeineke 377 return strdup( painCave.errMsg );
466     }
467     q[1] = atof( foo );
468 tim 837
469 mmeineke 377 foo = strtok(NULL, " ,;\t");
470     if(foo == NULL){
471     sprintf( painCave.errMsg,
472 tim 1108 "error in reading velocity x from %s\n",
473     c_in_name );
474 mmeineke 377 return strdup( painCave.errMsg );
475     }
476     q[2] = atof( foo );
477 tim 837
478 mmeineke 377 foo = strtok(NULL, " ,;\t");
479     if(foo == NULL){
480     sprintf( painCave.errMsg,
481 tim 1108 "error in reading velocity x from %s\n",
482     c_in_name );
483 mmeineke 377 return strdup( painCave.errMsg );
484     }
485     q[3] = atof( foo );
486 tim 837
487 mmeineke 377 // get the angular velocities
488 tim 837
489 mmeineke 377 foo = strtok(NULL, " ,;\t");
490     if(foo == NULL){
491     sprintf( painCave.errMsg,
492 tim 1108 "error in reading velocity x from %s\n",
493     c_in_name );
494 mmeineke 377 return strdup( painCave.errMsg );
495     }
496 gezelter 1097 ji[0] = atof( foo );
497 tim 837
498 mmeineke 377 foo = strtok(NULL, " ,;\t");
499     if(foo == NULL){
500     sprintf( painCave.errMsg,
501 tim 1108 "error in reading velocity x from %s\n",
502     c_in_name );
503 mmeineke 377 return strdup( painCave.errMsg );
504     }
505 gezelter 1097 ji[1] = atof(foo );
506 tim 837
507 mmeineke 377 foo = strtok(NULL, " ,;\t");
508     if(foo == NULL){
509     sprintf( painCave.errMsg,
510 tim 1108 "error in reading velocity x from %s\n",
511     c_in_name );
512 mmeineke 377 return strdup( painCave.errMsg );
513     }
514 gezelter 1097 ji[2] = atof( foo );
515 tim 837
516 mmeineke 377
517     // check that the quaternion vector is normalized
518    
519     qSqr = (q[0] * q[0]) + (q[1] * q[1]) + (q[2] * q[2]) + (q[3] * q[3]);
520 tim 837
521 tim 1268 if (fabs(qSqr) < 1e-6) {
522     sprintf(painCave.errMsg,
523     "initial quaternion error (q0^2 + q1^2 + q2^2 + q3^2 ~ 0).\n");
524     return strdup(painCave.errMsg);
525     }
526    
527 mmeineke 377 qLength = sqrt( qSqr );
528     q[0] = q[0] / qLength;
529     q[1] = q[1] / qLength;
530     q[2] = q[2] / qLength;
531     q[3] = q[3] / qLength;
532 tim 837
533 tim 1108 // add quaternion and angular velocities
534 tim 837
535 tim 1108 sd->setQ( q );
536     sd->setJ( ji );
537 mmeineke 377 }
538 tim 837
539    
540 mmeineke 377
541     return NULL;
542     }
543 chuckv 436
544    
545 tim 837 char* InitializeFromFile::parseCommentLine(char* readLine, SimInfo* entry_plug){
546 mmeineke 586
547 tim 837 double currTime;
548     double boxMat[9];
549     double theBoxMat3[3][3];
550     double chi;
551     double integralOfChidt;
552     double eta[9];
553 mmeineke 586
554 tim 837 char *foo; // the pointer to the current string token
555    
556 mmeineke 586 // set the string tokenizer
557 tim 837
558 mmeineke 586 foo = strtok(readLine, " ,;\t");
559 mmeineke 641 // set the timeToken.
560 mmeineke 586
561 mmeineke 641 if(foo == NULL){
562     sprintf( painCave.errMsg,
563     "error in reading Time from %s\n",
564     c_in_name );
565     return strdup( painCave.errMsg );
566     }
567 mmeineke 586
568 tim 837 currTime = atof( foo );
569     entry_plug->setTime( currTime );
570 mmeineke 586
571 tim 837 //get H-Matrix
572    
573     for(int i = 0 ; i < 9; i++){
574     foo = strtok(NULL, " ,;\t");
575     if(foo == NULL){
576     sprintf( painCave.errMsg,
577     "error in reading H[%d] from %s\n", i, c_in_name );
578     return strdup( painCave.errMsg );
579     }
580     boxMat[i] = atof( foo );
581 mmeineke 586 }
582    
583 tim 837 for(int i=0;i<3;i++)
584     for(int j=0;j<3;j++) theBoxMat3[i][j] = boxMat[3*j+i];
585 mmeineke 586
586 tim 837 //set H-Matrix
587     entry_plug->setBoxM( theBoxMat3 );
588 mmeineke 586
589 tim 837 //get chi and integralOfChidt, they should appear by pair
590 mmeineke 586
591 mmeineke 906 if( entry_plug->useInitXSstate ){
592 tim 837 foo = strtok(NULL, " ,;\t\n");
593 mmeineke 906 if(foo != NULL){
594     chi = atof(foo);
595    
596     foo = strtok(NULL, " ,;\t\n");
597     if(foo == NULL){
598     sprintf( painCave.errMsg,
599     "chi and integralOfChidt should appear by pair in %s\n", c_in_name );
600     return strdup( painCave.errMsg );
601     }
602     integralOfChidt = atof( foo );
603    
604     //push chi and integralOfChidt into SimInfo::properties which can be
605     //retrieved by integrator later
606     DoubleData* chiValue = new DoubleData();
607     chiValue->setID(CHIVALUE_ID);
608     chiValue->setData(chi);
609     entry_plug->addProperty(chiValue);
610    
611     DoubleData* integralOfChidtValue = new DoubleData();
612     integralOfChidtValue->setID(INTEGRALOFCHIDT_ID);
613     integralOfChidtValue->setData(integralOfChidt);
614     entry_plug->addProperty(integralOfChidtValue);
615    
616 tim 837 }
617 mmeineke 906 else
618     return NULL;
619    
620     //get eta
621 mmeineke 911 foo = strtok(NULL, " ,;\t\n");
622 mmeineke 909 if(foo != NULL ){
623 mmeineke 911
624 mmeineke 909 for(int i = 0 ; i < 9; i++){
625    
626     if(foo == NULL){
627     sprintf( painCave.errMsg,
628     "error in reading eta[%d] from %s\n", i, c_in_name );
629     return strdup( painCave.errMsg );
630     }
631     eta[i] = atof( foo );
632 mmeineke 911 foo = strtok(NULL, " ,;\t\n");
633 mmeineke 906 }
634     }
635 mmeineke 909 else
636     return NULL;
637 mmeineke 906
638     //push eta into SimInfo::properties which can be
639 tim 837 //retrieved by integrator later
640 tim 1129
641 mmeineke 906 DoubleArrayData* etaValue = new DoubleArrayData();
642     etaValue->setID(ETAVALUE_ID);
643     etaValue->setData(eta, 9);
644     entry_plug->addProperty(etaValue);
645 mmeineke 586 }
646 tim 837
647 mmeineke 586 return NULL;
648     }
649    
650 chuckv 436 #ifdef IS_MPI
651    
652     // a couple of functions to let us escape the read loop
653    
654 mmeineke 440 void initFile::nodeZeroError( void ){
655 chuckv 436 int j, myStatus;
656 tim 837
657 chuckv 436 myStatus = 0;
658 gezelter 1203 for (j = 0; j < mpiSim->getNProcessors(); j++) {
659 tim 837 MPI_Send( &myStatus, 1, MPI_INT, j,
660 mmeineke 447 TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
661 tim 837 }
662 chuckv 436
663 tim 837
664 chuckv 436 MPI_Finalize();
665     exit (0);
666 tim 837
667 chuckv 436 }
668    
669 mmeineke 440 void initFile::anonymousNodeDie( void ){
670 chuckv 436
671     MPI_Finalize();
672     exit (0);
673     }
674    
675     #endif //is_mpi