--- branches/development/src/io/DumpWriter.cpp 2012/05/19 18:12:46 1714 +++ branches/development/src/io/DumpWriter.cpp 2012/06/10 14:05:02 1752 @@ -65,6 +65,12 @@ namespace OpenMD { needFlucQ_ = simParams->getOutputFluctuatingCharges(); needElectricField_ = simParams->getOutputElectricField(); + if (needParticlePot_ || needFlucQ_ || needElectricField_) { + doSiteData_ = true; + } else { + doSiteData_ = false; + } + createDumpFile_ = true; #ifdef HAVE_LIBZ if (needCompression_) { @@ -108,6 +114,12 @@ namespace OpenMD { needFlucQ_ = simParams->getOutputFluctuatingCharges(); needElectricField_ = simParams->getOutputElectricField(); + if (needParticlePot_ || needFlucQ_ || needElectricField_) { + doSiteData_ = true; + } else { + doSiteData_ = false; + } + createDumpFile_ = true; #ifdef HAVE_LIBZ if (needCompression_) { @@ -151,6 +163,12 @@ namespace OpenMD { needFlucQ_ = simParams->getOutputFluctuatingCharges(); needElectricField_ = simParams->getOutputElectricField(); + if (needParticlePot_ || needFlucQ_ || needElectricField_) { + doSiteData_ = true; + } else { + doSiteData_ = false; + } + #ifdef HAVE_LIBZ if (needCompression_) { filename_ += ".gz"; @@ -284,6 +302,8 @@ namespace OpenMD { StuntDouble* integrableObject; SimInfo::MoleculeIterator mi; Molecule::IntegrableObjectIterator ii; + RigidBody::AtomIterator ai; + Atom* atom; #ifndef IS_MPI os << " \n"; @@ -301,7 +321,32 @@ namespace OpenMD { } } os << " \n"; - + + if (doSiteData_) { + os << " \n"; + for (mol = info_->beginMolecule(mi); mol != NULL; mol = info_->nextMolecule(mi)) { + + for (integrableObject = mol->beginIntegrableObject(ii); integrableObject != NULL; + integrableObject = mol->nextIntegrableObject(ii)) { + + int ioIndex = integrableObject->getGlobalIntegrableObjectIndex(); + // do one for the IO itself + os << prepareSiteLine(integrableObject, ioIndex, 0); + + if (integrableObject->isRigidBody()) { + + RigidBody* rb = static_cast(integrableObject); + int siteIndex = 0; + for (atom = rb->beginAtom(ai); atom != NULL; + atom = rb->nextAtom(ai)) { + os << prepareSiteLine(atom, ioIndex, siteIndex); + siteIndex++; + } + } + } + } + os << " \n"; + } os << " \n"; os.flush(); @@ -470,27 +515,33 @@ namespace OpenMD { } } - if (needParticlePot_) { - type += "u"; - RealType particlePot = integrableObject->getParticlePot(); - if (isinf(particlePot) || isnan(particlePot)) { - sprintf( painCave.errMsg, - "DumpWriter detected a numerical error writing the particle " - " potential for object %d", index); - painCave.isFatal = 1; - simError(); - } - sprintf(tempBuffer, " %13e", particlePot); - line += tempBuffer; + sprintf(tempBuffer, "%10d %7s %s\n", index, type.c_str(), line.c_str()); + return std::string(tempBuffer); + } + + std::string DumpWriter::prepareSiteLine(StuntDouble* integrableObject, int ioIndex, int siteIndex) { + + + std::string id; + std::string type; + std::string line; + char tempBuffer[4096]; + + if (integrableObject->isRigidBody()) { + sprintf(tempBuffer, "%10d ", ioIndex); + id = std::string(tempBuffer); + } else { + sprintf(tempBuffer, "%10d %10d", ioIndex, siteIndex); + id = std::string(tempBuffer); } - + if (needFlucQ_) { type += "cw"; RealType fqPos = integrableObject->getFlucQPos(); if (isinf(fqPos) || isnan(fqPos) ) { sprintf( painCave.errMsg, "DumpWriter detected a numerical error writing the" - " fluctuating charge for object %d", index); + " fluctuating charge for object %s", id.c_str()); painCave.isFatal = 1; simError(); } @@ -501,7 +552,7 @@ namespace OpenMD { if (isinf(fqVel) || isnan(fqVel) ) { sprintf( painCave.errMsg, "DumpWriter detected a numerical error writing the" - " fluctuating charge velocity for object %d", index); + " fluctuating charge velocity for object %s", id.c_str()); painCave.isFatal = 1; simError(); } @@ -514,7 +565,7 @@ namespace OpenMD { if (isinf(fqFrc) || isnan(fqFrc) ) { sprintf( painCave.errMsg, "DumpWriter detected a numerical error writing the" - " fluctuating charge force for object %d", index); + " fluctuating charge force for object %s", id.c_str()); painCave.isFatal = 1; simError(); } @@ -531,7 +582,7 @@ namespace OpenMD { isinf(eField[2]) || isnan(eField[2]) ) { sprintf( painCave.errMsg, "DumpWriter detected a numerical error writing the electric" - " field for object %d", index); + " field for object %s", id.c_str()); painCave.isFatal = 1; simError(); } @@ -540,7 +591,23 @@ namespace OpenMD { line += tempBuffer; } - sprintf(tempBuffer, "%10d %7s %s\n", index, type.c_str(), line.c_str()); + + if (needParticlePot_) { + type += "u"; + RealType particlePot = integrableObject->getParticlePot(); + if (isinf(particlePot) || isnan(particlePot)) { + sprintf( painCave.errMsg, + "DumpWriter detected a numerical error writing the particle " + " potential for object %s", id.c_str()); + painCave.isFatal = 1; + simError(); + } + sprintf(tempBuffer, " %13e", particlePot); + line += tempBuffer; + } + + + sprintf(tempBuffer, "%s %7s %s\n", id.c_str(), type.c_str(), line.c_str()); return std::string(tempBuffer); } @@ -621,7 +688,7 @@ namespace OpenMD { newOStream = new std::ofstream(filename.c_str()); #endif //write out MetaData first - (*newOStream) << "" << std::endl; + (*newOStream) << "" << std::endl; (*newOStream) << " " << std::endl; (*newOStream) << info_->getRawMetaData(); (*newOStream) << " " << std::endl;