48#include "visitors/ZconsVisitor.hpp"
54#include "types/ZconsStamp.hpp"
60 BaseVisitor(), zconsReader_(NULL), info_(info) {
61 visitorName =
"ZConsVisitor";
62 currSnapshot_ = info_->getSnapshotManager()->getCurrentSnapshot();
63 Globals* simParam = info_->getSimParams();
65 if (simParam->haveZconsTime()) {
66 zconsTime_ = simParam->getZconsTime();
68 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
69 "ZConstraint error: If you use a ZConstraint,\n"
70 "\tyou must set zconsTime.\n");
75 if (simParam->haveZconsTol()) {
76 zconsTol_ = simParam->getZconsTol();
79 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
80 "ZConstraint Warning: Tolerance for z-constraint method is not "
82 "\tOpenMD will use a default value of %f.\n"
83 "\tTo set the tolerance, use the zconsTol variable.\n",
89 int nZconstraints = simParam->getNZconsStamps();
90 std::vector<ZConsStamp*> stamp = simParam->getZconsStamps();
91 for (
int i = 0; i < nZconstraints; i++) {
92 int zmolIndex = stamp[i]->getMolIndex();
93 zmolStates_.insert(std::make_pair(zmolIndex, zsMoving));
98 std::map<int, ZConsState>::iterator j;
99 for (j = zmolStates_.begin(); j != zmolStates_.end(); ++j) {
100 Molecule* mol = info_->getMoleculeByGlobalIndex(j->first);
102 Molecule::AtomIterator ai;
104 for (at = mol->beginAtom(ai); at != NULL; at = mol->nextAtom(ai)) {
106 std::make_pair(at->getGlobalIndex(), mol->getGlobalIndex()));
110 zconsFilename_ =
getPrefix(info_->getFinalConfigFileName()) +
".fz";
114 if (zconsReader_->hasNextFrame()) zconsReader_->readNextFrame();
117 ZConsVisitor::~ZConsVisitor() {
delete zconsReader_; }
119 void ZConsVisitor::visit(Atom* atom) {
121 if (isZconstraint(atom->getGlobalIndex(), prefix))
122 internalVisit(atom, prefix);
125 void ZConsVisitor::visit(DirectionalAtom* datom) {
128 if (isZconstraint(datom->getGlobalIndex(), prefix))
129 internalVisit(datom, prefix);
132 void ZConsVisitor::visit(RigidBody* rb) {
134 std::vector<Atom*> atoms;
136 atoms = rb->getAtoms();
138 if (isZconstraint(atoms[0]->getGlobalIndex(), prefix))
139 internalVisit(rb, prefix);
142 void ZConsVisitor::update() {
144 std::map<int, ZConsState>::iterator i;
145 for (i = zmolStates_.begin(); i != zmolStates_.end(); ++i) {
146 i->second = zsMoving;
149 readZconsFile(currSnapshot_->getTime());
151 const std::vector<ZconsData>& fixedZmolData =
152 zconsReader_->getFixedZMolData();
153 std::vector<ZconsData>::const_iterator j;
154 for (j = fixedZmolData.begin(); j != fixedZmolData.end(); ++j) {
155 std::map<int, ZConsState>::iterator k = zmolStates_.find(j->zmolIndex);
156 assert(k != zmolStates_.end());
161 void ZConsVisitor::readZconsFile(RealType time) {
163 while (zconsReader_->hasNextFrame()) {
164 tempTime = zconsReader_->getCurTime();
165 if (tempTime >= time) {
return; }
167 zconsReader_->readNextFrame();
171 void ZConsVisitor::internalVisit(StuntDouble* sd,
const std::string& prefix) {
172 std::shared_ptr<GenericData> data;
173 std::shared_ptr<AtomData> atomData;
174 std::shared_ptr<AtomInfo> atomInfo;
175 std::vector<std::shared_ptr<AtomInfo>>::iterator iter;
178 data = sd->getPropertyByName(
"ATOMDATA");
179 if (data !=
nullptr) {
180 atomData = std::dynamic_pointer_cast<AtomData>(data);
181 if (atomData ==
nullptr)
return;
185 for (atomInfo = atomData->beginAtomInfo(iter); atomInfo;
186 atomInfo = atomData->nextAtomInfo(iter))
187 (atomInfo->atomTypeName).insert(0, prefix);
190 bool ZConsVisitor::isZconstraint(
int atomIndex, std::string& prefix) {
191 std::string prefixString[] = {
"ZF",
"ZM"};
192 std::map<int, int>::iterator i = zatomToZmol_.find(atomIndex);
193 if (i == zatomToZmol_.end()) {
197 std::map<int, ZConsState>::iterator j = zmolStates_.find(i->second);
198 assert(j != zmolStates_.end());
199 prefix = prefixString[j->second];
204 const std::string ZConsVisitor::toString() {
210 "------------------------------------------------------------------\n");
213 snprintf(buffer, 65535,
"Visitor name: %s\n", visitorName.c_str());
216 snprintf(buffer, 65535,
"number of zconstraint molecule: %d\n",
217 (
int)zmolStates_.size());
220 snprintf(buffer, 65535,
"zconstraint tolerance = %lf\n", zconsTol_);
223 snprintf(buffer, 65535,
"zconstraint sample time = %lf\n", zconsTime_);
226 snprintf(buffer, 65535,
"zconstraint output filename = %s\n",
227 zconsFilename_.c_str());
230 std::map<int, ZConsState>::iterator i;
232 for (i = zmolStates_.begin(); i != zmolStates_.end(); ++i) {
233 snprintf(buffer, 65535,
"zconstraint molecule[%d] = %d\n", j++, i->first);
239 "------------------------------------------------------------------\n");
One of the heavy-weight classes of OpenMD, SimInfo maintains objects and variables relating to the cu...
ZConsVisitor(SimInfo *info)
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.
std::string getPrefix(const std::string &str)