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 1657 by gezelter, Tue Oct 18 13:44:44 2011 UTC vs.
Revision 1818 by gezelter, Wed Dec 12 20:37:29 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 57 | Line 58 | namespace OpenMD {
58      setOutputName(getPrefix(filename) + ".p2");
59      
60      evaluator1_.loadScriptString(sele1);
60    
61    if (!evaluator1_.isDynamic()) {
62      seleMan1_.setSelectionSet(evaluator1_.evaluate());
63    }
61    }
62  
63    P2OrderParameter::P2OrderParameter(SimInfo* info, const string& filename,
# Line 72 | Line 69 | namespace OpenMD {
69      setOutputName(getPrefix(filename) + ".p2");
70      
71      evaluator1_.loadScriptString(sele1);
72 <    evaluator2_.loadScriptString(sele2);
76 <    
77 <    if (!evaluator1_.isDynamic()) {
78 <      seleMan1_.setSelectionSet(evaluator1_.evaluate());
79 <    }else {
80 <      sprintf( painCave.errMsg,
81 <               "--sele1 must be static selection\n");
82 <      painCave.severity = OPENMD_ERROR;
83 <      painCave.isFatal = 1;
84 <      simError();  
85 <    }
86 <    
87 <    if (!evaluator2_.isDynamic()) {
88 <      seleMan2_.setSelectionSet(evaluator2_.evaluate());
89 <    }else {
90 <      sprintf( painCave.errMsg,
91 <               "--sele2 must be static selection\n");
92 <      painCave.severity = OPENMD_ERROR;
93 <      painCave.isFatal = 1;
94 <      simError();  
95 <    }
96 <    
97 <    if (seleMan1_.getSelectionCount() != seleMan2_.getSelectionCount() ) {
98 <      sprintf( painCave.errMsg,
99 <               "The number of selected Stuntdoubles are not the same in --sele1 and sele2\n");
100 <      painCave.severity = OPENMD_ERROR;
101 <      painCave.isFatal = 1;
102 <      simError();  
103 <      
104 <    }
105 <    
106 <    int i;
107 <    int j;
108 <    StuntDouble* sd1;
109 <    StuntDouble* sd2;
110 <    for (sd1 = seleMan1_.beginSelected(i), sd2 = seleMan2_.beginSelected(j);
111 <         sd1 != NULL && sd2 != NULL;
112 <         sd1 = seleMan1_.nextSelected(i), sd2 = seleMan2_.nextSelected(j)) {
113 <
114 <      sdPairs_.push_back(make_pair(sd1, sd2));
115 <    }
72 >    evaluator2_.loadScriptString(sele2);    
73    }
74  
75    void P2OrderParameter::process() {
# Line 120 | Line 77 | namespace OpenMD {
77      RigidBody* rb;
78      SimInfo::MoleculeIterator mi;
79      Molecule::RigidBodyIterator rbIter;
80 <    StuntDouble* sd;
81 <    int i, ii;
82 <  
80 >    StuntDouble* sd1;
81 >    StuntDouble* sd2;
82 >    int ii;
83 >    int jj;
84 >    int vecCount;
85 >
86      DumpReader reader(info_, dumpFilename_);    
87      int nFrames = reader.getNFrames();
88  
# Line 140 | Line 100 | namespace OpenMD {
100        }      
101  
102        Mat3x3d orderTensor(0.0);
103 +      vecCount = 0;
104  
105 +      seleMan1_.setSelectionSet(evaluator1_.evaluate());
106 +      
107        if (doVect_) {
108          
109 <        if  (evaluator1_.isDynamic())
110 <          seleMan1_.setSelectionSet(evaluator1_.evaluate());
111 <        
112 <        for (sd = seleMan1_.beginSelected(ii); sd != NULL;
150 <             sd = seleMan1_.nextSelected(ii)) {
151 <          if (sd->isDirectional()) {
152 <            Vector3d vec = sd->getA().getColumn(2);
109 >        for (sd1 = seleMan1_.beginSelected(ii); sd1 != NULL;
110 >             sd1 = seleMan1_.nextSelected(ii)) {
111 >          if (sd1->isDirectional()) {
112 >            Vector3d vec = sd1->getA().getColumn(2);
113              vec.normalize();
114              orderTensor += outProduct(vec, vec);
115 +            vecCount++;
116            }
117          }
118    
119 <        orderTensor /= seleMan1_.getSelectionCount();
119 >        orderTensor /= vecCount;
120  
121        } else {
122 +
123 +        seleMan2_.setSelectionSet(evaluator2_.evaluate());
124              
125 <        for (vector<pair<StuntDouble*, StuntDouble*> >::iterator j = sdPairs_.begin();
126 <             j != sdPairs_.end(); ++j) {
127 <          Vector3d vec = j->first->getPos() - j->second->getPos();
125 >        if (seleMan1_.getSelectionCount() != seleMan2_.getSelectionCount() ) {
126 >          sprintf( painCave.errMsg,
127 >                   "In frame %d, the number of selected StuntDoubles are not\n"
128 >                   "\tthe same in --sele1 and sele2\n", i);
129 >          painCave.severity = OPENMD_INFO;
130 >          painCave.isFatal = 0;
131 >          simError();            
132 >        }
133 >        
134 >        for (sd1 = seleMan1_.beginSelected(ii),
135 >               sd2 = seleMan2_.beginSelected(jj);
136 >             sd1 != NULL && sd2 != NULL;
137 >             sd1 = seleMan1_.nextSelected(ii),
138 >               sd2 = seleMan2_.nextSelected(jj)) {
139 >
140 >          Vector3d vec = sd1->getPos() - sd2->getPos();
141 >
142            if (usePeriodicBoundaryConditions_)
143              currentSnapshot_->wrapVector(vec);
144 +
145            vec.normalize();
146 +
147            orderTensor +=outProduct(vec, vec);
148 +          vecCount++;
149          }
150        
151 <        orderTensor /= sdPairs_.size();
151 >        orderTensor /= vecCount;
152        }
153        
154 +      if (vecCount == 0) {
155 +          sprintf( painCave.errMsg,
156 +                   "In frame %d, the number of selected vectors was zero.\n"
157 +                   "\tThis will not give a meaningful order parameter.", i);
158 +          painCave.severity = OPENMD_ERROR;
159 +          painCave.isFatal = 1;
160 +          simError();        
161 +      }
162  
163        orderTensor -= (RealType)(1.0/3.0) * Mat3x3d::identity();  
164        
# Line 196 | Line 184 | namespace OpenMD {
184        }  
185  
186        RealType angle = 0.0;
187 <      RealType p4 = 0.0;
187 >      vecCount = 0;
188        
189        if (doVect_) {
190 <        for (sd = seleMan1_.beginSelected(ii); sd != NULL;
191 <             sd = seleMan1_.nextSelected(ii)) {
192 <          if (sd->isDirectional()) {
193 <            Vector3d vec = sd->getA().getColumn(2);
190 >        for (sd1 = seleMan1_.beginSelected(ii); sd1 != NULL;
191 >             sd1 = seleMan1_.nextSelected(ii)) {
192 >          if (sd1->isDirectional()) {
193 >            Vector3d vec = sd1->getA().getColumn(2);
194              vec.normalize();
195 <            RealType myDot = dot(vec, director);
196 <            angle += acos(myDot);
209 <            p4 += (35.0 * pow(myDot, 4) - 30.0 * pow(myDot, 2) + 3.0) / 8.0;
195 >            angle += acos(dot(vec, director));
196 >            vecCount++;
197            }
198          }
199 <        angle = angle/(seleMan1_.getSelectionCount()*NumericConstant::PI)*180.0;
200 <        p4 /= (seleMan1_.getSelectionCount());
199 >        angle = angle/(vecCount*NumericConstant::PI)*180.0;
200 >        
201        } else {
202 <        for (vector<pair<StuntDouble*, StuntDouble*> >::iterator j = sdPairs_.begin(); j != sdPairs_.end(); ++j) {
203 <          Vector3d vec = j->first->getPos() - j->second->getPos();
202 >        for (sd1 = seleMan1_.beginSelected(ii),
203 >               sd2 = seleMan2_.beginSelected(jj);
204 >             sd1 != NULL && sd2 != NULL;
205 >             sd1 = seleMan1_.nextSelected(ii),
206 >               sd2 = seleMan2_.nextSelected(jj)) {
207 >          
208 >          Vector3d vec = sd1->getPos() - sd2->getPos();
209            if (usePeriodicBoundaryConditions_)
210              currentSnapshot_->wrapVector(vec);
211            vec.normalize();          
212 <          RealType myDot = dot(vec, director);
213 <          angle += acos(myDot);
222 <          p4 += (35.0 * pow(myDot, 4) - 30.0 * pow(myDot, 2) + 3.0) / 8.0;
212 >          angle += acos(dot(vec, director)) ;
213 >          vecCount++;
214          }
215 <        angle = angle / (sdPairs_.size() * NumericConstant::PI) * 180.0;
225 <        p4 /= (seleMan1_.getSelectionCount());
215 >        angle = angle / (vecCount * NumericConstant::PI) * 180.0;
216        }
217  
218        OrderParam param;
219        param.p2 = p2;
220        param.director = director;
221        param.angle = angle;
232      param.p4 = p4;
222  
223        orderParams_.push_back(param);      
224      
# Line 247 | Line 236 | namespace OpenMD {
236      if (!doVect_) {
237        os << "selection2: (" << selectionScript2_ << ")\n";
238      }
239 <    os << "#p2\tdirector_x\tdirector_y\tdiretor_z\tangle(degree)\t<p4>\n";    
239 >    os << "#p2\tdirector_x\tdirector_y\tdiretor_z\tangle(degree)\n";    
240  
241      for (size_t i = 0; i < orderParams_.size(); ++i) {
242        os <<  orderParams_[i].p2 << "\t"
243           <<  orderParams_[i].director[0] << "\t"
244           <<  orderParams_[i].director[1] << "\t"
245           <<  orderParams_[i].director[2] << "\t"
246 <         <<  orderParams_[i].angle << "\t"
258 <         <<  orderParams_[i].p4 << "\n";
246 >         <<  orderParams_[i].angle << "\n";
247  
248      }
249  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines