@DSL DefaultDSL; @Behaviour IsotropicLinearHardeningPlasticity; @Author Thomas Helfer; @Date 14 / 10 / 2016; @Description { An implicit implementation of a simple isotropic plasticity behaviour with isotropic linear hardening. The yield surface is defined by: "\[" " f(\sigmaeq,p) = \sigmaeq-s_{0}-H\,p" "\]" } @StateVariable StrainStensor eel; eel.setGlossaryName("ElasticStrain"); @StateVariable strain p; p.setGlossaryName("EquivalentPlasticStrain"); @Parameter young = 70.e9; young.setGlossaryName("YoungModulus"); @Parameter nu = 0.34; nu.setGlossaryName("PoissonRatio"); @Parameter H = 10.e9; H.setEntryName("HardeningSlope"); @Parameter s0 = 300.e6; s0.setGlossaryName("YieldStress"); /*! * computation of the prediction operator: we only provide the elastic * operator. * * We could also provide a tangent operator, but this would mean * saving an auxiliary state variable stating if a plastic loading * occured at the previous time step. */ @PredictionOperator { const auto lambda = computeLambda(young, nu); const auto mu = computeMu(young, nu); Dt = lambda * Stensor4::IxI() + 2 * mu * Stensor4::Id(); } /*! * behaviour integration using a fully implicit Euler-backwark scheme. */ @ProvidesSymmetricTangentOperator; @Integrator { const auto lambda = computeLambda(young, nu); const auto mu = computeMu(young, nu); // elastic loading eel += deto; if(computeTangentOperator_){ Dt = lambda * Stensor4::IxI() + 2 * mu * Stensor4::Id(); } // trial equivalent stress const auto se = 2 * mu * deviator(eel); const auto seq_e = sigmaeq(se); const auto plastic_loading = seq_e - s0 - H * p > stress{0}; // plastic loading if (plastic_loading) { const auto iseq_e = 1 / seq_e; const auto n = eval(3 * se / (2 * seq_e)); const auto cste = 1 / (H + 3 * mu); dp = (seq_e - s0 - H * p) * cste; eel -= dp * n; if ((computeTangentOperator_) && (smt == CONSISTENTTANGENTOPERATOR)) { Dt -= 4 * mu * mu * (dp * iseq_e * (Stensor4::M() - (n ^ n)) + cste * (n ^ n)); } } // stress update sig = lambda * trace(eel) * Stensor::Id() + 2 * mu * eel; }