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 1782 by gezelter, Wed Aug 22 02:28:28 2012 UTC vs.
Revision 1818 by gezelter, Wed Dec 12 20:37:29 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 +      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;
151 <             sd = seleMan1_.nextSelected(ii)) {
152 <          if (sd->isDirectional()) {
153 <            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 197 | Line 184 | namespace OpenMD {
184        }  
185  
186        RealType angle = 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              angle += acos(dot(vec, director));
196 +            vecCount++;
197            }
198          }
199 <        angle = angle/(seleMan1_.getSelectionCount()*NumericConstant::PI)*180.0;
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            angle += acos(dot(vec, director)) ;
213 +          vecCount++;
214          }
215 <        angle = angle / (sdPairs_.size() * NumericConstant::PI) * 180.0;
215 >        angle = angle / (vecCount * NumericConstant::PI) * 180.0;
216        }
217  
218        OrderParam param;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines