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 2632 by tim, Thu Mar 16 22:50:48 2006 UTC vs.
Revision 2768 by gezelter, Wed May 24 18:31:12 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 "hydrodynamics/Shape.hpp"
43 + #include "hydrodynamics/Sphere.hpp"
44 + #include "hydrodynamics/Ellipsoid.hpp"
45 + #include "applications/hydrodynamics/CompositeShape.hpp"
46  
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"
47   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 <
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 <
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;
48 >  
49 >  bool HydrodynamicsModel::calcHydroProps(Shape* shape, RealType viscosity, RealType temperature) {
50 >    return false;
51 >  }
52 >  
53 >  void HydrodynamicsModel::writeHydroProps(std::ostream& os) {
54      
98    for (std::size_t i = 0; i < nbeads; ++i) {
99        for (std::size_t j = 0; j < nbeads; ++j) {
100            Mat3x3d Tij;
101            if (i != j ) {
102                Vector3d Rij = beads_[i].pos - beads_[j].pos;
103                double rij = Rij.length();
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(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 * viscosity_ * beads_[i].radius);
112                Tij(0, 0) = constant;
113                Tij(1, 1) = constant;
114                Tij(2, 2) = constant;
115            }
116            B.setSubMatrix(i*3, j*3, Tij);
117        }
118    }
119
120    //invert B Matrix
121    invertMatrix(B, C);
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) {
126        Mat3x3d currU;
127        currU.setupSkewMat(beads_[i].pos);
128        U.push_back(currU);
129    }
55      
56 <    //calculate Xi matrix at arbitrary origin O
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) {
145 <            Mat3x3d Cij;
146 <            C.getSubMatrix(i*3, j*3, Cij);
147 <            
148 <            Xitt += Cij;
149 <            Xitr += U[i] * Cij;
150 <            Xirr += -U[i] * Cij * U[j] + (6 * viscosity_ * volume) * I;            
151 <        }
152 <    }
153 <
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
164 <
165 <    const static Mat3x3d zeroMat(0.0);
56 >    os << sd_->getType() << "\t";
57      
58 <    Mat3x3d XittInv(0.0);
59 <    XittInv = Xitt.inverse();
58 >    //center of resistance
59 >    os << cr_.center[0] <<  "\t" << cr_.center[1] <<  "\t" << cr_.center[2] <<  "\t";
60      
61 <    Mat3x3d XirrInv;
62 <    XirrInv = Xirr.inverse();
63 <
64 <    Mat3x3d tmp;
65 <    Mat3x3d tmpInv;
175 <    tmp = Xitt - Xitr.transpose() * XirrInv * Xitr;
176 <    tmpInv = tmp.inverse();
177 <
178 <    Dott = tmpInv;
179 <    Dotr = -XirrInv * Xitr * tmpInv;
61 >    //resistance tensor at center of resistance
62 >    //translation
63 >    os << cr_.Xi(0, 0) <<  "\t" << cr_.Xi(0, 1) <<  "\t" << cr_.Xi(0, 2) <<  "\t"
64 >       << cr_.Xi(1, 0) <<  "\t" << cr_.Xi(1, 1) <<  "\t" << cr_.Xi(1, 2) <<  "\t"
65 >       << cr_.Xi(2, 0) <<  "\t" << cr_.Xi(2, 1) <<  "\t" << cr_.Xi(2, 2) <<  "\t";
66      
67 <    tmp = Xirr - Xitr * XittInv * Xitr.transpose();    
68 <    tmpInv = tmp.inverse();
67 >    //rotation-translation
68 >    os << cr_.Xi(0, 3) <<  "\t" << cr_.Xi(0, 4) <<  "\t" << cr_.Xi(0, 5) <<  "\t"
69 >       << cr_.Xi(1, 3) <<  "\t" << cr_.Xi(1, 4) <<  "\t" << cr_.Xi(1, 5) <<  "\t"
70 >       << cr_.Xi(2, 3) <<  "\t" << cr_.Xi(2, 4) <<  "\t" << cr_.Xi(2, 5) <<  "\t";
71      
72 <    Dorr = tmpInv;
73 <
74 <    //calculate center of diffusion
75 <    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);
201 <
202 <    tmpInv = tmp.inverse();
72 >    //translation-rotation
73 >    os << cr_.Xi(3, 0) <<  "\t" << cr_.Xi(3, 1) <<  "\t" << cr_.Xi(3, 2) <<  "\t"
74 >       << cr_.Xi(4, 0) <<  "\t" << cr_.Xi(4, 1) <<  "\t" << cr_.Xi(4, 2) <<  "\t"
75 >       << cr_.Xi(5, 0) <<  "\t" << cr_.Xi(5, 1) <<  "\t" << cr_.Xi(5, 2) <<  "\t";
76      
77 <    Vector3d rod = tmpInv * tmpVec;
78 <
79 <    //calculate Diffusion Tensor at center of diffusion
80 <    Mat3x3d Uod;
208 <    Uod.setupSkewMat(rod);
77 >    //rotation
78 >    os << cr_.Xi(3, 3) <<  "\t" << cr_.Xi(3, 4) <<  "\t" << cr_.Xi(3, 5) <<  "\t"
79 >       << cr_.Xi(4, 3) <<  "\t" << cr_.Xi(4, 4) <<  "\t" << cr_.Xi(4, 5) <<  "\t"
80 >       << cr_.Xi(5, 3) <<  "\t" << cr_.Xi(5, 4) <<  "\t" << cr_.Xi(5, 5) <<  "\t";
81      
210    Mat3x3d Ddtt; //translational diffusion tensor at diffusion center
211    Mat3x3d Ddtr; //rotational diffusion tensor at diffusion center
212    Mat3x3d Ddrr; //translation-rotation couplingl diffusion tensor at diffusion tensor
82      
83 <    Ddtt = Dott - Uod * Dorr * Uod + Dotr.transpose() * Uod - Uod * Dotr;
84 <    Ddrr = Dorr;
85 <    Ddtr = Dotr + Dorr * Uod;
86 <
87 <    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 <    Ddtt *= kt;
225 <    Ddtr *=kt;
226 <    Ddrr *= kt;
227 <    invertMatrix(Dd, Xid);
228 <
229 <
230 <
231 <    //Xidtt in units of kcal*fs*mol^-1*Ang^-2
232 <    //Xid /= OOPSEConstant::energyConvert;
233 <    Xid *= OOPSEConstant::kb * temperature_;
234 <    props_.diffCenter = rod;
235 <    props_.Ddtt = Ddtt;
236 <    props_.Ddtr = Ddtr;
237 <    props_.Ddrr = Ddrr;
238 <    Xid.getSubMatrix(0, 0, props_.Xidtt);
239 <    Xid.getSubMatrix(0, 3, props_.Xidrt);
240 <    Xid.getSubMatrix(3, 0, props_.Xidtr);
241 <    Xid.getSubMatrix(3, 3, props_.Xidrr);
242 <
243 <
244 <    std::cout << "viscosity = " << viscosity_ << std::endl;
245 <    std::cout << "temperature = " << temperature_ << std::endl;
246 <    std::cout << "center of diffusion :" << std::endl;
247 <    std::cout << rod << std::endl;
248 <    std::cout << "diffusion tensor at center of diffusion " << std::endl;
249 <    std::cout << "translation(A^2/fs) :" << std::endl;
250 <    std::cout << Ddtt << std::endl;
251 <    std::cout << "translation-rotation(A^3/fs):" << std::endl;
252 <    std::cout << Ddtr << std::endl;
253 <    std::cout << "rotation(A^4/fs):" << std::endl;
254 <    std::cout << Ddrr << std::endl;
255 <
256 <    std::cout << "resistance tensor at center of diffusion " << std::endl;
257 <    std::cout << "translation(kcal*fs*mol^-1*Ang^-2) :" << std::endl;
258 <    std::cout << props_.Xidtt << std::endl;
259 <    std::cout << "rotation-translation (kcal*fs*mol^-1*Ang^-3):" << std::endl;
260 <    std::cout << props_.Xidrt << std::endl;
261 <    std::cout << "translation-rotation(kcal*fs*mol^-1*Ang^-3):" << std::endl;
262 <    std::cout << props_.Xidtr << std::endl;
263 <    std::cout << "rotation(kcal*fs*mol^-1*Ang^-4):" << std::endl;
264 <    std::cout << props_.Xidrr << std::endl;
83 >    //diffusion tensor at center of resistance
84 >    //translation
85 >    os << cr_.D(0, 0) <<  "\t" << cr_.D(0, 1) <<  "\t" << cr_.D(0, 2) <<  "\t"
86 >       << cr_.D(1, 0) <<  "\t" << cr_.D(1, 1) <<  "\t" << cr_.D(1, 2) <<  "\t"
87 >       << cr_.D(2, 0) <<  "\t" << cr_.D(2, 1) <<  "\t" << cr_.D(2, 2) <<  "\t";
88      
89 <      
90 < }
91 <
92 < void HydrodynamicsModel::writeBeads(std::ostream& os) {
270 <    std::vector<BeadParam>::iterator iter;
271 <    os << beads_.size() << std::endl;
272 <    os << "Generated by Hydro" << std::endl;
273 <    for (iter = beads_.begin(); iter != beads_.end(); ++iter) {
274 <        os << iter->atomName << "\t" << iter->pos[0] << "\t" << iter->pos[1] << "\t" << iter->pos[2] << std::endl;
275 <    }
276 <
277 < }
278 <
279 < void HydrodynamicsModel::writeDiffCenterAndDiffTensor(std::ostream& os) {
280 <
281 <    os << sd_->getType() << "\t";
282 <    os << props_.diffCenter[0] << "\t" << props_.diffCenter[1] << "\t" << props_.diffCenter[2] << "\t";
283 <
284 <    os << props_.Ddtt(0, 0) << "\t" << props_.Ddtt(0, 1) << "\t" << props_.Ddtt(0, 2) << "\t"
285 <        << props_.Ddtt(1, 0) << "\t" << props_.Ddtt(1, 1) << "\t" << props_.Ddtt(1, 2) << "\t"
286 <        << props_.Ddtt(2, 0) << "\t" << props_.Ddtt(2, 1) << "\t" << props_.Ddtt(2, 2) << "\t";
89 >    //rotation-translation
90 >    os << cr_.D(0, 3) <<  "\t" << cr_.D(0, 4) <<  "\t" << cr_.D(0, 5) <<  "\t"
91 >       << cr_.D(1, 3) <<  "\t" << cr_.D(1, 4) <<  "\t" << cr_.D(1, 5) <<  "\t"
92 >       << cr_.D(2, 3) <<  "\t" << cr_.D(2, 4) <<  "\t" << cr_.D(2, 5) <<  "\t";
93      
94 <    os << props_.Ddtr(0, 0) << "\t" << props_.Ddtr(0, 1) << "\t" << props_.Ddtr(0, 2) << "\t"
95 <        << props_.Ddtr(1, 0) << "\t" << props_.Ddtr(1, 1) << "\t" << props_.Ddtr(1, 2) << "\t"
96 <        << props_.Ddtr(2, 0) << "\t" << props_.Ddtr(2, 1) << "\t" << props_.Ddtr(2, 2) << "\t";
97 <
292 <    os << props_.Ddrr(0, 0) << "\t" << props_.Ddrr(0, 1) << "\t" << props_.Ddrr(0, 2) << "\t"
293 <        << props_.Ddrr(1, 0) << "\t" << props_.Ddrr(1, 1) << "\t" << props_.Ddrr(1, 2) << "\t"
294 <        << props_.Ddrr(2, 0) << "\t" << props_.Ddrr(2, 1) << "\t" << props_.Ddrr(2, 2) <<"\t";        
295 <
296 <    os << props_.Xidtt(0, 0) << "\t" << props_.Xidtt(0, 1) << "\t" << props_.Xidtt(0, 2) << "\t"
297 <        << props_.Xidtt(1, 0) << "\t" << props_.Xidtt(1, 1) << "\t" << props_.Xidtt(1, 2) << "\t"
298 <        << props_.Xidtt(2, 0) << "\t" << props_.Xidtt(2, 1) << "\t" << props_.Xidtt(2, 2) << "\t";
299 <
300 <    os << props_.Xidrt(0, 0) << "\t" << props_.Xidrt(0, 1) << "\t" << props_.Xidrt(0, 2) << "\t"
301 <        << props_.Xidrt(1, 0) << "\t" << props_.Xidrt(1, 1) << "\t" << props_.Xidrt(1, 2) << "\t"
302 <        << props_.Xidrt(2, 0) << "\t" << props_.Xidrt(2, 1) << "\t" << props_.Xidrt(2, 2) << "\t";
94 >    //translation-rotation
95 >    os << cr_.D(3, 0) <<  "\t" << cr_.D(3, 1) <<  "\t" << cr_.D(3, 2) <<  "\t"
96 >       << cr_.D(4, 0) <<  "\t" << cr_.D(4, 1) <<  "\t" << cr_.D(4, 2) <<  "\t"
97 >       << cr_.D(5, 0) <<  "\t" << cr_.D(5, 1) <<  "\t" << cr_.D(5, 2) <<  "\t";
98      
99 <    os << props_.Xidtr(0, 0) << "\t" << props_.Xidtr(0, 1) << "\t" << props_.Xidtr(0, 2) << "\t"
100 <        << props_.Xidtr(1, 0) << "\t" << props_.Xidtr(1, 1) << "\t" << props_.Xidtr(1, 2) << "\t"
101 <        << props_.Xidtr(2, 0) << "\t" << props_.Xidtr(2, 1) << "\t" << props_.Xidtr(2, 2) << "\t";
102 <
308 <    os << props_.Xidrr(0, 0) << "\t" << props_.Xidrr(0, 1) << "\t" << props_.Xidrr(0, 2) << "\t"
309 <        << props_.Xidrr(1, 0) << "\t" << props_.Xidrr(1, 1) << "\t" << props_.Xidrr(1, 2) << "\t"
310 <        << props_.Xidrr(2, 0) << "\t" << props_.Xidrr(2, 1) << "\t" << props_.Xidrr(2, 2) << std::endl;
99 >    //rotation
100 >    os << cr_.D(3, 3) <<  "\t" << cr_.D(3, 4) <<  "\t" << cr_.D(3, 5) <<  "\t"
101 >       << cr_.D(4, 3) <<  "\t" << cr_.D(4, 4) <<  "\t" << cr_.D(4, 5) <<  "\t"
102 >       << cr_.D(5, 3) <<  "\t" << cr_.D(5, 4) <<  "\t" << cr_.D(5, 5) <<  "\t";
103      
104 +    //---------------------------------------------------------------------
105 +    
106 +    //center of diffusion
107 +    os << cd_.center[0] <<  "\t" << cd_.center[1] <<  "\t" << cd_.center[2] <<  "\t";
108 +    
109 +    //resistance tensor at center of diffusion
110 +    //translation
111 +    os << cd_.Xi(0, 0) <<  "\t" << cd_.Xi(0, 1) <<  "\t" << cd_.Xi(0, 2) <<  "\t"
112 +       << cd_.Xi(1, 0) <<  "\t" << cd_.Xi(1, 1) <<  "\t" << cd_.Xi(1, 2) <<  "\t"
113 +       << cd_.Xi(2, 0) <<  "\t" << cd_.Xi(2, 1) <<  "\t" << cd_.Xi(2, 2) <<  "\t";
114 +    
115 +    //rotation-translation
116 +    os << cd_.Xi(0, 3) <<  "\t" << cd_.Xi(0, 4) <<  "\t" << cd_.Xi(0, 5) <<  "\t"
117 +       << cd_.Xi(1, 3) <<  "\t" << cd_.Xi(1, 4) <<  "\t" << cd_.Xi(1, 5) <<  "\t"
118 +       << cd_.Xi(2, 3) <<  "\t" << cd_.Xi(2, 4) <<  "\t" << cd_.Xi(2, 5) <<  "\t";
119 +    
120 +    //translation-rotation
121 +    os << cd_.Xi(3, 0) <<  "\t" << cd_.Xi(3, 1) <<  "\t" << cd_.Xi(3, 2) <<  "\t"
122 +       << cd_.Xi(4, 0) <<  "\t" << cd_.Xi(4, 1) <<  "\t" << cd_.Xi(4, 2) <<  "\t"
123 +       << cd_.Xi(5, 0) <<  "\t" << cd_.Xi(5, 1) <<  "\t" << cd_.Xi(5, 2) <<  "\t";
124 +    
125 +    //rotation
126 +    os << cd_.Xi(3, 3) <<  "\t" << cd_.Xi(3, 4) <<  "\t" << cd_.Xi(3, 5) <<  "\t"
127 +       << cd_.Xi(4, 3) <<  "\t" << cd_.Xi(4, 4) <<  "\t" << cd_.Xi(4, 5) <<  "\t"
128 +       << cd_.Xi(5, 3) <<  "\t" << cd_.Xi(5, 4) <<  "\t" << cd_.Xi(5, 5) <<  "\t";
129 +    
130 +    
131 +    //diffusion tensor at center of diffusion
132 +    //translation
133 +    os << cd_.D(0, 0) <<  "\t" << cd_.D(0, 1) <<  "\t" << cd_.D(0, 2) <<  "\t"
134 +       << cd_.D(1, 0) <<  "\t" << cd_.D(1, 1) <<  "\t" << cd_.D(1, 2) <<  "\t"
135 +       << cd_.D(2, 0) <<  "\t" << cd_.D(2, 1) <<  "\t" << cd_.D(2, 2) <<  "\t";
136 +    
137 +    //rotation-translation
138 +    os << cd_.D(0, 3) <<  "\t" << cd_.D(0, 4) <<  "\t" << cd_.D(0, 5) <<  "\t"
139 +       << cd_.D(1, 3) <<  "\t" << cd_.D(1, 4) <<  "\t" << cd_.D(1, 5) <<  "\t"
140 +       << cd_.D(2, 3) <<  "\t" << cd_.D(2, 4) <<  "\t" << cd_.D(2, 5) <<  "\t";
141 +    
142 +    //translation-rotation
143 +    os << cd_.D(3, 0) <<  "\t" << cd_.D(3, 1) <<  "\t" << cd_.D(3, 2) <<  "\t"
144 +       << cd_.D(4, 0) <<  "\t" << cd_.D(4, 1) <<  "\t" << cd_.D(4, 2) <<  "\t"
145 +       << cd_.D(5, 0) <<  "\t" << cd_.D(5, 1) <<  "\t" << cd_.D(5, 2) <<  "\t";
146 +    
147 +    //rotation
148 +    os << cd_.D(3, 3) <<  "\t" << cd_.D(3, 4) <<  "\t" << cd_.D(3, 5) <<  "\t"
149 +       << cd_.D(4, 3) <<  "\t" << cd_.D(4, 4) <<  "\t" << cd_.D(4, 5) <<  "\t"
150 +       << cd_.D(5, 3) <<  "\t" << cd_.D(5, 4) <<  "\t" << cd_.D(5, 5) <<  "\n";    
151 +    
152 +  }
153 +  
154   }
313
314 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines