1@Parser Implicit; 2@Behaviour EllipticCreep; 3@Author Maxime Salvo / Thomas Helfer; 4@Date 9 Octobre 2013; 5 6@Includes{ 7#include"TFEL/Material/Lame.hxx" 8} 9 10@Algorithm NewtonRaphson_NumericalJacobian; 11 12// equivalent hydrostatic viscoplastic strain 13@StateVariable real pv; 14pv.setEntryName("HydrostaticEquivalentViscoplasticStrain"); 15// equivalent deviatoric viscoplastic strain 16@StateVariable real pd; 17pd.setEntryName("DeviatoricEquivalentViscoplasticStrain"); 18// porosity 19@AuxiliaryStateVariable real f; 20f.setGlossaryName("Porosity"); 21 22@Parameter A = 8.e-67; 23A.setEntryName("CreepCoefficient"); 24@Parameter E = 8.2; 25E.setEntryName("CreepExponent"); 26@Parameter CAf = 1; 27CAf.setEntryName("CAf"); 28 29// Coefficient de Poisson 30@LocalVariable real nu; 31// Premier coefficient de Lame 32@LocalVariable stress lambda; 33// Second coefficient de Lame 34@LocalVariable stress mu; 35// Porosity at the beginning of the time step 36@LocalVariable real f_t; 37 38@MaterialLaw "UO2_YoungModulus_Fink1981.mfront"; 39@MaterialLaw "UO2_PoissonRatio_Fink1981.mfront"; 40 41@ComputeThermalExpansion "UO2_ThermalExpansion_MATPRO.mfront"; 42 43@InitLocalVariables{ 44 /* Initialize Poisson coefficient */ 45 nu = UO2_PoissonRatio_Fink1981(); 46 /* Porosity at the beginning of the time step */ 47 f_t = f; 48} // end of @InitLocalVars 49 50@ComputeStress{ 51 using namespace tfel::material::lame; 52 // porosity at the intermediate time 53 f = f_t + theta*(1-f_t)/(1+theta*dpv)*dpv; 54 // evaluate young modulus to take porosity variation into account 55 const stress young = UO2_YoungModulus_Fink1981(T,min(max(f,real(0)),real(1))); 56 lambda = computeLambda(young,nu); 57 mu = computeMu(young,nu); 58 // Hooke law 59 sig = lambda*trace(eel)*Stensor::Id()+2*mu*eel; 60} // end of @ComputeStresss 61 62@ComputeFinalStress{ 63 using namespace tfel::material::lame; 64 // porosity at the end of the time step 65 f = f_t + (1-f_t)/(1+theta*dpv)*dpv; 66 // evaluate young modulus to take porosity variation into account 67 const stress young = UO2_YoungModulus_Fink1981(T,min(max(f,real(0)),real(1))); 68 lambda = computeLambda(young,nu); 69 mu = computeMu(young,nu); 70 // Hooke law 71 sig = lambda*trace(eel)*Stensor::Id()+2*mu*eel; 72} 73 74@Integrator{ 75 // hydrostatic pressure 76 const stress pr = trace(sig)/real(3); 77 // Von Mises stress 78 const stress seq = sigmaeq(sig); 79 // equivalent stress 80 const real Af = pow(E*(pow(f,-1/E)-1),-2*E/(E+1)); 81 const real Bf = (1+2*f/real(3))*pow(1-f,-2*E/(E+1)); 82 const stress s = sqrt(Af*pr*pr+Bf*seq*seq); 83 if(s>1.e-8*mu){ 84 // normal 85 real inv_seq(0); 86 Stensor n(real(0.)); 87 if(seq > 1.e-8*mu){ 88 inv_seq = 1/seq; 89 n = 1.5*deviator(sig)*inv_seq; 90 } 91 const real ds_dpr = Af*pr/s; 92 const real ds_dseq = Bf*seq/s; 93 const real dphi_ds = A*pow(s,E); 94 const real dphi_dp = dphi_ds*ds_dpr; 95 const real dphi_dseq = dphi_ds*ds_dseq; 96 // hydrostatic part 97 const real K = lambda+(2*mu)/3; 98 fpv -= dphi_dp*dt; 99 // deviatoric part 100 fpd -= dphi_dseq*dt; 101 // elasticity 102 feel += (dpv/3)*Stensor::Id()+dpd*n; 103 } 104 feel -= deto; 105} // end of @Integrator 106