1@Parser Implicit;
2@Behaviour Chaboche;
3@Algorithm NewtonRaphson_NumericalJacobian;
4
5@Theta 1. ;
6@Epsilon 1.e-12;
7
8@MaterialProperty real young; /* mandatory for castem */
9young.setGlossaryName("YoungModulus");
10@MaterialProperty real nu;    /* mandatory for castem */
11nu.setGlossaryName("PoissonRatio");
12
13@MaterialProperty stress R_inf;
14@MaterialProperty stress R_0;
15@MaterialProperty real b;
16@MaterialProperty real k;
17@MaterialProperty real w;
18@MaterialProperty stress C_inf[2];
19@MaterialProperty real   g_0[2];
20@MaterialProperty real   a_inf;
21
22@Includes{
23#include"TFEL/Material/Lame.hxx"
24}
25
26@StateVariable strain    p;
27@StateVariable StrainStensor a[2];
28
29@LocalVariable stress lambda;
30@LocalVariable stress mu;
31@LocalVariable stress Fel;
32
33/* Initialize Lame coefficients */
34@InitLocalVars{
35  using namespace tfel::material::lame;
36  lambda = computeLambda(young,nu);
37  mu     = computeMu(young,nu);
38  // elastic prediction
39  StressStensor sigel(lambda*trace(eel+deto)*Stensor::Id()+2*mu*(eel+deto));
40  const real tmpC0 = (1.+(k-1.)*exp(-w*p));
41  for(unsigned short i=0;i!=2;++i){
42    const stress Cel  = C_inf[i]*tmpC0;
43    sigel            -= 2*Cel*a[i]/3;
44  }
45  const real seqel = sigmaeq(sigel);
46  const real Rpel  = R_inf + (R_0-R_inf)*exp(-b*p) ;
47  Fel   = seqel - Rpel ;
48}
49
50@ComputeStress{
51  sig = lambda*trace(eel)*Stensor::Id()+2*mu*eel;
52}
53
54@Integrator{
55  if(Fel > 0){
56    const real eps           = 1.e-12;
57    // Les variables post-fixee par un _ sont exprimees les valeurs en
58    // t+theta*dt
59    const strain p_           = p +theta*dp ;
60    const stress Rp_          = R_inf + (R_0-R_inf)*exp(-b*p_) ;
61    // ces exponentielles sont communes aux deux ecrouissages
62    const real tmpC           = (1.+(k-1.)*exp(-w*p_));
63    const real tmpG           = (a_inf+(1-a_inf)*exp(-b*p_));
64    StressStensor sr_         = deviator(sig);
65    StrainStensor a_[2];
66    real g_[2];
67    for(unsigned short i=0;i!=2;++i){
68      const stress C_         = C_inf[i]*tmpC;
69      g_[i]                   = g_0[i]*tmpG;
70      a_[i]                   = a[i]+theta*da[i];
71      const StressStensor X_  = 2*C_*a_[i]/3;
72      sr_                    -= X_;
73    }
74    Stensor n_(real(0));
75    const stress        seq_ = sigmaeq(sr_);
76    if(seq_>eps*young){
77      n_ = 1.5*sr_/seq_;
78    }
79    feel += dp*n_;
80    fp    = (seq_-Rp_)/young;
81    for(unsigned short i=0;i!=2;++i){
82      fa[i]  -= dp*(n_-g_[i]*a_[i]);
83    }
84  }
85  feel -= deto;
86}
87
88@TangentOperator{
89  using namespace tfel::material::lame;
90  if((smt==ELASTIC)||(smt==SECANTOPERATOR)){
91    computeElasticStiffness<N,Type>::exe(Dt,lambda,mu);
92  } else if (smt==CONSISTENTTANGENTOPERATOR){
93    StiffnessTensor De;
94    Stensor4 Je;
95    computeElasticStiffness<N,Type>::exe(De,lambda,mu);
96    getPartialJacobianInvert(Je);
97    Dt = De*Je;
98  } else {
99    return false;
100  }
101}
102