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