ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/applications/staticProps/P2OrderParameter.cpp
(Generate patch)

Comparing trunk/src/applications/staticProps/P2OrderParameter.cpp (file contents):
Revision 1390 by gezelter, Wed Nov 25 20:02:06 2009 UTC vs.
Revision 1782 by gezelter, Wed Aug 22 02:28:28 2012 UTC

# Line 36 | Line 36
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).          
39 < * [4]  Vardeman & Gezelter, in progress (2009).                        
39 > * [4]  Kuang & Gezelter,  J. Chem. Phys. 133, 164101 (2010).
40 > * [5]  Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
41   */
42  
43   #include "applications/staticProps/P2OrderParameter.hpp"
# Line 44 | Line 45
45   #include "io/DumpReader.hpp"
46   #include "primitives/Molecule.hpp"
47   #include "utils/NumericConstant.hpp"
48 +
49 + using namespace std;
50   namespace OpenMD {
51  
52 +  P2OrderParameter::P2OrderParameter(SimInfo* info, const string& filename,
53 +                                     const string& sele1)
54 +    : StaticAnalyser(info, filename), doVect_(true),
55 +      selectionScript1_(sele1), evaluator1_(info),
56 +      evaluator2_(info), seleMan1_(info), seleMan2_(info) {
57 +    
58 +    setOutputName(getPrefix(filename) + ".p2");
59 +    
60 +    evaluator1_.loadScriptString(sele1);
61 +    
62 +    if (!evaluator1_.isDynamic()) {
63 +      seleMan1_.setSelectionSet(evaluator1_.evaluate());
64 +    }
65 +  }
66  
67 <  P2OrderParameter::P2OrderParameter(SimInfo* info, const std::string& filename, const std::string& sele1, const std::string& sele2)
68 <    : StaticAnalyser(info, filename),
69 <      selectionScript1_(sele1), selectionScript2_(sele2), evaluator1_(info), evaluator2_(info),
70 <      seleMan1_(info), seleMan2_(info){
71 <
67 >  P2OrderParameter::P2OrderParameter(SimInfo* info, const string& filename,
68 >                                     const string& sele1, const string& sele2)
69 >    : StaticAnalyser(info, filename), doVect_(false),
70 >      selectionScript1_(sele1), selectionScript2_(sele2), evaluator1_(info),
71 >      evaluator2_(info), seleMan1_(info), seleMan2_(info) {
72 >    
73      setOutputName(getPrefix(filename) + ".p2");
74 <        
74 >    
75      evaluator1_.loadScriptString(sele1);
76      evaluator2_.loadScriptString(sele2);
77 <
77 >    
78      if (!evaluator1_.isDynamic()) {
79        seleMan1_.setSelectionSet(evaluator1_.evaluate());
80      }else {
# Line 66 | Line 84 | namespace OpenMD {
84        painCave.isFatal = 1;
85        simError();  
86      }
87 <
87 >    
88      if (!evaluator2_.isDynamic()) {
89        seleMan2_.setSelectionSet(evaluator2_.evaluate());
90      }else {
# Line 76 | Line 94 | namespace OpenMD {
94        painCave.isFatal = 1;
95        simError();  
96      }
97 <
97 >    
98      if (seleMan1_.getSelectionCount() != seleMan2_.getSelectionCount() ) {
99        sprintf( painCave.errMsg,
100                 "The number of selected Stuntdoubles are not the same in --sele1 and sele2\n");
101        painCave.severity = OPENMD_ERROR;
102        painCave.isFatal = 1;
103        simError();  
104 <
104 >      
105      }
106 <
106 >    
107      int i;
108      int j;
109      StuntDouble* sd1;
# Line 94 | Line 112 | namespace OpenMD {
112           sd1 != NULL && sd2 != NULL;
113           sd1 = seleMan1_.nextSelected(i), sd2 = seleMan2_.nextSelected(j)) {
114  
115 <      sdPairs_.push_back(std::make_pair(sd1, sd2));
116 <    }
99 <
100 <    
115 >      sdPairs_.push_back(make_pair(sd1, sd2));
116 >    }
117    }
118  
119    void P2OrderParameter::process() {
# Line 105 | Line 121 | namespace OpenMD {
121      RigidBody* rb;
122      SimInfo::MoleculeIterator mi;
123      Molecule::RigidBodyIterator rbIter;
124 +    StuntDouble* sd;
125 +    int ii;
126    
127      DumpReader reader(info_, dumpFilename_);    
128      int nFrames = reader.getNFrames();
# Line 112 | Line 130 | namespace OpenMD {
130      for (int i = 0; i < nFrames; i += step_) {
131        reader.readFrame(i);
132        currentSnapshot_ = info_->getSnapshotManager()->getCurrentSnapshot();
133 <
134 <    
135 <      for (mol = info_->beginMolecule(mi); mol != NULL; mol = info_->nextMolecule(mi)) {
133 >      
134 >      for (mol = info_->beginMolecule(mi); mol != NULL;
135 >           mol = info_->nextMolecule(mi)) {
136          //change the positions of atoms which belong to the rigidbodies
137 <        for (rb = mol->beginRigidBody(rbIter); rb != NULL; rb = mol->nextRigidBody(rbIter)) {
137 >        for (rb = mol->beginRigidBody(rbIter); rb != NULL;
138 >             rb = mol->nextRigidBody(rbIter)) {
139            rb->updateAtoms();
140 <        }
122 <        
140 >        }        
141        }      
142  
143        Mat3x3d orderTensor(0.0);
144 <      for (std::vector<std::pair<StuntDouble*, StuntDouble*> >::iterator j = sdPairs_.begin(); j != sdPairs_.end(); ++j) {
145 <        Vector3d vec = j->first->getPos() - j->second->getPos();
146 <        if (usePeriodicBoundaryConditions_)
147 <          currentSnapshot_->wrapVector(vec);
148 <        vec.normalize();
149 <        orderTensor +=outProduct(vec, vec);
144 >
145 >      if (doVect_) {
146 >        
147 >        if  (evaluator1_.isDynamic())
148 >          seleMan1_.setSelectionSet(evaluator1_.evaluate());
149 >        
150 >        for (sd = seleMan1_.beginSelected(ii); sd != NULL;
151 >             sd = seleMan1_.nextSelected(ii)) {
152 >          if (sd->isDirectional()) {
153 >            Vector3d vec = sd->getA().getColumn(2);
154 >            vec.normalize();
155 >            orderTensor += outProduct(vec, vec);
156 >          }
157 >        }
158 >  
159 >        orderTensor /= seleMan1_.getSelectionCount();
160 >
161 >      } else {
162 >            
163 >        for (vector<pair<StuntDouble*, StuntDouble*> >::iterator j = sdPairs_.begin();
164 >             j != sdPairs_.end(); ++j) {
165 >          Vector3d vec = j->first->getPos() - j->second->getPos();
166 >          if (usePeriodicBoundaryConditions_)
167 >            currentSnapshot_->wrapVector(vec);
168 >          vec.normalize();
169 >          orderTensor +=outProduct(vec, vec);
170 >        }
171 >      
172 >        orderTensor /= sdPairs_.size();
173        }
174        
175 <      orderTensor /= sdPairs_.size();
175 >
176        orderTensor -= (RealType)(1.0/3.0) * Mat3x3d::identity();  
177        
178        Vector3d eigenvalues;
179        Mat3x3d eigenvectors;    
180 +
181        Mat3x3d::diagonalize(orderTensor, eigenvalues, eigenvectors);
182        
183        int which;
# Line 155 | Line 197 | namespace OpenMD {
197        }  
198  
199        RealType angle = 0.0;
200 <      for (std::vector<std::pair<StuntDouble*, StuntDouble*> >::iterator j = sdPairs_.begin(); j != sdPairs_.end(); ++j) {
201 <        Vector3d vec = j->first->getPos() - j->second->getPos();
202 <        if (usePeriodicBoundaryConditions_)
203 <          currentSnapshot_->wrapVector(vec);
204 <        vec.normalize();
205 <
206 <        angle += acos(dot(vec, director)) ;
200 >      
201 >      if (doVect_) {
202 >        for (sd = seleMan1_.beginSelected(ii); sd != NULL;
203 >             sd = seleMan1_.nextSelected(ii)) {
204 >          if (sd->isDirectional()) {
205 >            Vector3d vec = sd->getA().getColumn(2);
206 >            vec.normalize();
207 >            angle += acos(dot(vec, director));
208 >          }
209 >        }
210 >        angle = angle/(seleMan1_.getSelectionCount()*NumericConstant::PI)*180.0;
211 >        
212 >      } else {
213 >        for (vector<pair<StuntDouble*, StuntDouble*> >::iterator j = sdPairs_.begin(); j != sdPairs_.end(); ++j) {
214 >          Vector3d vec = j->first->getPos() - j->second->getPos();
215 >          if (usePeriodicBoundaryConditions_)
216 >            currentSnapshot_->wrapVector(vec);
217 >          vec.normalize();          
218 >          angle += acos(dot(vec, director)) ;
219 >        }
220 >        angle = angle / (sdPairs_.size() * NumericConstant::PI) * 180.0;
221        }
166      angle = angle / (sdPairs_.size() * NumericConstant::PI) * 180.0;
222  
223        OrderParam param;
224        param.p2 = p2;
# Line 173 | Line 228 | namespace OpenMD {
228        orderParams_.push_back(param);      
229      
230      }
231 <
231 >    
232      writeP2();
233 <  
233 >    
234    }
235  
236    void P2OrderParameter::writeP2() {
237  
238 <    std::ofstream os(getOutputFileName().c_str());
238 >    ofstream os(getOutputFileName().c_str());
239      os << "#radial distribution function\n";
240      os<< "#selection1: (" << selectionScript1_ << ")\t";
241 <    os << "selection2: (" << selectionScript2_ << ")\n";
241 >    if (!doVect_) {
242 >      os << "selection2: (" << selectionScript2_ << ")\n";
243 >    }
244      os << "#p2\tdirector_x\tdirector_y\tdiretor_z\tangle(degree)\n";    
245  
246 <    for (std::size_t i = 0; i < orderParams_.size(); ++i) {
246 >    for (size_t i = 0; i < orderParams_.size(); ++i) {
247        os <<  orderParams_[i].p2 << "\t"
248           <<  orderParams_[i].director[0] << "\t"
249           <<  orderParams_[i].director[1] << "\t"

Comparing trunk/src/applications/staticProps/P2OrderParameter.cpp (property svn:keywords):
Revision 1390 by gezelter, Wed Nov 25 20:02:06 2009 UTC vs.
Revision 1782 by gezelter, Wed Aug 22 02:28:28 2012 UTC

# Line 0 | Line 1
1 + Author Id Revision Date

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines