--- trunk/src/applications/staticProps/P2OrderParameter.cpp 2011/03/03 20:32:49 1542 +++ trunk/src/applications/staticProps/P2OrderParameter.cpp 2012/08/22 02:28:28 1782 @@ -36,7 +36,8 @@ * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005). * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006). * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008). - * [4] Vardeman & Gezelter, in progress (2009). + * [4] Kuang & Gezelter, J. Chem. Phys. 133, 164101 (2010). + * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011). */ #include "applications/staticProps/P2OrderParameter.hpp" @@ -61,7 +62,6 @@ namespace OpenMD { if (!evaluator1_.isDynamic()) { seleMan1_.setSelectionSet(evaluator1_.evaluate()); } - } P2OrderParameter::P2OrderParameter(SimInfo* info, const string& filename, @@ -122,8 +122,7 @@ namespace OpenMD { SimInfo::MoleculeIterator mi; Molecule::RigidBodyIterator rbIter; StuntDouble* sd; - int i; - + int ii; DumpReader reader(info_, dumpFilename_); int nFrames = reader.getNFrames(); @@ -131,7 +130,7 @@ namespace OpenMD { for (int i = 0; i < nFrames; i += step_) { reader.readFrame(i); currentSnapshot_ = info_->getSnapshotManager()->getCurrentSnapshot(); - + for (mol = info_->beginMolecule(mi); mol != NULL; mol = info_->nextMolecule(mi)) { //change the positions of atoms which belong to the rigidbodies @@ -148,8 +147,8 @@ namespace OpenMD { if (evaluator1_.isDynamic()) seleMan1_.setSelectionSet(evaluator1_.evaluate()); - for (sd = seleMan1_.beginSelected(i); sd != NULL; - sd = seleMan1_.nextSelected(i)) { + for (sd = seleMan1_.beginSelected(ii); sd != NULL; + sd = seleMan1_.nextSelected(ii)) { if (sd->isDirectional()) { Vector3d vec = sd->getA().getColumn(2); vec.normalize(); @@ -173,10 +172,12 @@ namespace OpenMD { orderTensor /= sdPairs_.size(); } + orderTensor -= (RealType)(1.0/3.0) * Mat3x3d::identity(); Vector3d eigenvalues; Mat3x3d eigenvectors; + Mat3x3d::diagonalize(orderTensor, eigenvalues, eigenvectors); int which; @@ -196,11 +197,10 @@ namespace OpenMD { } RealType angle = 0.0; - if (doVect_) { - for (sd = seleMan1_.beginSelected(i); sd != NULL; - sd = seleMan1_.nextSelected(i)) { + for (sd = seleMan1_.beginSelected(ii); sd != NULL; + sd = seleMan1_.nextSelected(ii)) { if (sd->isDirectional()) { Vector3d vec = sd->getA().getColumn(2); vec.normalize(); @@ -214,8 +214,7 @@ namespace OpenMD { Vector3d vec = j->first->getPos() - j->second->getPos(); if (usePeriodicBoundaryConditions_) currentSnapshot_->wrapVector(vec); - vec.normalize(); - + vec.normalize(); angle += acos(dot(vec, director)) ; } angle = angle / (sdPairs_.size() * NumericConstant::PI) * 180.0;