# | Line 35 | Line 35 | |
---|---|---|
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 | */ | |
# | Line 310 | Line 310 | namespace OpenMD { | |
310 | SimInfo::MoleculeIterator mi; | |
311 | Molecule::IntegrableObjectIterator ii; | |
312 | RigidBody::AtomIterator ai; | |
313 | – | Atom* atom; |
313 | ||
314 | #ifndef IS_MPI | |
315 | os << " <Snapshot>\n"; | |
# | Line 318 | Line 317 | namespace OpenMD { | |
317 | writeFrameProperties(os, info_->getSnapshotManager()->getCurrentSnapshot()); | |
318 | ||
319 | os << " <StuntDoubles>\n"; | |
320 | < | for (mol = info_->beginMolecule(mi); mol != NULL; mol = info_->nextMolecule(mi)) { |
321 | < | |
320 | > | for (mol = info_->beginMolecule(mi); mol != NULL; |
321 | > | mol = info_->nextMolecule(mi)) { |
322 | ||
323 | for (sd = mol->beginIntegrableObject(ii); sd != NULL; | |
324 | sd = mol->nextIntegrableObject(ii)) { | |
# | Line 335 | Line 334 | namespace OpenMD { | |
334 | mol = info_->nextMolecule(mi)) { | |
335 | ||
336 | for (sd = mol->beginIntegrableObject(ii); sd != NULL; | |
337 | < | sd = mol->nextIntegrableObject(ii)) { |
338 | < | |
337 | > | sd = mol->nextIntegrableObject(ii)) { |
338 | > | |
339 | int ioIndex = sd->getGlobalIntegrableObjectIndex(); | |
340 | // do one for the IO itself | |
341 | os << prepareSiteLine(sd, ioIndex, 0); | |
# | Line 345 | Line 344 | namespace OpenMD { | |
344 | ||
345 | RigidBody* rb = static_cast<RigidBody*>(sd); | |
346 | int siteIndex = 0; | |
347 | < | for (atom = rb->beginAtom(ai); atom != NULL; |
347 | > | for (Atom* atom = rb->beginAtom(ai); atom != NULL; |
348 | atom = rb->nextAtom(ai)) { | |
349 | os << prepareSiteLine(atom, ioIndex, siteIndex); | |
350 | siteIndex++; | |
# | Line 420 | Line 419 | namespace OpenMD { | |
419 | // send our buffer: | |
420 | MPI::COMM_WORLD.Send((void *)buffer.c_str(), sendBufferLength, | |
421 | MPI::CHAR, masterNode, 0); | |
422 | + | |
423 | } | |
424 | } | |
425 | } | |
# | Line 447 | Line 447 | namespace OpenMD { | |
447 | ||
448 | RigidBody* rb = static_cast<RigidBody*>(sd); | |
449 | int siteIndex = 0; | |
450 | < | for (atom = rb->beginAtom(ai); atom != NULL; |
450 | > | for (Atom* atom = rb->beginAtom(ai); atom != NULL; |
451 | atom = rb->nextAtom(ai)) { | |
452 | buffer += prepareSiteLine(atom, ioIndex, siteIndex); | |
453 | siteIndex++; | |
# | Line 625 | Line 625 | namespace OpenMD { | |
625 | } | |
626 | ||
627 | std::string DumpWriter::prepareSiteLine(StuntDouble* sd, int ioIndex, int siteIndex) { | |
628 | < | |
628 | > | int storageLayout = info_->getSnapshotManager()->getStorageLayout(); |
629 | ||
630 | std::string id; | |
631 | std::string type; | |
# | Line 641 | Line 641 | namespace OpenMD { | |
641 | } | |
642 | ||
643 | if (needFlucQ_) { | |
644 | < | type += "cw"; |
645 | < | RealType fqPos = sd->getFlucQPos(); |
646 | < | if (isinf(fqPos) || isnan(fqPos) ) { |
647 | < | sprintf( painCave.errMsg, |
648 | < | "DumpWriter detected a numerical error writing the" |
649 | < | " fluctuating charge for object %s", id.c_str()); |
650 | < | painCave.isFatal = 1; |
651 | < | simError(); |
652 | < | } |
653 | < | sprintf(tempBuffer, " %13e ", fqPos); |
654 | < | line += tempBuffer; |
655 | < | |
656 | < | RealType fqVel = sd->getFlucQVel(); |
657 | < | if (isinf(fqVel) || isnan(fqVel) ) { |
658 | < | sprintf( painCave.errMsg, |
659 | < | "DumpWriter detected a numerical error writing the" |
660 | < | " fluctuating charge velocity for object %s", id.c_str()); |
661 | < | painCave.isFatal = 1; |
662 | < | simError(); |
663 | < | } |
664 | < | sprintf(tempBuffer, " %13e ", fqVel); |
665 | < | line += tempBuffer; |
644 | > | if (storageLayout & DataStorage::dslFlucQPosition) { |
645 | > | type += "c"; |
646 | > | RealType fqPos = sd->getFlucQPos(); |
647 | > | if (isinf(fqPos) || isnan(fqPos) ) { |
648 | > | sprintf( painCave.errMsg, |
649 | > | "DumpWriter detected a numerical error writing the" |
650 | > | " fluctuating charge for object %s", id.c_str()); |
651 | > | painCave.isFatal = 1; |
652 | > | simError(); |
653 | > | } |
654 | > | sprintf(tempBuffer, " %13e ", fqPos); |
655 | > | line += tempBuffer; |
656 | > | } |
657 | ||
658 | < | if (needForceVector_) { |
659 | < | type += "g"; |
660 | < | RealType fqFrc = sd->getFlucQFrc(); |
661 | < | if (isinf(fqFrc) || isnan(fqFrc) ) { |
658 | > | if (storageLayout & DataStorage::dslFlucQVelocity) { |
659 | > | type += "w"; |
660 | > | RealType fqVel = sd->getFlucQVel(); |
661 | > | if (isinf(fqVel) || isnan(fqVel) ) { |
662 | sprintf( painCave.errMsg, | |
663 | "DumpWriter detected a numerical error writing the" | |
664 | < | " fluctuating charge force for object %s", id.c_str()); |
664 | > | " fluctuating charge velocity for object %s", id.c_str()); |
665 | painCave.isFatal = 1; | |
666 | simError(); | |
667 | } | |
668 | < | sprintf(tempBuffer, " %13e ", fqFrc); |
668 | > | sprintf(tempBuffer, " %13e ", fqVel); |
669 | line += tempBuffer; | |
670 | } | |
680 | – | } |
671 | ||
672 | + | if (needForceVector_) { |
673 | + | if (storageLayout & DataStorage::dslFlucQForce) { |
674 | + | type += "g"; |
675 | + | RealType fqFrc = sd->getFlucQFrc(); |
676 | + | if (isinf(fqFrc) || isnan(fqFrc) ) { |
677 | + | sprintf( painCave.errMsg, |
678 | + | "DumpWriter detected a numerical error writing the" |
679 | + | " fluctuating charge force for object %s", id.c_str()); |
680 | + | painCave.isFatal = 1; |
681 | + | simError(); |
682 | + | } |
683 | + | sprintf(tempBuffer, " %13e ", fqFrc); |
684 | + | line += tempBuffer; |
685 | + | } |
686 | + | } |
687 | + | } |
688 | + | |
689 | if (needElectricField_) { | |
690 | < | type += "e"; |
691 | < | Vector3d eField= sd->getElectricField(); |
692 | < | if (isinf(eField[0]) || isnan(eField[0]) || |
693 | < | isinf(eField[1]) || isnan(eField[1]) || |
694 | < | isinf(eField[2]) || isnan(eField[2]) ) { |
695 | < | sprintf( painCave.errMsg, |
696 | < | "DumpWriter detected a numerical error writing the electric" |
697 | < | " field for object %s", id.c_str()); |
698 | < | painCave.isFatal = 1; |
699 | < | simError(); |
690 | > | if (storageLayout & DataStorage::dslElectricField) { |
691 | > | type += "e"; |
692 | > | Vector3d eField= sd->getElectricField(); |
693 | > | if (isinf(eField[0]) || isnan(eField[0]) || |
694 | > | isinf(eField[1]) || isnan(eField[1]) || |
695 | > | isinf(eField[2]) || isnan(eField[2]) ) { |
696 | > | sprintf( painCave.errMsg, |
697 | > | "DumpWriter detected a numerical error writing the electric" |
698 | > | " field for object %s", id.c_str()); |
699 | > | painCave.isFatal = 1; |
700 | > | simError(); |
701 | > | } |
702 | > | sprintf(tempBuffer, " %13e %13e %13e", |
703 | > | eField[0], eField[1], eField[2]); |
704 | > | line += tempBuffer; |
705 | } | |
694 | – | sprintf(tempBuffer, " %13e %13e %13e", |
695 | – | eField[0], eField[1], eField[2]); |
696 | – | line += tempBuffer; |
706 | } | |
707 | ||
708 | ||
709 | if (needParticlePot_) { | |
710 | < | type += "u"; |
711 | < | RealType particlePot = sd->getParticlePot(); |
712 | < | if (isinf(particlePot) || isnan(particlePot)) { |
713 | < | sprintf( painCave.errMsg, |
714 | < | "DumpWriter detected a numerical error writing the particle " |
715 | < | " potential for object %s", id.c_str()); |
716 | < | painCave.isFatal = 1; |
717 | < | simError(); |
710 | > | if (storageLayout & DataStorage::dslParticlePot) { |
711 | > | type += "u"; |
712 | > | RealType particlePot = sd->getParticlePot(); |
713 | > | if (isinf(particlePot) || isnan(particlePot)) { |
714 | > | sprintf( painCave.errMsg, |
715 | > | "DumpWriter detected a numerical error writing the particle " |
716 | > | " potential for object %s", id.c_str()); |
717 | > | painCave.isFatal = 1; |
718 | > | simError(); |
719 | > | } |
720 | > | sprintf(tempBuffer, " %13e", particlePot); |
721 | > | line += tempBuffer; |
722 | } | |
710 | – | sprintf(tempBuffer, " %13e", particlePot); |
711 | – | line += tempBuffer; |
723 | } | |
724 | < | |
714 | < | |
724 | > | |
725 | sprintf(tempBuffer, "%s %7s %s\n", id.c_str(), type.c_str(), line.c_str()); | |
726 | return std::string(tempBuffer); | |
727 | } | |
# | Line 726 | Line 736 | namespace OpenMD { | |
736 | #ifdef IS_MPI | |
737 | if (worldRank == 0) { | |
738 | #endif // is_mpi | |
739 | < | |
739 | > | |
740 | eorStream = createOStream(eorFilename_); | |
741 | ||
742 | #ifdef IS_MPI | |
743 | } | |
744 | < | #endif // is_mpi |
745 | < | |
744 | > | #endif |
745 | > | |
746 | writeFrame(*eorStream); | |
747 | < | |
747 | > | |
748 | #ifdef IS_MPI | |
749 | if (worldRank == 0) { | |
750 | < | #endif // is_mpi |
750 | > | #endif |
751 | > | |
752 | writeClosing(*eorStream); | |
753 | delete eorStream; | |
754 | + | |
755 | #ifdef IS_MPI | |
756 | } | |
757 | #endif // is_mpi |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |