EL_NLEijMD.cppGo to the documentation of this file.00001 /* 00002 //================================================================================ 00003 # COPYRIGHT (C): :-)) # 00004 # PROJECT: Object Oriented Finite Element Program # 00005 # PURPOSE: General platform for elaso-plastic constitutive model # 00006 # implementation # 00007 # # 00008 # CLASS: EvolutionLaw_NL_EijMD (on plastic strain) # 00009 # # 00010 # VERSION: # 00011 # LANGUAGE: C++.ver >= 2.0 ( Borland C++ ver=3.00, SUN C++ ver=2.1 ) # 00012 # TARGET OS: DOS || UNIX || . . . # 00013 # DESIGNER(S): Boris Jeremic, Zhaohui Yang # 00014 # PROGRAMMER(S): Boris Jeremic, Zhaohui Yang # 00015 # # 00016 # # 00017 # DATE: 09-13-2000 # 00018 # UPDATE HISTORY: # 00019 # # 00020 # # 00021 # # 00022 # SHORT EXPLANATION: This is a nonlinear evolution law for the evolution of a # 00023 # tensorial variable alpha which depends on plastic strain # 00024 # i.e. dalpha_ij = 2/3*ha*dE_ij -Cr*de_eq*alpha_ij( Armstrong-# 00025 // Frederick Model) # 00026 //================================================================================ 00027 */ 00028 00029 #ifndef EL_NLEIJMD_CPP 00030 #define EL_NLEIJMD_CPP 00031 00032 #include "EL_NLEijMD.h" 00033 #include <basics.h> 00034 00035 #define sqrt23rd 0.8165 00036 00037 //================================================================================ 00038 // Default constructor 00039 //================================================================================ 00040 EvolutionLaw_NL_EijMD::EvolutionLaw_NL_EijMD( 00041 double eod = 0.85, 00042 double ad = 0.5, 00043 double Mcd = 1.14,//1.14, 00044 double Med = 1.14,//1.14, 00045 double Lambdad = 0.025, 00046 double ec_refd = 0.8, 00047 double p_refd = 160.0, 00048 double kc_bd = 3.975, 00049 double kc_dd = 4.200, 00050 double ke_bd = 2.000, 00051 double ke_dd = 0.07, 00052 double hod = 1200, 00053 double Cmd = 0.00, 00054 double Aod = 2.64, 00055 double Fmaxd = 100, 00056 double Cfd = 100): 00057 //double ed = 0.85, 00058 eo(eod), a(ad), Mc(Mcd), Me(Med), Lambda(Lambdad), ec_ref(ec_refd), p_ref(p_refd), 00059 kc_b(kc_bd), kc_d(kc_dd), ke_b(ke_bd), ke_d(ke_dd), ho(hod), Cm(Cmd), 00060 D(0.0), Ao(Aod), Fmax(Fmaxd), Cf(Cfd) 00061 { } 00062 00063 //================================================================================ 00064 // Copy constructor 00065 //================================================================================ 00066 00067 EvolutionLaw_NL_EijMD::EvolutionLaw_NL_EijMD(const EvolutionLaw_NL_EijMD &MDE ) { 00068 00069 this->a = MDE.geta(); 00070 this->Mc = MDE.getMc(); 00071 this->Me = MDE.getMe(); 00072 this->Lambda = MDE.getLambda(); 00073 this->ec_ref = MDE.getec_ref(); 00074 this->p_ref= MDE.getp_ref(); 00075 this->kc_b = MDE.getkc_b(); 00076 this->kc_d = MDE.getkc_d(); 00077 this->ke_b = MDE.getke_b(); 00078 this->ke_d = MDE.getke_d(); 00079 this->ho = MDE.getho(); 00080 this->eo = MDE.geteo(); 00081 //this->e = MDE.gete(); 00082 this->Cm = MDE.getCm(); 00083 //D is also needed in PS, so it is copied to 2nd cell of scalar var array 00084 this->D = MDE.getD(); 00085 this->Ao = MDE.getAo(); 00086 this->Fmax = MDE.getFmax(); 00087 this->Cf = MDE.getCf(); 00088 this->F = MDE.getF(); 00089 } 00090 00091 00092 //================================================================================ 00093 // Create a clone of itself 00094 //================================================================================ 00095 //EvolutionLaw_NL_EijMD * EvolutionLaw_NL_EijMD::newObj() { 00096 EvolutionLaw_T * EvolutionLaw_NL_EijMD::newObj() { 00097 00098 //EvolutionLaw_T *newEL = new EvolutionLaw_NL_EijMD( *this ); 00099 EvolutionLaw_T *newEL = new EvolutionLaw_NL_EijMD( *this ); 00100 00101 return newEL; 00102 00103 } 00104 00105 //================================================================================ 00106 // Evaluating h_s = h * b_ij = h * (alpha_ij_theta_b - alpha_ij) (For the evaluation of Kp) 00107 //================================================================================ 00108 00109 tensor EvolutionLaw_NL_EijMD::h_t( EPState *EPS, PotentialSurface *PS) 00110 { 00111 //========================================================================= 00112 //calculate n_ij 00113 stresstensor S = EPS->getStress().deviator(); 00114 double p = EPS->getStress().p_hydrostatic(); 00115 stresstensor alpha = EPS->getTensorVar( 1 ); // alpha_ij 00116 double m = EPS->getScalarVar(1); 00117 00118 stresstensor n; 00119 //stresstensor n = EPS->getTensorVar( 2 ); 00120 00121 stresstensor r = S * (1.0 / p); 00122 //r.reportshort("r"); 00123 stresstensor r_bar = r - alpha; 00124 stresstensor norm2 = r_bar("ij") * r_bar("ij"); 00125 double norm = sqrt( norm2.trace() ); 00126 00127 if ( norm >= d_macheps()){ 00128 n = r_bar *(1.0 / norm ); 00129 } 00130 else { 00131 opserr << "EvolutionLaw_NL_EijMD::h_t |n_ij| = 0, divide by zero! Program exits.\n"; 00132 exit(-1); 00133 } 00134 // n = r_bar *(1.0 / sqrt23rd / m ); 00135 //opserr << "nij = " << n; 00136 //EPS->setTensorVar(2, n); //n_ij is also stored in Tensor array for 2nd derivative eval in PS // 00137 00138 00139 //========================================================================= 00140 //calculating b_ij for Kp and d_ij for updating D 00141 00142 //Calculate the state parameters xi 00143 //double e = EPS->gete(); 00144 //double e = EPS->getScalarVar(3); 00145 00146 //opserr << "\n------>h_t(): \n"; 00147 //opserr << " p: " << p; 00148 if (p < 0.0) 00149 { 00150 //opserr << " p: " << p; 00151 opserr << "EvolutionLaw_NL_EijMD::h_t p < 0, Program exits.\n"; 00152 exit(-1); 00153 } 00154 //double ec = (EPS->getec()) - (EPS->getLam()) * log( p / (EPS->getpo()) ); 00155 //double xi = e - ec; 00156 double xi = EPS->getpsi(); 00157 //opserr << " e = " << e << " ec = " << ec << " xi = " << xi << endln; 00158 00159 // //Calculating the lode angle theta 00160 // double J2_bar = r_bar.Jinvariant2(); 00161 // double J3_bar = r_bar.Jinvariant3(); 00162 // double tempd = 3.0*pow(3.0, 0.5)/2.0*J3_bar/ pow( J2_bar, 1.5); 00163 // //opserr << "theta -1 =" << tempd << endln; 00164 // 00165 // if (tempd > 1.0 ) tempd = 1.0; //bug. if tempd = 1.00000000003, acos gives NaN 00166 // if (tempd < -1.0 ) tempd = -1.0; 00167 // double theta0 = acos( tempd ) / 3.0; 00168 double theta = r_bar.theta( ); 00169 //opserr << "theta0 = " << theta0/3.1416*180; 00170 //opserr << " theta = " << theta/3.1416*180 << endln; 00171 00172 //calculate the alpha_theta_b and alpha_theta_d 00173 double c = getMe() / getMc(); 00174 00175 // double cd = getke_d() / getkc_d(); 00176 // //stresstensor alpha_theta_d = n("ij") * (g_WW(theta, c) * Mc + g_WW(theta, cd) * kc_d * xi - m) * pow(2.0/3.0, 0.5); 00177 // stresstensor alpha_theta_d = n * (g_A(theta, c) * Mc + g_A(theta, cd) * kc_d * xi - m) * sqrt23rd; 00178 // //opserr << "alpha_theta_d " << alpha_theta_d<<" g_WW(theta, c) "<< g_WW(theta, c) << endln; 00179 00180 double cb = getke_b() / getkc_b(); 00181 if ( xi > 0.0 ) xi = 0.0; // < -xi > for alpha_theta_b 00182 //stresstensor alpha_theta_b = n("ij") * (g_WW(theta, c) * Mc - g_WW(theta, cb) * kc_b * xi - m) * pow(2.0/3.0, 0.5); 00183 //stresstensor alpha_theta_b = n * (g_A(theta, c) * Mc - g_A(theta, cb) * kc_b * xi - m) * sqrt23rd; 00184 double a_theta_b_scalar = g_A(theta, c) * Mc + g_A(theta, cb) * kc_b *(-1.0*xi) - m; // Mc^b > Mc --> this is right refer to p258 of Mazari's paper 00185 stresstensor alpha_theta_b = n * a_theta_b_scalar * sqrt23rd; 00186 alpha_theta_b.null_indices(); 00187 00188 //========================================================================= 00189 // calculating h 00190 stresstensor b; 00191 b = alpha_theta_b - alpha; 00192 b.null_indices(); 00193 // stresstensor d; 00194 // d = alpha_theta_d - alpha; 00195 // d.null_indices(); 00196 00197 //double alpha_c_b = g_WW(0.0, c) * Mc + g_WW(0.0, cb) * kc_b * (-xi) - m; 00198 double alpha_c_b = g_A(60.0, c) * Mc + g_A(60.0, cb) * kc_b * (-1.0*xi) - m; 00199 double b_ref = 2.0 * sqrt23rd * alpha_c_b; 00200 //double PI = 3.1416; 00201 //double a_theta_pi_b = g_A(theta+PI, c) * Mc + g_A(theta+PI, cb) * kc_b *(-1.0*xi) - m; 00202 //double b_ref = sqrt23rd * ( a_theta_b_scalar + a_theta_pi_b ); 00203 tensor temp1 = b("ij") * n("ij"); 00204 double bn = temp1.trace(); 00205 00206 if (bn < 0) bn = 0; // Added Joey 02-19-03 00207 double abs_bn = fabs( sqrt(bn) ); 00208 //opserr << ">>>> alpha_c_b " << alpha_c_b; 00209 //opserr << " alpha_theta_b " << alpha_theta_b; 00210 //opserr << " alpha " << alpha; 00211 //opserr << " \nn " << n; 00212 00213 //double h = getho() * abs_bn /( b_ref - abs_bn ); 00214 double h = getho() * abs_bn /( b_ref - abs_bn ); 00215 //opserr << " ||| b_ref =" << b_ref << " bn =" << bn << " abs(bn) =" << abs_bn << " h =" << h << endln; 00216 //cerr << " " << h << endln; 00217 00218 //Updating D and F---need to fine tune 00219 //temp1 = d("ij") * n("ij"); 00220 //double dn = temp1.trace(); 00221 //opserr << "bn =" << bn << " dn =" << dn << endln; 00222 00224 //stresstensor F = EPS->getTensorVar( 2 ); // getting F_ij from EPState 00225 //temp1 = F("ij") * n("ij"); 00226 //double temp = temp1.trace(); 00227 //if (temp < 0) temp = 0; 00228 //double A = getAo()*(1.0 + temp); 00229 00230 00231 tensor ht = b * h; 00232 00233 return ht; 00234 00235 } 00236 00237 00238 //================================================================================ 00239 // Print vars defined in Linear Evolution Law 00240 //================================================================================ 00241 void EvolutionLaw_NL_EijMD::print() 00242 { 00243 opserr << (*this); 00244 } 00245 00246 //================================================================================ 00247 // prints Manzari-Dafalia EvolutionLaw's contents 00248 //================================================================================ 00249 OPS_Stream& operator<< (OPS_Stream& os, const EvolutionLaw_NL_EijMD & MDEL) 00250 //ostream& operator<< (ostream& os, const EvolutionLaw_NL_EijMD & MDEL) 00251 { 00252 // os.unsetf( ios::scientific ); 00253 os.precision(5); 00254 00255 //os.width(10); 00256 os << endln << "Manzari-Dafalias Evolution Law's parameters:" << endln; 00257 //os << "a = " << MDEL.geta() << "; "; 00258 os << "Mc = " << MDEL.getMc() << "; "; 00259 //os.width(10); 00260 os << "Me = " << MDEL.getMe() << "; "; 00261 //os.width(10); 00262 os << "Lambda = " << MDEL.getLambda() << "; "; 00263 //os.width(10); 00264 os << "ec_ref = " << MDEL.getec_ref() << "; "; 00265 //os.width(10); 00266 os << "p_ref = " << MDEL.getp_ref() << "kPa" << "; " << endln; 00267 00268 //os.width(10); 00269 os << "kc_b = " << MDEL.getkc_b() << "; "; 00270 //os.width(10); 00271 os << "kc_d = " << MDEL.getkc_d() << "; "; 00272 //os.width(10); 00273 os << "ke_b = " << MDEL.getke_b() << "; "; 00274 //os.width(10); 00275 os << "ke_d = " << MDEL.getke_d() << "; " << endln; 00276 00277 //os.width(10); 00278 //os << "h = " << MDEL.h << "; "; 00279 //os.width(10); 00280 os << "ho = " << MDEL.getho() << "; "; 00281 //os.width(10); 00282 os << "Cm = " << MDEL.getCm() << "; " << endln; 00283 00284 //os.width(10); 00285 os << "D = " << MDEL.getD() << "; "; 00286 //os.width(10); 00287 os << "Ao = " << MDEL.getAo() << "; "; 00288 //os.width(10); 00289 //os << "Fmax = " << MDEL.getFmax() << "; "; 00291 //os << "Cf = " << MDEL.getCf() << "; " << endln; 00292 //os << "F = " << MDEL.getF() << endln; 00293 00294 return os; 00295 } 00296 00297 00298 //================================================================================ 00299 // Initialize some vars in EPState 00300 //================================================================================ 00301 //void EvolutionLaw_L_EijMD::InitVars(EPState *EPS) 00302 00303 int EvolutionLaw_NL_EijMD::updateEeDm(EPState *EPS, double st_vol, double dLamda) 00304 { 00305 int err = 0; 00306 00307 //opserr << "------>updateEeDm(): \n"; 00308 00309 double p = EPS->getStress().p_hydrostatic();//Pc??? 00310 00312 //double p_atm = 100.0; //Kpa atmospheric pressure 00313 //double E = EPS->getEo()* pow( (p/p_atm), geta()); 00314 //EPS->setE( E ); 00315 //opserr << " EL_NLEijMD -->Ec = " << E << endln; 00316 00317 //if ( dLamda < 0) dLamda = 0; //One more bug found by Joey Yang 07-16-02 Forgot <Macauley bracket> 00318 00319 // Updating e 00320 //double st_vol = st.p_hydrostatic(); 00321 double e = EPS->gete(); 00322 //Should focus on plastic volumetric strain Joey 02-18-03 00323 //double de = -(1.0 + geteo())*st_vol; //bug found should be (-st_vol) 07-16-02 Compressive strain is negative 00324 //double de = -(1.0 + (EPS->geteo()) )*st_vol; //ZC 00325 double de = -(1.0 + eo )*st_vol; 00326 //e = e + de; 00327 EPS->sete( e + de ); 00328 00329 //double ec = (EPS->getec()) - (EPS->getLam()) * log( p / (EPS->getpo()) ); 00330 double ec = getec_ref() - getLambda() * log( p / getp_ref() ); 00331 double xi = EPS->gete() + de - ec; 00332 EPS->setpsi( xi ); 00333 //EPS->setScalarVar(3, e); // e also stored in scalar array's 3nd cell for PS 00334 //opserr << " ++st_vol = " << st_vol << " de = " << de << " e = " << e << " p = " << p << " ec = " << ec << " xi " << xi; 00335 00336 //double Do = EPS->getScalarVar(2); 00337 //opserr << " !!!!! Do = " << Do; 00338 //if ( dLamda < 0) 00339 //opserr << " dLamda = " << dLamda << endln; 00340 00341 //Just moved here!!!!! 00342 double m = EPS->getScalarVar(1); 00343 stresstensor n; 00344 stresstensor S = (EPS->getStress()).deviator(); 00345 stresstensor alpha = EPS->getTensorVar( 1 ); // alpha_ij 00346 00347 stresstensor r = S * (1.0 / p); 00348 //r.reportshort("r"); 00349 stresstensor r_bar = r - alpha; 00350 stresstensor norm2 = r_bar("ij") * r_bar("ij"); 00351 double norm = sqrt( norm2.trace() ); 00352 00353 if ( norm >= d_macheps()){ 00354 n = r_bar *(1.0 / norm ); 00355 } 00356 else { 00357 opserr << "EvolutionLaw_L_EijMD::dFods |n_ij| = 0, divide by zero! Program exits.\n"; 00358 err += 1; 00359 exit(-1); 00360 } 00361 //wrong Joey 02-10-03 00362 //n = r_bar *(1.0 / sqrt23rd / m ); 00363 00364 //if ( dLamda > 0 ) 00365 EPS->setTensorVar(2, n); //n_ij is also stored in Tensor array for 2nd derivative eval in PS // 00366 //opserr << " alpha = " << alpha; 00367 //opserr << " n = " << n; 00368 //opserr << "\n **** n = " << n; 00369 00370 //Updating D and m if dLamda != 0.0 00371 // Should also update D no matter dLamda is 0 or not. 00372 //if (dLamda != 0.0) 00373 //{ 00374 00375 //========================================================================= 00376 //calculate n_ij 00377 00378 00379 00380 //Calculate the state parameters xi 00381 00382 // if (p < 0.0) 00383 // { 00384 // //p = 0.1; 00385 // g3ErrorHandler->warning("EvolutionLaw_NL_EijMD::updateEeDm p < 0, Program exits."); 00386 // exit(-1); 00387 // } 00388 00389 //double ec = ( EPS->getec() ) - (EPS->getLam()) * log( p/( EPS->getpo() ) ); 00390 //double xi = ( EPS->gete() ) - ec; 00391 00392 // //========================================================================= 00393 // // Update m 00394 // double m = EPS->getScalarVar(1); 00395 // double Cm = getCm(); 00396 // double eo = geteo(); 00397 // double dm = dLamda * Cm * ( 1.0 + eo ) * D; 00398 // m = m - dm; 00399 // EPS->setScalarVar(1, m); 00400 // //opserr << endln << "dm = " << dm << "m = " << m << endln; 00401 00402 //========================================================================= 00403 // Update F 00404 stresstensor dF; 00405 stresstensor F = EPS->getTensorVar( 3 ); // getting F_ij from EPState 00406 double D = getD(); 00407 //if (D != EPS->getScalarVar(2)) { 00408 // g3ErrorHandler->warning("EvolutionLaw_L_EijMD::updateEeDm D values contradict:%f %f ", D, EPS->getScalarVar(2)); 00409 // err += 1; 00410 // //exit(-1); 00411 //} 00412 00413 if ( D > 0.0 ) D = 0.0; 00414 if (dLamda < 0) dLamda = 0; 00415 dF = ( n("ij") * getFmax() + F("ij") ) * dLamda * getCf() * (-1.0*D); 00416 //opserr << "dF" << dF; 00417 F = F - dF; 00418 EPS->setTensorVar(3, F); 00419 this->F = F; 00420 //opserr << " \n F = " << F << endln; 00421 00422 tensor temp_tensor = F("ij") * n("ij"); 00423 double temp = temp_tensor.trace(); 00424 if (temp < 0) temp = 0; 00425 double A = getAo()*(1.0 + temp); 00426 //double A = getAo(); 00427 00428 // //Calculating the lode angle theta 00429 // double J2_bar = r_bar.Jinvariant2(); 00430 // double J3_bar = r_bar.Jinvariant3(); 00431 // double tempd = 3.0*pow(3.0, 0.5)/2.0*J3_bar/ pow( J2_bar, 1.5); 00432 // 00433 // if (tempd > 1.0 ) tempd = 1.0; //bug. if tempd = 1.00000000003, acos gives nan 00434 // if (tempd < -1.0 ) tempd = -1.0; 00435 // 00436 double theta = r_bar.theta( ); 00437 //opserr << "Update... theta = " << theta/3.1416*180 << endln; 00438 00439 //Calculate alpha_theta_d 00440 double c = getMe() / getMc(); 00441 00442 double cd = getke_d() / getkc_d(); 00443 00444 //Testing g_WW 00445 //opserr << "g_A(0, c) " << g_A(0.0, 0.0167) << endln; 00446 //opserr << "g_A(60, c) " << g_A(1.0472, 0.0167) << endln; 00447 double alpha_theta_dd = g_A(theta, c) * Mc + g_A(theta, cd) * getkc_d() * xi - m; 00448 stresstensor alpha_theta_d = n("ij") * alpha_theta_dd * sqrt23rd; 00450 //opserr << " alpha_theta_d " << alpha_theta_d; //<<" g_A(theta, cd) "<< g_A(theta, cd) << " Mc " << Mc << endln; 00451 //opserr << " alpha = " << alpha << "\n"; 00452 00453 stresstensor d; 00454 d = alpha_theta_d - alpha; 00455 d.null_indices(); 00456 //EPS->setTensorVar(2, d); //d is also stored in Tensor array for 2nd derivative eval in PS //no use since F is gone. 00457 //opserr << " d = " << d << " n = " << n << endln; 00458 00459 //========================================================================= 00460 // Updating D --does not depend on dLamda 00461 tensor temp1 = d("ij") * n("ij"); 00462 temp1.null_indices(); 00463 double dn = temp1.trace(); 00464 00465 // Restrictions 00466 if ( xi > 0.0 && dn < 0.0) { 00467 opserr << "Restriction !"; 00468 dn = 0.0; 00469 } 00470 00471 double newD = dn * A; 00472 EPS->setScalarVar(2, newD); // D also stored in scalar array's 2nd cell for PS 00473 this->D = newD; 00474 //opserr << " dn = " << dn << " ** D = " << newD << endln << endln; 00476 00477 //} 00478 00479 return err; 00480 } 00481 00482 00483 //================================================================================ 00484 // Set initial value of D once the current stress hit the yield surface 00485 // for MD Hardening model only 00486 //================================================================================ 00487 //void EvolutionLaw_L_EijMD::setInitD(EPState *EPS) 00488 // 00489 //void EvolutionLaw_NL_EijMD::updateDF(EPState *EPS) 00490 //{ 00491 // 00492 //} 00493 00494 //================================================================================ 00495 // Private accessory functions 00496 00497 //================================================================================ 00498 double EvolutionLaw_NL_EijMD::geta() const 00499 { 00500 return a; 00501 } 00502 00503 //================================================================================ 00504 double EvolutionLaw_NL_EijMD::getMc() const 00505 { 00506 return Mc; 00507 } 00508 00509 //================================================================================ 00510 double EvolutionLaw_NL_EijMD::getMe() const 00511 { 00512 return Me; 00513 } 00514 00515 00516 //================================================================================ 00517 double EvolutionLaw_NL_EijMD::getLambda() const 00518 { 00519 return Lambda; 00520 } 00521 00522 //================================================================================ 00523 double EvolutionLaw_NL_EijMD::getec_ref() const 00524 { 00525 return ec_ref; 00526 } 00527 00528 //================================================================================ 00529 double EvolutionLaw_NL_EijMD::getp_ref() const 00530 { 00531 return p_ref; 00532 } 00533 00534 //================================================================================ 00535 double EvolutionLaw_NL_EijMD::getkc_b() const 00536 { 00537 return kc_b; 00538 } 00539 00540 //================================================================================ 00541 double EvolutionLaw_NL_EijMD::getkc_d() const 00542 { 00543 return kc_d; 00544 } 00545 00546 //================================================================================ 00547 double EvolutionLaw_NL_EijMD::getke_b() const 00548 { 00549 return ke_b; 00550 } 00551 00552 //================================================================================ 00553 double EvolutionLaw_NL_EijMD::getke_d() const 00554 { 00555 return ke_d; 00556 } 00557 00558 //================================================================================ 00559 //double EvolutionLaw_NL_EijMD::geth() const 00560 //{ 00561 // return h; 00562 //} 00563 00564 //================================================================================ 00565 double EvolutionLaw_NL_EijMD::getho() const 00566 { 00567 return ho; 00568 } 00569 00570 //================================================================================ 00571 double EvolutionLaw_NL_EijMD::getCm() const 00572 { 00573 return Cm; 00574 } 00575 00576 //================================================================================ 00577 double EvolutionLaw_NL_EijMD::geteo() const 00578 { 00579 return eo; 00580 } 00581 00583 //double EvolutionLaw_NL_EijMD::gete() const 00584 //{ 00585 // return e; 00586 //} 00587 00588 00589 //================================================================================ 00590 double EvolutionLaw_NL_EijMD::getAo() const 00591 { 00592 return Ao; 00593 } 00594 00595 //================================================================================ 00596 double EvolutionLaw_NL_EijMD::getD() const 00597 { 00598 return D; 00599 } 00600 00601 00602 //================================================================================ 00603 stresstensor EvolutionLaw_NL_EijMD::getF() const 00604 { 00605 return F; 00606 } 00607 00608 //================================================================================ 00609 double EvolutionLaw_NL_EijMD::getFmax() const 00610 { 00611 return Fmax; 00612 } 00613 00614 //================================================================================ 00615 double EvolutionLaw_NL_EijMD::getCf() const 00616 { 00617 return Cf; 00618 } 00619 00620 00621 //================================================================================ 00622 // Interpolation function No.1 -- Agyris: g_A(theta, e) 00623 //================================================================================ 00624 00625 double EvolutionLaw_NL_EijMD::g_A(double theta, double e) 00626 { 00627 double temp = 2.0 * e; 00628 temp = temp / ( (1.0 + e) - (1.0 - e) * cos(3.0*theta) ); 00629 00630 return temp; 00631 } 00632 00633 00634 //================================================================================ 00635 // Interpolation function No.2 -- Willan-Warkne: g_WW(theta, e) 00636 //================================================================================ 00637 //g_WW(60, 0.0167) = +3.3818e-02????? 00638 00639 double EvolutionLaw_NL_EijMD::g_WW(double theta, double e) 00640 { 00641 //Rotate 60 degree to produce 1 at 0.0, c at 60 degrees 00642 theta = theta - 3.1415926/3; 00643 double g1 = 4.0*( 1.0 - e*e ) * cos(theta) * cos(theta) + pow(2.0*e-1.0, 2.0); 00644 double d1 = 2.0*( 1.0 - e*e ) * cos( theta ); 00645 double d2 = ( 2.0*e-1.0 ) * pow( (4.0*(1.0-e*e)*cos(theta)*cos(theta) + 5.0*e*e - 4.0*e), 0.5); 00646 double temp =( d1 + d2 ) / g1; 00647 00648 return temp; 00649 } 00650 00651 #endif 00652 |