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 1816 by gezelter, Wed Aug 22 02:28:28 2012 UTC vs.
Revision 1817 by gezelter, Wed Dec 12 19:05:43 2012 UTC

# Line 58 | Line 58 | namespace OpenMD {
58      setOutputName(getPrefix(filename) + ".p2");
59      
60      evaluator1_.loadScriptString(sele1);
61    
62    if (!evaluator1_.isDynamic()) {
63      seleMan1_.setSelectionSet(evaluator1_.evaluate());
64    }
61    }
62  
63    P2OrderParameter::P2OrderParameter(SimInfo* info, const string& filename,
# Line 73 | Line 69 | namespace OpenMD {
69      setOutputName(getPrefix(filename) + ".p2");
70      
71      evaluator1_.loadScriptString(sele1);
72 <    evaluator2_.loadScriptString(sele2);
77 <    
78 <    if (!evaluator1_.isDynamic()) {
79 <      seleMan1_.setSelectionSet(evaluator1_.evaluate());
80 <    }else {
81 <      sprintf( painCave.errMsg,
82 <               "--sele1 must be static selection\n");
83 <      painCave.severity = OPENMD_ERROR;
84 <      painCave.isFatal = 1;
85 <      simError();  
86 <    }
87 <    
88 <    if (!evaluator2_.isDynamic()) {
89 <      seleMan2_.setSelectionSet(evaluator2_.evaluate());
90 <    }else {
91 <      sprintf( painCave.errMsg,
92 <               "--sele2 must be static selection\n");
93 <      painCave.severity = OPENMD_ERROR;
94 <      painCave.isFatal = 1;
95 <      simError();  
96 <    }
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 <      
105 <    }
106 <    
107 <    int i;
108 <    int j;
109 <    StuntDouble* sd1;
110 <    StuntDouble* sd2;
111 <    for (sd1 = seleMan1_.beginSelected(i), sd2 = seleMan2_.beginSelected(j);
112 <         sd1 != NULL && sd2 != NULL;
113 <         sd1 = seleMan1_.nextSelected(i), sd2 = seleMan2_.nextSelected(j)) {
114 <
115 <      sdPairs_.push_back(make_pair(sd1, sd2));
116 <    }
72 >    evaluator2_.loadScriptString(sele2);    
73    }
74  
75    void P2OrderParameter::process() {
# Line 121 | Line 77 | namespace OpenMD {
77      RigidBody* rb;
78      SimInfo::MoleculeIterator mi;
79      Molecule::RigidBodyIterator rbIter;
80 <    StuntDouble* sd;
81 <    int 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 141 | 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;
151 <             sd = seleMan1_.nextSelected(ii)) {
152 <          if (sd->isDirectional()) {
153 <            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 197 | Line 186 | namespace OpenMD {
186        }  
187  
188        RealType angle = 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              angle += acos(dot(vec, director));
198 +            vecCount++;
199            }
200          }
201 <        angle = angle/(seleMan1_.getSelectionCount()*NumericConstant::PI)*180.0;
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            angle += acos(dot(vec, director)) ;
215 +          vecCount++;
216          }
217 <        angle = angle / (sdPairs_.size() * NumericConstant::PI) * 180.0;
217 >        angle = angle / (vecCount * NumericConstant::PI) * 180.0;
218        }
219  
220        OrderParam param;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines