https://mooseframework.inl.gov
Loading...
Searching...
No Matches
CombinedNonlinearHardeningPlasticity.C
Go to the documentation of this file.
2#include "Function.h"
6
9
10template <bool is_ad>
13{
15 params.addClassDescription("Combined isotropic and kinematic plasticity model with nonlinear "
16 "hardening rules, including a Voce model for isotropic hardening and "
17 "an Armstrong-Fredrick model for kinematic hardening.");
18 params.addParam<Real>("q", 0.0, "Saturation value for isotropic hardening (Q in Voce model)");
19 params.addParam<Real>("b", 0.0, "Rate constant for isotropic hardening (b in Voce model)");
20 params.addParam<FunctionName>("yield_stress_function",
21 "Yield stress as a function of temperature");
22 params.addParam<Real>("yield_stress", "The point at which plastic strain begins accumulating");
23 params.addParam<FunctionName>("isotropic_hardening_function",
24 "True stress as a function of plastic strain");
25 params.addParam<Real>("isotropic_hardening_constant", "Isotropic hardening slope");
26 params.addCoupledVar("temperature", 0.0, "Coupled Temperature");
27 params.set<std::string>("effective_inelastic_strain_name") = "effective_plastic_strain";
28 params.addParam<Real>("kinematic_hardening_modulus", 0.0, "Kinematic hardening modulus");
29 params.addParam<Real>(
30 "gamma", 0.0, "The nonlinear hardening parameter (gamma) for back stress evolution");
31
32 return params;
33}
34
35template <bool is_ad>
37 const InputParameters & parameters)
39 _yield_stress_function(this->isParamValid("yield_stress_function")
40 ? &this->getFunction("yield_stress_function")
41 : nullptr),
42 _yield_stress(this->isParamValid("yield_stress") ? this->template getParam<Real>("yield_stress")
43 : 0),
44 _isotropic_hardening_constant(
45 this->isParamValid("isotropic_hardening_constant")
46 ? this->template getParam<Real>("isotropic_hardening_constant")
47 : 0),
48 _isotropic_hardening_function(this->isParamValid("isotropic_hardening_function")
49 ? &this->getFunction("isotropic_hardening_function")
50 : nullptr),
51 _yield_condition(-1.0), // set to a non-physical value to catch uninitalized yield condition
52 _isotropic_hardening_slope(0.0),
53 _plastic_strain(
54 this->template declareGenericProperty<RankTwoTensor, is_ad>(_base_name + "plastic_strain")),
55 _plastic_strain_old(
56 this->template getMaterialPropertyOld<RankTwoTensor>(_base_name + "plastic_strain")),
57 _kinematic_hardening_modulus(this->template getParam<Real>("kinematic_hardening_modulus")),
58 _gamma(this->template getParam<Real>("gamma")),
59 _q(this->template getParam<Real>("q")),
60 _b(this->template getParam<Real>("b")),
61 _isotropic_hardening_variable(this->template declareGenericProperty<Real, is_ad>(
62 _base_name + "isotropic_hardening_variable")),
63 _isotropic_hardening_variable_old(
64 this->template getMaterialPropertyOld<Real>(_base_name + "isotropic_hardening_variable")),
65 _kinematic_hardening_variable(
66 this->template declareGenericProperty<Real, is_ad>("kinematic_hardening_variable")),
67 _kinematic_hardening_variable_old(
68 this->template getMaterialPropertyOld<Real>("kinematic_hardening_variable")),
69 _temperature(this->template coupledGenericValue<is_ad>("temperature"))
70{
71 if (parameters.isParamSetByUser("yield_stress") && _yield_stress <= 0.0)
72 mooseError("Yield stress must be greater than zero");
73 // Both of these parameters are given default values by derived classes, which makes them valid
74 if (_yield_stress_function == nullptr && !this->isParamValid("yield_stress"))
75 mooseError("Either yield_stress or yield_stress_function must be given");
76 if (!parameters.isParamValid("isotropic_hardening_constant") &&
77 !this->isParamValid("isotropic_hardening_function"))
79 "Either isotropic_hardening_constant or isotropic_hardening_function must be defined");
80 if (parameters.isParamSetByUser("isotropic_hardening_constant") &&
81 this->isParamValid("isotropic_hardening_function"))
83 "Only the isotropic_hardening_constant or only the isotropic_hardening_function can be "
84 "defined but not both");
85}
86
87template <bool is_ad>
88void
90{
91 _isotropic_hardening_variable[_qp] = 0.0;
92 _kinematic_hardening_variable[_qp] = 0.0;
93 _plastic_strain[_qp].zero();
95}
96
97template <bool is_ad>
98void
100{
101 _isotropic_hardening_variable[_qp] = _isotropic_hardening_variable_old[_qp];
102 _kinematic_hardening_variable[_qp] = _kinematic_hardening_variable_old[_qp];
103 _plastic_strain[_qp] = _plastic_strain_old[_qp];
104
106}
107
108template <bool is_ad>
109void
111 const GenericReal<is_ad> & effective_trial_stress,
112 const GenericRankFourTensor<is_ad> & elasticity_tensor)
113{
115 effective_trial_stress, elasticity_tensor);
116
117 computeYieldStress(elasticity_tensor);
118 _yield_condition =
119 effective_trial_stress - _isotropic_hardening_variable_old[_qp] - _yield_stress;
120 _plastic_strain[_qp] = _plastic_strain_old[_qp];
121}
122
123template <bool is_ad>
126 const GenericReal<is_ad> & effective_trial_stress, const GenericReal<is_ad> & scalar)
127{
128 mooseAssert(_yield_condition != -1.0,
129 "the yield stress was not updated by computeStressInitialize");
130 if (_yield_condition > 0.0)
131 {
132 _isotropic_hardening_slope = computeIsotropicHardeningDerivative(scalar);
133 _isotropic_hardening_variable[_qp] = computeIsotropicHardeningValue(scalar);
134 _kinematic_hardening_variable[_qp] = computeKinematicHardeningValue(scalar);
135 GenericReal<is_ad> residual = (effective_trial_stress - _kinematic_hardening_variable[_qp] -
136 _isotropic_hardening_variable[_qp] - _yield_stress) /
137 _three_shear_modulus -
138 scalar;
139 return residual;
140 }
141 return 0.0;
142}
143
144template <bool is_ad>
147 const GenericReal<is_ad> & /*effective_trial_stress*/, const GenericReal<is_ad> & /*scalar*/)
148{
149 if (_yield_condition > 0.0)
150 return -1.0 - _isotropic_hardening_slope / _three_shear_modulus;
151 return 1.0;
152}
153
154template <bool is_ad>
155void
157 const GenericReal<is_ad> & scalar)
158{
159 if (_yield_condition > 0.0)
160 {
161 _isotropic_hardening_variable[_qp] = computeIsotropicHardeningValue(scalar);
162 _kinematic_hardening_variable[_qp] = computeKinematicHardeningValue(scalar);
163 }
164}
165
166template <bool is_ad>
167void
169 const GenericRankTwoTensor<is_ad> & plastic_strain_increment)
170{
171 _plastic_strain[_qp] += plastic_strain_increment;
172 this->_backstress[_qp] =
173 this->_backstress_old[_qp] +
174 (2.0 / 3.0) * _kinematic_hardening_modulus * plastic_strain_increment -
175 _gamma * this->_backstress[_qp] * this->_effective_inelastic_strain_increment;
176}
177
178template <bool is_ad>
181 const GenericReal<is_ad> & scalar)
182{
183 using std::exp;
184
185 const Real _q = this->template getParam<Real>("q");
186 const Real _b = this->template getParam<Real>("b");
187 if (_isotropic_hardening_function)
188 {
189 const Real strain_old = this->_effective_inelastic_strain_old[_qp];
190 return _isotropic_hardening_function->value(strain_old + scalar) - _yield_stress;
191 }
192
193 _isotropic_hardening_variable[_qp] = _q * (1.0 - exp(-_b * scalar));
194
195 return (_isotropic_hardening_variable_old[_qp] + _isotropic_hardening_slope * scalar +
196 _b * (_q - _isotropic_hardening_variable_old[_qp]) *
197 this->_effective_inelastic_strain_increment);
198}
199
200template <bool is_ad>
203 const GenericReal<is_ad> & /*scalar*/)
204{
205 if (_isotropic_hardening_function)
206 {
207 const Real strain_old = this->_effective_inelastic_strain_old[_qp];
208 return _isotropic_hardening_function->timeDerivative(strain_old);
209 }
210 return _isotropic_hardening_constant;
211}
212
213template <bool is_ad>
216 const GenericReal<is_ad> & scalar)
217{
218 _kinematic_hardening_variable[_qp] = _kinematic_hardening_modulus * scalar;
219 return _kinematic_hardening_variable[_qp];
220}
221
222template <bool is_ad>
223void
225 const GenericRankFourTensor<is_ad> & /*elasticity_tensor*/)
226{
227 if (_yield_stress_function)
228 {
230 _yield_stress = _yield_stress_function->value(_temperature[_qp], p);
231 if (_yield_stress <= 0.0)
232 mooseError("In ",
233 this->_name,
234 ": The calculated yield stress (",
235 _yield_stress,
236 ") is less than zero");
237 }
238}
239
registerMooseObject("SolidMechanicsApp", ADCombinedNonlinearHardeningPlasticity)
const Real p
void mooseError(Args &&... args)
Moose::GenericType< RankFourTensor, is_ad > GenericRankFourTensor
Moose::GenericType< Real, is_ad > GenericReal
Moose::GenericType< RankTwoTensor, is_ad > GenericRankTwoTensor
virtual void iterationFinalize(const GenericReal< is_ad > &scalar) override
Finalize internal state variables for a model for a given iteration.
virtual GenericReal< is_ad > computeKinematicHardeningValue(const GenericReal< is_ad > &scalar)
virtual void computeStressInitialize(const GenericReal< is_ad > &effective_trial_stress, const GenericRankFourTensor< is_ad > &elasticity_tensor) override
Perform any necessary initialization before return mapping iterations.
virtual void propagateQpStatefulProperties() override
If updateState is not called during a timestep, this will be.
virtual GenericReal< is_ad > computeIsotropicHardeningDerivative(const GenericReal< is_ad > &scalar)
CombinedNonlinearHardeningPlasticityTempl(const InputParameters &parameters)
virtual GenericReal< is_ad > computeDerivative(const GenericReal< is_ad > &effective_trial_stress, const GenericReal< is_ad > &scalar) override
Compute the derivative of the residual as a function of the scalar variable.
virtual GenericReal< is_ad > computeIsotropicHardeningValue(const GenericReal< is_ad > &scalar)
virtual void computeYieldStress(const GenericRankFourTensor< is_ad > &elasticity_tensor)
virtual void computeStressFinalize(const GenericRankTwoTensor< is_ad > &plastic_strain_increment) override
Perform any necessary steps to finalize state after return mapping iterations.
virtual GenericReal< is_ad > computeResidual(const GenericReal< is_ad > &effective_trial_stress, const GenericReal< is_ad > &scalar) override
Compute the residual for a predicted value of the scalar.
bool isParamSetByUser(const std::string &name) const
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
void addCoupledVar(const std::string &name, const std::string &doc_string)
bool isParamValid(const std::string &name) const
const InputParameters & parameters() const
void mooseError(Args &&... args) const
bool isParamValid(const std::string &name) const
void propagateQpStatefulPropertiesRadialReturn()
Propagate the properties pertaining to this intermediate class.
virtual void computeStressInitialize(const GenericReal< is_ad > &effective_trial_stress, const GenericRankFourTensor< is_ad > &elasticity_tensor)
Perform any necessary initialization before return mapping iterations.
typename std::conditional< is_ad, typename ADType< T >::type, T >::type GenericType
Real elasticity_tensor(unsigned int i, unsigned int j, unsigned int k, unsigned int l)