ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/applications/staticProps/RippleOP.cpp
Revision: 2071
Committed: Sat Mar 7 21:41:51 2015 UTC (10 years, 1 month ago) by gezelter
File size: 13780 byte(s)
Log Message:
Reducing the number of warnings when using g++ to compile.

File Contents

# User Rev Content
1 xsun 980 /*
2     * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3     *
4     * The University of Notre Dame grants you ("Licensee") a
5     * non-exclusive, royalty free, license to use, modify and
6     * redistribute this software in source and binary code form, provided
7     * that the following conditions are met:
8     *
9 gezelter 1390 * 1. Redistributions of source code must retain the above copyright
10 xsun 980 * notice, this list of conditions and the following disclaimer.
11     *
12 gezelter 1390 * 2. Redistributions in binary form must reproduce the above copyright
13 xsun 980 * notice, this list of conditions and the following disclaimer in the
14     * documentation and/or other materials provided with the
15     * distribution.
16     *
17     * This software is provided "AS IS," without a warranty of any
18     * kind. All express or implied conditions, representations and
19     * warranties, including any implied warranty of merchantability,
20     * fitness for a particular purpose or non-infringement, are hereby
21     * excluded. The University of Notre Dame and its licensors shall not
22     * be liable for any damages suffered by licensee as a result of
23     * using, modifying or distributing the software or its
24     * derivatives. In no event will the University of Notre Dame or its
25     * licensors be liable for any lost revenue, profit or data, or for
26     * direct, indirect, special, consequential, incidental or punitive
27     * damages, however caused and regardless of the theory of liability,
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 gezelter 1390 *
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 gezelter 1879 * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008).
39 gezelter 1782 * [4] Kuang & Gezelter, J. Chem. Phys. 133, 164101 (2010).
40     * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
41 xsun 980 */
42    
43     #include "applications/staticProps/RippleOP.hpp"
44     #include "utils/simError.h"
45     #include "io/DumpReader.hpp"
46     #include "primitives/Molecule.hpp"
47     #include "utils/NumericConstant.hpp"
48 gezelter 1879 #include "types/MultipoleAdapter.hpp"
49 gezelter 1390 namespace OpenMD {
50 xsun 980
51 gezelter 2071
52     RippleOP::RippleOP(SimInfo* info, const std::string& filename,
53     const std::string& sele1, const std::string& sele2)
54     : StaticAnalyser(info, filename),
55     selectionScript1_(sele1), selectionScript2_(sele2),
56     seleMan1_(info), seleMan2_(info), evaluator1_(info), evaluator2_(info) {
57 xsun 980
58     setOutputName(getPrefix(filename) + ".rp2");
59    
60     evaluator1_.loadScriptString(sele1);
61     evaluator2_.loadScriptString(sele2);
62    
63     if (!evaluator1_.isDynamic()) {
64     seleMan1_.setSelectionSet(evaluator1_.evaluate());
65     }else {
66     sprintf( painCave.errMsg,
67     "--sele1 must be static selection\n");
68 gezelter 1390 painCave.severity = OPENMD_ERROR;
69 xsun 980 painCave.isFatal = 1;
70     simError();
71     }
72    
73     if (!evaluator2_.isDynamic()) {
74     seleMan2_.setSelectionSet(evaluator2_.evaluate());
75     }else {
76     sprintf( painCave.errMsg,
77     "--sele2 must be static selection\n");
78 gezelter 1390 painCave.severity = OPENMD_ERROR;
79 xsun 980 painCave.isFatal = 1;
80     simError();
81     }
82    
83     if (seleMan1_.getSelectionCount() != seleMan2_.getSelectionCount() ) {
84     sprintf( painCave.errMsg,
85     "The number of selected Stuntdoubles are not the same in --sele1 and sele2\n");
86 gezelter 1390 painCave.severity = OPENMD_ERROR;
87 xsun 980 painCave.isFatal = 1;
88     simError();
89    
90     }
91    
92     int i;
93     int j;
94     StuntDouble* sd1;
95     StuntDouble* sd2;
96     for (sd1 = seleMan1_.beginSelected(i), sd2 = seleMan2_.beginSelected(j);
97     sd1 != NULL && sd2 != NULL;
98     sd1 = seleMan1_.nextSelected(i), sd2 = seleMan2_.nextSelected(j)) {
99    
100     sdPairs_.push_back(std::make_pair(sd1, sd2));
101     }
102    
103     }
104    
105     void RippleOP::process() {
106     Molecule* mol;
107     RigidBody* rb;
108     SimInfo::MoleculeIterator mi;
109     Molecule::RigidBodyIterator rbIter;
110 xsun 1213
111     StuntDouble* j1;
112     StuntDouble* j2;
113     StuntDouble* sd3;
114 xsun 980
115     DumpReader reader(info_, dumpFilename_);
116     int nFrames = reader.getNFrames();
117 xsun 1213
118 xsun 980 for (int i = 0; i < nFrames; i += step_) {
119     reader.readFrame(i);
120     currentSnapshot_ = info_->getSnapshotManager()->getCurrentSnapshot();
121 xsun 1213 int nMolecules = info_->getNGlobalMolecules();
122     int i1;
123     int nUpper=0;
124     int nLower=0;
125     int nTail=0;
126     RealType sumZ = 0.0;
127 xsun 980
128 gezelter 2071 for (mol = info_->beginMolecule(mi); mol != NULL;
129     mol = info_->nextMolecule(mi)) {
130 xsun 980 //change the positions of atoms which belong to the rigidbodies
131 gezelter 2071 for (rb = mol->beginRigidBody(rbIter); rb != NULL;
132     rb = mol->nextRigidBody(rbIter)) {
133 xsun 980 rb->updateAtoms();
134     }
135     }
136 xsun 1213
137 gezelter 2071 for (sd3 = seleMan2_.beginSelected(i1); sd3 != NULL;
138     sd3 = seleMan2_.nextSelected(i1)) {
139 xsun 1213 Vector3d pos1 = sd3->getPos();
140     if (usePeriodicBoundaryConditions_)
141     currentSnapshot_->wrapVector(pos1);
142     sd3->setPos(pos1);
143     }
144    
145 gezelter 2071 for (sd3 = seleMan2_.beginSelected(i1); sd3 != NULL;
146     sd3 = seleMan2_.nextSelected(i1)) {
147 xsun 1213 Vector3d pos1 = sd3->getPos();
148     sumZ += pos1.z();
149     }
150     RealType avgZ = sumZ / (RealType) nMolecules;
151 xsun 980
152 gezelter 2071 Mat3x3d orderTensorHeadUpper(0.0);
153     Mat3x3d orderTensorTail(0.0);
154     Mat3x3d orderTensorHeadLower(0.0);
155     for (j1 = seleMan1_.beginSelected(i1); j1 != NULL;
156     j1 = seleMan1_.nextSelected(i1)) {
157 xsun 1213 Vector3d pos = j1->getPos();
158     if (usePeriodicBoundaryConditions_)
159     currentSnapshot_->wrapVector(pos);
160     Vector3d vecHeadUpper;
161     if (pos.z() >= avgZ){
162 gezelter 1879 AtomType* atype1 = static_cast<Atom*>(j1)->getAtomType();
163     MultipoleAdapter ma1 = MultipoleAdapter(atype1);
164     if (ma1.isDipole())
165     vecHeadUpper = j1->getDipole();
166     else
167     vecHeadUpper = j1->getA().transpose()*V3Z;
168 xsun 1213 nUpper++;
169     }
170     Vector3d vecHeadLower;
171     if (pos.z() <= avgZ){
172 gezelter 1879 AtomType* atype1 = static_cast<Atom*>(j1)->getAtomType();
173     MultipoleAdapter ma1 = MultipoleAdapter(atype1);
174     if (ma1.isDipole())
175     vecHeadLower = j1->getDipole();
176     else
177     vecHeadLower = j1->getA().transpose() * V3Z;
178 xsun 1213 nLower++;
179     }
180     orderTensorHeadUpper +=outProduct(vecHeadUpper, vecHeadUpper);
181     orderTensorHeadLower +=outProduct(vecHeadLower, vecHeadLower);
182     }
183 gezelter 2071 for (j2 = seleMan2_.beginSelected(i1); j2 != NULL;
184     j2 = seleMan2_.nextSelected(i1)) {
185 xsun 1213 // The lab frame vector corresponding to the body-fixed
186     // z-axis is simply the second column of A.transpose()
187     // or, identically, the second row of A itself.
188    
189     Vector3d vecTail = j2->getA().getRow(2);
190 xsun 980 orderTensorTail +=outProduct(vecTail, vecTail);
191 xsun 1213 nTail++;
192 xsun 980 }
193    
194 xsun 1213 orderTensorHeadUpper /= (RealType) nUpper;
195     orderTensorHeadLower /= (RealType) nLower;
196     orderTensorHeadUpper -= (RealType)(1.0/3.0) * Mat3x3d::identity();
197     orderTensorHeadLower -= (RealType)(1.0/3.0) * Mat3x3d::identity();
198    
199     orderTensorTail /= (RealType) nTail;
200 xsun 980 orderTensorTail -= (RealType)(1.0/3.0) * Mat3x3d::identity();
201    
202 xsun 1213 Vector3d eigenvaluesHeadUpper, eigenvaluesHeadLower, eigenvaluesTail;
203 gezelter 2071 Mat3x3d eigenvectorsHeadUpper, eigenvectorsHeadLower, eigenvectorsTail;
204     Mat3x3d::diagonalize(orderTensorHeadUpper, eigenvaluesHeadUpper,
205     eigenvectorsHeadUpper);
206     Mat3x3d::diagonalize(orderTensorHeadLower, eigenvaluesHeadLower,
207     eigenvectorsHeadLower);
208 xsun 980 Mat3x3d::diagonalize(orderTensorTail, eigenvaluesTail, eigenvectorsTail);
209    
210 gezelter 2071 int whichUpper(-1), whichLower(-1), whichTail(-1);
211 xsun 1213 RealType maxEvalUpper = 0.0;
212     RealType maxEvalLower = 0.0;
213     RealType maxEvalTail = 0.0;
214 xsun 980 for(int k = 0; k< 3; k++){
215 xsun 1213 if(fabs(eigenvaluesHeadUpper[k]) > maxEvalUpper){
216     whichUpper = k;
217     maxEvalUpper = fabs(eigenvaluesHeadUpper[k]);
218 xsun 980 }
219     }
220 xsun 1213 RealType p2HeadUpper = 1.5 * maxEvalUpper;
221 xsun 980 for(int k = 0; k< 3; k++){
222 xsun 1213 if(fabs(eigenvaluesHeadLower[k]) > maxEvalLower){
223     whichLower = k;
224     maxEvalLower = fabs(eigenvaluesHeadLower[k]);
225 xsun 980 }
226     }
227 xsun 1213 RealType p2HeadLower = 1.5 * maxEvalLower;
228     for(int k = 0; k< 3; k++){
229     if(fabs(eigenvaluesTail[k]) > maxEvalTail){
230     whichTail = k;
231     maxEvalTail = fabs(eigenvaluesTail[k]);
232     }
233     }
234     RealType p2Tail = 1.5 * maxEvalTail;
235 xsun 980
236 gezelter 2071 //the eigenvector is already normalized in SquareMatrix3::diagonalize
237 xsun 1213 Vector3d directorHeadUpper = eigenvectorsHeadUpper.getColumn(whichUpper);
238     if (directorHeadUpper[0] < 0) {
239     directorHeadUpper.negate();
240 xsun 980 }
241 xsun 1213 Vector3d directorHeadLower = eigenvectorsHeadLower.getColumn(whichLower);
242     if (directorHeadLower[0] < 0) {
243     directorHeadLower.negate();
244     }
245     Vector3d directorTail = eigenvectorsTail.getColumn(whichTail);
246 xsun 980 if (directorTail[0] < 0) {
247     directorTail.negate();
248     }
249    
250 xsun 1213 OrderParam paramHeadUpper, paramHeadLower, paramTail;
251     paramHeadUpper.p2 = p2HeadUpper;
252     paramHeadUpper.director = directorHeadUpper;
253     paramHeadLower.p2 = p2HeadLower;
254     paramHeadLower.director = directorHeadLower;
255 xsun 980 paramTail.p2 = p2Tail;
256     paramTail.director = directorTail;
257    
258 xsun 1213 orderParamsHeadUpper_.push_back(paramHeadUpper);
259     orderParamsHeadLower_.push_back(paramHeadLower);
260 xsun 980 orderParamsTail_.push_back(paramTail);
261    
262     }
263    
264 xsun 1213 OrderParam sumOPHeadUpper, errsumOPHeadUpper;
265     OrderParam sumOPHeadLower, errsumOPHeadLower;
266 xsun 980 OrderParam sumOPTail, errsumOPTail;
267    
268 xsun 1213 sumOPHeadUpper.p2 = 0.0;
269     errsumOPHeadUpper.p2 = 0.0;
270     sumOPHeadLower.p2 = 0.0;
271     errsumOPHeadLower.p2 = 0.0;
272     for (std::size_t i = 0; i < orderParamsHeadUpper_.size(); ++i) {
273     sumOPHeadUpper.p2 += orderParamsHeadUpper_[i].p2;
274     sumOPHeadUpper.director[0] += orderParamsHeadUpper_[i].director[0];
275     sumOPHeadUpper.director[1] += orderParamsHeadUpper_[i].director[1];
276     sumOPHeadUpper.director[2] += orderParamsHeadUpper_[i].director[2];
277 xsun 980 }
278    
279 xsun 1213 avgOPHeadUpper.p2 = sumOPHeadUpper.p2 / (RealType)orderParamsHeadUpper_.size();
280     avgOPHeadUpper.director[0] = sumOPHeadUpper.director[0] / (RealType)orderParamsHeadUpper_.size();
281     avgOPHeadUpper.director[1] = sumOPHeadUpper.director[1] / (RealType)orderParamsHeadUpper_.size();
282     avgOPHeadUpper.director[2] = sumOPHeadUpper.director[2] / (RealType)orderParamsHeadUpper_.size();
283     for (std::size_t i = 0; i < orderParamsHeadUpper_.size(); ++i) {
284     errsumOPHeadUpper.p2 += pow((orderParamsHeadUpper_[i].p2 - avgOPHeadUpper.p2), 2);
285 xsun 980 }
286 xsun 1213 errOPHeadUpper.p2 = sqrt(errsumOPHeadUpper.p2 / (RealType)orderParamsHeadUpper_.size());
287     for (std::size_t i = 0; i < orderParamsHeadLower_.size(); ++i) {
288     sumOPHeadLower.p2 += orderParamsHeadLower_[i].p2;
289     sumOPHeadLower.director[0] += orderParamsHeadLower_[i].director[0];
290     sumOPHeadLower.director[1] += orderParamsHeadLower_[i].director[1];
291     sumOPHeadLower.director[2] += orderParamsHeadLower_[i].director[2];
292     }
293 xsun 980
294 xsun 1213 avgOPHeadLower.p2 = sumOPHeadLower.p2 / (RealType)orderParamsHeadLower_.size();
295     avgOPHeadLower.director[0] = sumOPHeadLower.director[0] / (RealType)orderParamsHeadLower_.size();
296     avgOPHeadLower.director[1] = sumOPHeadLower.director[1] / (RealType)orderParamsHeadLower_.size();
297     avgOPHeadLower.director[2] = sumOPHeadLower.director[2] / (RealType)orderParamsHeadLower_.size();
298     for (std::size_t i = 0; i < orderParamsHeadLower_.size(); ++i) {
299     errsumOPHeadLower.p2 += pow((orderParamsHeadLower_[i].p2 - avgOPHeadLower.p2), 2);
300     }
301     errOPHeadLower.p2 = sqrt(errsumOPHeadLower.p2 / (RealType)orderParamsHeadLower_.size());
302    
303 xsun 980 sumOPTail.p2 = 0.0;
304     errsumOPTail.p2 = 0.0;
305     for (std::size_t i = 0; i < orderParamsTail_.size(); ++i) {
306     sumOPTail.p2 += orderParamsTail_[i].p2;
307     sumOPTail.director[0] += orderParamsTail_[i].director[0];
308     sumOPTail.director[1] += orderParamsTail_[i].director[1];
309     sumOPTail.director[2] += orderParamsTail_[i].director[2];
310     }
311    
312     avgOPTail.p2 = sumOPTail.p2 / (RealType)orderParamsTail_.size();
313     avgOPTail.director[0] = sumOPTail.director[0] / (RealType)orderParamsTail_.size();
314     avgOPTail.director[1] = sumOPTail.director[1] / (RealType)orderParamsTail_.size();
315     avgOPTail.director[2] = sumOPTail.director[2] / (RealType)orderParamsTail_.size();
316     for (std::size_t i = 0; i < orderParamsTail_.size(); ++i) {
317     errsumOPTail.p2 += pow((orderParamsTail_[i].p2 - avgOPTail.p2), 2);
318     }
319     errOPTail.p2 = sqrt(errsumOPTail.p2 / (RealType)orderParamsTail_.size());
320    
321     writeP2();
322    
323     }
324    
325     void RippleOP::writeP2() {
326    
327     std::ofstream os(getOutputFileName().c_str());
328     os<< "#selection1: (" << selectionScript1_ << ")\n";
329     os << "#p2\terror\tdirector_x\tdirector_y\tdiretor_z\n";
330    
331 xsun 1213 os << avgOPHeadUpper.p2 << "\t"
332     << errOPHeadUpper.p2 << "\t"
333     << avgOPHeadUpper.director[0] << "\t"
334     << avgOPHeadUpper.director[1] << "\t"
335     << avgOPHeadUpper.director[2] << "\n";
336    
337     os << avgOPHeadLower.p2 << "\t"
338     << errOPHeadLower.p2 << "\t"
339     << avgOPHeadLower.director[0] << "\t"
340     << avgOPHeadLower.director[1] << "\t"
341     << avgOPHeadLower.director[2] << "\n";
342 xsun 980
343     os << "selection2: (" << selectionScript2_ << ")\n";
344     os << "#p2\terror\tdirector_x\tdirector_y\tdiretor_z\n";
345    
346     os << avgOPTail.p2 << "\t"
347     << errOPTail.p2 << "\t"
348     << avgOPTail.director[0] << "\t"
349     << avgOPTail.director[1] << "\t"
350     << avgOPTail.director[2] << "\n";
351     }
352    
353     }
354    

Properties

Name Value
svn:executable *
svn:keywords Author Id Revision Date