XC::BJtensor XC::DPPotentialSurface::d2Qods2(const XC::EPState *EPS) const { BJtensor d2Qods2(4, def_dim_4, 0.0); BJtensor KroneckerI("I", 2, def_dim_2); BJtensor T1 = KroneckerI("ij")*KroneckerI("mn"); T1.null_indices(); BJtensor T2 = (T1.transpose0110()+T1.transpose0111())*0.5; BJtensor T3 = T2 - T1*(1.0/3.0); //double temp1 = EPS->getScalarVar(1); //double temp1 = getalfa2(); BJtensor T4; XC::stresstensor alpha; XC::stresstensor s_bar; BJtensor temp9(4, def_dim_4, 0.0); XC::stresstensor sigma = EPS->getStress(); double p = sigma.p_hydrostatic(); XC::stresstensor sdev = sigma.deviator(); double halfRt2 = 0.5 * sqrt(2.0); int nod = EPS->getNTensorVar(); if ( nod >=1 ) { //May not have kinematic hardening alpha = EPS->getTensorVar(1); temp9 = KroneckerI("ij") * alpha("mn"); temp9.null_indices(); T4 = T2 + temp9*(1.0/3.0); s_bar = sdev - (alpha*p); } else { s_bar = sdev; T4 = T2; } T4 = T2 - temp9; BJtensor temp3 = s_bar("ij") * s_bar("ij"); temp3.null_indices(); double temp4 = temp3.trace(); temp4 = sqrt(temp4); BJtensor temp5 = s_bar("ij")*s_bar("mn"); double eps = pow( d_macheps(), 0.5 ); if ( fabs(temp4) > eps ) { d2Qods2 = T3 * (halfRt2/temp4) - temp5*(halfRt2/(temp4*temp4*temp4)); d2Qods2 = T4("ijkl") * d2Qods2("klmn"); d2Qods2.null_indices(); } return d2Qods2; }
XC::BJtensor XC::DPPotentialSurface::dQods(const XC::EPState *EPS) const { XC::stresstensor dQods; BJtensor KroneckerI("I", 2, def_dim_2); //double temp1 = EPS->getScalarVar(1); double temp1 = getalfa2(); XC::stresstensor alpha; XC::stresstensor s_bar; XC::stresstensor Tnsr0; double temp6 = 0.0; XC::stresstensor temp5; XC::stresstensor sigma = EPS->getStress(); double p = sigma.p_hydrostatic(); XC::stresstensor sdev = sigma.deviator(); double halfRt2 = 0.5 * sqrt(2.0); int nod = EPS->getNTensorVar(); if ( nod >=1 ) { //May not have kinematic hardening alpha = EPS->getTensorVar(1); s_bar = sdev - (alpha*p); temp5 = alpha("ij") * s_bar("ij"); temp5.null_indices(); temp6 = temp5.trace(); Tnsr0 = KroneckerI*(temp6/3.0); } else { s_bar = sdev; } XC::stresstensor temp3 = s_bar("ij") * s_bar("ij"); temp3.null_indices(); double temp4 = temp3.trace(); temp4 = sqrt(temp4); Tnsr0 += s_bar; double eps = pow( d_macheps(), 0.5 ); if ( fabs(temp4) > eps ) { Tnsr0 = Tnsr0 * (halfRt2/temp4); } dQods = (KroneckerI * temp1) + Tnsr0;; return dQods; }
//================================================================================ const tensor& DM04_PF::Dm_Dkin2(const stresstensor &Stre, const straintensor &Stra, const MaterialParameter &MaterialParameter_in) const { const double oneOver3 = 1.0/3.0; const double rt23 = sqrt(2.0/3.0); tensor I2("I", 2, def_dim_2); double e0 = gete0(MaterialParameter_in); double e_r = gete_r(MaterialParameter_in); double lambda_c = getlambda_c(MaterialParameter_in); double xi = getxi(MaterialParameter_in); double Pat = getPat(MaterialParameter_in); //double m = getm(MaterialParameter_in); double M_cal = getM_cal(MaterialParameter_in); double cc = getcc(MaterialParameter_in); double A0 = getA0(MaterialParameter_in); double nd = getnd(MaterialParameter_in); stresstensor alpha = getalpha(MaterialParameter_in); stresstensor z = getz(MaterialParameter_in); stresstensor n; stresstensor alpha_d; stresstensor alpha_d_alpha; double g = 0.0; double ec = e_r; double stateParameter = 0.0; double expnd = 1.0; //double ad = 0.0; double D0 = 0.0; stresstensor s_bar; double norm_s = 0.0; double epsilon_v = 0.0; double e = e0; double J3D; double cos3theta = 0.0; double z_n = 0.0; double alpha_n = 0.0; double s_n = 0.0; double p = Stre.p_hydrostatic(); stresstensor s = Stre.deviator(); s_bar = s - (alpha *p); norm_s = sqrt( (s_bar("ij")*s_bar("ij")).trace() ); if (p > 0.0 && norm_s > 0.0) n = s_bar * (1.0/norm_s); J3D = n.Jinvariant3(); cos3theta = -3.0*sqrt(6.0) *J3D; if (cos3theta > 1.0) cos3theta = 1.0; if (cos3theta < -1.0) cos3theta = -1.0; g = getg(cc, cos3theta); if ( (p/Pat) >= 0.0 ) ec = getec(e_r, lambda_c, xi, Pat, p); epsilon_v = Stra.Iinvariant1(); e = e0 + (1.0 + e0) *epsilon_v; stateParameter = e - ec; expnd = exp(nd*stateParameter); alpha_n = (alpha("ij")*n("ij")).trace(); s_n = (s("ij")*n("ij")).trace(); // way 1 //ad = g*M_cal*expnd - m; //D0 = rt23 * ad - alpha_n; // way 2 D0 = rt23*g*M_cal*expnd - s_n /p; tensor dD_dz(2, def_dim_2, 0.0); // dD_dz: if (z_n > 0.0) dD_dz = n *A0; // dm_da: tensor tensor1 = I2("ij")*dD_dz("mn"); tensor1.null_indices(); PlasticFlow::PF_tensorR4 = tensor1 *(-D0*oneOver3); return PlasticFlow::PF_tensorR4; }
//================================================================================ const tensor& DM04_PF::Dm_Dkin(const stresstensor &Stre, const straintensor &Stra, const MaterialParameter &MaterialParameter_in) const { const double oneOver3 = 1.0/3.0; const double rt23 = sqrt(2.0/3.0); tensor I2("I", 2, def_dim_2); tensor I4 = I2("ij")*I2("kl"); tensor I4s = ( I4.transpose0110() + I4.transpose0111() ) *0.5; double e0 = gete0(MaterialParameter_in); double e_r = gete_r(MaterialParameter_in); double lambda_c = getlambda_c(MaterialParameter_in); double xi = getxi(MaterialParameter_in); double Pat = getPat(MaterialParameter_in); //double m = getm(MaterialParameter_in); double M_cal = getM_cal(MaterialParameter_in); double cc = getcc(MaterialParameter_in); double A0 = getA0(MaterialParameter_in); double nd = getnd(MaterialParameter_in); stresstensor alpha = getalpha(MaterialParameter_in); stresstensor z = getz(MaterialParameter_in); stresstensor n; stresstensor alpha_d; stresstensor alpha_d_alpha; double g = 0.0; double ec = e_r; double stateParameter = 0.0; double expnd = 1.0; //double ad = 0.0; double A_d = 0.0; double B = 1.0; double C = 0.0; double D0 = 0.0; stresstensor s_bar; double norm_s = 0.0; double epsilon_v = 0.0; double e = e0; double J3D; double cos3theta = 0.0; double z_n = 0.0; double alpha_n = 0.0; double s_n = 0.0; double p = Stre.p_hydrostatic(); stresstensor s = Stre.deviator(); s_bar = s - (alpha *p); norm_s = sqrt( (s_bar("ij")*s_bar("ij")).trace() ); if (p > 0.0 && norm_s > 0.0) n = s_bar * (1.0/norm_s); J3D = n.Jinvariant3(); cos3theta = -3.0*sqrt(6.0) *J3D; if (cos3theta > 1.0) cos3theta = 1.0; if (cos3theta < -1.0) cos3theta = -1.0; g = getg(cc, cos3theta); if ( (p/Pat) >= 0.0 ) ec = getec(e_r, lambda_c, xi, Pat, p); epsilon_v = Stra.Iinvariant1(); e = e0 + (1.0 + e0) *epsilon_v; stateParameter = e - ec; expnd = exp(nd*stateParameter); alpha_n = (alpha("ij")*n("ij")).trace(); s_n = (s("ij")*n("ij")).trace(); // way 1 //ad = g*M_cal*expnd - m; //D0 = rt23 * ad - alpha_n; // way 2 D0 = rt23*g*M_cal*expnd - s_n /p; z_n = (z("ij")*n("ij")).trace(); if (z_n < 0.0) z_n = 0.0; A_d = A0 * (1.0 + z_n); B = 1.0 + 1.5 *((1.0-cc)/cc) *g *cos3theta; C = 3.0 *sqrt(1.5) *((1.0-cc)/cc) *g; tensor n_n = n("ik")*n("kj"); n_n.null_indices(); tensor nt_nt = n("ij")*n("kl"); nt_nt.null_indices(); tensor alpha_I = alpha("ij")*I2("kl"); alpha_I.null_indices(); tensor n_I = n("ij")*I2("kl"); n_I.null_indices(); // dn_dalpha: tensor dn_da = nt_nt - I4s; dn_da = dn_da *(p/norm_s); // dcos3theta_dalpha: tensor dcos3theta_da = dn_da("ijmn")*n_n("ji"); dcos3theta_da.null_indices(); dcos3theta_da = dcos3theta_da *(-3.0*sqrt(6.0)); // dg_da: tensor dg_da = dcos3theta_da *(g*g*(1.0-cc)/(2.0*cc)); // dB_da: tensor dB_da = (dg_da*cos3theta + dcos3theta_da*g) *(1.5*(1.0-cc)/cc); // dC_ds: tensor dC_da = dg_da *(3.0*sqrt(1.5)*(1.0-cc)/cc); // dR_da: tensor tensor1 = n("ij")*dB_da("mn"); tensor1.null_indices(); tensor tensor2 = n_n - I2 *oneOver3; tensor tensor3 = tensor2("ij")*dC_da("mn"); tensor3.null_indices(); tensor tensor4 = n("kj")*dn_da("ikmn"); tensor4.null_indices(); tensor4.transpose1100(); tensor dR_da = dn_da *B + tensor1 + tensor4 *(2.0*C) + tensor3; // dad_da: tensor dad_da = dg_da *(M_cal*expnd); // dD_da: // way 1 //tensor tensor5 = alpha("pq")*dn_da("pqmn"); // tensor5.null_indices(); //tensor dD_da = (dad_da *rt23 - n - tensor5) *(-A_d); // way 2 tensor tensor5 = s("pq")*dn_da("pqmn"); tensor5.null_indices(); tensor dD_da = (dad_da *rt23 - tensor5 *(1.0/p)) *(-A_d); if (z_n > 0.0) { tensor tensor6 = z("pq")*dn_da("pqmn"); tensor6.null_indices(); dD_da += tensor6 *(-A0*D0); } // dm_da: tensor tensor7 = I2("ij")*dD_da("mn"); tensor7.null_indices(); PlasticFlow::PF_tensorR4 = dR_da + tensor7 *oneOver3; return PlasticFlow::PF_tensorR4; }
//================================================================================ const straintensor& DM04_PF::PlasticFlowTensor(const stresstensor& Stre, const straintensor& Stra, const MaterialParameter &MaterialParameter_in) const { const double oneOver3 = 1.0/3.0; const double rt23 = sqrt(2.0/3.0); tensor I2("I", 2, def_dim_2); double e0 = gete0(MaterialParameter_in); double e_r = gete_r(MaterialParameter_in); double lambda_c = getlambda_c(MaterialParameter_in); double xi = getxi(MaterialParameter_in); double Pat = getPat(MaterialParameter_in); //double m = getm(MaterialParameter_in); double M_cal = getM_cal(MaterialParameter_in); double cc = getcc(MaterialParameter_in); double A0 = getA0(MaterialParameter_in); double nd = getnd(MaterialParameter_in); stresstensor alpha = getalpha(MaterialParameter_in); stresstensor z = getz(MaterialParameter_in); stresstensor n; stresstensor alpha_d; stresstensor alpha_d_alpha; double g = 0.0; double ec = e_r; double stateParameter = 0.0; double expnd = 1.0; //double ad = 0.0; double A_d = 0.0; double B = 1.0; double C = 0.0; double D = 0.0; double D0 = 0.0; stresstensor s_bar; double norm_s = 0.0; double epsilon_v = 0.0; double e = e0; double J3D; double cos3theta = 0.0; double z_n = 0.0; double alpha_n = 0.0; double s_n = 0.0; double p = Stre.p_hydrostatic(); stresstensor s = Stre.deviator(); s_bar = s - (alpha *p); norm_s = sqrt( (s_bar("ij")*s_bar("ij")).trace() ); if (p > 0.0 && norm_s > 0.0) n = s_bar * (1.0/norm_s); J3D = n.Jinvariant3(); cos3theta = -3.0*sqrt(6.0) *J3D; if (p <= 0.0) cos3theta = 1.0; if (cos3theta > 1.0) cos3theta = 1.0; if (cos3theta < -1.0) cos3theta = -1.0; g = getg(cc, cos3theta); if ( (p/Pat) >= 0.0 ) ec = getec(e_r, lambda_c, xi, Pat, p); epsilon_v = Stra.Iinvariant1(); e = e0 + (1.0 + e0) *epsilon_v; stateParameter = e - ec; expnd = exp(nd*stateParameter); alpha_n = (alpha("ij")*n("ij")).trace(); s_n = (s("ij")*n("ij")).trace(); // way 1 //ad = g*M_cal*expnd - m; //D0 = rt23 *ad - alpha_n; // way 2, better use this when "p" is small D0 = rt23*g*M_cal*expnd - s_n /p; z_n = (z("ij")*n("ij")).trace(); if (z_n < 0.0) z_n = 0.0; A_d = A0 * (1.0 + z_n); D = D0 *(-A_d); B = 1.0 + 1.5 *((1.0-cc)/cc) *g *cos3theta; C = 3.0 *sqrt(1.5) *((1.0-cc)/cc) *g; stresstensor n_n = n("ik")*n("kj"); n_n.null_indices(); // note different 'positive-negative' since we assume extension (dilation) positive // which is different from the Ref. DM04_PF::DM04m = n *B + n_n *C + I2 *((D-C)*oneOver3); return DM04_PF::DM04m; }
const straintensor& SANISAND_alpha_Eij::Hij(const PlasticFlow& plastic_flow, const stresstensor& Stre, const straintensor& Stra, const MaterialParameter& material_parameter) { // const double rt23 = sqrt(2.0/3.0); // stresstensor a_a_in; // double a_in = 0.0; double e0 = gete0(material_parameter); double e_r = gete_r(material_parameter); double lambda = getlambda(material_parameter); double xi = getxi(material_parameter); double Pat = getPat(material_parameter); double alpha_cc = getalpha_cc(material_parameter); double c = getc(material_parameter); double nb = getnb(material_parameter); double h0 = geth0(material_parameter); double ch = getch(material_parameter); double G0 = getG0(material_parameter); double m = getm(material_parameter); stresstensor alpha = getalpha(material_parameter); stresstensor n; stresstensor s_bar; double norm_s = 0.0; double r_ef = 0.0; double cos3theta = 0.0; double g = 0.0; double ec = e_r; double e = e0; double psi = 0.0; double alpha_b_c = 0.0; stresstensor alpha_b_tensor; stresstensor b_ref; stresstensor temp_tensor; double lower = 0.0; double h = G0*h0; double p = Stre.p_hydrostatic(); stresstensor s = Stre.deviator(); s_bar = s - (alpha *p); norm_s = sqrt( (s_bar("ij")*s_bar("ij")).trace() ); if (p > 0.0 && norm_s > 0.0) { n = s_bar * (1.0/norm_s); r_ef = rt32 * norm_s / p; cos3theta = -3.0 * sqrt(6.0) * n.Jinvariant3(); } if (p <= 0.0) cos3theta = 1.0; if (cos3theta > 1.0) cos3theta = 1.0; if (cos3theta < -1.0) cos3theta = -1.0; g = getg(c, cos3theta); if ( p >= 0.0 ) ec = getec(e_r, lambda, xi, Pat, p); e = e0 + (1.0 + e0) * Stra.Iinvariant1(); psi = e - ec; alpha_b_c = alpha_cc * exp(-nb*psi); alpha_b_tensor = n * (rt23 * g * alpha_b_c); b_ref = n * rt23 * alpha_b_c * (1.0+c); // b_ref = n * rt23 * alpha_cc * (1.0+c); // Method 1 temp_tensor = b_ref - (alpha_b_tensor - alpha); //// Method 2, better to use this when "p" is small //temp_tensor = b_ref - (alpha_b_tensor - s*(1.0/p)); lower = rt32*(temp_tensor("ij")*n("ij")).trace(); if ( lower>0 ) h = G0 * h0 * (1-ch*e) * sqrt(Pat/p) / (lower*lower); // h = G0 * h0 * (1-ch*e) * sqrt(Pat/p); // h = h0; // Method 1 temp_tensor = alpha_b_tensor - alpha; // Method 2 //temp_tensor = alpha_b_tensor+n*m - s*(1.0/p); TensorEvolution::TensorEvolutionHij = temp_tensor * (h*r_ef); return TensorEvolution::TensorEvolutionHij; }