ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/applications/hydrodynamics/HydrodynamicsModel.cpp
Revision: 2596
Committed: Wed Feb 22 20:35:16 2006 UTC (18 years, 6 months ago) by tim
File size: 6512 byte(s)
Log Message:
Adding Hydrodynamics Module

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     namespace oopse {
47     /**
48     * Reference:
49     * Beatriz Carrasco and Jose Gracia de la Torre, Hydrodynamic Properties of Rigid Particles:
50     * Comparison of Different Modeling and Computational Procedures.
51     * Biophysical Journal, 75(6), 3044, 1999
52     */
53     bool HydrodynamicsModel::calcHydrodyanmicsProps(double eta) {
54     if (!createBeads(beads_)) {
55     std::cout << "can not create beads" << std::endl;
56     return false;
57     }
58    
59     int nbeads = beads_.size();
60     DynamicRectMatrix<double> B(3*nbeads, 3*nbeads);
61     DynamicRectMatrix<double> C(3*nbeads, 3*nbeads);
62     Mat3x3d I;
63     for (std::size_t i = 0; i < nbeads; ++i) {
64     for (std::size_t j = 0; j < nbeads; ++j) {
65     Mat3x3d Tij;
66     if (i != j ) {
67     Vector3d Rij = beads_[i].pos - beads_[j].pos;
68     double rij = Rij.length();
69     double rij2 = rij * rij;
70     double sumSigma2OverRij2 = ((beads_[i].radius*beads_[i].radius) + (beads_[i].radius*beads_[i].radius)) / rij2;
71     Mat3x3d tmpMat;
72     tmpMat = outProduct(beads_[i].pos, beads_[j].pos) / rij2;
73     double constant = 8.0 * NumericConstant::PI * eta * rij;
74     Tij = ((1.0 + sumSigma2OverRij2/3.0) * I + (1.0 - sumSigma2OverRij2) * tmpMat ) / constant;
75     }else {
76     double constant = 1.0 / (6.0 * NumericConstant::PI * eta * beads_[i].radius);
77     Tij(0, 0) = constant;
78     Tij(1, 1) = constant;
79     Tij(2, 2) = constant;
80     }
81     B.setSubMatrix(i*3, j*3, Tij);
82     }
83     }
84    
85     //invert B Matrix
86     invertMatrix(B, C);
87    
88     //prepare U Matrix relative to arbitrary origin O(0.0, 0.0, 0.0)
89     std::vector<Mat3x3d> U;
90     for (int i = 0; i < nbeads; ++i) {
91     Mat3x3d currU;
92     currU.setupSkewMat(beads_[i].pos);
93     U.push_back(currU);
94     }
95    
96     //calculate Xi matrix at arbitrary origin O
97     Mat3x3d Xitt;
98     Mat3x3d Xirr;
99     Mat3x3d Xitr;
100    
101     for (std::size_t i = 0; i < nbeads; ++i) {
102     for (std::size_t j = 0; j < nbeads; ++j) {
103     Mat3x3d Cij;
104     C.getSubMatrix(i*3, j*3, Cij);
105    
106     Xitt += Cij;
107     Xirr += U[i] * Cij;
108     Xitr += U[i] * Cij * U[j];
109     }
110     }
111    
112     //invert Xi to get Diffusion Tensor at arbitrary origin O
113     RectMatrix<double, 6, 6> Xi;
114     RectMatrix<double, 6, 6> Do;
115     Xi.setSubMatrix(0, 0, Xitt);
116     Xi.setSubMatrix(0, 3, Xitr.transpose());
117     Xi.setSubMatrix(3, 0, Xitr);
118     Xi.setSubMatrix(3, 3, Xitt);
119     invertMatrix(Xi, Do);
120    
121     Mat3x3d Dott; //translational diffusion tensor at arbitrary origin O
122     Mat3x3d Dorr; //rotational diffusion tensor at arbitrary origin O
123     Mat3x3d Dotr; //translation-rotation couplingl diffusion tensor at arbitrary origin O
124     Do.getSubMatrix(0, 0 , Dott);
125     Do.getSubMatrix(3, 0, Dotr);
126     Do.getSubMatrix(3, 3, Dorr);
127    
128     //calculate center of diffusion
129     Mat3x3d tmpMat;
130     tmpMat(0, 0) = Dorr(1, 1) + Dorr(2, 2);
131     tmpMat(0, 1) = - Dorr(0, 1);
132     tmpMat(0, 2) = -Dorr(0, 2);
133     tmpMat(1, 0) = -Dorr(0, 1);
134     tmpMat(1, 1) = Dorr(0, 0) + Dorr(2, 2);
135     tmpMat(1, 2) = -Dorr(1, 2);
136     tmpMat(2, 0) = -Dorr(0, 2);
137     tmpMat(2, 1) = -Dorr(1, 2);
138     tmpMat(2, 2) = Dorr(1, 1) + Dorr(0, 0);
139    
140     Vector3d tmpVec;
141     tmpVec[0] = Dotr(1, 2) - Dotr(2, 1);
142     tmpVec[1] = Dotr(2, 0) - Dotr(0, 2);
143     tmpVec[2] = Dotr(0, 1) - Dotr(1, 0);
144    
145     Vector3d rod = tmpMat.inverse() * tmpVec;
146    
147     //calculate Diffusion Tensor at center of diffusion
148     Mat3x3d Uod;
149     Uod.setupSkewMat(rod);
150    
151     Mat3x3d Ddtt; //translational diffusion tensor at diffusion center
152     Mat3x3d Ddtr; //rotational diffusion tensor at diffusion center
153     Mat3x3d Ddrr; //translation-rotation couplingl diffusion tensor at diffusion tensor
154    
155     Ddtt = Dott - Uod * Dorr * Uod + Dotr.transpose() * Uod - Uod * Dotr;
156     Ddrr = Dorr;
157     Ddtr = Dotr + Dorr * Uod;
158    
159     props_.diffCenter = rod;
160     props_.transDiff = Ddtt;
161     props_.transRotDiff = Ddtr;
162     props_.rotDiff = Ddrr;
163    
164     return true;
165     }
166    
167     void HydrodynamicsModel::writeBeads(std::ostream& os) {
168    
169     }
170    
171     void HydrodynamicsModel::writeDiffCenterAndDiffTensor(std::ostream& os) {
172    
173     }
174    
175     }

Properties

Name Value
svn:executable *