ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/DumpWriter.cpp
(Generate patch)

Comparing trunk/OOPSE/libmdtools/DumpWriter.cpp (file contents):
Revision 929 by tim, Tue Jan 13 15:46:49 2004 UTC vs.
Revision 934 by tim, Tue Jan 13 20:04:28 2004 UTC

# Line 40 | Line 40 | DumpWriter::DumpWriter( SimInfo* the_entry_plug ){
40        simError();
41      }
42  
43 <    //outFile.setf( ios::scientific );
43 >    finalOut.open( entry_plug->finalName, ios::out | ios::trunc );
44 >    if( !finalOut ){
45 >      sprintf( painCave.errMsg,
46 >               "Could not open \"%s\" for final dump output.\n",
47 >               entry_plug->finalName );
48 >      painCave.isFatal = 1;
49 >      simError();
50 >    }
51  
52   #ifdef IS_MPI
53    }
# Line 61 | Line 68 | DumpWriter::~DumpWriter( ){
68   #endif // is_mpi
69  
70      dumpFile.close();
71 +    finalOut.close();
72  
73   #ifdef IS_MPI
74    }
# Line 102 | Line 110 | void DumpWriter::writeDump(double currentTime){
110   #endif
111  
112   void DumpWriter::writeDump(double currentTime){
105  
106 // write to eor file
107  writeFinal(currentTime);
113  
114 < //write to dump file
115 <  writeFrame(dumpFile, currentTime);
114 >  vector<ofstream*> fileStreams;
115 >
116 > #ifdef IS_MPI
117 >  if(worldRank == 0 ){
118 >    finalOut.seekp(0);
119 >  }
120 > #endif // is_mpi
121 >
122 >  fileStreams.push_back(&finalOut);
123 >  fileStreams.push_back(&dumpFile);
124 >
125 >  writeFrame(fileStreams, currentTime);
126          
127   }
128  
129   void DumpWriter::writeFinal(double currentTime){
130  
131 <  ofstream finalOut;    
117 <  
118 <  //Open eor file
119 < #ifdef IS_MPI
120 <  if(worldRank == 0 ){
121 < #endif // is_mpi
131 >  vector<ofstream*> fileStreams;
132  
123    finalOut.open( entry_plug->finalName, ios::out | ios::trunc );
124    if( !finalOut ){
125      sprintf( painCave.errMsg,
126               "Could not open \"%s\" for final dump output.\n",
127               entry_plug->finalName );
128      painCave.isFatal = 1;
129      simError();
130    }
131    
133   #ifdef IS_MPI
133  }
134 #endif
135  
136  //write to eor file  
137  writeFrame(finalOut, currentTime);
138  
139  //close eor file      
140 #ifdef IS_MPI
134    if(worldRank == 0 ){
135 <    finalOut.close();
135 >    finalOut.seekp(0);
136    }
137   #endif // is_mpi
138 <
138 >  
139 >  fileStreams.push_back(&finalOut);  
140 >  writeFrame(fileStreams, currentTime);
141 >  
142   }
143  
144 < void DumpWriter::writeFrame( ofstream& outFile, double currentTime ){
144 > void DumpWriter::writeFrame( vector<ofstream*>& outFile, double currentTime ){
145  
146    const int BUFFERSIZE = 2000;
147    const int MINIBUFFERSIZE = 100;
# Line 153 | Line 149 | void DumpWriter::writeFrame( ofstream& outFile, double
149    char tempBuffer[BUFFERSIZE];
150    char writeLine[BUFFERSIZE];
151  
152 <  int i;
152 >  int i, k;
153  
154   #ifdef IS_MPI
155    
# Line 178 | Line 174 | void DumpWriter::writeFrame( ofstream& outFile, double
174    double pos[3], vel[3];
175  
176   #ifndef IS_MPI
177 +  
178 +  for(k = 0; k < outFile.size(); k++){
179 +    *outFile[k] << nAtoms << "\n";
180  
181 <  outFile << nAtoms << "\n";
181 >    *outFile[k] << currentTime << ";\t"
182 >               << entry_plug->Hmat[0][0] << "\t"
183 >                     << entry_plug->Hmat[1][0] << "\t"
184 >                     << entry_plug->Hmat[2][0] << ";\t"
185 >              
186 >               << entry_plug->Hmat[0][1] << "\t"
187 >                     << entry_plug->Hmat[1][1] << "\t"
188 >                     << entry_plug->Hmat[2][1] << ";\t"
189  
190 <  outFile << currentTime << ";\t"
191 <          << entry_plug->Hmat[0][0] << "\t"
192 <          << entry_plug->Hmat[1][0] << "\t"
187 <          << entry_plug->Hmat[2][0] << ";\t"
190 >                     << entry_plug->Hmat[0][2] << "\t"
191 >                     << entry_plug->Hmat[1][2] << "\t"
192 >                     << entry_plug->Hmat[2][2] << ";";
193  
194 <          << entry_plug->Hmat[0][1] << "\t"
195 <          << entry_plug->Hmat[1][1] << "\t"
196 <          << entry_plug->Hmat[2][1] << ";\t"
197 <
193 <          << entry_plug->Hmat[0][2] << "\t"
194 <          << entry_plug->Hmat[1][2] << "\t"
195 <          << entry_plug->Hmat[2][2] << ";";
196 <  //write out additional parameters, such as chi and eta
197 <  outFile << entry_plug->the_integrator->getAdditionalParameters();
198 <  outFile << endl;
199 <
194 >    //write out additional parameters, such as chi and eta
195 >    *outFile[k] << entry_plug->the_integrator->getAdditionalParameters() << endl;
196 >  }
197 >  
198    for( i=0; i<nAtoms; i++ ){
199  
200      atoms[i]->getPos(pos);
# Line 232 | Line 230 | void DumpWriter::writeFrame( ofstream& outFile, double
230      else
231        strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
232  
233 <    outFile << writeLine;
233 >    for(k = 0; k < outFile.size(); k++)
234 >      *outFile[k] << writeLine;
235    }
236  
237   #else // is_mpi
# Line 261 | Line 260 | void DumpWriter::writeFrame( ofstream& outFile, double
260      nProc = mpiSim->getNumberProcessors();
261      potatoes = new int[nProc];
262  
263 +    //write out the comment lines
264      for (i = 0; i < nProc; i++)
265        potatoes[i] = 0;
266      
267 <    outFile << mpiSim->getTotAtoms() << "\n";
267 >      for(k = 0; k < outFile.size(); k++){
268 >        *outFile[k] << mpiSim->getTotAtoms() << "\n";
269  
270 <    outFile << currentTime << ";\t"
271 <            << entry_plug->Hmat[0][0] << "\t"
272 <            << entry_plug->Hmat[1][0] << "\t"
273 <            << entry_plug->Hmat[2][0] << ";\t"
270 >        *outFile[k] << currentTime << ";\t"
271 >                         << entry_plug->Hmat[0][0] << "\t"
272 >                         << entry_plug->Hmat[1][0] << "\t"
273 >                         << entry_plug->Hmat[2][0] << ";\t"
274  
275 <            << entry_plug->Hmat[0][1] << "\t"
276 <            << entry_plug->Hmat[1][1] << "\t"
277 <            << entry_plug->Hmat[2][1] << ";\t"
275 >                         << entry_plug->Hmat[0][1] << "\t"
276 >                         << entry_plug->Hmat[1][1] << "\t"
277 >                         << entry_plug->Hmat[2][1] << ";\t"
278  
279 <            << entry_plug->Hmat[0][2] << "\t"
280 <            << entry_plug->Hmat[1][2] << "\t"
281 <            << entry_plug->Hmat[2][2] << ";";
279 >                         << entry_plug->Hmat[0][2] << "\t"
280 >                         << entry_plug->Hmat[1][2] << "\t"
281 >                         << entry_plug->Hmat[2][2] << ";";
282 >  
283 >        *outFile[k] << entry_plug->the_integrator->getAdditionalParameters() << endl;
284 >    }
285  
282    outFile << entry_plug->the_integrator->getAdditionalParameters();
283    outFile << endl;
284    outFile.flush();
285    
286      currentIndex = 0;
287 +
288      for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
289        
290        // Get the Node number which has this atom;
# Line 328 | Line 329 | void DumpWriter::writeFrame( ofstream& outFile, double
329  
330        } else {
331          
332 <        haveError = 0;
333 <        which_atom = i;
332 >        haveError = 0;
333 >              which_atom = i;
334          
335          local_index = indexArray[currentIndex].first;        
336                  
# Line 337 | Line 338 | void DumpWriter::writeFrame( ofstream& outFile, double
338            
339            atomTypeString = atoms[local_index]->getType();
340  
341 <          atoms[local_index]->getPos(pos);
342 <          atoms[local_index]->getVel(vel);          
341 >                atoms[local_index]->getPos(pos);
342 >                atoms[local_index]->getVel(vel);          
343  
344            atomData6[0] = pos[0];
345            atomData6[1] = pos[1];
# Line 371 | Line 372 | void DumpWriter::writeFrame( ofstream& outFile, double
372            }
373            
374          } else {
375 <          sprintf(painCave.errMsg,
376 <                  "Atom %d not found on processor %d\n",
377 <                  i, worldRank );
378 <          haveError= 1;
379 <          simError();
380 <        }
375 >          sprintf(painCave.errMsg,
376 >                              "Atom %d not found on processor %d\n",
377 >                              i, worldRank );
378 >                haveError= 1;
379 >                simError();
380 >              }
381          
382 <        if(haveError) DieDieDie();
382 >        if(haveError) DieDieDie();
383          
384          currentIndex ++;
385        }
# Line 386 | Line 387 | void DumpWriter::writeFrame( ofstream& outFile, double
387        
388        if (!isDirectional) {
389          
390 <        sprintf( writeLine,
391 <                 "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
392 <                 atomTypeString,
393 <                 atomData6[0],
394 <                 atomData6[1],
395 <                 atomData6[2],
396 <                 atomData6[3],
397 <                 atomData6[4],
398 <                 atomData6[5]);
390 >        sprintf( writeLine,
391 >                             "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
392 >                             atomTypeString,
393 >                             atomData6[0],
394 >                             atomData6[1],
395 >                             atomData6[2],
396 >                             atomData6[3],
397 >                             atomData6[4],
398 >                             atomData6[5]);
399  
400 <        strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
400 >              strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
401          
402        } else {
403          
404 <        sprintf( writeLine,
405 <                 "%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",
406 <                 atomTypeString,
407 <                 atomData13[0],
408 <                 atomData13[1],
409 <                 atomData13[2],
410 <                 atomData13[3],
411 <                 atomData13[4],
412 <                 atomData13[5],
413 <                 atomData13[6],
414 <                 atomData13[7],
415 <                 atomData13[8],
416 <                 atomData13[9],
417 <                 atomData13[10],
418 <                 atomData13[11],
419 <                 atomData13[12]);
404 >              sprintf( writeLine,
405 >                             "%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",
406 >                             atomTypeString,
407 >                             atomData13[0],
408 >                             atomData13[1],
409 >                             atomData13[2],
410 >                             atomData13[3],
411 >                             atomData13[4],
412 >                             atomData13[5],
413 >                             atomData13[6],
414 >                             atomData13[7],
415 >                             atomData13[8],
416 >                             atomData13[9],
417 >                             atomData13[10],
418 >                             atomData13[11],
419 >                             atomData13[12]);
420          
421        }
422        
423 <      outFile << writeLine;
423 >      for(k = 0; k < outFile.size(); k++)
424 >        *outFile[k] << writeLine;
425      }
426      
427 <
428 <    outFile.flush();
427 >    for(k = 0; k < outFile.size(); k++)
428 >      outFile[k]->flush();
429 >    
430      sprintf( checkPointMsg,
431               "Sucessfully took a dump.\n");
432 +
433      MPIcheckPoint();        
434 +
435      delete[] potatoes;
436 +
437    } else {
438  
439      // worldRank != 0, so I'm a remote node.  
# Line 459 | Line 465 | void DumpWriter::writeFrame( ofstream& outFile, double
465          
466            atomTypeString = atoms[local_index]->getType();
467  
468 <          atoms[local_index]->getPos(pos);
469 <          atoms[local_index]->getVel(vel);
468 >                atoms[local_index]->getPos(pos);
469 >                atoms[local_index]->getVel(vel);
470  
471            atomData6[0] = pos[0];
472            atomData6[1] = pos[1];
# Line 486 | Line 492 | void DumpWriter::writeFrame( ofstream& outFile, double
492              atomData13[7] = q[1];
493              atomData13[8] = q[2];
494              atomData13[9] = q[3];
495 <
495 >  
496              atomData13[10] = dAtom->getJx();
497              atomData13[11] = dAtom->getJy();
498              atomData13[12] = dAtom->getJz();
499            }
500  
501          } else {
502 <          sprintf(painCave.errMsg,
503 <                  "Atom %d not found on processor %d\n",
504 <                  i, worldRank );
505 <          haveError= 1;
506 <          simError();
507 <        }
502 >                sprintf(painCave.errMsg,
503 >                              "Atom %d not found on processor %d\n",
504 >                              i, worldRank );
505 >                haveError= 1;
506 >                simError();
507 >              }
508  
509          strncpy(MPIatomTypeString, atomTypeString, MINIBUFFERSIZE);
510  
# Line 506 | Line 512 | void DumpWriter::writeFrame( ofstream& outFile, double
512          MPIatomTypeString[MINIBUFFERSIZE-1] = '\0';
513  
514          MPI_Send(MPIatomTypeString, MINIBUFFERSIZE, MPI_CHAR, 0,
515 <                 myPotato, MPI_COMM_WORLD);
515 >                             myPotato, MPI_COMM_WORLD);
516          
517          myPotato++;
518  
519          MPI_Send(&isDirectional, 1, MPI_INT, 0,
520 <                 myPotato, MPI_COMM_WORLD);
520 >                             myPotato, MPI_COMM_WORLD);
521          
522          myPotato++;
523          

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines