1@DSL DefaultDSL;
2@Behaviour IsotropicLinearHardeningPlasticity;
3@Author Thomas Helfer;
4@Date   14/10/2016;
5@Description{
6  An implicit implementation of a simple
7  isotropic plasticity behaviour with
8  isotropic linear hardening.
9
10  The yield surface is defined by:
11  "\["
12  "  f(\sigmaeq,p) = \sigmaeq-s_{0}-H\,p"
13  "\]"
14}
15
16@StateVariable StrainStensor eel;
17eel.setGlossaryName("ElasticStrain");
18@StateVariable strain p;
19p.setGlossaryName("EquivalentPlasticStrain");
20
21@Parameter young =  70.e9;
22young.setGlossaryName("YoungModulus");
23@Parameter nu    =   0.34;
24nu.setGlossaryName("PoissonRatio");
25@Parameter H     =  10.e9;
26H.setEntryName("HardeningSlope");
27@Parameter s0    =  300.e6;
28s0.setGlossaryName("YieldStress");
29
30/*!
31 * computation of the prediction operator: we only provide the elastic
32 * operator.
33 *
34 * We could also provide a tangent operator, but this would mean
35 * saving an auxiliary state variable stating if a plastic loading
36 * occured at the previous time step.
37 */
38@PredictionOperator{
39  const auto lambda = computeLambda(young,nu);
40  const auto mu     = computeMu(young,nu);
41  Dt = lambda*Stensor4::IxI()+2*mu*Stensor4::Id();
42}
43
44/*!
45 * behaviour integration using a fully implicit Euler-backwark scheme.
46 */
47@ProvidesSymmetricTangentOperator;
48@Integrator{
49  const auto lambda = computeLambda(young,nu);
50  const auto mu     = computeMu(young,nu);
51  eel += deto;
52  const auto se     = 2*mu*deviator(eel);
53  const auto seq_e  = sigmaeq(se);
54  const auto b      = seq_e-s0-H*p>stress{0};
55  if(b){
56    const auto iseq_e = 1/seq_e;
57    const auto n      = eval(3*se/(2*seq_e));
58    const auto cste   = 1/(H+3*mu);
59    dp   = (seq_e-s0-H*p)*cste;
60    eel -= dp*n;
61    if(computeTangentOperator_){
62      if(smt==CONSISTENTTANGENTOPERATOR){
63	Dt = (lambda*Stensor4::IxI()+2*mu*Stensor4::Id()
64	      -4*mu*mu*(dp*iseq_e*(Stensor4::M()-(n^n))+cste*(n^n)));
65      } else {
66	Dt = lambda*Stensor4::IxI()+2*mu*Stensor4::Id();
67      }
68    }
69  } else {
70    if(computeTangentOperator_){
71      Dt = lambda*Stensor4::IxI()+2*mu*Stensor4::Id();
72    }
73  }
74  sig = lambda*trace(eel)*Stensor::Id()+2*mu*eel;
75}
76