--- trunk/src/selection/SelectionEvaluator.cpp 2015/01/09 19:06:35 2052 +++ trunk/src/selection/SelectionEvaluator.cpp 2015/03/07 21:41:51 2071 @@ -53,11 +53,9 @@ namespace OpenMD { namespace OpenMD { - SelectionEvaluator::SelectionEvaluator(SimInfo* si) : info(si), nameFinder(info), distanceFinder(info), hullFinder(info), - indexFinder(info), hasSurfaceArea_(false), - isLoaded_(false){ + indexFinder(info), isLoaded_(false), hasSurfaceArea_(false) { nObjects.push_back(info->getNGlobalAtoms() + info->getNGlobalRigidBodies()); nObjects.push_back(info->getNGlobalBonds()); nObjects.push_back(info->getNGlobalBends()); @@ -334,6 +332,8 @@ namespace OpenMD { for (mol = info->beginMolecule(mi); mol != NULL; mol = info->nextMolecule(mi)) { + + compareProperty(mol, bs, property, comparator, comparisonValue); for(atom = mol->beginAtom(ai); atom != NULL; atom = mol->nextAtom(ai)) { compareProperty(atom, bs, property, comparator, comparisonValue); @@ -365,6 +365,8 @@ namespace OpenMD { for (mol = info->beginMolecule(mi); mol != NULL; mol = info->nextMolecule(mi)) { + compareProperty(mol, bs, property, comparator, comparisonValue, frame); + for(atom = mol->beginAtom(ai); atom != NULL; atom = mol->nextAtom(ai)) { compareProperty(atom, bs, property, comparator, comparisonValue, frame); } @@ -460,6 +462,160 @@ namespace OpenMD { } + void SelectionEvaluator::compareProperty(Molecule* mol, SelectionSet& bs, + int property, int comparator, + float comparisonValue) { + RealType propertyValue = 0.0; + Vector3d pos; + + switch (property) { + case Token::mass: + propertyValue = mol->getMass(); + break; + case Token::charge: + { + Molecule::AtomIterator ai; + Atom* atom; + for (atom = mol->beginAtom(ai); atom != NULL; + atom = mol->nextAtom(ai)) { + propertyValue+= getCharge(atom); + } + } + break; + case Token::x: + propertyValue = mol->getCom().x(); + break; + case Token::y: + propertyValue = mol->getCom().y(); + break; + case Token::z: + propertyValue = mol->getCom().z(); + break; + case Token::wrappedX: + pos = mol->getCom(); + info->getSnapshotManager()->getCurrentSnapshot()->wrapVector(pos); + propertyValue = pos.x(); + break; + case Token::wrappedY: + pos = mol->getCom(); + info->getSnapshotManager()->getCurrentSnapshot()->wrapVector(pos); + propertyValue = pos.y(); + break; + case Token::wrappedZ: + pos = mol->getCom(); + info->getSnapshotManager()->getCurrentSnapshot()->wrapVector(pos); + propertyValue = pos.z(); + break; + case Token::r: + propertyValue = mol->getCom().length(); + break; + default: + unrecognizedMoleculeProperty(property); + } + + bool match = false; + switch (comparator) { + case Token::opLT: + match = propertyValue < comparisonValue; + break; + case Token::opLE: + match = propertyValue <= comparisonValue; + break; + case Token::opGE: + match = propertyValue >= comparisonValue; + break; + case Token::opGT: + match = propertyValue > comparisonValue; + break; + case Token::opEQ: + match = propertyValue == comparisonValue; + break; + case Token::opNE: + match = propertyValue != comparisonValue; + break; + } + + if (match) + bs.bitsets_[MOLECULE].setBitOn(mol->getGlobalIndex()); + } + + void SelectionEvaluator::compareProperty(Molecule* mol, SelectionSet& bs, + int property, int comparator, + float comparisonValue, int frame) { + RealType propertyValue = 0.0; + Vector3d pos; + switch (property) { + case Token::mass: + propertyValue = mol->getMass(); + break; + case Token::charge: + { + Molecule::AtomIterator ai; + Atom* atom; + for (atom = mol->beginAtom(ai); atom != NULL; + atom = mol->nextAtom(ai)) { + propertyValue+= getCharge(atom,frame); + } + } + break; + case Token::x: + propertyValue = mol->getCom(frame).x(); + break; + case Token::y: + propertyValue = mol->getCom(frame).y(); + break; + case Token::z: + propertyValue = mol->getCom(frame).z(); + break; + case Token::wrappedX: + pos = mol->getCom(frame); + info->getSnapshotManager()->getSnapshot(frame)->wrapVector(pos); + propertyValue = pos.x(); + break; + case Token::wrappedY: + pos = mol->getCom(frame); + info->getSnapshotManager()->getSnapshot(frame)->wrapVector(pos); + propertyValue = pos.y(); + break; + case Token::wrappedZ: + pos = mol->getCom(frame); + info->getSnapshotManager()->getSnapshot(frame)->wrapVector(pos); + propertyValue = pos.z(); + break; + + case Token::r: + propertyValue = mol->getCom(frame).length(); + break; + default: + unrecognizedMoleculeProperty(property); + } + + bool match = false; + switch (comparator) { + case Token::opLT: + match = propertyValue < comparisonValue; + break; + case Token::opLE: + match = propertyValue <= comparisonValue; + break; + case Token::opGE: + match = propertyValue >= comparisonValue; + break; + case Token::opGT: + match = propertyValue > comparisonValue; + break; + case Token::opEQ: + match = propertyValue == comparisonValue; + break; + case Token::opNE: + match = propertyValue != comparisonValue; + break; + } + if (match) + bs.bitsets_[MOLECULE].setBitOn(mol->getGlobalIndex()); + + + } void SelectionEvaluator::compareProperty(StuntDouble* sd, SelectionSet& bs, int property, int comparator, float comparisonValue, int frame) { @@ -536,11 +692,10 @@ namespace OpenMD { break; } if (match) - bs.bitsets_[STUNTDOUBLE].setBitOn(sd->getGlobalIndex()); - - + bs.bitsets_[STUNTDOUBLE].setBitOn(sd->getGlobalIndex()); } - + + void SelectionEvaluator::withinInstruction(const Token& instruction, SelectionSet& bs){