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 2628 by tim, Wed Mar 15 22:08:25 2006 UTC

# Line 43 | Line 43 | namespace oopse {
43   #include "math/LU.hpp"
44   #include "math/DynamicRectMatrix.hpp"
45   #include "math/SquareMatrix3.hpp"
46 + #include "utils/OOPSEConstant.hpp"
47   namespace oopse {
48   /**
49   * Reference:
# Line 50 | Line 51 | bool HydrodynamicsModel::calcHydrodyanmicsProps(double
51   * Comparison of Different Modeling and Computational Procedures.
52   * Biophysical Journal, 75(6), 3044, 1999
53   */
54 < bool HydrodynamicsModel::calcHydrodyanmicsProps(double eta) {
54 >
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      if (!createBeads(beads_)) {
77          std::cout << "can not create beads" << std::endl;
78          return false;
79      }
80 <    
80 >
81 >    //calcResistanceTensor();
82 >    calcDiffusionTensor();    
83 >    return true;    
84 > }
85 >
86 > void HydrodynamicsModel::calcResistanceTensor() {
87 > }
88 >
89 > void HydrodynamicsModel::calcDiffusionTensor() {
90      int nbeads = beads_.size();
91      DynamicRectMatrix<double> B(3*nbeads, 3*nbeads);
92      DynamicRectMatrix<double> C(3*nbeads, 3*nbeads);
93      Mat3x3d I;
94 +    I(0, 0) = 1.0;
95 +    I(1, 1) = 1.0;
96 +    I(2, 2) = 1.0;
97 +    
98      for (std::size_t i = 0; i < nbeads; ++i) {
99          for (std::size_t j = 0; j < nbeads; ++j) {
100              Mat3x3d Tij;
# Line 69 | Line 104 | bool HydrodynamicsModel::calcHydrodyanmicsProps(double
104                  double rij2 = rij * rij;
105                  double sumSigma2OverRij2 = ((beads_[i].radius*beads_[i].radius) + (beads_[i].radius*beads_[i].radius)) / rij2;                
106                  Mat3x3d tmpMat;
107 <                tmpMat = outProduct(beads_[i].pos, beads_[j].pos) / rij2;
108 <                double constant = 8.0 * NumericConstant::PI * eta * rij;
107 >                tmpMat = outProduct(Rij, Rij) / rij2;
108 >                double constant = 8.0 * NumericConstant::PI * viscosity_ * rij;
109                  Tij = ((1.0 + sumSigma2OverRij2/3.0) * I + (1.0 - sumSigma2OverRij2) * tmpMat ) / constant;
110              }else {
111 <                double constant = 1.0 / (6.0 * NumericConstant::PI * eta * beads_[i].radius);
111 >                double constant = 1.0 / (6.0 * NumericConstant::PI * viscosity_ * beads_[i].radius);
112                  Tij(0, 0) = constant;
113                  Tij(1, 1) = constant;
114                  Tij(2, 2) = constant;
# Line 84 | Line 119 | bool HydrodynamicsModel::calcHydrodyanmicsProps(double
119  
120      //invert B Matrix
121      invertMatrix(B, C);
122 <    
122 >
123      //prepare U Matrix relative to arbitrary origin O(0.0, 0.0, 0.0)
124      std::vector<Mat3x3d> U;
125      for (int i = 0; i < nbeads; ++i) {
# Line 97 | Line 132 | bool HydrodynamicsModel::calcHydrodyanmicsProps(double
132      Mat3x3d Xitt;
133      Mat3x3d Xirr;
134      Mat3x3d Xitr;
135 +
136 +    //calculate the total volume
137 +
138 +    double volume = 0.0;
139 +    for (std::vector<BeadParam>::iterator iter = beads_.begin(); iter != beads_.end(); ++iter) {
140 +        volume += 4.0/3.0 * NumericConstant::PI * pow((*iter).radius,3);
141 +    }
142          
143      for (std::size_t i = 0; i < nbeads; ++i) {
144          for (std::size_t j = 0; j < nbeads; ++j) {
# Line 104 | Line 146 | bool HydrodynamicsModel::calcHydrodyanmicsProps(double
146              C.getSubMatrix(i*3, j*3, Cij);
147              
148              Xitt += Cij;
149 <            Xirr += U[i] * Cij;
150 <            Xitr += U[i] * Cij * U[j];            
149 >            Xitr += U[i] * Cij;
150 >            Xirr += -U[i] * Cij * U[j] + (6 * viscosity_ * volume) * I;            
151          }
152      }
153  
154 <    //invert Xi to get Diffusion Tensor at arbitrary origin O
155 <    RectMatrix<double, 6, 6> Xi;    
156 <    RectMatrix<double, 6, 6> Do;
157 <    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);
154 >    const double convertConstant = 6.023; //convert poise.angstrom to amu/fs
155 >    Xitt *= convertConstant;
156 >    Xitr *= convertConstant;
157 >    Xirr *= convertConstant;
158  
159 +    double kt = OOPSEConstant::kB * temperature_;
160 +
161      Mat3x3d Dott; //translational diffusion tensor at arbitrary origin O
162      Mat3x3d Dorr; //rotational diffusion tensor at arbitrary origin O
163      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);
164  
165 +    const static Mat3x3d zeroMat(0.0);
166 +    
167 +    Mat3x3d XittInv(0.0);
168 +    XittInv = Xitt.inverse();
169 +    
170 +    Mat3x3d XirrInv;
171 +    XirrInv = Xirr.inverse();
172 +
173 +    Mat3x3d tmp;
174 +    Mat3x3d tmpInv;
175 +    tmp = Xitt - Xitr.transpose() * XirrInv * Xitr;
176 +    tmpInv = tmp.inverse();
177 +
178 +    Dott = tmpInv;
179 +    Dotr = -XirrInv * Xitr * tmpInv;
180 +    
181 +    tmp = Xirr - Xitr * XittInv * Xitr.transpose();    
182 +    tmpInv = tmp.inverse();
183 +    
184 +    Dorr = tmpInv;
185 +
186      //calculate center of diffusion
187 <    Mat3x3d tmpMat;
188 <    tmpMat(0, 0) = Dorr(1, 1) + Dorr(2, 2);
189 <    tmpMat(0, 1) = - Dorr(0, 1);
190 <    tmpMat(0, 2) = -Dorr(0, 2);
191 <    tmpMat(1, 0) = -Dorr(0, 1);
192 <    tmpMat(1, 1) = Dorr(0, 0)  + Dorr(2, 2);
193 <    tmpMat(1, 2) = -Dorr(1, 2);
194 <    tmpMat(2, 0) = -Dorr(0, 2);
195 <    tmpMat(2, 1) = -Dorr(1, 2);
138 <    tmpMat(2, 2) = Dorr(1, 1) + Dorr(0, 0);
187 >    tmp(0, 0) = Dorr(1, 1) + Dorr(2, 2);
188 >    tmp(0, 1) = - Dorr(0, 1);
189 >    tmp(0, 2) = -Dorr(0, 2);
190 >    tmp(1, 0) = -Dorr(0, 1);
191 >    tmp(1, 1) = Dorr(0, 0)  + Dorr(2, 2);
192 >    tmp(1, 2) = -Dorr(1, 2);
193 >    tmp(2, 0) = -Dorr(0, 2);
194 >    tmp(2, 1) = -Dorr(1, 2);
195 >    tmp(2, 2) = Dorr(1, 1) + Dorr(0, 0);
196  
197      Vector3d tmpVec;
198      tmpVec[0] = Dotr(1, 2) - Dotr(2, 1);
199      tmpVec[1] = Dotr(2, 0) - Dotr(0, 2);
200      tmpVec[2] = Dotr(0, 1) - Dotr(1, 0);
144        
145    Vector3d rod = tmpMat.inverse() * tmpVec;
201  
202 +    tmpInv = tmp.inverse();
203 +    
204 +    Vector3d rod = tmpInv * tmpVec;
205 +
206      //calculate Diffusion Tensor at center of diffusion
207      Mat3x3d Uod;
208      Uod.setupSkewMat(rod);
# Line 155 | Line 214 | bool HydrodynamicsModel::calcHydrodyanmicsProps(double
214      Ddtt = Dott - Uod * Dorr * Uod + Dotr.transpose() * Uod - Uod * Dotr;
215      Ddrr = Dorr;
216      Ddtr = Dotr + Dorr * Uod;
217 <    
217 >
218 >    SquareMatrix<double, 6> Dd;
219 >    Dd.setSubMatrix(0, 0, Ddtt);
220 >    Dd.setSubMatrix(0, 3, Ddtr.transpose());
221 >    Dd.setSubMatrix(3, 0, Ddtr);
222 >    Dd.setSubMatrix(3, 3, Ddrr);    
223 >    SquareMatrix<double, 6> Xid;
224 >    invertMatrix(Dd, Xid);
225 >
226 >    Ddtt *= kt;
227 >    Ddtr *=kt;
228 >    Ddrr *= kt;
229 >
230 >    //Xidtt in units of kcal*fs*mol^-1*Ang^-2
231 >    Xid *= OOPSEConstant::kb*temperature_/kt;
232 >
233      props_.diffCenter = rod;
234 <    props_.transDiff = Ddtt;
235 <    props_.transRotDiff = Ddtr;
236 <    props_.rotDiff = Ddrr;
234 >    props_.Ddtt = Ddtt;
235 >    props_.Ddtr = Ddtr;
236 >    props_.Ddrr = Ddrr;
237 >    Xid.getSubMatrix(0, 0, props_.Xidtt);
238 >    Xid.getSubMatrix(0, 3, props_.Xidrt);
239 >    Xid.getSubMatrix(3, 0, props_.Xidtr);
240 >    Xid.getSubMatrix(3, 3, props_.Xidrr);
241  
242 <    return true;    
242 >
243 >    std::cout << "viscosity = " << viscosity_ << std::endl;
244 >    std::cout << "temperature = " << temperature_ << std::endl;
245 >    std::cout << "center of diffusion :" << std::endl;
246 >    std::cout << rod << std::endl;
247 >    std::cout << "diffusion tensor at center of diffusion " << std::endl;
248 >    std::cout << "translation(A^2/fs) :" << std::endl;
249 >    std::cout << Ddtt << std::endl;
250 >    std::cout << "translation-rotation(A^3/fs):" << std::endl;
251 >    std::cout << Ddtr << std::endl;
252 >    std::cout << "rotation(A^4/fs):" << std::endl;
253 >    std::cout << Ddrr << std::endl;
254 >
255 >    std::cout << "resistance tensor at center of diffusion " << std::endl;
256 >    std::cout << "translation(kcal*fs*mol^-1*Ang^-2) :" << std::endl;
257 >    std::cout << props_.Xidtt << std::endl;
258 >    std::cout << "rotation-translation (kcal*fs*mol^-1*Ang^-3):" << std::endl;
259 >    std::cout << props_.Xidrt << std::endl;
260 >    std::cout << "translation-rotation(kcal*fs*mol^-1*Ang^-3):" << std::endl;
261 >    std::cout << props_.Xidtr << std::endl;
262 >    std::cout << "rotation(kcal*fs*mol^-1*Ang^-4):" << std::endl;
263 >    std::cout << props_.Xidrr << std::endl;
264 >    
265 >      
266   }
267  
268   void HydrodynamicsModel::writeBeads(std::ostream& os) {
269 +    std::vector<BeadParam>::iterator iter;
270 +    os << beads_.size() << std::endl;
271 +    os << "Generated by Hydro" << std::endl;
272 +    for (iter = beads_.begin(); iter != beads_.end(); ++iter) {
273 +        os << iter->atomName << "\t" << iter->pos[0] << "\t" << iter->pos[1] << "\t" << iter->pos[2] << std::endl;
274 +    }
275  
276   }
277  
278   void HydrodynamicsModel::writeDiffCenterAndDiffTensor(std::ostream& os) {
279  
280 +    os << sd_->getType() << "\t";
281 +    os << props_.diffCenter[0] << "\t" << props_.diffCenter[1] << "\t" << props_.diffCenter[2] << "\t";
282 +
283 +    os << props_.Ddtt(0, 0) << "\t" << props_.Ddtt(0, 1) << "\t" << props_.Ddtt(0, 2) << "\t"
284 +        << props_.Ddtt(1, 0) << "\t" << props_.Ddtt(1, 1) << "\t" << props_.Ddtt(1, 2) << "\t"
285 +        << props_.Ddtt(2, 0) << "\t" << props_.Ddtt(2, 1) << "\t" << props_.Ddtt(2, 2) << "\t";
286 +    
287 +    os << props_.Ddtr(0, 0) << "\t" << props_.Ddtr(0, 1) << "\t" << props_.Ddtr(0, 2) << "\t"
288 +        << props_.Ddtr(1, 0) << "\t" << props_.Ddtr(1, 1) << "\t" << props_.Ddtr(1, 2) << "\t"
289 +        << props_.Ddtr(2, 0) << "\t" << props_.Ddtr(2, 1) << "\t" << props_.Ddtr(2, 2) << "\t";
290 +
291 +    os << props_.Ddrr(0, 0) << "\t" << props_.Ddrr(0, 1) << "\t" << props_.Ddrr(0, 2) << "\t"
292 +        << props_.Ddrr(1, 0) << "\t" << props_.Ddrr(1, 1) << "\t" << props_.Ddrr(1, 2) << "\t"
293 +        << props_.Ddrr(2, 0) << "\t" << props_.Ddrr(2, 1) << "\t" << props_.Ddrr(2, 2) <<"\t";        
294 +
295 +    os << props_.Xidtt(0, 0) << "\t" << props_.Xidtt(0, 1) << "\t" << props_.Xidtt(0, 2) << "\t"
296 +        << props_.Xidtt(1, 0) << "\t" << props_.Xidtt(1, 1) << "\t" << props_.Xidtt(1, 2) << "\t"
297 +        << props_.Xidtt(2, 0) << "\t" << props_.Xidtt(2, 1) << "\t" << props_.Xidtt(2, 2) << "\t";
298 +
299 +    os << props_.Xidrt(0, 0) << "\t" << props_.Xidrt(0, 1) << "\t" << props_.Xidrt(0, 2) << "\t"
300 +        << props_.Xidrt(1, 0) << "\t" << props_.Xidrt(1, 1) << "\t" << props_.Xidrt(1, 2) << "\t"
301 +        << props_.Xidrt(2, 0) << "\t" << props_.Xidrt(2, 1) << "\t" << props_.Xidrt(2, 2) << "\t";
302 +    
303 +    os << props_.Xidtr(0, 0) << "\t" << props_.Xidtr(0, 1) << "\t" << props_.Xidtr(0, 2) << "\t"
304 +        << props_.Xidtr(1, 0) << "\t" << props_.Xidtr(1, 1) << "\t" << props_.Xidtr(1, 2) << "\t"
305 +        << props_.Xidtr(2, 0) << "\t" << props_.Xidtr(2, 1) << "\t" << props_.Xidtr(2, 2) << "\t";
306 +
307 +    os << props_.Xidrr(0, 0) << "\t" << props_.Xidrr(0, 1) << "\t" << props_.Xidrr(0, 2) << "\t"
308 +        << props_.Xidrr(1, 0) << "\t" << props_.Xidrr(1, 1) << "\t" << props_.Xidrr(1, 2) << "\t"
309 +        << props_.Xidrr(2, 0) << "\t" << props_.Xidrr(2, 1) << "\t" << props_.Xidrr(2, 2) << std::endl;
310 +    
311   }
312  
313   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines