--- trunk/src/io/DumpWriter.cpp 2013/08/01 18:23:07 1921 +++ trunk/src/io/DumpWriter.cpp 2014/04/29 17:32:31 1993 @@ -39,6 +39,12 @@ * [4] Kuang & Gezelter, J. Chem. Phys. 133, 164101 (2010). * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011). */ + +#include "config.h" + +#ifdef IS_MPI +#include +#endif #include "io/DumpWriter.hpp" #include "primitives/Molecule.hpp" @@ -54,15 +60,12 @@ #define isinf(x) (!_finite(x) && !_isnan(x)) #endif -#ifdef IS_MPI -#include -#endif - using namespace std; namespace OpenMD { DumpWriter::DumpWriter(SimInfo* info) - : info_(info), filename_(info->getDumpFileName()), eorFilename_(info->getFinalConfigFileName()){ + : info_(info), filename_(info->getDumpFileName()), + eorFilename_(info->getFinalConfigFileName()){ Globals* simParams = info->getSimParams(); needCompression_ = simParams->getCompressDumpFile(); @@ -70,8 +73,10 @@ namespace OpenMD { needParticlePot_ = simParams->getOutputParticlePotential(); needFlucQ_ = simParams->getOutputFluctuatingCharges(); needElectricField_ = simParams->getOutputElectricField(); + needSitePotential_ = simParams->getOutputSitePotential(); - if (needParticlePot_ || needFlucQ_ || needElectricField_) { + if (needParticlePot_ || needFlucQ_ || needElectricField_ || + needSitePotential_) { doSiteData_ = true; } else { doSiteData_ = false; @@ -119,8 +124,10 @@ namespace OpenMD { needParticlePot_ = simParams->getOutputParticlePotential(); needFlucQ_ = simParams->getOutputFluctuatingCharges(); needElectricField_ = simParams->getOutputElectricField(); + needSitePotential_ = simParams->getOutputSitePotential(); - if (needParticlePot_ || needFlucQ_ || needElectricField_) { + if (needParticlePot_ || needFlucQ_ || needElectricField_ || + needSitePotential_) { doSiteData_ = true; } else { doSiteData_ = false; @@ -168,8 +175,10 @@ namespace OpenMD { needParticlePot_ = simParams->getOutputParticlePotential(); needFlucQ_ = simParams->getOutputFluctuatingCharges(); needElectricField_ = simParams->getOutputElectricField(); + needSitePotential_ = simParams->getOutputSitePotential(); - if (needParticlePot_ || needFlucQ_ || needElectricField_) { + if (needParticlePot_ || needFlucQ_ || needElectricField_ || + needSitePotential_) { doSiteData_ = true; } else { doSiteData_ = false; @@ -302,7 +311,7 @@ namespace OpenMD { void DumpWriter::writeFrame(std::ostream& os) { #ifdef IS_MPI - MPI::Status istatus; + MPI_Status istatus; #endif Molecule* mol; @@ -360,9 +369,13 @@ namespace OpenMD { #else const int masterNode = 0; - int worldRank = MPI::COMM_WORLD.Get_rank(); - int nProc = MPI::COMM_WORLD.Get_size(); + int worldRank; + int nProc; + MPI_Comm_size( MPI_COMM_WORLD, &nProc); + MPI_Comm_rank( MPI_COMM_WORLD, &worldRank); + + if (worldRank == masterNode) { os << " \n"; writeFrameProperties(os, @@ -385,21 +398,21 @@ namespace OpenMD { for (int i = 1; i < nProc; ++i) { // tell processor i to start sending us data: - MPI::COMM_WORLD.Bcast(&i, 1, MPI::INT, masterNode); + MPI_Bcast(&i, 1, MPI_INT, masterNode, MPI_COMM_WORLD); // receive the length of the string buffer that was // prepared by processor i: int recvLength; - MPI::COMM_WORLD.Recv(&recvLength, 1, MPI::INT, i, MPI::ANY_TAG, - istatus); + MPI_Recv(&recvLength, 1, MPI_INT, i, MPI_ANY_TAG, MPI_COMM_WORLD, + &istatus); // create a buffer to receive the data char* recvBuffer = new char[recvLength]; if (recvBuffer == NULL) { } else { // receive the data: - MPI::COMM_WORLD.Recv(recvBuffer, recvLength, MPI::CHAR, i, - MPI::ANY_TAG, istatus); + MPI_Recv(recvBuffer, recvLength, MPI_CHAR, i, + MPI_ANY_TAG, MPI_COMM_WORLD, &istatus); // send it to the file: os << recvBuffer; // get rid of the receive buffer: @@ -411,14 +424,14 @@ namespace OpenMD { int myturn = 0; for (int i = 1; i < nProc; ++i){ // wait for the master node to call our number: - MPI::COMM_WORLD.Bcast(&myturn, 1, MPI::INT, masterNode); + MPI_Bcast(&myturn, 1, MPI_INT, masterNode, MPI_COMM_WORLD); if (myturn == worldRank){ // send the length of our buffer: - MPI::COMM_WORLD.Send(&sendBufferLength, 1, MPI::INT, masterNode, 0); + MPI_Send(&sendBufferLength, 1, MPI_INT, masterNode, 0, MPI_COMM_WORLD); // send our buffer: - MPI::COMM_WORLD.Send((void *)buffer.c_str(), sendBufferLength, - MPI::CHAR, masterNode, 0); + MPI_Send((void *)buffer.c_str(), sendBufferLength, + MPI_CHAR, masterNode, 0, MPI_COMM_WORLD); } } @@ -462,21 +475,21 @@ namespace OpenMD { for (int i = 1; i < nProc; ++i) { // tell processor i to start sending us data: - MPI::COMM_WORLD.Bcast(&i, 1, MPI::INT, masterNode); + MPI_Bcast(&i, 1, MPI_INT, masterNode, MPI_COMM_WORLD); // receive the length of the string buffer that was // prepared by processor i: int recvLength; - MPI::COMM_WORLD.Recv(&recvLength, 1, MPI::INT, i, MPI::ANY_TAG, - istatus); + MPI_Recv(&recvLength, 1, MPI_INT, i, MPI_ANY_TAG, MPI_COMM_WORLD, + &istatus); // create a buffer to receive the data char* recvBuffer = new char[recvLength]; if (recvBuffer == NULL) { } else { // receive the data: - MPI::COMM_WORLD.Recv(recvBuffer, recvLength, MPI::CHAR, i, - MPI::ANY_TAG, istatus); + MPI_Recv(recvBuffer, recvLength, MPI_CHAR, i, + MPI_ANY_TAG, MPI_COMM_WORLD, &istatus); // send it to the file: os << recvBuffer; // get rid of the receive buffer: @@ -488,13 +501,13 @@ namespace OpenMD { int myturn = 0; for (int i = 1; i < nProc; ++i){ // wait for the master node to call our number: - MPI::COMM_WORLD.Bcast(&myturn, 1, MPI::INT, masterNode); + MPI_Bcast(&myturn, 1, MPI_INT, masterNode, MPI_COMM_WORLD); if (myturn == worldRank){ // send the length of our buffer: - MPI::COMM_WORLD.Send(&sendBufferLength, 1, MPI::INT, masterNode, 0); + MPI_Send(&sendBufferLength, 1, MPI_INT, masterNode, 0, MPI_COMM_WORLD); // send our buffer: - MPI::COMM_WORLD.Send((void *)buffer.c_str(), sendBufferLength, - MPI::CHAR, masterNode, 0); + MPI_Send((void *)buffer.c_str(), sendBufferLength, + MPI_CHAR, masterNode, 0, MPI_COMM_WORLD); } } } @@ -705,7 +718,22 @@ namespace OpenMD { } } - + if (needSitePotential_) { + if (storageLayout & DataStorage::dslSitePotential) { + type += "s"; + RealType sPot = sd->getSitePotential(); + if (isinf(sPot) || isnan(sPot) ) { + sprintf( painCave.errMsg, + "DumpWriter detected a numerical error writing the" + " site potential for object %s", id.c_str()); + painCave.isFatal = 1; + simError(); + } + sprintf(tempBuffer, " %13e ", sPot); + line += tempBuffer; + } + } + if (needParticlePot_) { if (storageLayout & DataStorage::dslParticlePot) { type += "u"; @@ -731,8 +759,9 @@ namespace OpenMD { } void DumpWriter::writeEor() { - std::ostream* eorStream; - + + std::ostream* eorStream = NULL; + #ifdef IS_MPI if (worldRank == 0) { #endif // is_mpi @@ -765,20 +794,15 @@ namespace OpenMD { #ifdef IS_MPI if (worldRank == 0) { #endif // is_mpi - buffers.push_back(dumpFile_->rdbuf()); - eorStream = createOStream(eorFilename_); - buffers.push_back(eorStream->rdbuf()); - #ifdef IS_MPI } #endif // is_mpi TeeBuf tbuf(buffers.begin(), buffers.end()); std::ostream os(&tbuf); - writeFrame(os); #ifdef IS_MPI @@ -788,8 +812,7 @@ namespace OpenMD { delete eorStream; #ifdef IS_MPI } -#endif // is_mpi - +#endif // is_mpi } std::ostream* DumpWriter::createOStream(const std::string& filename) {