ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/applications/hydrodynamics/HydrodynamicsModel.cpp
(Generate patch)

Comparing trunk/OOPSE-4/src/applications/hydrodynamics/HydrodynamicsModel.cpp (file contents):
Revision 2598 by tim, Fri Feb 24 21:17:05 2006 UTC vs.
Revision 2634 by tim, Fri Mar 17 23:20:35 2006 UTC

# Line 38 | Line 38
38   * University of Notre Dame has been advised of the possibility of
39   * such damages.
40   */
41 + #include "applications/hydrodynamics/HydrodynamicsModel.hpp"
42 + #include "applications/hydrodynamics/Spheric.hpp"
43 + #include "applications/hydrodynamics/Ellipsoid.hpp"
44 + #include "applications/hydrodynamics/CompositeShape.hpp"
45  
42 #include "applications/hydrodynamics/HydrodynamicsModel.hpp"
43 #include "math/LU.hpp"
44 #include "math/DynamicRectMatrix.hpp"
45 #include "math/SquareMatrix3.hpp"
46 #include "utils/OOPSEConstant.hpp"
46   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 */
47  
48 < HydrodynamicsModel::HydrodynamicsModel(StuntDouble* sd, const DynamicProperty& extraParams) : sd_(sd){
49 <    DynamicProperty::const_iterator iter;
48 > bool HydrodynamicsModel::calcHydroProps(Spheric* spheric, double viscosity, double temperature) {
49 >    return false;
50 > }
51  
52 <    iter = extraParams.find("Viscosity");
53 <    if (iter != extraParams.end()) {
54 <        boost::any param = iter->second;
61 <        viscosity_ = boost::any_cast<double>(param);
62 <    }else {
63 <        std::cout << "HydrodynamicsModel Error\n" ;
64 <    }
52 > bool HydrodynamicsModel::calcHydroProps(Ellipsoid* ellipsoid, double viscosity, double temperature) {
53 >    return false;
54 > }
55  
56 <    iter = extraParams.find("Temperature");
57 <    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 <    }    
56 > bool HydrodynamicsModel::calcHydroProps(CompositeShape* compositexShape, double viscosity, double temperature) {
57 >    return false;
58   }
74
75 bool HydrodynamicsModel::calcHydrodyanmicsProps() {
76    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    I(0, 0) = 1.0;
86    I(1, 1) = 1.0;
87    I(2, 2) = 1.0;
88    
89    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                tmpMat = outProduct(Rij, Rij) / rij2;
99                double constant = 8.0 * NumericConstant::PI * viscosity_ * rij;
100                Tij = ((1.0 + sumSigma2OverRij2/3.0) * I + (1.0 - sumSigma2OverRij2) * tmpMat ) / constant;
101            }else {
102                double constant = 1.0 / (6.0 * NumericConstant::PI * viscosity_ * beads_[i].radius);
103                Tij(0, 0) = constant;
104                Tij(1, 1) = constant;
105                Tij(2, 2) = constant;
106            }
107            B.setSubMatrix(i*3, j*3, Tij);
108            std::cout << Tij << std::endl;
109        }
110    }
59  
60 <    std::cout << "B=\n"
113 <                  << B << std::endl;
114 <    //invert B Matrix
115 <    invertMatrix(B, C);
60 > void HydrodynamicsModel::writeHydroProps(std::ostream& os) {
61  
117    std::cout << "C=\n"
118                  << C << std::endl;
119
120    //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    }
62      
63 <    //calculate Xi matrix at arbitrary origin O
64 <    Mat3x3d Xitt;
65 <    Mat3x3d Xirr;
66 <    Mat3x3d Xitr;
63 >    os << sd_->getType() << "\t";
64 >    
65 >    //center of resistance
66 >    os << cr_.center[0] <<  "\t" << cr_.center[1] <<  "\t" << cr_.center[2] <<  "\t";
67  
68 <    //calculate the total volume
68 >    //resistance tensor at center of resistance
69 >    //translation
70 >    os << cr_.Xi(0, 0) <<  "\t" << cr_.Xi(0, 1) <<  "\t" << cr_.Xi(0, 2) <<  "\t"
71 >        << cr_.Xi(1, 0) <<  "\t" << cr_.Xi(1, 1) <<  "\t" << cr_.Xi(1, 2) <<  "\t"
72 >        << cr_.Xi(2, 0) <<  "\t" << cr_.Xi(2, 1) <<  "\t" << cr_.Xi(2, 2) <<  "\t";
73  
74 <    double volume = 0.0;
75 <    for (std::vector<BeadParam>::iterator iter = beads_.begin(); iter != beads_.end(); ++iter) {
76 <        volume = 4.0/3.0 * NumericConstant::PI * pow((*iter).radius,3);
77 <    }
139 <        
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 <            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 <        }
150 <    }
74 >    //rotation-translation
75 >    os << cr_.Xi(0, 3) <<  "\t" << cr_.Xi(0, 4) <<  "\t" << cr_.Xi(0, 5) <<  "\t"
76 >        << cr_.Xi(1, 3) <<  "\t" << cr_.Xi(1, 4) <<  "\t" << cr_.Xi(1, 5) <<  "\t"
77 >        << cr_.Xi(2, 3) <<  "\t" << cr_.Xi(2, 4) <<  "\t" << cr_.Xi(2, 5) <<  "\t";
78  
79 <    //invert Xi to get Diffusion Tensor at arbitrary origin O
80 <    RectMatrix<double, 6, 6> Xi;    
81 <    RectMatrix<double, 6, 6> Do;
82 <    Xi.setSubMatrix(0, 0, Xitt);
156 <    Xi.setSubMatrix(0, 3, Xitr.transpose());
157 <    Xi.setSubMatrix(3, 0, Xitr);
158 <    Xi.setSubMatrix(3, 3, Xirr);
159 <    //invertMatrix(Xi, Do);
160 <    double kt = OOPSEConstant::kB * temperature_ * 1.66E-2;
161 <    //Do *= kt;    
79 >    //translation-rotation
80 >    os << cr_.Xi(3, 0) <<  "\t" << cr_.Xi(3, 1) <<  "\t" << cr_.Xi(3, 2) <<  "\t"
81 >        << cr_.Xi(4, 0) <<  "\t" << cr_.Xi(4, 1) <<  "\t" << cr_.Xi(4, 2) <<  "\t"
82 >        << cr_.Xi(5, 0) <<  "\t" << cr_.Xi(5, 1) <<  "\t" << cr_.Xi(5, 2) <<  "\t";
83  
84 +    //rotation
85 +    os << cr_.Xi(3, 3) <<  "\t" << cr_.Xi(3, 4) <<  "\t" << cr_.Xi(3, 5) <<  "\t"
86 +        << cr_.Xi(4, 3) <<  "\t" << cr_.Xi(4, 4) <<  "\t" << cr_.Xi(4, 5) <<  "\t"
87 +        << cr_.Xi(5, 3) <<  "\t" << cr_.Xi(5, 4) <<  "\t" << cr_.Xi(5, 5) <<  "\t";
88  
164    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
89  
90 <    const static Mat3x3d zeroMat(0.0);
91 <    
92 <    Mat3x3d XittInv(0.0);
93 <    XittInv = Xitt.inverse();
94 <    
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();
90 >    //diffusion tensor at center of resistance
91 >    //translation
92 >    os << cr_.D(0, 0) <<  "\t" << cr_.D(0, 1) <<  "\t" << cr_.D(0, 2) <<  "\t"
93 >        << cr_.D(1, 0) <<  "\t" << cr_.D(1, 1) <<  "\t" << cr_.D(1, 2) <<  "\t"
94 >        << cr_.D(2, 0) <<  "\t" << cr_.D(2, 1) <<  "\t" << cr_.D(2, 2) <<  "\t";
95  
96 <    Mat3x3d tmp;
97 <    Mat3x3d tmpInv;
98 <    tmp = Xitt - Xitr.transpose() * XirrInv * Xitr;
99 <    tmpInv = tmp.inverse();
96 >    //rotation-translation
97 >    os << cr_.D(0, 3) <<  "\t" << cr_.D(0, 4) <<  "\t" << cr_.D(0, 5) <<  "\t"
98 >        << cr_.D(1, 3) <<  "\t" << cr_.D(1, 4) <<  "\t" << cr_.D(1, 5) <<  "\t"
99 >        << cr_.D(2, 3) <<  "\t" << cr_.D(2, 4) <<  "\t" << cr_.D(2, 5) <<  "\t";
100  
101 <    Dott = kt * tmpInv;
102 <    Dotr = -kt*XirrInv * Xitr * tmpInv* 1.0E8;
101 >    //translation-rotation
102 >    os << cr_.D(3, 0) <<  "\t" << cr_.D(3, 1) <<  "\t" << cr_.D(3, 2) <<  "\t"
103 >        << cr_.D(4, 0) <<  "\t" << cr_.D(4, 1) <<  "\t" << cr_.D(4, 2) <<  "\t"
104 >        << cr_.D(5, 0) <<  "\t" << cr_.D(5, 1) <<  "\t" << cr_.D(5, 2) <<  "\t";
105  
106 <    tmp = Xirr - Xitr * XittInv * Xitr.transpose();    
107 <    tmpInv = tmp.inverse();
108 <    
109 <    Dorr = kt * tmpInv*1.0E16;
106 >    //rotation
107 >    os << cr_.D(3, 3) <<  "\t" << cr_.D(3, 4) <<  "\t" << cr_.D(3, 5) <<  "\t"
108 >        << cr_.D(4, 3) <<  "\t" << cr_.D(4, 4) <<  "\t" << cr_.D(4, 5) <<  "\t"
109 >        << cr_.D(5, 3) <<  "\t" << cr_.D(5, 4) <<  "\t" << cr_.D(5, 5) <<  "\t";
110 >        
111 >    //---------------------------------------------------------------------
112  
113 <    //Do.getSubMatrix(0, 0 , Dott);
114 <    //Do.getSubMatrix(3, 0, Dotr);
195 <    //Do.getSubMatrix(3, 3, Dorr);
113 >    //center of diffusion
114 >    os << cd_.center[0] <<  "\t" << cd_.center[1] <<  "\t" << cd_.center[2] <<  "\t";
115  
116 <    //calculate center of diffusion
117 <    tmp(0, 0) = Dorr(1, 1) + Dorr(2, 2);
118 <    tmp(0, 1) = - Dorr(0, 1);
119 <    tmp(0, 2) = -Dorr(0, 2);
120 <    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);
116 >    //resistance tensor at center of diffusion
117 >    //translation
118 >    os << cd_.Xi(0, 0) <<  "\t" << cd_.Xi(0, 1) <<  "\t" << cd_.Xi(0, 2) <<  "\t"
119 >        << cd_.Xi(1, 0) <<  "\t" << cd_.Xi(1, 1) <<  "\t" << cd_.Xi(1, 2) <<  "\t"
120 >        << cd_.Xi(2, 0) <<  "\t" << cd_.Xi(2, 1) <<  "\t" << cd_.Xi(2, 2) <<  "\t";
121  
122 <    Vector3d tmpVec;
123 <    tmpVec[0] = Dotr(1, 2) - Dotr(2, 1);
124 <    tmpVec[1] = Dotr(2, 0) - Dotr(0, 2);
125 <    tmpVec[2] = Dotr(0, 1) - Dotr(1, 0);
122 >    //rotation-translation
123 >    os << cd_.Xi(0, 3) <<  "\t" << cd_.Xi(0, 4) <<  "\t" << cd_.Xi(0, 5) <<  "\t"
124 >        << cd_.Xi(1, 3) <<  "\t" << cd_.Xi(1, 4) <<  "\t" << cd_.Xi(1, 5) <<  "\t"
125 >        << cd_.Xi(2, 3) <<  "\t" << cd_.Xi(2, 4) <<  "\t" << cd_.Xi(2, 5) <<  "\t";
126  
127 <    tmpInv = tmp.inverse();
128 <    
129 <    Vector3d rod = tmpInv * tmpVec;
127 >    //translation-rotation
128 >    os << cd_.Xi(3, 0) <<  "\t" << cd_.Xi(3, 1) <<  "\t" << cd_.Xi(3, 2) <<  "\t"
129 >        << cd_.Xi(4, 0) <<  "\t" << cd_.Xi(4, 1) <<  "\t" << cd_.Xi(4, 2) <<  "\t"
130 >        << cd_.Xi(5, 0) <<  "\t" << cd_.Xi(5, 1) <<  "\t" << cd_.Xi(5, 2) <<  "\t";
131  
132 <    //calculate Diffusion Tensor at center of diffusion
133 <    Mat3x3d Uod;
134 <    Uod.setupSkewMat(rod);
135 <    
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;
132 >    //rotation
133 >    os << cd_.Xi(3, 3) <<  "\t" << cd_.Xi(3, 4) <<  "\t" << cd_.Xi(3, 5) <<  "\t"
134 >        << cd_.Xi(4, 3) <<  "\t" << cd_.Xi(4, 4) <<  "\t" << cd_.Xi(4, 5) <<  "\t"
135 >        << cd_.Xi(5, 3) <<  "\t" << cd_.Xi(5, 4) <<  "\t" << cd_.Xi(5, 5) <<  "\t";
136  
234    return true;    
235 }
137  
138 < void HydrodynamicsModel::writeBeads(std::ostream& os) {
139 <    std::vector<BeadParam>::iterator iter;
140 <    os << beads_.size() << std::endl;
141 <    os << "Generated by Hydro" << std::endl;
142 <    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 <    }
138 >    //diffusion tensor at center of diffusion
139 >    //translation
140 >    os << cd_.D(0, 0) <<  "\t" << cd_.D(0, 1) <<  "\t" << cd_.D(0, 2) <<  "\t"
141 >        << cd_.D(1, 0) <<  "\t" << cd_.D(1, 1) <<  "\t" << cd_.D(1, 2) <<  "\t"
142 >        << cd_.D(2, 0) <<  "\t" << cd_.D(2, 1) <<  "\t" << cd_.D(2, 2) <<  "\t";
143  
144 < }
144 >    //rotation-translation
145 >    os << cd_.D(0, 3) <<  "\t" << cd_.D(0, 4) <<  "\t" << cd_.D(0, 5) <<  "\t"
146 >        << cd_.D(1, 3) <<  "\t" << cd_.D(1, 4) <<  "\t" << cd_.D(1, 5) <<  "\t"
147 >        << cd_.D(2, 3) <<  "\t" << cd_.D(2, 4) <<  "\t" << cd_.D(2, 5) <<  "\t";
148  
149 < void HydrodynamicsModel::writeDiffCenterAndDiffTensor(std::ostream& os) {
150 <    os << "//viscosity = " << viscosity_ << std::endl;
151 <    os << "//temperature = " << temperature_<< std::endl;
152 <    std::vector<BeadParam>::iterator iter;
251 <    os << sd_->getType() << "\n";
149 >    //translation-rotation
150 >    os << cd_.D(3, 0) <<  "\t" << cd_.D(3, 1) <<  "\t" << cd_.D(3, 2) <<  "\t"
151 >        << cd_.D(4, 0) <<  "\t" << cd_.D(4, 1) <<  "\t" << cd_.D(4, 2) <<  "\t"
152 >        << cd_.D(5, 0) <<  "\t" << cd_.D(5, 1) <<  "\t" << cd_.D(5, 2) <<  "\t";
153  
154 <    os << "//diffusion center" << std::endl;
155 <    os << props_.diffCenter << std::endl;
154 >    //rotation
155 >    os << cd_.D(3, 3) <<  "\t" << cd_.D(3, 4) <<  "\t" << cd_.D(3, 5) <<  "\t"
156 >        << cd_.D(4, 3) <<  "\t" << cd_.D(4, 4) <<  "\t" << cd_.D(4, 5) <<  "\t"
157 >        << cd_.D(5, 3) <<  "\t" << cd_.D(5, 4) <<  "\t" << cd_.D(5, 5) <<  "\n";
158  
256    os << "//translational diffusion tensor" << std::endl;
257    os << props_.transDiff << std::endl;
159  
259    os << "//translation-rotation coupling diffusion tensor" << std::endl;
260    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    */
160   }
161  
162   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines