ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/applications/hydrodynamics/HydrodynamicsModel.cpp
Revision: 2598
Committed: Fri Feb 24 21:17:05 2006 UTC (18 years, 6 months ago) by tim
File size: 10452 byte(s)
Log Message:
fix bugs in HydrodynamicsModel; (1) sign issue of Xirr calculation (2) out product of Rij

File Contents

# User Rev Content
1 tim 2596 /*
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. 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
19     * notice, this list of conditions and the following disclaimer.
20     *
21     * 3. Redistributions in binary form must reproduce the above copyright
22     * notice, this list of conditions and the following disclaimer in the
23     * documentation and/or other materials provided with the
24     * distribution.
25     *
26     * This software is provided "AS IS," without a warranty of any
27     * kind. All express or implied conditions, representations and
28     * warranties, including any implied warranty of merchantability,
29     * fitness for a particular purpose or non-infringement, are hereby
30     * excluded. The University of Notre Dame and its licensors shall not
31     * be liable for any damages suffered by licensee as a result of
32     * using, modifying or distributing the software or its
33     * derivatives. In no event will the University of Notre Dame or its
34     * licensors be liable for any lost revenue, profit or data, or for
35     * direct, indirect, special, consequential, incidental or punitive
36     * damages, however caused and regardless of the theory of liability,
37     * arising out of the use of or inability to use software, even if the
38     * University of Notre Dame has been advised of the possibility of
39     * such damages.
40     */
41    
42     #include "applications/hydrodynamics/HydrodynamicsModel.hpp"
43     #include "math/LU.hpp"
44     #include "math/DynamicRectMatrix.hpp"
45     #include "math/SquareMatrix3.hpp"
46 tim 2597 #include "utils/OOPSEConstant.hpp"
47 tim 2596 namespace oopse {
48     /**
49     * Reference:
50     * Beatriz Carrasco and Jose Gracia de la Torre, Hydrodynamic Properties of Rigid Particles:
51     * Comparison of Different Modeling and Computational Procedures.
52     * Biophysical Journal, 75(6), 3044, 1999
53     */
54 tim 2597
55     HydrodynamicsModel::HydrodynamicsModel(StuntDouble* sd, const DynamicProperty& extraParams) : sd_(sd){
56     DynamicProperty::const_iterator iter;
57    
58     iter = extraParams.find("Viscosity");
59     if (iter != extraParams.end()) {
60     boost::any param = iter->second;
61     viscosity_ = boost::any_cast<double>(param);
62     }else {
63     std::cout << "HydrodynamicsModel Error\n" ;
64     }
65    
66     iter = extraParams.find("Temperature");
67     if (iter != extraParams.end()) {
68     boost::any param = iter->second;
69     temperature_ = boost::any_cast<double>(param);
70     }else {
71     std::cout << "HydrodynamicsModel Error\n" ;
72     }
73     }
74    
75     bool HydrodynamicsModel::calcHydrodyanmicsProps() {
76 tim 2596 if (!createBeads(beads_)) {
77     std::cout << "can not create beads" << std::endl;
78     return false;
79     }
80    
81     int nbeads = beads_.size();
82     DynamicRectMatrix<double> B(3*nbeads, 3*nbeads);
83     DynamicRectMatrix<double> C(3*nbeads, 3*nbeads);
84     Mat3x3d I;
85 tim 2597 I(0, 0) = 1.0;
86     I(1, 1) = 1.0;
87     I(2, 2) = 1.0;
88    
89 tim 2596 for (std::size_t i = 0; i < nbeads; ++i) {
90     for (std::size_t j = 0; j < nbeads; ++j) {
91     Mat3x3d Tij;
92     if (i != j ) {
93     Vector3d Rij = beads_[i].pos - beads_[j].pos;
94     double rij = Rij.length();
95     double rij2 = rij * rij;
96     double sumSigma2OverRij2 = ((beads_[i].radius*beads_[i].radius) + (beads_[i].radius*beads_[i].radius)) / rij2;
97     Mat3x3d tmpMat;
98 tim 2598 tmpMat = outProduct(Rij, Rij) / rij2;
99 tim 2597 double constant = 8.0 * NumericConstant::PI * viscosity_ * rij;
100 tim 2596 Tij = ((1.0 + sumSigma2OverRij2/3.0) * I + (1.0 - sumSigma2OverRij2) * tmpMat ) / constant;
101     }else {
102 tim 2597 double constant = 1.0 / (6.0 * NumericConstant::PI * viscosity_ * beads_[i].radius);
103 tim 2596 Tij(0, 0) = constant;
104     Tij(1, 1) = constant;
105     Tij(2, 2) = constant;
106     }
107     B.setSubMatrix(i*3, j*3, Tij);
108 tim 2598 std::cout << Tij << std::endl;
109 tim 2596 }
110     }
111    
112 tim 2598 std::cout << "B=\n"
113     << B << std::endl;
114 tim 2596 //invert B Matrix
115     invertMatrix(B, C);
116 tim 2598
117     std::cout << "C=\n"
118     << C << std::endl;
119    
120 tim 2596 //prepare U Matrix relative to arbitrary origin O(0.0, 0.0, 0.0)
121     std::vector<Mat3x3d> U;
122     for (int i = 0; i < nbeads; ++i) {
123     Mat3x3d currU;
124     currU.setupSkewMat(beads_[i].pos);
125     U.push_back(currU);
126     }
127    
128     //calculate Xi matrix at arbitrary origin O
129     Mat3x3d Xitt;
130     Mat3x3d Xirr;
131     Mat3x3d Xitr;
132 tim 2598
133     //calculate the total volume
134    
135     double volume = 0.0;
136     for (std::vector<BeadParam>::iterator iter = beads_.begin(); iter != beads_.end(); ++iter) {
137     volume = 4.0/3.0 * NumericConstant::PI * pow((*iter).radius,3);
138     }
139 tim 2596
140     for (std::size_t i = 0; i < nbeads; ++i) {
141     for (std::size_t j = 0; j < nbeads; ++j) {
142     Mat3x3d Cij;
143     C.getSubMatrix(i*3, j*3, Cij);
144    
145     Xitt += Cij;
146 tim 2598 Xitr += U[i] * Cij;
147     Xirr += -U[i] * Cij * U[j];
148     //Xirr += -U[i] * Cij * U[j] + (0.166*6 * viscosity_ * volume) * I;
149 tim 2596 }
150     }
151    
152     //invert Xi to get Diffusion Tensor at arbitrary origin O
153     RectMatrix<double, 6, 6> Xi;
154     RectMatrix<double, 6, 6> Do;
155     Xi.setSubMatrix(0, 0, Xitt);
156     Xi.setSubMatrix(0, 3, Xitr.transpose());
157     Xi.setSubMatrix(3, 0, Xitr);
158 tim 2597 Xi.setSubMatrix(3, 3, Xirr);
159     //invertMatrix(Xi, Do);
160     double kt = OOPSEConstant::kB * temperature_ * 1.66E-2;
161     //Do *= kt;
162 tim 2596
163 tim 2597
164 tim 2596 Mat3x3d Dott; //translational diffusion tensor at arbitrary origin O
165     Mat3x3d Dorr; //rotational diffusion tensor at arbitrary origin O
166     Mat3x3d Dotr; //translation-rotation couplingl diffusion tensor at arbitrary origin O
167    
168 tim 2598 const static Mat3x3d zeroMat(0.0);
169 tim 2597
170     Mat3x3d XittInv(0.0);
171 tim 2598 XittInv = Xitt.inverse();
172    
173     //Xirr may not be inverted,if it one of the diagonal element is zero, for example
174     //( a11 a12 0)
175     //( a21 a22 0)
176     //( 0 0 0)
177     Mat3x3d XirrInv;
178     XirrInv = Xirr.inverse();
179 tim 2597
180     Mat3x3d tmp;
181     Mat3x3d tmpInv;
182     tmp = Xitt - Xitr.transpose() * XirrInv * Xitr;
183 tim 2598 tmpInv = tmp.inverse();
184 tim 2597
185     Dott = kt * tmpInv;
186 tim 2598 Dotr = -kt*XirrInv * Xitr * tmpInv* 1.0E8;
187 tim 2597
188 tim 2598 tmp = Xirr - Xitr * XittInv * Xitr.transpose();
189     tmpInv = tmp.inverse();
190 tim 2597
191 tim 2598 Dorr = kt * tmpInv*1.0E16;
192 tim 2597
193     //Do.getSubMatrix(0, 0 , Dott);
194     //Do.getSubMatrix(3, 0, Dotr);
195     //Do.getSubMatrix(3, 3, Dorr);
196    
197 tim 2596 //calculate center of diffusion
198 tim 2597 tmp(0, 0) = Dorr(1, 1) + Dorr(2, 2);
199     tmp(0, 1) = - Dorr(0, 1);
200     tmp(0, 2) = -Dorr(0, 2);
201     tmp(1, 0) = -Dorr(0, 1);
202     tmp(1, 1) = Dorr(0, 0) + Dorr(2, 2);
203     tmp(1, 2) = -Dorr(1, 2);
204     tmp(2, 0) = -Dorr(0, 2);
205     tmp(2, 1) = -Dorr(1, 2);
206     tmp(2, 2) = Dorr(1, 1) + Dorr(0, 0);
207 tim 2596
208     Vector3d tmpVec;
209     tmpVec[0] = Dotr(1, 2) - Dotr(2, 1);
210     tmpVec[1] = Dotr(2, 0) - Dotr(0, 2);
211     tmpVec[2] = Dotr(0, 1) - Dotr(1, 0);
212    
213 tim 2598 tmpInv = tmp.inverse();
214 tim 2597
215     Vector3d rod = tmpInv * tmpVec;
216    
217 tim 2596 //calculate Diffusion Tensor at center of diffusion
218     Mat3x3d Uod;
219     Uod.setupSkewMat(rod);
220    
221     Mat3x3d Ddtt; //translational diffusion tensor at diffusion center
222     Mat3x3d Ddtr; //rotational diffusion tensor at diffusion center
223     Mat3x3d Ddrr; //translation-rotation couplingl diffusion tensor at diffusion tensor
224    
225     Ddtt = Dott - Uod * Dorr * Uod + Dotr.transpose() * Uod - Uod * Dotr;
226     Ddrr = Dorr;
227     Ddtr = Dotr + Dorr * Uod;
228    
229     props_.diffCenter = rod;
230     props_.transDiff = Ddtt;
231     props_.transRotDiff = Ddtr;
232     props_.rotDiff = Ddrr;
233    
234     return true;
235     }
236    
237     void HydrodynamicsModel::writeBeads(std::ostream& os) {
238 tim 2597 std::vector<BeadParam>::iterator iter;
239     os << beads_.size() << std::endl;
240     os << "Generated by Hydro" << std::endl;
241     for (iter = beads_.begin(); iter != beads_.end(); ++iter) {
242     os << iter->atomName << "\t" << iter->pos[0] << "\t" << iter->pos[1] << "\t" << iter->pos[2] << std::endl;
243     }
244 tim 2596
245     }
246    
247     void HydrodynamicsModel::writeDiffCenterAndDiffTensor(std::ostream& os) {
248 tim 2597 os << "//viscosity = " << viscosity_ << std::endl;
249     os << "//temperature = " << temperature_<< std::endl;
250     std::vector<BeadParam>::iterator iter;
251     os << sd_->getType() << "\n";
252 tim 2596
253 tim 2597 os << "//diffusion center" << std::endl;
254     os << props_.diffCenter << std::endl;
255    
256     os << "//translational diffusion tensor" << std::endl;
257     os << props_.transDiff << std::endl;
258    
259 tim 2598 os << "//translation-rotation coupling diffusion tensor" << std::endl;
260 tim 2597 os << props_.transRotDiff << std::endl;
261    
262     os << "//rotational diffusion tensor" << std::endl;
263     os << props_.rotDiff << std::endl;
264    
265     /*
266     os << props_.diffCenter[0] << "\t" << props_.diffCenter[1] << "\t" << props_.diffCenter[2] << "\n"
267    
268     os << props_.transDiff(0, 0) << "\t" << props_.transDiff(0, 1) << "\t" << props_.transDiff(0, 2) << "\t"
269     << props_.transDiff(1, 0) << "\t" << props_.transDiff(1, 1) << "\t" << props_.transDiff(1, 2) << "\t"
270     << props_.transDiff(2, 0) << "\t" << props_.transDiff(2, 1) << "\t" << props_.transDiff(2, 2) << "\n";
271    
272     os << props_.transRotDiff(0, 0) << "\t" << props_.transRotDiff(0, 1) << "\t" << props_.transRotDiff(0, 2) << "\t"
273     << props_.transRotDiff(1, 0) << "\t" << props_.transRotDiff(1, 1) << "\t" << props_.transRotDiff(1, 2) << "\t"
274     << props_.transRotDiff(2, 0) << "\t" << props_.transRotDiff(2, 1) << "\t" << props_.transRotDiff(2, 2) << "\t"
275    
276     os << props_.rotDiff(0, 0) << "\t" << props_.rotDiff(0, 1) << "\t" << props_.rotDiff(0, 2) << "\t"
277     << props_.rotDiff(1, 0) << "\t" << props_.rotDiff(1, 1) << "\t" << props_.rotDiff(1, 2) << "\t"
278     << props_.rotDiff(2, 0) << "\t" << props_.rotDiff(2, 1) << "\t" << props_.rotDiff(2, 2) << ";"
279     << std::endl;
280     */
281 tim 2596 }
282    
283     }

Properties

Name Value
svn:executable *