12 #include "MooseMesh.h"
17 template <ComputeStage compute_stage>
22 params.addClassDescription(
"Calculates the effective inelastic strain increment required to "
23 "return the isotropic stress state to a J2 yield surface. This class "
24 "is intended to be a parent class for classes with specific "
25 "constitutive models.");
27 params.addParam<Real>(
"max_inelastic_increment",
29 "The maximum inelastic strain increment allowed in a time step");
30 params.addRequiredParam<std::string>(
31 "effective_inelastic_strain_name",
32 "Name of the material property that stores the effective inelastic strain");
33 params.addParam<
bool>(
"apply_strain",
true,
"Flag to apply strain. Used for testing.");
34 params.addParamNamesToGroup(
"effective_inelastic_strain_name apply_strain",
"Advanced");
38 template <ComputeStage compute_stage>
40 const InputParameters & parameters)
43 _effective_inelastic_strain(declareADProperty<Real>(
44 _base_name + getParam<std::string>(
"effective_inelastic_strain_name"))),
45 _effective_inelastic_strain_old(getMaterialPropertyOld<Real>(
46 _base_name + getParam<std::string>(
"effective_inelastic_strain_name"))),
47 _max_inelastic_increment(getParam<Real>(
"max_inelastic_increment")),
48 _apply_strain(getParam<bool>(
"apply_strain"))
52 template <ComputeStage compute_stage>
56 _effective_inelastic_strain[_qp] = 0.0;
59 template <ComputeStage compute_stage>
63 _effective_inelastic_strain[_qp] = _effective_inelastic_strain_old[_qp];
66 template <ComputeStage compute_stage>
69 ADRankTwoTensor & strain_increment,
70 ADRankTwoTensor & inelastic_strain_increment,
71 const ADRankTwoTensor & ,
72 ADRankTwoTensor & stress_new,
74 const ADRankFourTensor & elasticity_tensor,
79 ADRankTwoTensor deviatoric_trial_stress = stress_new.deviatoric();
82 ADReal dev_trial_stress_squared =
83 deviatoric_trial_stress.doubleContraction(deviatoric_trial_stress);
84 ADReal effective_trial_stress =
85 dev_trial_stress_squared == 0.0 ? 0.0 : std::sqrt(3.0 / 2.0 * dev_trial_stress_squared);
90 computeStressInitialize(effective_trial_stress, elasticity_tensor);
93 ADReal scalar_effective_inelastic_strain = 0.0;
94 if (!MooseUtils::absoluteFuzzyEqual(effective_trial_stress, 0.0))
96 returnMappingSolve(effective_trial_stress, scalar_effective_inelastic_strain, _console);
97 if (scalar_effective_inelastic_strain != 0.0)
98 inelastic_strain_increment =
99 deviatoric_trial_stress *
100 (1.5 * scalar_effective_inelastic_strain / effective_trial_stress);
102 inelastic_strain_increment.zero();
105 inelastic_strain_increment.zero();
109 strain_increment -= inelastic_strain_increment;
110 _effective_inelastic_strain[_qp] =
111 _effective_inelastic_strain_old[_qp] + scalar_effective_inelastic_strain;
116 stress_new = elasticity_tensor * (elastic_strain_old + strain_increment);
119 computeStressFinalize(inelastic_strain_increment);
122 template <ComputeStage compute_stage>
125 const ADReal & effective_trial_stress,
const ADReal & scalar_effective_inelastic_strain)
127 return MetaPhysicL::raw_value(effective_trial_stress / _three_shear_modulus) -
128 MetaPhysicL::raw_value(scalar_effective_inelastic_strain);
131 template <ComputeStage compute_stage>
134 const ADReal & effective_trial_stress)
const
136 return effective_trial_stress / _three_shear_modulus;
139 template <ComputeStage compute_stage>
143 Real scalar_inelastic_strain_incr = MetaPhysicL::raw_value(_effective_inelastic_strain[_qp]) -
144 _effective_inelastic_strain_old[_qp];
145 if (MooseUtils::absoluteFuzzyEqual(scalar_inelastic_strain_incr, 0.0))
146 return std::numeric_limits<Real>::max();
148 return _dt * _max_inelastic_increment / scalar_inelastic_strain_incr;
151 template <ComputeStage compute_stage>
154 const unsigned int total_it)
158 *iter_output <<
"At element " << _current_elem->id() <<
" _qp=" << _qp <<
" Coordinates "
159 << _q_point[_qp] <<
" block=" << _current_elem->subdomain_id() <<
'\n';