ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/applications/dynamicProps/cOHz.cpp
Revision: 1934
Committed: Mon Aug 26 14:15:09 2013 UTC (11 years, 8 months ago) by gezelter
File size: 7785 byte(s)
Log Message:
Added OH bond time correlation function

File Contents

# User Rev Content
1 gezelter 1934 /*
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     * 1. Redistributions of source code must retain the above copyright
10     * notice, this list of conditions and the following disclaimer.
11     *
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.
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     *
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, 234107 (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/dynamicProps/cOHz.hpp"
44     #include "math/LegendrePolynomial.hpp"
45     #include "utils/simError.h"
46    
47     namespace OpenMD {
48     COHZ::COHZ(SimInfo* info,
49     const std::string& filename,
50     const std::string& sele1,
51     const std::string& sele2,
52     int order, int nZbins,
53     long long int memSize)
54     : ParticleTimeCorrFunc(info, filename, sele1, sele2,
55     DataStorage::dslAmat, memSize), nZBins_(nZbins) {
56    
57     setCorrFuncType("Legendre Correlation Function for OH bond vector of Z");
58     setOutputName1(getPrefix(dumpFilename_) + ".cohZ");
59     setOutputName2(getPrefix(dumpFilename_) + ".lcorrZ");
60     histogram_.resize(nTimeBins_);
61     counts_.resize(nTimeBins_);
62     for (int i = 0; i < nTimeBins_; i++) {
63     histogram_[i].resize(nZBins_);
64     counts_[i].resize(nZBins_);
65     }
66     LegendrePolynomial polynomial(order);
67     legendre_ = polynomial.getLegendrePolynomial(order);
68     }
69    
70     void COHZ::correlateFrames(int frame1, int frame2) {
71     Snapshot* snapshot1 = bsMan_->getSnapshot(frame1);
72     Snapshot* snapshot2 = bsMan_->getSnapshot(frame2);
73     assert(snapshot1 && snapshot2);
74    
75     Mat3x3d hmat = snapshot1->getHmat();
76     RealType halfBoxZ_ = hmat(2,2) / 2.0;
77    
78     RealType time1 = snapshot1->getTime();
79     RealType time2 = snapshot2->getTime();
80    
81     int timeBin = int ((time2 - time1) /deltaTime_ + 0.5);
82    
83     int i;
84     int j;
85     StuntDouble* sd1;
86     StuntDouble* sd2;
87    
88     for (sd1 = seleMan1_.beginSelected(i), sd2 = seleMan2_.beginSelected(j);
89     sd1 != NULL && sd2 != NULL;
90     sd1 = seleMan1_.nextSelected(i), sd2 = seleMan2_.nextSelected(j)) {
91    
92     Vector3d pos = sd1->getPos();
93     if (info_->getSimParams()->getUsePeriodicBoundaryConditions())
94     snapshot1->wrapVector(pos);
95     int zBin = int(nZBins_ * (halfBoxZ_ + pos.z()) / hmat(2,2));
96    
97     Vector3d corrVals = calcCorrVals(frame1, frame2, sd1, sd2);
98     histogram_[timeBin][zBin] += corrVals;
99     counts_[timeBin][zBin]++;
100     }
101    
102     }
103    
104     void COHZ::postCorrelate() {
105     for (int i =0 ; i < nTimeBins_; ++i) {
106     for (int j = 0; j < nZBins_; ++j) {
107     if (counts_[i][j] > 0) {
108     histogram_[i][j] /= counts_[i][j];
109     }
110     }
111     }
112     }
113    
114     void COHZ::preCorrelate() {
115     for (int i = 0; i < nTimeBins_; i++) {
116     std::fill(histogram_[i].begin(), histogram_[i].end(), Vector3d(0.0));
117     std::fill(counts_[i].begin(), counts_[i].end(), 0);
118     }
119     }
120    
121     Vector3d COHZ::calcCorrVals(int frame1, int frame2, StuntDouble* sd1, StuntDouble* sd2) {
122    
123     // Vectors v1x, v1y, and v1z are the body-fixed axes on the
124     // molecule in frame 1 in the laboratory frame.
125    
126     // Vectors v2x, v2y, and v2z are the body-fixed axes on the
127     // molecule in frame 2 in the laboratory frame.
128    
129     // Vectors u1 & u2 are the first OH bond vector in frames 1 & 2
130     // respectively. Here we assume SPC/E geometry.
131    
132     // Vectors w1 & w2 are the second OH bond vector in frames 1 & 2
133     // respectively. Here we assume SPC/E geometry.
134    
135     Vector3d v1x = sd1->getA(frame1).getRow(0);
136     Vector3d v2x = sd2->getA(frame2).getRow(0);
137    
138     Vector3d v1y = sd1->getA(frame1).getRow(1);
139     Vector3d v2y = sd2->getA(frame2).getRow(1);
140    
141     Vector3d v1z = sd1->getA(frame1).getRow(2);
142     Vector3d v2z = sd2->getA(frame2).getRow(2);
143    
144     Vector3d u1 = 0.81649 * v1y + 0.57736 * v1z;
145     Vector3d u2 = 0.81649 * v2y + 0.57736 * v2z;
146    
147     Vector3d w1 = -0.81649 * v1y + 0.57736 * v1z;
148     Vector3d w2 = -0.81649 * v2y + 0.57736 * v2z;
149    
150    
151     RealType vprod = legendre_.evaluate(dot(v1z, v2z)/(v1z.length()*v2z.length()));
152     RealType uprod = legendre_.evaluate(dot(u1, u2)/(u1.length()*u2.length()));
153     RealType wprod = legendre_.evaluate(dot(w1, w2)/(w1.length()*w2.length()));
154    
155     return Vector3d(vprod, uprod, wprod);
156    
157     }
158    
159    
160     void COHZ::validateSelection(const SelectionManager& seleMan) {
161     StuntDouble* sd;
162     int i;
163     for (sd = seleMan1_.beginSelected(i); sd != NULL; sd = seleMan1_.nextSelected(i)) {
164     if (!sd->isDirectionalAtom()) {
165     sprintf(painCave.errMsg,
166     "LegendreCorrFunc::validateSelection Error: selected atoms are not Directional\n");
167     painCave.isFatal = 1;
168     simError();
169     }
170     }
171    
172     }
173    
174     void COHZ::writeCorrelate() {
175     std::ofstream ofs1(getOutputFileName1().c_str());
176     std::ofstream ofs2(getOutputFileName2().c_str());
177    
178     if (ofs1.is_open()) {
179    
180     ofs1 << "#" << getCorrFuncType() << "\n";
181     ofs1 << "#time\tPn(costheta_z)\n";
182    
183     for (int i = 0; i < nTimeBins_; ++i) {
184    
185     ofs1 << time_[i];
186    
187     for (int j = 0; j < nZBins_; ++j) {
188     ofs1 << "\t" << 0.5*(histogram_[i][j](1) + histogram_[i][j](2));
189     }
190     ofs1 << "\n";
191     }
192    
193     } else {
194     sprintf(painCave.errMsg,
195     "cOHz::writeCorrelate Error: fail to open %s\n", getOutputFileName1().c_str());
196     painCave.isFatal = 1;
197     simError();
198     }
199     ofs1.close();
200    
201     if (ofs2.is_open()) {
202    
203     ofs2 << "#" << getCorrFuncType() << "\n";
204     ofs2 << "#time\tPn(costheta_z)\n";
205    
206     for (int i = 0; i < nTimeBins_; ++i) {
207    
208     ofs2 << time_[i];
209    
210     for (int j = 0; j < nZBins_; ++j) {
211     ofs2 << "\t" << histogram_[i][j](0);
212     }
213     ofs2 << "\n";
214     }
215    
216     } else {
217     sprintf(painCave.errMsg,
218     "cOHz::writeCorrelate Error: fail to open %s\n", getOutputFileName2().c_str());
219     painCave.isFatal = 1;
220     simError();
221     }
222     ofs2.close();
223     }
224     }

Properties

Name Value
svn:eol-style native
svn:executable *