ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/applications/staticProps/RippleOP.cpp
(Generate patch)

Comparing trunk/src/applications/staticProps/RippleOP.cpp (file contents):
Revision 980 by xsun, Thu Jun 1 18:06:33 2006 UTC vs.
Revision 1782 by gezelter, Wed Aug 22 02:28:28 2012 UTC

# Line 6 | Line 6
6   * redistribute this software in source and binary code form, provided
7   * that the following conditions are met:
8   *
9 < * 1. Acknowledgement of the program authors must be made in any
10 < *    publication of scientific results based in part on use of the
11 < *    program.  An acceptable form of acknowledgement is citation of
12 < *    the article in which the program was described (Matthew
13 < *    A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher
14 < *    J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented
15 < *    Parallel Simulation Engine for Molecular Dynamics,"
16 < *    J. Comput. Chem. 26, pp. 252-271 (2005))
17 < *
18 < * 2. Redistributions of source code must retain the above copyright
9 > * 1. Redistributions of source code must retain the above copyright
10   *    notice, this list of conditions and the following disclaimer.
11   *
12 < * 3. Redistributions in binary form must reproduce the above copyright
12 > * 2. Redistributions in binary form must reproduce the above copyright
13   *    notice, this list of conditions and the following disclaimer in the
14   *    documentation and/or other materials provided with the
15   *    distribution.
# Line 37 | Line 28
28   * arising out of the use of or inability to use software, even if the
29   * University of Notre Dame has been advised of the possibility of
30   * such damages.
31 + *
32 + * SUPPORT OPEN SCIENCE!  If you use OpenMD or its source code in your
33 + * research, please cite the appropriate papers when you publish your
34 + * work.  Good starting points are:
35 + *                                                                      
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]  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/RippleOP.hpp"
# Line 44 | Line 45
45   #include "io/DumpReader.hpp"
46   #include "primitives/Molecule.hpp"
47   #include "utils/NumericConstant.hpp"
48 < namespace oopse {
48 > namespace OpenMD {
49  
50  
51    RippleOP::RippleOP(SimInfo* info, const std::string& filename, const std::string& sele1, const std::string& sele2)
# Line 62 | Line 63 | namespace oopse {
63      }else {
64        sprintf( painCave.errMsg,
65                 "--sele1 must be static selection\n");
66 <      painCave.severity = OOPSE_ERROR;
66 >      painCave.severity = OPENMD_ERROR;
67        painCave.isFatal = 1;
68        simError();  
69      }
# Line 72 | Line 73 | namespace oopse {
73      }else {
74        sprintf( painCave.errMsg,
75                 "--sele2 must be static selection\n");
76 <      painCave.severity = OOPSE_ERROR;
76 >      painCave.severity = OPENMD_ERROR;
77        painCave.isFatal = 1;
78        simError();  
79      }
# Line 80 | Line 81 | namespace oopse {
81      if (seleMan1_.getSelectionCount() != seleMan2_.getSelectionCount() ) {
82        sprintf( painCave.errMsg,
83                 "The number of selected Stuntdoubles are not the same in --sele1 and sele2\n");
84 <      painCave.severity = OOPSE_ERROR;
84 >      painCave.severity = OPENMD_ERROR;
85        painCave.isFatal = 1;
86        simError();  
87  
# Line 104 | Line 105 | namespace oopse {
105      RigidBody* rb;
106      SimInfo::MoleculeIterator mi;
107      Molecule::RigidBodyIterator rbIter;
108 +
109 +    StuntDouble* j1;
110 +    StuntDouble* j2;
111 +    StuntDouble* sd3;
112    
113      DumpReader reader(info_, dumpFilename_);    
114      int nFrames = reader.getNFrames();
115 <    
115 >
116      for (int i = 0; i < nFrames; i += step_) {
117        reader.readFrame(i);
118        currentSnapshot_ = info_->getSnapshotManager()->getCurrentSnapshot();
119 +      int nMolecules = info_->getNGlobalMolecules();
120 +      int i1;
121 +      int nUpper=0;
122 +      int nLower=0;
123 +      int nTail=0;
124 +      RealType sumZ = 0.0;
125        
115      
126        for (mol = info_->beginMolecule(mi); mol != NULL; mol = info_->nextMolecule(mi)) {
127          //change the positions of atoms which belong to the rigidbodies
128          for (rb = mol->beginRigidBody(rbIter); rb != NULL; rb = mol->nextRigidBody(rbIter)) {
129            rb->updateAtoms();
130          }
131        }      
132 +
133 +      for (sd3 = seleMan2_.beginSelected(i1); sd3 != NULL; sd3 = seleMan2_.nextSelected(i1)) {
134 +        Vector3d pos1 = sd3->getPos();
135 +        if (usePeriodicBoundaryConditions_)
136 +          currentSnapshot_->wrapVector(pos1);
137 +        sd3->setPos(pos1);
138 +      }
139 +
140 +      for (sd3 = seleMan2_.beginSelected(i1); sd3 != NULL; sd3 = seleMan2_.nextSelected(i1)) {
141 +        Vector3d pos1 = sd3->getPos();
142 +        sumZ += pos1.z();
143 +      }
144 +      RealType avgZ = sumZ / (RealType) nMolecules;
145        
146 <      Mat3x3d orderTensorHead(0.0), orderTensorTail(0.0);
147 <      for (std::vector<std::pair<StuntDouble*, StuntDouble*> >::iterator j = sdPairs_.begin(); j != sdPairs_.end(); ++j) {
148 <        Vector3d vecHead = j->first->getElectroFrame().getColumn(2);
149 <        Vector3d vecTail = j->second->getA().getColumn(2);
150 <        orderTensorHead +=outProduct(vecHead, vecHead);
146 >      Mat3x3d orderTensorHeadUpper(0.0), orderTensorTail(0.0), orderTensorHeadLower(0.0);
147 >      //      for (std::vector<std::pair<StuntDouble*, StuntDouble*> >::iterator j = sdPairs_.begin(); j != sdPairs_.end(); ++j) {
148 >      for (j1 = seleMan1_.beginSelected(i1); j1 != NULL; j1 = seleMan1_.nextSelected(i1)) {
149 >        Vector3d pos = j1->getPos();
150 >        if (usePeriodicBoundaryConditions_)
151 >          currentSnapshot_->wrapVector(pos);
152 >        Vector3d vecHeadUpper;
153 >        if (pos.z() >= avgZ){
154 >          vecHeadUpper = j1->getElectroFrame().getColumn(2);
155 >          nUpper++;
156 >        }
157 >        Vector3d vecHeadLower;
158 >        if (pos.z() <= avgZ){
159 >          vecHeadLower = j1->getElectroFrame().getColumn(2);
160 >          nLower++;
161 >        }
162 >        orderTensorHeadUpper +=outProduct(vecHeadUpper, vecHeadUpper);
163 >        orderTensorHeadLower +=outProduct(vecHeadLower, vecHeadLower);
164 >      }
165 >      for (j2 = seleMan2_.beginSelected(i1); j2 != NULL; j2 = seleMan2_.nextSelected(i1)) {
166 >        // The lab frame vector corresponding to the body-fixed
167 >        // z-axis is simply the second column of A.transpose()
168 >        // or, identically, the second row of A itself.
169 >
170 >        Vector3d vecTail = j2->getA().getRow(2);
171          orderTensorTail +=outProduct(vecTail, vecTail);
172 +        nTail++;
173        }
130    
131      orderTensorHead /= sdPairs_.size();
132      orderTensorHead -= (RealType)(1.0/3.0) * Mat3x3d::identity();  
174        
175 <      orderTensorTail /= sdPairs_.size();
175 >      orderTensorHeadUpper /= (RealType) nUpper;
176 >      orderTensorHeadLower /= (RealType) nLower;
177 >      orderTensorHeadUpper -= (RealType)(1.0/3.0) * Mat3x3d::identity();  
178 >      orderTensorHeadLower -= (RealType)(1.0/3.0) * Mat3x3d::identity();  
179 >      
180 >      orderTensorTail /= (RealType) nTail;
181        orderTensorTail -= (RealType)(1.0/3.0) * Mat3x3d::identity();  
182        
183 <      Vector3d eigenvaluesHead, eigenvaluesTail;
184 <      Mat3x3d eigenvectorsHead, eigenvectorsTail;    
185 <      Mat3x3d::diagonalize(orderTensorHead, eigenvaluesHead, eigenvectorsHead);
183 >      Vector3d eigenvaluesHeadUpper, eigenvaluesHeadLower, eigenvaluesTail;
184 >      Mat3x3d eigenvectorsHeadUpper, eigenvectorsHeadLower, eigenvectorsTail;    
185 >      Mat3x3d::diagonalize(orderTensorHeadUpper, eigenvaluesHeadUpper, eigenvectorsHeadUpper);
186 >      Mat3x3d::diagonalize(orderTensorHeadLower, eigenvaluesHeadLower, eigenvectorsHeadLower);
187        Mat3x3d::diagonalize(orderTensorTail, eigenvaluesTail, eigenvectorsTail);
188        
189 <      int which;
190 <      RealType maxEval = 0.0;
189 >      int whichUpper, whichLower, whichTail;
190 >      RealType maxEvalUpper = 0.0;
191 >      RealType maxEvalLower = 0.0;
192 >      RealType maxEvalTail = 0.0;
193        for(int k = 0; k< 3; k++){
194 <        if(fabs(eigenvaluesHead[k]) > maxEval){
195 <          which = k;
196 <          maxEval = fabs(eigenvaluesHead[k]);
194 >        if(fabs(eigenvaluesHeadUpper[k]) > maxEvalUpper){
195 >          whichUpper = k;
196 >          maxEvalUpper = fabs(eigenvaluesHeadUpper[k]);
197          }
198        }
199 <      RealType p2Head = 1.5 * maxEval;
151 <      maxEval = 0.0;
199 >      RealType p2HeadUpper = 1.5 * maxEvalUpper;
200        for(int k = 0; k< 3; k++){
201 <        if(fabs(eigenvaluesTail[k]) > maxEval){
202 <          which = k;
203 <          maxEval = fabs(eigenvaluesTail[k]);
201 >        if(fabs(eigenvaluesHeadLower[k]) > maxEvalLower){
202 >          whichLower = k;
203 >          maxEvalLower = fabs(eigenvaluesHeadLower[k]);
204          }
205        }
206 <      RealType p2Tail = 1.5 * maxEval;
206 >      RealType p2HeadLower = 1.5 * maxEvalLower;
207 >      for(int k = 0; k< 3; k++){
208 >        if(fabs(eigenvaluesTail[k]) > maxEvalTail){
209 >          whichTail = k;
210 >          maxEvalTail = fabs(eigenvaluesTail[k]);
211 >        }
212 >      }
213 >      RealType p2Tail = 1.5 * maxEvalTail;
214        
215        //the eigen vector is already normalized in SquareMatrix3::diagonalize
216 <      Vector3d directorHead = eigenvectorsHead.getColumn(which);
217 <      if (directorHead[0] < 0) {
218 <        directorHead.negate();
216 >      Vector3d directorHeadUpper = eigenvectorsHeadUpper.getColumn(whichUpper);
217 >      if (directorHeadUpper[0] < 0) {
218 >        directorHeadUpper.negate();
219        }
220 <      Vector3d directorTail = eigenvectorsTail.getColumn(which);
220 >      Vector3d directorHeadLower = eigenvectorsHeadLower.getColumn(whichLower);
221 >      if (directorHeadLower[0] < 0) {
222 >        directorHeadLower.negate();
223 >      }
224 >      Vector3d directorTail = eigenvectorsTail.getColumn(whichTail);
225        if (directorTail[0] < 0) {
226          directorTail.negate();
227        }  
228  
229 <      OrderParam paramHead, paramTail;
230 <      paramHead.p2 = p2Head;
231 <      paramHead.director = directorHead;
229 >      OrderParam paramHeadUpper, paramHeadLower, paramTail;
230 >      paramHeadUpper.p2 = p2HeadUpper;
231 >      paramHeadUpper.director = directorHeadUpper;
232 >      paramHeadLower.p2 = p2HeadLower;
233 >      paramHeadLower.director = directorHeadLower;
234        paramTail.p2 = p2Tail;
235        paramTail.director = directorTail;
236        
237 <      orderParamsHead_.push_back(paramHead);
237 >      orderParamsHeadUpper_.push_back(paramHeadUpper);
238 >      orderParamsHeadLower_.push_back(paramHeadLower);
239        orderParamsTail_.push_back(paramTail);      
240        
241      }
242  
243 <    OrderParam sumOPHead, errsumOPHead;
243 >    OrderParam sumOPHeadUpper, errsumOPHeadUpper;
244 >    OrderParam sumOPHeadLower, errsumOPHeadLower;
245      OrderParam sumOPTail, errsumOPTail;
246  
247 <    sumOPHead.p2 = 0.0;
248 <    errsumOPHead.p2 = 0.0;
249 <    for (std::size_t i = 0; i < orderParamsHead_.size(); ++i) {
250 <      sumOPHead.p2 += orderParamsHead_[i].p2;
251 <      sumOPHead.director[0] += orderParamsHead_[i].director[0];
252 <      sumOPHead.director[1] += orderParamsHead_[i].director[1];
253 <      sumOPHead.director[2] += orderParamsHead_[i].director[2];
247 >    sumOPHeadUpper.p2 = 0.0;
248 >    errsumOPHeadUpper.p2 = 0.0;
249 >    sumOPHeadLower.p2 = 0.0;
250 >    errsumOPHeadLower.p2 = 0.0;
251 >    for (std::size_t i = 0; i < orderParamsHeadUpper_.size(); ++i) {
252 >      sumOPHeadUpper.p2 += orderParamsHeadUpper_[i].p2;
253 >      sumOPHeadUpper.director[0] += orderParamsHeadUpper_[i].director[0];
254 >      sumOPHeadUpper.director[1] += orderParamsHeadUpper_[i].director[1];
255 >      sumOPHeadUpper.director[2] += orderParamsHeadUpper_[i].director[2];
256      }
257  
258 <    avgOPHead.p2 = sumOPHead.p2 / (RealType)orderParamsHead_.size();
259 <    avgOPHead.director[0] = sumOPHead.director[0] / (RealType)orderParamsHead_.size();
260 <    avgOPHead.director[1] = sumOPHead.director[1] / (RealType)orderParamsHead_.size();
261 <    avgOPHead.director[2] = sumOPHead.director[2] / (RealType)orderParamsHead_.size();
262 <    for (std::size_t i = 0; i < orderParamsHead_.size(); ++i) {
263 <      errsumOPHead.p2 += pow((orderParamsHead_[i].p2 - avgOPHead.p2), 2);
258 >    avgOPHeadUpper.p2 = sumOPHeadUpper.p2 / (RealType)orderParamsHeadUpper_.size();
259 >    avgOPHeadUpper.director[0] = sumOPHeadUpper.director[0] / (RealType)orderParamsHeadUpper_.size();
260 >    avgOPHeadUpper.director[1] = sumOPHeadUpper.director[1] / (RealType)orderParamsHeadUpper_.size();
261 >    avgOPHeadUpper.director[2] = sumOPHeadUpper.director[2] / (RealType)orderParamsHeadUpper_.size();
262 >    for (std::size_t i = 0; i < orderParamsHeadUpper_.size(); ++i) {
263 >      errsumOPHeadUpper.p2 += pow((orderParamsHeadUpper_[i].p2 - avgOPHeadUpper.p2), 2);
264      }
265 <    errOPHead.p2 = sqrt(errsumOPHead.p2 / (RealType)orderParamsHead_.size());
265 >    errOPHeadUpper.p2 = sqrt(errsumOPHeadUpper.p2 / (RealType)orderParamsHeadUpper_.size());
266 >    for (std::size_t i = 0; i < orderParamsHeadLower_.size(); ++i) {
267 >      sumOPHeadLower.p2 += orderParamsHeadLower_[i].p2;
268 >      sumOPHeadLower.director[0] += orderParamsHeadLower_[i].director[0];
269 >      sumOPHeadLower.director[1] += orderParamsHeadLower_[i].director[1];
270 >      sumOPHeadLower.director[2] += orderParamsHeadLower_[i].director[2];
271 >    }
272  
273 +    avgOPHeadLower.p2 = sumOPHeadLower.p2 / (RealType)orderParamsHeadLower_.size();
274 +    avgOPHeadLower.director[0] = sumOPHeadLower.director[0] / (RealType)orderParamsHeadLower_.size();
275 +    avgOPHeadLower.director[1] = sumOPHeadLower.director[1] / (RealType)orderParamsHeadLower_.size();
276 +    avgOPHeadLower.director[2] = sumOPHeadLower.director[2] / (RealType)orderParamsHeadLower_.size();
277 +    for (std::size_t i = 0; i < orderParamsHeadLower_.size(); ++i) {
278 +      errsumOPHeadLower.p2 += pow((orderParamsHeadLower_[i].p2 - avgOPHeadLower.p2), 2);
279 +    }
280 +    errOPHeadLower.p2 = sqrt(errsumOPHeadLower.p2 / (RealType)orderParamsHeadLower_.size());
281 +
282      sumOPTail.p2 = 0.0;
283      errsumOPTail.p2 = 0.0;
284      for (std::size_t i = 0; i < orderParamsTail_.size(); ++i) {
# Line 227 | Line 307 | namespace oopse {
307      os<< "#selection1: (" << selectionScript1_ << ")\n";
308      os << "#p2\terror\tdirector_x\tdirector_y\tdiretor_z\n";    
309      
310 <    os <<  avgOPHead.p2 << "\t"
311 <       <<  errOPHead.p2 << "\t"
312 <       <<  avgOPHead.director[0] << "\t"
313 <       <<  avgOPHead.director[1] << "\t"
314 <       <<  avgOPHead.director[2] << "\n";
310 >    os <<  avgOPHeadUpper.p2 << "\t"
311 >       <<  errOPHeadUpper.p2 << "\t"
312 >       <<  avgOPHeadUpper.director[0] << "\t"
313 >       <<  avgOPHeadUpper.director[1] << "\t"
314 >       <<  avgOPHeadUpper.director[2] << "\n";
315 >
316 >    os <<  avgOPHeadLower.p2 << "\t"
317 >       <<  errOPHeadLower.p2 << "\t"
318 >       <<  avgOPHeadLower.director[0] << "\t"
319 >       <<  avgOPHeadLower.director[1] << "\t"
320 >       <<  avgOPHeadLower.director[2] << "\n";
321      
322      os << "selection2: (" << selectionScript2_ << ")\n";
323      os << "#p2\terror\tdirector_x\tdirector_y\tdiretor_z\n";

Comparing trunk/src/applications/staticProps/RippleOP.cpp (property svn:keywords):
Revision 980 by xsun, Thu Jun 1 18:06:33 2006 UTC vs.
Revision 1782 by gezelter, Wed Aug 22 02:28:28 2012 UTC

# Line 0 | Line 1
1 + Author Id Revision Date

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines