11 #include "libmesh/utility.h"
22 params.addRequiredParam<std::vector<Real>>(
24 "Input data as pairs of equivalent plastic strain and yield stress: Should "
25 "start with equivalent plastic strain 0");
26 params.addParam<Real>(
"rtol", 1e-8,
"Plastic strain NR tolerance");
27 params.addParam<Real>(
"ftol", 1e-4,
"Consistency condition NR tolerance");
28 params.addParam<Real>(
"eptol", 1e-7,
"Equivalent plastic strain NR tolerance");
29 params.addClassDescription(
"Associative J2 plasticity with isotropic hardening.");
36 _yield_stress_vector(getParam<std::vector<Real>>(
"yield_stress")),
37 _plastic_strain(declareProperty<
RankTwoTensor>(_base_name +
"plastic_strain")),
38 _plastic_strain_old(getMaterialPropertyOld<
RankTwoTensor>(_base_name +
"plastic_strain")),
39 _eqv_plastic_strain(declareProperty<Real>(_base_name +
"eqv_plastic_strain")),
40 _eqv_plastic_strain_old(getMaterialPropertyOld<Real>(_base_name +
"eqv_plastic_strain")),
41 _stress_old(getMaterialPropertyOld<
RankTwoTensor>(_base_name +
"stress")),
42 _strain_increment(getMaterialProperty<
RankTwoTensor>(_base_name +
"strain_increment")),
43 _rotation_increment(getMaterialProperty<
RankTwoTensor>(_base_name +
"rotation_increment")),
44 _elasticity_tensor_name(_base_name +
"elasticity_tensor"),
45 _elasticity_tensor(getMaterialPropertyByName<
RankFourTensor>(_elasticity_tensor_name)),
46 _rtol(getParam<Real>(
"rtol")),
47 _ftol(getParam<Real>(
"ftol")),
48 _eptol(getParam<Real>(
"eptol")),
152 const Real eqvpstrain_old,
166 Real flow_incr = 0.0;
183 Real dflow_incr = 0.0;
186 Real deqvpstrain = 0.0;
212 Real err1, err2, err3;
215 unsigned int iter = 0;
218 unsigned int maxiter = 100;
225 sig = sig_old + E_ijkl * delta_d;
226 eqvpstrain = eqvpstrain_old;
227 plastic_strain = plastic_strain_old;
237 sig = sig_old + E_ijkl * delta_d;
241 resid = flow_dirn * flow_incr - delta_dp;
245 err1 = resid.L2norm();
247 err3 = std::abs(rep);
255 getJac(sig, E_ijkl, flow_incr, dr_dsig);
269 dr_dsig_inv = dr_dsig.invSymm();
278 dflow_incr = (f - df_dsig.doubleContraction(dr_dsig_inv * resid) + fq * rep) /
279 (df_dsig.doubleContraction(dr_dsig_inv * flow_dirn) - fq);
283 flow_dirn * dflow_incr);
288 flow_incr += dflow_incr;
289 delta_dp -= E_ijkl.invSymm() * ddsig;
291 eqvpstrain += deqvpstrain;
295 resid = flow_dirn * flow_incr - delta_dp;
299 err1 = resid.L2norm();
301 err3 = std::abs(rep);
305 mooseError(
"Constitutive failure");
307 plastic_strain += delta_dp;
321 deriv *= std::sqrt(3.0 / sig.secondInvariant()) / 2.0;
346 return std::sqrt(3 * stress.secondInvariant());
363 sig_dev = sig.deviatoric();
368 f1 = 3.0 / (2.0 * sig_eqv);
370 f3 = 9.0 / (4.0 * Utility::pow<3>(sig_eqv));
375 dresid_dsig = E_ijkl.invSymm() + dfd_dsig * flow_incr;
387 mooseError(
"Error in yield stress input: Should be a vector with eqv plastic strain and yield "
388 "stress pair values.\n");
390 unsigned int ind = 0;
423 mooseError(
"Error in yield stress input: Should be a vector with eqv plastic strain and yield "
424 "stress pair values.\n");
426 unsigned int ind = 0;