ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/io/DumpWriter.cpp
(Generate patch)

Comparing branches/development/src/io/DumpWriter.cpp (file contents):
Revision 1746 by gezelter, Wed Jun 6 02:18:54 2012 UTC vs.
Revision 1764 by gezelter, Tue Jul 3 18:32:27 2012 UTC

# Line 50 | Line 50
50  
51   #ifdef IS_MPI
52   #include <mpi.h>
53 < #endif //is_mpi
53 > #endif
54  
55   using namespace std;
56   namespace OpenMD {
# Line 65 | Line 65 | namespace OpenMD {
65      needFlucQ_         = simParams->getOutputFluctuatingCharges();
66      needElectricField_ = simParams->getOutputElectricField();
67  
68 +    if (needParticlePot_ || needFlucQ_ || needElectricField_) {
69 +      doSiteData_ = true;
70 +    } else {
71 +      doSiteData_ = false;
72 +    }
73 +
74      createDumpFile_ = true;
75   #ifdef HAVE_LIBZ
76      if (needCompression_) {
# Line 108 | Line 114 | namespace OpenMD {
114      needFlucQ_         = simParams->getOutputFluctuatingCharges();
115      needElectricField_ = simParams->getOutputElectricField();
116  
117 +    if (needParticlePot_ || needFlucQ_ || needElectricField_) {
118 +      doSiteData_ = true;
119 +    } else {
120 +      doSiteData_ = false;
121 +    }
122 +
123      createDumpFile_ = true;
124   #ifdef HAVE_LIBZ
125      if (needCompression_) {
# Line 151 | Line 163 | namespace OpenMD {
163      needFlucQ_         = simParams->getOutputFluctuatingCharges();
164      needElectricField_ = simParams->getOutputElectricField();
165  
166 +    if (needParticlePot_ || needFlucQ_ || needElectricField_) {
167 +      doSiteData_ = true;
168 +    } else {
169 +      doSiteData_ = false;
170 +    }
171 +
172   #ifdef HAVE_LIBZ
173      if (needCompression_) {
174        filename_ += ".gz";
# Line 239 | Line 257 | namespace OpenMD {
257              hmat(0, 2), hmat(1, 2), hmat(2, 2));
258      os << buffer;
259  
260 <    RealType chi = s->getChi();
261 <    RealType integralOfChiDt = s->getIntegralOfChiDt();
262 <    if (isinf(chi) || isnan(chi) ||
263 <        isinf(integralOfChiDt) || isnan(integralOfChiDt)) {      
260 >    pair<RealType, RealType> thermostat = s->getThermostat();
261 >
262 >    if (isinf(thermostat.first)  || isnan(thermostat.first) ||
263 >        isinf(thermostat.second) || isnan(thermostat.second)) {      
264        sprintf( painCave.errMsg,
265                 "DumpWriter detected a numerical error writing the thermostat");
266        painCave.isFatal = 1;
267        simError();
268      }
269 <    sprintf(buffer, "  Thermostat: %.10g , %.10g\n", chi, integralOfChiDt);
269 >    sprintf(buffer, "  Thermostat: %.10g , %.10g\n", thermostat.first,
270 >            thermostat.second);
271      os << buffer;
272  
273      Mat3x3d eta;
274 <    eta = s->getEta();
274 >    eta = s->getBarostat();
275  
276      for (unsigned int i = 0; i < 3; i++) {
277        for (unsigned int j = 0; j < 3; j++) {
# Line 284 | Line 303 | namespace OpenMD {
303      StuntDouble* integrableObject;
304      SimInfo::MoleculeIterator mi;
305      Molecule::IntegrableObjectIterator ii;
306 +    RigidBody::AtomIterator ai;
307 +    Atom* atom;
308  
309   #ifndef IS_MPI
310      os << "  <Snapshot>\n";
# Line 301 | Line 322 | namespace OpenMD {
322        }
323      }    
324      os << "    </StuntDoubles>\n";
325 <    
325 >
326 >    if (doSiteData_) {
327 >      os << "    <SiteData>\n";
328 >      for (mol = info_->beginMolecule(mi); mol != NULL; mol = info_->nextMolecule(mi)) {
329 >              
330 >        for (integrableObject = mol->beginIntegrableObject(ii); integrableObject != NULL;  
331 >           integrableObject = mol->nextIntegrableObject(ii)) {  
332 >
333 >          int ioIndex = integrableObject->getGlobalIntegrableObjectIndex();
334 >          // do one for the IO itself
335 >          os << prepareSiteLine(integrableObject, ioIndex, 0);
336 >
337 >          if (integrableObject->isRigidBody()) {
338 >            
339 >            RigidBody* rb = static_cast<RigidBody*>(integrableObject);
340 >            int siteIndex = 0;
341 >            for (atom = rb->beginAtom(ai); atom != NULL;  
342 >                 atom = rb->nextAtom(ai)) {                                            
343 >              os << prepareSiteLine(atom, ioIndex, siteIndex);
344 >              siteIndex++;
345 >            }
346 >          }
347 >        }
348 >      }    
349 >      os << "    </SiteData>\n";
350 >    }
351      os << "  </Snapshot>\n";
352  
353      os.flush();
# Line 470 | Line 516 | namespace OpenMD {
516        }      
517      }
518  
519 <    if (needParticlePot_) {
520 <      type += "u";
521 <      RealType particlePot = integrableObject->getParticlePot();
522 <      if (isinf(particlePot) || isnan(particlePot)) {      
523 <        sprintf( painCave.errMsg,
524 <                 "DumpWriter detected a numerical error writing the particle "
525 <                 " potential for object %d", index);      
526 <        painCave.isFatal = 1;
527 <        simError();
528 <      }
529 <      sprintf(tempBuffer, " %13e", particlePot);
530 <      line += tempBuffer;
519 >    sprintf(tempBuffer, "%10d %7s %s\n", index, type.c_str(), line.c_str());
520 >    return std::string(tempBuffer);
521 >  }
522 >
523 >  std::string DumpWriter::prepareSiteLine(StuntDouble* integrableObject, int ioIndex, int siteIndex) {
524 >        
525 >
526 >    std::string id;
527 >    std::string type;
528 >    std::string line;
529 >    char tempBuffer[4096];
530 >
531 >    if (integrableObject->isRigidBody()) {
532 >      sprintf(tempBuffer, "%10d           ", ioIndex);
533 >      id = std::string(tempBuffer);
534 >    } else {
535 >      sprintf(tempBuffer, "%10d %10d", ioIndex, siteIndex);
536 >      id = std::string(tempBuffer);
537      }
538 <    
538 >              
539      if (needFlucQ_) {
540        type += "cw";
541        RealType fqPos = integrableObject->getFlucQPos();
542        if (isinf(fqPos) || isnan(fqPos) ) {      
543          sprintf( painCave.errMsg,
544                   "DumpWriter detected a numerical error writing the"
545 <                 " fluctuating charge for object %d", index);      
545 >                 " fluctuating charge for object %s", id.c_str());      
546          painCave.isFatal = 1;
547          simError();
548        }
# Line 501 | Line 553 | namespace OpenMD {
553        if (isinf(fqVel) || isnan(fqVel) ) {      
554          sprintf( painCave.errMsg,
555                   "DumpWriter detected a numerical error writing the"
556 <                 " fluctuating charge velocity for object %d", index);      
556 >                 " fluctuating charge velocity for object %s", id.c_str());      
557          painCave.isFatal = 1;
558          simError();
559        }
# Line 514 | Line 566 | namespace OpenMD {
566          if (isinf(fqFrc) || isnan(fqFrc) ) {      
567            sprintf( painCave.errMsg,
568                     "DumpWriter detected a numerical error writing the"
569 <                   " fluctuating charge force for object %d", index);      
569 >                   " fluctuating charge force for object %s", id.c_str());      
570            painCave.isFatal = 1;
571            simError();
572          }
# Line 531 | Line 583 | namespace OpenMD {
583            isinf(eField[2]) || isnan(eField[2]) ) {      
584          sprintf( painCave.errMsg,
585                   "DumpWriter detected a numerical error writing the electric"
586 <                 " field for object %d", index);      
586 >                 " field for object %s", id.c_str());      
587          painCave.isFatal = 1;
588          simError();
589        }
# Line 540 | Line 592 | namespace OpenMD {
592        line += tempBuffer;
593      }
594  
595 <    sprintf(tempBuffer, "%10d %7s %s\n", index, type.c_str(), line.c_str());
595 >
596 >    if (needParticlePot_) {
597 >      type += "u";
598 >      RealType particlePot = integrableObject->getParticlePot();
599 >      if (isinf(particlePot) || isnan(particlePot)) {      
600 >        sprintf( painCave.errMsg,
601 >                 "DumpWriter detected a numerical error writing the particle "
602 >                 " potential for object %s", id.c_str());      
603 >        painCave.isFatal = 1;
604 >        simError();
605 >      }
606 >      sprintf(tempBuffer, " %13e", particlePot);
607 >      line += tempBuffer;
608 >    }
609 >    
610 >
611 >    sprintf(tempBuffer, "%s %7s %s\n", id.c_str(), type.c_str(), line.c_str());
612      return std::string(tempBuffer);
613    }
614  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines