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 1542 by gezelter, Thu Mar 3 20:32:49 2011 UTC vs.
Revision 1657 by gezelter, Tue Oct 18 13:44:44 2011 UTC

# Line 61 | Line 61 | namespace OpenMD {
61      if (!evaluator1_.isDynamic()) {
62        seleMan1_.setSelectionSet(evaluator1_.evaluate());
63      }
64    
64    }
65  
66    P2OrderParameter::P2OrderParameter(SimInfo* info, const string& filename,
# Line 122 | Line 121 | namespace OpenMD {
121      SimInfo::MoleculeIterator mi;
122      Molecule::RigidBodyIterator rbIter;
123      StuntDouble* sd;
124 <    int i;
126 <
124 >    int i, ii;
125    
126      DumpReader reader(info_, dumpFilename_);    
127      int nFrames = reader.getNFrames();
# Line 131 | Line 129 | namespace OpenMD {
129      for (int i = 0; i < nFrames; i += step_) {
130        reader.readFrame(i);
131        currentSnapshot_ = info_->getSnapshotManager()->getCurrentSnapshot();
132 <
132 >      
133        for (mol = info_->beginMolecule(mi); mol != NULL;
134             mol = info_->nextMolecule(mi)) {
135          //change the positions of atoms which belong to the rigidbodies
# Line 148 | Line 146 | namespace OpenMD {
146          if  (evaluator1_.isDynamic())
147            seleMan1_.setSelectionSet(evaluator1_.evaluate());
148          
149 <        for (sd = seleMan1_.beginSelected(i); sd != NULL;
150 <             sd = seleMan1_.nextSelected(i)) {
149 >        for (sd = seleMan1_.beginSelected(ii); sd != NULL;
150 >             sd = seleMan1_.nextSelected(ii)) {
151            if (sd->isDirectional()) {
152              Vector3d vec = sd->getA().getColumn(2);
153              vec.normalize();
# Line 173 | Line 171 | namespace OpenMD {
171          orderTensor /= sdPairs_.size();
172        }
173        
174 +
175        orderTensor -= (RealType)(1.0/3.0) * Mat3x3d::identity();  
176        
177        Vector3d eigenvalues;
178        Mat3x3d eigenvectors;    
179 +
180        Mat3x3d::diagonalize(orderTensor, eigenvalues, eigenvectors);
181        
182        int which;
# Line 196 | Line 196 | namespace OpenMD {
196        }  
197  
198        RealType angle = 0.0;
199 <
199 >      RealType p4 = 0.0;
200        
201        if (doVect_) {
202 <        for (sd = seleMan1_.beginSelected(i); sd != NULL;
203 <             sd = seleMan1_.nextSelected(i)) {
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));
207 >            RealType myDot = dot(vec, director);
208 >            angle += acos(myDot);
209 >            p4 += (35.0 * pow(myDot, 4) - 30.0 * pow(myDot, 2) + 3.0) / 8.0;
210            }
211          }
212          angle = angle/(seleMan1_.getSelectionCount()*NumericConstant::PI)*180.0;
213 <        
213 >        p4 /= (seleMan1_.getSelectionCount());
214        } else {
215          for (vector<pair<StuntDouble*, StuntDouble*> >::iterator j = sdPairs_.begin(); j != sdPairs_.end(); ++j) {
216            Vector3d vec = j->first->getPos() - j->second->getPos();
217            if (usePeriodicBoundaryConditions_)
218              currentSnapshot_->wrapVector(vec);
219 <          vec.normalize();
220 <          
221 <          angle += acos(dot(vec, director)) ;
219 >          vec.normalize();          
220 >          RealType myDot = dot(vec, director);
221 >          angle += acos(myDot);
222 >          p4 += (35.0 * pow(myDot, 4) - 30.0 * pow(myDot, 2) + 3.0) / 8.0;
223          }
224          angle = angle / (sdPairs_.size() * NumericConstant::PI) * 180.0;
225 +        p4 /= (seleMan1_.getSelectionCount());
226        }
227  
228        OrderParam param;
229        param.p2 = p2;
230        param.director = director;
231        param.angle = angle;
232 +      param.p4 = p4;
233  
234        orderParams_.push_back(param);      
235      
# Line 242 | Line 247 | namespace OpenMD {
247      if (!doVect_) {
248        os << "selection2: (" << selectionScript2_ << ")\n";
249      }
250 <    os << "#p2\tdirector_x\tdirector_y\tdiretor_z\tangle(degree)\n";    
250 >    os << "#p2\tdirector_x\tdirector_y\tdiretor_z\tangle(degree)\t<p4>\n";    
251  
252      for (size_t i = 0; i < orderParams_.size(); ++i) {
253        os <<  orderParams_[i].p2 << "\t"
254           <<  orderParams_[i].director[0] << "\t"
255           <<  orderParams_[i].director[1] << "\t"
256           <<  orderParams_[i].director[2] << "\t"
257 <         <<  orderParams_[i].angle << "\n";
257 >         <<  orderParams_[i].angle << "\t"
258 >         <<  orderParams_[i].p4 << "\n";
259  
260      }
261  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines