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 1817 by gezelter, Wed Dec 12 19:05:43 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 +      if  (evaluator1_.isDynamic())
106 +        seleMan1_.setSelectionSet(evaluator1_.evaluate());
107 +      
108        if (doVect_) {
109          
110 <        if  (evaluator1_.isDynamic())
111 <          seleMan1_.setSelectionSet(evaluator1_.evaluate());
112 <        
113 <        for (sd = seleMan1_.beginSelected(ii); sd != NULL;
150 <             sd = seleMan1_.nextSelected(ii)) {
151 <          if (sd->isDirectional()) {
152 <            Vector3d vec = sd->getA().getColumn(2);
110 >        for (sd1 = seleMan1_.beginSelected(ii); sd1 != NULL;
111 >             sd1 = seleMan1_.nextSelected(ii)) {
112 >          if (sd1->isDirectional()) {
113 >            Vector3d vec = sd1->getA().getColumn(2);
114              vec.normalize();
115              orderTensor += outProduct(vec, vec);
116 +            vecCount++;
117            }
118          }
119    
120 <        orderTensor /= seleMan1_.getSelectionCount();
120 >        orderTensor /= vecCount;
121  
122        } else {
123 +
124 +        if (evaluator2_.isDynamic())
125 +          seleMan2_.setSelectionSet(evaluator2_.evaluate());
126              
127 <        for (vector<pair<StuntDouble*, StuntDouble*> >::iterator j = sdPairs_.begin();
128 <             j != sdPairs_.end(); ++j) {
129 <          Vector3d vec = j->first->getPos() - j->second->getPos();
127 >        if (seleMan1_.getSelectionCount() != seleMan2_.getSelectionCount() ) {
128 >          sprintf( painCave.errMsg,
129 >                   "In frame %d, the number of selected StuntDoubles are not\n"
130 >                   "\tthe same in --sele1 and sele2\n", i);
131 >          painCave.severity = OPENMD_INFO;
132 >          painCave.isFatal = 0;
133 >          simError();            
134 >        }
135 >        
136 >        for (sd1 = seleMan1_.beginSelected(ii),
137 >               sd2 = seleMan2_.beginSelected(jj);
138 >             sd1 != NULL && sd2 != NULL;
139 >             sd1 = seleMan1_.nextSelected(ii),
140 >               sd2 = seleMan2_.nextSelected(jj)) {
141 >
142 >          Vector3d vec = sd1->getPos() - sd2->getPos();
143 >
144            if (usePeriodicBoundaryConditions_)
145              currentSnapshot_->wrapVector(vec);
146 +
147            vec.normalize();
148 +
149            orderTensor +=outProduct(vec, vec);
150 +          vecCount++;
151          }
152        
153 <        orderTensor /= sdPairs_.size();
153 >        orderTensor /= vecCount;
154        }
155        
156 +      if (vecCount == 0) {
157 +          sprintf( painCave.errMsg,
158 +                   "In frame %d, the number of selected vectors was zero.\n"
159 +                   "\tThis will not give a meaningful order parameter.", i);
160 +          painCave.severity = OPENMD_ERROR;
161 +          painCave.isFatal = 1;
162 +          simError();        
163 +      }
164  
165        orderTensor -= (RealType)(1.0/3.0) * Mat3x3d::identity();  
166        
# Line 196 | Line 186 | namespace OpenMD {
186        }  
187  
188        RealType angle = 0.0;
189 <      RealType p4 = 0.0;
189 >      vecCount = 0;
190        
191        if (doVect_) {
192 <        for (sd = seleMan1_.beginSelected(ii); sd != NULL;
193 <             sd = seleMan1_.nextSelected(ii)) {
194 <          if (sd->isDirectional()) {
195 <            Vector3d vec = sd->getA().getColumn(2);
192 >        for (sd1 = seleMan1_.beginSelected(ii); sd1 != NULL;
193 >             sd1 = seleMan1_.nextSelected(ii)) {
194 >          if (sd1->isDirectional()) {
195 >            Vector3d vec = sd1->getA().getColumn(2);
196              vec.normalize();
197 <            RealType myDot = dot(vec, director);
198 <            angle += acos(myDot);
209 <            p4 += (35.0 * pow(myDot, 4) - 30.0 * pow(myDot, 2) + 3.0) / 8.0;
197 >            angle += acos(dot(vec, director));
198 >            vecCount++;
199            }
200          }
201 <        angle = angle/(seleMan1_.getSelectionCount()*NumericConstant::PI)*180.0;
202 <        p4 /= (seleMan1_.getSelectionCount());
201 >        angle = angle/(vecCount*NumericConstant::PI)*180.0;
202 >        
203        } else {
204 <        for (vector<pair<StuntDouble*, StuntDouble*> >::iterator j = sdPairs_.begin(); j != sdPairs_.end(); ++j) {
205 <          Vector3d vec = j->first->getPos() - j->second->getPos();
204 >        for (sd1 = seleMan1_.beginSelected(ii),
205 >               sd2 = seleMan2_.beginSelected(jj);
206 >             sd1 != NULL && sd2 != NULL;
207 >             sd1 = seleMan1_.nextSelected(ii),
208 >               sd2 = seleMan2_.nextSelected(jj)) {
209 >          
210 >          Vector3d vec = sd1->getPos() - sd2->getPos();
211            if (usePeriodicBoundaryConditions_)
212              currentSnapshot_->wrapVector(vec);
213            vec.normalize();          
214 <          RealType myDot = dot(vec, director);
215 <          angle += acos(myDot);
222 <          p4 += (35.0 * pow(myDot, 4) - 30.0 * pow(myDot, 2) + 3.0) / 8.0;
214 >          angle += acos(dot(vec, director)) ;
215 >          vecCount++;
216          }
217 <        angle = angle / (sdPairs_.size() * NumericConstant::PI) * 180.0;
225 <        p4 /= (seleMan1_.getSelectionCount());
217 >        angle = angle / (vecCount * NumericConstant::PI) * 180.0;
218        }
219  
220        OrderParam param;
221        param.p2 = p2;
222        param.director = director;
223        param.angle = angle;
232      param.p4 = p4;
224  
225        orderParams_.push_back(param);      
226      
# Line 247 | Line 238 | namespace OpenMD {
238      if (!doVect_) {
239        os << "selection2: (" << selectionScript2_ << ")\n";
240      }
241 <    os << "#p2\tdirector_x\tdirector_y\tdiretor_z\tangle(degree)\t<p4>\n";    
241 >    os << "#p2\tdirector_x\tdirector_y\tdiretor_z\tangle(degree)\n";    
242  
243      for (size_t i = 0; i < orderParams_.size(); ++i) {
244        os <<  orderParams_[i].p2 << "\t"
245           <<  orderParams_[i].director[0] << "\t"
246           <<  orderParams_[i].director[1] << "\t"
247           <<  orderParams_[i].director[2] << "\t"
248 <         <<  orderParams_[i].angle << "\t"
258 <         <<  orderParams_[i].p4 << "\n";
248 >         <<  orderParams_[i].angle << "\n";
249  
250      }
251  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines