www.mooseframework.org
ADIsotropicPlasticityStressUpdate.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
11 
12 #include "Function.h"
13 #include "ElasticityTensorTools.h"
14 
16 
18 
19 template <ComputeStage compute_stage>
20 InputParameters
22 {
24  params.addClassDescription("This class uses the discrete material in a radial return isotropic "
25  "plasticity model. This class is one of the basic radial return "
26  "constitutive models, yet it can be used in conjunction with other "
27  "creep and plasticity materials for more complex simulations.");
28  // Linear strain hardening parameters
29  params.addParam<FunctionName>("yield_stress_function",
30  "Yield stress as a function of temperature");
31  params.addParam<Real>(
32  "yield_stress", 0.0, "The point at which plastic strain begins accumulating");
33  params.addParam<FunctionName>("hardening_function",
34  "True stress as a function of plastic strain");
35  params.addParam<Real>("hardening_constant", 0.0, "Hardening slope");
36  params.addCoupledVar("temperature", 0.0, "Coupled Temperature");
37  params.addDeprecatedParam<std::string>(
38  "plastic_prepend",
39  "",
40  "String that is prepended to the plastic_strain Material Property",
41  "This has been replaced by the 'base_name' parameter");
42  params.set<std::string>("effective_inelastic_strain_name") = "effective_plastic_strain";
43  return params;
44 }
45 
46 template <ComputeStage compute_stage>
48  const InputParameters & parameters)
49  : ADRadialReturnStressUpdate<compute_stage>(parameters),
50  _plastic_prepend(getParam<std::string>("plastic_prepend")),
51  _yield_stress_function(
52  isParamValid("yield_stress_function") ? &getFunction("yield_stress_function") : NULL),
53  _yield_stress(getParam<Real>("yield_stress")),
54  _hardening_constant(getParam<Real>("hardening_constant")),
55  _hardening_function(isParamValid("hardening_function") ? &getFunction("hardening_function")
56  : NULL),
57  _yield_condition(-1.0), // set to a non-physical value to catch uninitalized yield condition
58  _hardening_slope(0.0),
59  _plastic_strain(
60  declareADProperty<RankTwoTensor>(_base_name + _plastic_prepend + "plastic_strain")),
61  _plastic_strain_old(
62  getMaterialPropertyOld<RankTwoTensor>(_base_name + _plastic_prepend + "plastic_strain")),
63  _hardening_variable(declareADProperty<Real>(_base_name + "hardening_variable")),
64  _hardening_variable_old(getMaterialPropertyOld<Real>(_base_name + "hardening_variable")),
65  _temperature(adCoupledValue("temperature"))
66 {
67  if (parameters.isParamSetByUser("yield_stress") && _yield_stress <= 0.0)
68  mooseError("Yield stress must be greater than zero");
69 
70  if (_yield_stress_function == NULL && !parameters.isParamSetByUser("yield_stress"))
71  mooseError("Either yield_stress or yield_stress_function must be given");
72 
73  if (!parameters.isParamSetByUser("hardening_constant") && !isParamValid("hardening_function"))
74  mooseError("Either hardening_constant or hardening_function must be defined");
75 
76  if (parameters.isParamSetByUser("hardening_constant") && isParamValid("hardening_function"))
77  mooseError(
78  "Only the hardening_constant or only the hardening_function can be defined but not both");
79 }
80 
81 template <ComputeStage compute_stage>
82 void
84 {
85  _hardening_variable[_qp] = 0.0;
86  _plastic_strain[_qp].zero();
87 }
88 
89 template <ComputeStage compute_stage>
90 void
92 {
93  _hardening_variable[_qp] = _hardening_variable_old[_qp];
94  _plastic_strain[_qp] = _plastic_strain_old[_qp];
95 
96  propagateQpStatefulPropertiesRadialReturn();
97 }
98 
99 template <ComputeStage compute_stage>
100 void
102  const ADReal & effective_trial_stress, const ADRankFourTensor & elasticity_tensor)
103 {
104  computeYieldStress(elasticity_tensor);
105 
106  _yield_condition = effective_trial_stress - _hardening_variable_old[_qp] - _yield_stress;
107  _hardening_variable[_qp] = _hardening_variable_old[_qp];
108  _plastic_strain[_qp] = _plastic_strain_old[_qp];
109 }
110 
111 template <ComputeStage compute_stage>
112 ADReal
114  const ADReal & effective_trial_stress, const ADReal & scalar)
115 {
116  ADReal residual = 0.0;
117 
118  mooseAssert(_yield_condition != -1.0,
119  "the yield stress was not updated by computeStressInitialize");
120 
121  if (_yield_condition > 0.0)
122  {
123  _hardening_slope = computeHardeningDerivative(scalar);
124  _hardening_variable[_qp] = computeHardeningValue(scalar);
125 
126  residual =
127  (effective_trial_stress - _hardening_variable[_qp] - _yield_stress) / _three_shear_modulus -
128  scalar;
129  }
130  return residual;
131 }
132 
133 template <ComputeStage compute_stage>
134 ADReal
136  const ADReal & /*effective_trial_stress*/, const ADReal & /*scalar*/)
137 {
138  if (_yield_condition > 0.0)
139  return -1.0 - _hardening_slope / _three_shear_modulus;
140 
141  return 1.0;
142 }
143 
144 template <ComputeStage compute_stage>
145 void
147 {
148  if (_yield_condition > 0.0)
149  _hardening_variable[_qp] = computeHardeningValue(scalar);
150 }
151 
152 template <ComputeStage compute_stage>
153 void
155  const ADRankTwoTensor & plastic_strain_increment)
156 {
157  _plastic_strain[_qp] += plastic_strain_increment;
158 }
159 
160 template <ComputeStage compute_stage>
161 ADReal
163 {
164  if (_hardening_function)
165  {
166  const Real strain_old = _effective_inelastic_strain_old[_qp];
167  const Point p;
168  const Real t = strain_old + MetaPhysicL::raw_value(scalar);
169 
170  return _hardening_function->value(t, p) - _yield_stress;
171  }
172 
173  return _hardening_variable_old[_qp] + _hardening_slope * scalar;
174 }
175 
176 template <>
177 DualReal
179 {
180  if (_hardening_function)
181  {
182  const Real strain_old = _effective_inelastic_strain_old[_qp];
183  const Point p;
184  const Real t = strain_old + MetaPhysicL::raw_value(scalar);
185 
186  DualReal hardening_function_value = _hardening_function->value(t, p);
187  hardening_function_value.derivatives() =
188  (strain_old + scalar).derivatives() * _hardening_function->timeDerivative(t, p);
189 
190  return hardening_function_value - _yield_stress;
191  }
192 
193  return _hardening_variable_old[_qp] + _hardening_slope * scalar;
194 }
195 
196 template <ComputeStage compute_stage>
197 ADReal
199  const ADReal & /*scalar*/)
200 {
201  if (_hardening_function)
202  {
203  const Real strain_old = _effective_inelastic_strain_old[_qp];
204  const Point p; // Always (0,0,0)
205 
206  return _hardening_function->timeDerivative(strain_old, p);
207  }
208 
209  return _hardening_constant;
210 }
211 
212 template <ComputeStage compute_stage>
213 void
215  const ADRankFourTensor & /*elasticity_tensor*/)
216 {
217  if (_yield_stress_function)
218  {
219  const Point p;
220  _yield_stress = _yield_stress_function->value(MetaPhysicL::raw_value(_temperature[_qp]), p);
221  if (_yield_stress <= 0.0)
222  mooseException(
223  "In ", _name, ": The calculated yield stress (", _yield_stress, ") is less than zero");
224  }
225 }
226 
227 template <>
228 void
230  const DualRankFourTensor & /*elasticity_tensor*/)
231 {
232  if (_yield_stress_function)
233  {
234  const Point p;
235 
236  _yield_stress = _yield_stress_function->value(MetaPhysicL::raw_value(_temperature[_qp]), p);
237  _yield_stress.derivatives() =
238  _temperature[_qp].derivatives() *
239  _yield_stress_function->timeDerivative(MetaPhysicL::raw_value(_temperature[_qp]), p);
240 
241  if (_yield_stress <= 0.0)
242  mooseException("In ",
243  _name,
244  ": The calculated yield stress (",
245  _yield_stress.value(),
246  ") is less than zero");
247  }
248 }
249 
250 // explicit instantiation is required for AD base classes
ADIsotropicPlasticityStressUpdate::initQpStatefulProperties
virtual void initQpStatefulProperties() override
Definition: ADIsotropicPlasticityStressUpdate.C:83
ADIsotropicPlasticityStressUpdate::validParams
static InputParameters validParams()
Definition: ADIsotropicPlasticityStressUpdate.C:21
ADIsotropicPlasticityStressUpdate::ADIsotropicPlasticityStressUpdate
ADIsotropicPlasticityStressUpdate(const InputParameters &parameters)
Definition: ADIsotropicPlasticityStressUpdate.C:47
ADRadialReturnStressUpdate::validParams
static InputParameters validParams()
Definition: ADRadialReturnStressUpdate.C:19
ADIsotropicPlasticityStressUpdate::computeStressFinalize
virtual void computeStressFinalize(const ADRankTwoTensor &plastic_strain_increment) override
Perform any necessary steps to finalize state after return mapping iterations.
Definition: ADIsotropicPlasticityStressUpdate.C:154
ADIsotropicPlasticityStressUpdate::iterationFinalize
virtual void iterationFinalize(ADReal scalar) override
Finalize internal state variables for a model for a given iteration.
Definition: ADIsotropicPlasticityStressUpdate.C:146
ADIsotropicPlasticityStressUpdate::computeHardeningDerivative
virtual ADReal computeHardeningDerivative(const ADReal &scalar)
Definition: ADIsotropicPlasticityStressUpdate.C:198
adBaseClass
adBaseClass(ADIsotropicPlasticityStressUpdate)
ADRadialReturnStressUpdate
ADRadialReturnStressUpdate computes the radial return stress increment for an isotropic elastic-visco...
Definition: ADRadialReturnStressUpdate.h:26
ADIsotropicPlasticityStressUpdate::computeHardeningValue
virtual ADReal computeHardeningValue(const ADReal &scalar)
Definition: ADIsotropicPlasticityStressUpdate.C:162
defineADLegacyParams
defineADLegacyParams(ADIsotropicPlasticityStressUpdate)
ElasticityTensorTools.h
registerADMooseObject
registerADMooseObject("TensorMechanicsApp", ADIsotropicPlasticityStressUpdate)
ADIsotropicPlasticityStressUpdate::_yield_stress
ADReal _yield_stress
Definition: ADIsotropicPlasticityStressUpdate.h:77
ADIsotropicPlasticityStressUpdate.h
ADIsotropicPlasticityStressUpdate::computeStressInitialize
virtual void computeStressInitialize(const ADReal &effective_trial_stress, const ADRankFourTensor &elasticity_tensor) override
Perform any necessary initialization before return mapping iterations.
Definition: ADIsotropicPlasticityStressUpdate.C:101
ADIsotropicPlasticityStressUpdate::computeResidual
virtual ADReal computeResidual(const ADReal &effective_trial_stress, const ADReal &scalar) override
Compute the residual for a predicted value of the scalar.
Definition: ADIsotropicPlasticityStressUpdate.C:113
RankFourTensorTempl
Definition: ACGrGrElasticDrivingForce.h:20
ADIsotropicPlasticityStressUpdate::computeYieldStress
virtual void computeYieldStress(const ADRankFourTensor &elasticity_tensor)
Definition: ADIsotropicPlasticityStressUpdate.C:214
ADIsotropicPlasticityStressUpdate::_yield_stress_function
const Function * _yield_stress_function
Definition: ADIsotropicPlasticityStressUpdate.h:76
RankTwoTensorTempl
Definition: ACGrGrElasticDrivingForce.h:17
ADIsotropicPlasticityStressUpdate::propagateQpStatefulProperties
virtual void propagateQpStatefulProperties() override
If updateState is not called during a timestep, this will be.
Definition: ADIsotropicPlasticityStressUpdate.C:91
ADIsotropicPlasticityStressUpdate
This class uses the Discrete material in a radial return isotropic plasticity model.
Definition: ADIsotropicPlasticityStressUpdate.h:27
ADIsotropicPlasticityStressUpdate::computeDerivative
virtual ADReal computeDerivative(const ADReal &effective_trial_stress, const ADReal &scalar) override
Compute the derivative of the residual as a function of the scalar variable.
Definition: ADIsotropicPlasticityStressUpdate.C:135