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 2596 by tim, Wed Feb 22 20:35:16 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   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    }
47  
48 <    //invert B Matrix
49 <    invertMatrix(B, C);
48 > bool HydrodynamicsModel::calcHydroProps(Spheric* spheric, double viscosity, double temperature) {
49 >    return false;
50 > }
51 >
52 > bool HydrodynamicsModel::calcHydroProps(Ellipsoid* ellipsoid, double viscosity, double temperature) {
53 >    return false;
54 > }
55 >
56 > bool HydrodynamicsModel::calcHydroProps(CompositeShape* compositexShape, double viscosity, double temperature) {
57 >    return false;
58 > }
59 >
60 > void HydrodynamicsModel::writeHydroProps(std::ostream& os) {
61 >
62      
63 <    //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 <    }
63 >    os << sd_->getType() << "\t";
64      
65 <    //calculate Xi matrix at arbitrary origin O
66 <    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 <    }
65 >    //center of resistance
66 >    os << cr_.center[0] <<  "\t" << cr_.center[1] <<  "\t" << cr_.center[2] <<  "\t";
67  
68 <    //invert Xi to get Diffusion Tensor at arbitrary origin O
69 <    RectMatrix<double, 6, 6> Xi;    
70 <    RectMatrix<double, 6, 6> Do;
71 <    Xi.setSubMatrix(0, 0, Xitt);
72 <    Xi.setSubMatrix(0, 3, Xitr.transpose());
117 <    Xi.setSubMatrix(3, 0, Xitr);
118 <    Xi.setSubMatrix(3, 3, Xitt);
119 <    invertMatrix(Xi, Do);
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 <    Mat3x3d Dott; //translational diffusion tensor at arbitrary origin O
75 <    Mat3x3d Dorr; //rotational diffusion tensor at arbitrary origin O
76 <    Mat3x3d Dotr; //translation-rotation couplingl diffusion tensor at arbitrary origin O
77 <    Do.getSubMatrix(0, 0 , Dott);
125 <    Do.getSubMatrix(3, 0, Dotr);
126 <    Do.getSubMatrix(3, 3, Dorr);
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 <    //calculate center of diffusion
80 <    Mat3x3d tmpMat;
81 <    tmpMat(0, 0) = Dorr(1, 1) + Dorr(2, 2);
82 <    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);
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 <    Vector3d tmpVec;
85 <    tmpVec[0] = Dotr(1, 2) - Dotr(2, 1);
86 <    tmpVec[1] = Dotr(2, 0) - Dotr(0, 2);
87 <    tmpVec[2] = Dotr(0, 1) - Dotr(1, 0);
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 >
89 >
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 >    //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 >    //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 >    //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 <    Vector3d rod = tmpMat.inverse() * tmpVec;
111 >    //---------------------------------------------------------------------
112  
113 <    //calculate Diffusion Tensor at center of diffusion
114 <    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;
113 >    //center of diffusion
114 >    os << cd_.center[0] <<  "\t" << cd_.center[1] <<  "\t" << cd_.center[2] <<  "\t";
115  
116 <    return true;    
117 < }
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 < void HydrodynamicsModel::writeBeads(std::ostream& os) {
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 < }
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 < void HydrodynamicsModel::writeDiffCenterAndDiffTensor(std::ostream& os) {
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  
137 +
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 +    //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 +    //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 +    //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 +
159 +
160   }
161  
162   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines