| 35 |
|
* |
| 36 |
|
* [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005). |
| 37 |
|
* [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006). |
| 38 |
< |
* [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008). |
| 38 |
> |
* [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008). |
| 39 |
|
* [4] Kuang & Gezelter, J. Chem. Phys. 133, 164101 (2010). |
| 40 |
|
* [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011). |
| 41 |
|
*/ |
| 43 |
|
#define _LARGEFILE_SOURCE64 |
| 44 |
|
#define _FILE_OFFSET_BITS 64 |
| 45 |
|
|
| 46 |
+ |
#ifdef IS_MPI |
| 47 |
+ |
#include <mpi.h> |
| 48 |
+ |
#endif |
| 49 |
+ |
|
| 50 |
|
#include <sys/types.h> |
| 51 |
|
#include <sys/stat.h> |
| 52 |
|
|
| 64 |
|
#include "utils/StringTokenizer.hpp" |
| 65 |
|
#include "brains/Thermo.hpp" |
| 66 |
|
|
| 63 |
– |
#ifdef IS_MPI |
| 64 |
– |
#include <mpi.h> |
| 65 |
– |
#endif |
| 67 |
|
|
| 67 |
– |
|
| 68 |
|
namespace OpenMD { |
| 69 |
|
|
| 70 |
|
DumpReader::DumpReader(SimInfo* info, const std::string& filename) |
| 103 |
|
#ifdef IS_MPI |
| 104 |
|
|
| 105 |
|
if (worldRank == 0) { |
| 106 |
< |
#endif |
| 106 |
> |
#endif |
| 107 |
> |
|
| 108 |
> |
inFile_->~istream(); |
| 109 |
|
|
| 108 |
– |
delete inFile_; |
| 109 |
– |
|
| 110 |
|
#ifdef IS_MPI |
| 111 |
|
|
| 112 |
|
} |
| 128 |
|
} |
| 129 |
|
|
| 130 |
|
void DumpReader::scanFile(void) { |
| 131 |
< |
int lineNo = 0; |
| 131 |
> |
|
| 132 |
|
std::streampos prevPos; |
| 133 |
|
std::streampos currPos; |
| 134 |
|
|
| 142 |
|
bool foundOpenSnapshotTag = false; |
| 143 |
|
bool foundClosedSnapshotTag = false; |
| 144 |
|
|
| 145 |
+ |
int lineNo = 0; |
| 146 |
|
while(inFile_->getline(buffer, bufferSize)) { |
| 147 |
|
++lineNo; |
| 148 |
|
|
| 203 |
|
#ifdef IS_MPI |
| 204 |
|
} |
| 205 |
|
|
| 206 |
< |
MPI::COMM_WORLD.Bcast(&nframes_, 1, MPI::INT, 0); |
| 206 |
> |
MPI_Bcast(&nframes_, 1, MPI_INT, 0, MPI_COMM_WORLD); |
| 207 |
|
|
| 208 |
|
#endif // is_mpi |
| 209 |
|
|
| 228 |
|
needVel_ = false; |
| 229 |
|
} |
| 230 |
|
|
| 231 |
< |
if (storageLayout & DataStorage::dslAmat || storageLayout & DataStorage::dslElectroFrame) { |
| 231 |
> |
if (storageLayout & DataStorage::dslAmat || |
| 232 |
> |
storageLayout & DataStorage::dslDipole || |
| 233 |
> |
storageLayout & DataStorage::dslQuadrupole) { |
| 234 |
|
needQuaternion_ = true; |
| 235 |
|
} else { |
| 236 |
|
needQuaternion_ = false; |
| 289 |
|
} |
| 290 |
|
|
| 291 |
|
int sendBufferSize = sendBuffer.size(); |
| 292 |
< |
MPI::COMM_WORLD.Bcast(&sendBufferSize, 1, MPI::INT, masterNode); |
| 293 |
< |
MPI::COMM_WORLD.Bcast((void *)sendBuffer.c_str(), sendBufferSize, |
| 294 |
< |
MPI::CHAR, masterNode); |
| 292 |
> |
MPI_Bcast(&sendBufferSize, 1, MPI_INT, masterNode, MPI_COMM_WORLD); |
| 293 |
> |
MPI_Bcast((void *)sendBuffer.c_str(), sendBufferSize, |
| 294 |
> |
MPI_CHAR, masterNode, MPI_COMM_WORLD); |
| 295 |
|
|
| 296 |
|
sstream.str(sendBuffer); |
| 297 |
|
} else { |
| 298 |
|
int sendBufferSize; |
| 299 |
< |
MPI::COMM_WORLD.Bcast(&sendBufferSize, 1, MPI::INT, masterNode); |
| 299 |
> |
MPI_Bcast(&sendBufferSize, 1, MPI_INT, masterNode, MPI_COMM_WORLD); |
| 300 |
|
char * recvBuffer = new char[sendBufferSize+1]; |
| 301 |
|
assert(recvBuffer); |
| 302 |
|
recvBuffer[sendBufferSize] = '\0'; |
| 303 |
< |
MPI::COMM_WORLD.Bcast(recvBuffer, sendBufferSize, MPI::CHAR, masterNode); |
| 303 |
> |
MPI_Bcast(recvBuffer, sendBufferSize, MPI_CHAR, masterNode, MPI_COMM_WORLD); |
| 304 |
|
sstream.str(recvBuffer); |
| 305 |
|
delete [] recvBuffer; |
| 306 |
|
} |
| 510 |
|
sd->setElectricField(eField); |
| 511 |
|
break; |
| 512 |
|
} |
| 513 |
+ |
case 's' : { |
| 514 |
+ |
|
| 515 |
+ |
RealType sPot; |
| 516 |
+ |
sPot = tokenizer.nextTokenAsDouble(); |
| 517 |
+ |
sd->setSitePotential(sPot); |
| 518 |
+ |
break; |
| 519 |
+ |
} |
| 520 |
|
default: { |
| 521 |
|
sprintf(painCave.errMsg, |
| 522 |
|
"DumpReader Error: %s is an unrecognized type\n", type.c_str()); |
| 527 |
|
|
| 528 |
|
} |
| 529 |
|
} |
| 520 |
– |
|
| 530 |
|
} |
| 531 |
|
|
| 532 |
|
|
| 534 |
|
|
| 535 |
|
StringTokenizer tokenizer(line); |
| 536 |
|
int nTokens; |
| 537 |
< |
|
| 537 |
> |
|
| 538 |
|
nTokens = tokenizer.countTokens(); |
| 539 |
|
|
| 540 |
|
if (nTokens < 2) { |
| 566 |
|
if (i >> siteIndex) { |
| 567 |
|
// chew up this token and parse as an int: |
| 568 |
|
siteIndex = tokenizer.nextTokenAsInt(); |
| 569 |
< |
RigidBody* rb = static_cast<RigidBody*>(sd); |
| 570 |
< |
sd = rb->getAtoms()[siteIndex]; |
| 569 |
> |
|
| 570 |
> |
if (sd->isRigidBody()) { |
| 571 |
> |
RigidBody* rb = static_cast<RigidBody*>(sd); |
| 572 |
> |
sd = rb->getAtoms()[siteIndex]; |
| 573 |
> |
} |
| 574 |
|
} |
| 575 |
|
|
| 576 |
|
/** |
| 619 |
|
sd->setElectricField(eField); |
| 620 |
|
break; |
| 621 |
|
} |
| 622 |
+ |
case 's' : { |
| 623 |
+ |
|
| 624 |
+ |
RealType sPot; |
| 625 |
+ |
sPot = tokenizer.nextTokenAsDouble(); |
| 626 |
+ |
sd->setSitePotential(sPot); |
| 627 |
+ |
break; |
| 628 |
+ |
} |
| 629 |
|
default: { |
| 630 |
|
sprintf(painCave.errMsg, |
| 631 |
|
"DumpReader Error: %s is an unrecognized type\n", type.c_str()); |
| 638 |
|
} |
| 639 |
|
|
| 640 |
|
|
| 641 |
< |
void DumpReader::readStuntDoubles(std::istream& inputStream) { |
| 641 |
> |
void DumpReader::readStuntDoubles(std::istream& inputStream) { |
| 642 |
|
|
| 643 |
|
inputStream.getline(buffer, bufferSize); |
| 644 |
|
std::string line(buffer); |
| 664 |
|
|
| 665 |
|
void DumpReader::readSiteData(std::istream& inputStream) { |
| 666 |
|
|
| 648 |
– |
inputStream.getline(buffer, bufferSize); |
| 667 |
|
std::string line(buffer); |
| 650 |
– |
|
| 651 |
– |
if (line.find("<SiteData>") == std::string::npos) { |
| 652 |
– |
// site data isn't required for a simulation, so skip |
| 653 |
– |
return; |
| 654 |
– |
} |
| 668 |
|
|
| 669 |
+ |
// We already found the starting <SiteData> tag or we wouldn't be |
| 670 |
+ |
// here, so just start parsing until we get to the ending |
| 671 |
+ |
// </SiteData> tag: |
| 672 |
+ |
|
| 673 |
|
while(inputStream.getline(buffer, bufferSize)) { |
| 674 |
|
line = buffer; |
| 675 |
|
|