https://mooseframework.inl.gov
CompositePowerLawCreepStressUpdate.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
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 #include <cmath>
12 
15 
16 template <bool is_ad>
19 {
21  params.addClassDescription(
22  "This class uses the stress update material in a radial return isotropic power law creep "
23  "model. This class can be used in conjunction with other creep and plasticity materials "
24  "for more complex simulations. This class is an extension to include multi-phase "
25  "capability.");
26 
27  // Linear strain hardening parameters
28  params.addRequiredCoupledVar("temperature", "Coupled temperature");
29  params.addRequiredParam<std::vector<Real>>(
30  "coefficient",
31  "a vector of leading coefficient / Dorn Constant in power-law equation for each material.");
32  params.addRequiredParam<std::vector<Real>>(
33  "n_exponent",
34  "a vector of Exponent on effective stress in power-law equation for each material");
35  params.addParam<Real>("m_exponent", 0.0, "Exponent on time in power-law equation");
36  params.addRequiredParam<std::vector<Real>>("activation_energy",
37  "a vector of Activation energy for Arrhenius-type "
38  "equation of the Dorn Constant for each material");
39  params.addParam<Real>("gas_constant", 8.3143, "Universal gas constant");
40  params.addParam<Real>("start_time", 0.0, "Start time (if not zero)");
41  params.addRequiredParam<std::vector<MaterialPropertyName>>(
42  "switching_functions", "a vector of switching functions for each material");
43  return params;
44 }
45 
46 template <bool is_ad>
48  const InputParameters & parameters)
49  : RadialReturnCreepStressUpdateBaseTempl<is_ad>(parameters),
50  _temperature(this->isParamValid("temperature")
51  ? &this->template coupledGenericValue<is_ad>("temperature")
52  : nullptr),
53  _coefficient(this->template getParam<std::vector<Real>>("coefficient")),
54  _n_exponent(this->template getParam<std::vector<Real>>("n_exponent")),
55  _m_exponent(this->template getParam<Real>("m_exponent")),
56  _activation_energy(this->template getParam<std::vector<Real>>("activation_energy")),
57  _gas_constant(this->template getParam<Real>("gas_constant")),
58  _start_time(this->template getParam<Real>("start_time")),
59  _switching_func_names(
60  this->template getParam<std::vector<MaterialPropertyName>>("switching_functions"))
61 
62 {
64  if (_n_exponent.size() != _num_materials)
65  this->paramError("n_exponent", "n exponent must be equal to the number of switching functions");
66 
67  if (_coefficient.size() != _num_materials)
68  this->paramError("coefficient",
69  "number of Dorn constant must be equal to the number of switching functions");
70 
71  if (_activation_energy.size() != _num_materials)
72  this->paramError("activation_energy",
73  "activation energy must be equal to the number of swithing functions");
74 
75  if (_start_time < this->_app.getStartTime() && (std::trunc(_m_exponent) != _m_exponent))
76  this->paramError("start_time",
77  "Start time must be equal to or greater than the Executioner start_time if a "
78  "non-integer m_exponent is used");
80  // set switching functions material properties for each phase
81  for (unsigned int i = 0; i < _num_materials; ++i)
82  {
83  _switchingFunc[i] =
84  &this->template getGenericMaterialProperty<Real, is_ad>(_switching_func_names[i]);
85  }
86 }
87 
88 template <bool is_ad>
89 void
91  const GenericReal<is_ad> & effective_trial_stress,
92  const GenericRankFourTensor<is_ad> & elasticity_tensor)
93 {
96  _exp_time = std::pow(_t - _start_time, _m_exponent);
97 }
98 
99 template <bool is_ad>
100 template <typename ScalarType>
101 ScalarType
103  const GenericReal<is_ad> & effective_trial_stress, const ScalarType & scalar)
104 {
105  const ScalarType stress_delta = effective_trial_stress - _three_shear_modulus * scalar;
106  ScalarType creep_rate = 0.0;
107  for (const auto n : make_range(_num_materials))
108  {
109  creep_rate +=
110  _coefficient[n] * std::pow(stress_delta, _n_exponent[n]) * (*_switchingFunc[n])[_qp] *
111  std::exp(-_activation_energy[n] / (_gas_constant * (*_temperature)[_qp])) * _exp_time;
112  }
113  return creep_rate * _dt - scalar;
114 }
115 
116 template <bool is_ad>
119  const GenericReal<is_ad> & effective_trial_stress, const GenericReal<is_ad> & scalar)
120 {
121  const GenericReal<is_ad> stress_delta = effective_trial_stress - _three_shear_modulus * scalar;
122  GenericReal<is_ad> creep_rate_derivative = 0.0;
123  for (const auto n : make_range(_num_materials))
124  {
125  creep_rate_derivative +=
126  -_coefficient[n] * _three_shear_modulus * _n_exponent[n] *
127  std::pow(stress_delta, _n_exponent[n] - 1.0) * (*_switchingFunc[n])[_qp] *
128  std::exp(-_activation_energy[n] / (_gas_constant * (*_temperature)[_qp])) * _exp_time;
129  }
130  return creep_rate_derivative * _dt - 1.0;
131 }
132 
133 template <bool is_ad>
134 Real
138 {
139  GenericReal<is_ad> interpolated_exponent = 0.0;
140  for (unsigned int n = 0; n < _num_materials; ++n)
141  {
142  interpolated_exponent += (_n_exponent[n] / (_n_exponent[n] + 1)) * (*_switchingFunc[n])[_qp];
143  }
144  return MetaPhysicL::raw_value(interpolated_exponent *
145  stress[_qp].doubleContraction((strain_rate)[_qp]));
146 }
147 
148 template <bool is_ad>
149 void
151  const GenericRankTwoTensor<is_ad> & plastic_strain_increment)
152 {
153  _creep_strain[_qp] += plastic_strain_increment;
154 }
155 
156 template <bool is_ad>
157 void
159 {
160  _creep_strain[_qp] = _creep_strain_old[_qp];
161 }
162 
163 template <bool is_ad>
164 bool
166 {
167  return this->_use_substepping != RadialReturnStressUpdateTempl<is_ad>::SubsteppingType::NONE;
168 }
169 
172 template Real
174  const Real &);
175 template ADReal
177  const ADReal &);
178 template ChainedReal
180  const Real &, const ChainedReal &);
181 template ChainedADReal
183  const ADReal &, const ChainedADReal &);
Moose::GenericType< Real, is_ad > GenericReal
std::vector< Real > _activation_energy
Activation energy for exp term.
This class uses the stress update material in a radial return isotropic creep model.
std::vector< const GenericMaterialProperty< Real, is_ad > * > _switchingFunc
switching functions for each phase
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
CompositePowerLawCreepStressUpdateTempl(const InputParameters &parameters)
DualNumber< Real, Real > ChainedReal
virtual void computeStressInitialize(const GenericReal< is_ad > &effective_trial_stress, const GenericRankFourTensor< is_ad > &elasticity_tensor)
Perform any necessary initialization before return mapping iterations.
auto raw_value(const Eigen::Map< T > &in)
RadialReturnStressUpdate computes the radial return stress increment for an isotropic elastic-viscopl...
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.
Real getStartTime() const
const std::vector< MaterialPropertyName > _switching_func_names
vector to keep the material property name for switching function material
DualNumber< Real, DNDerivativeType, true > ADReal
Moose::GenericType< RankFourTensor, is_ad > GenericRankFourTensor
void addRequiredParam(const std::string &name, const std::string &doc_string)
registerMooseObject("SolidMechanicsApp", CompositePowerLawCreepStressUpdate)
std::vector< Real > _coefficient
Leading coefficient.
Real elasticity_tensor(unsigned int i, unsigned int j, unsigned int k, unsigned int l)
typename GenericMaterialPropertyStruct< T, is_ad >::type GenericMaterialProperty
virtual Real computeStrainEnergyRateDensity(const GenericMaterialProperty< RankTwoTensor, is_ad > &stress, const GenericMaterialProperty< RankTwoTensor, is_ad > &strain_rate) override
Compute the strain energy rate density for this inelastic model for the current step.
void paramError(const std::string &param, Args... args) const
void addRequiredCoupledVar(const std::string &name, const std::string &doc_string)
This class provides baseline functionallity for creep models based on the stress update material in a...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
MooseApp & _app
IntRange< T > make_range(T beg, T end)
virtual void resetIncrementalMaterialProperties() override
Reset material properties.
void addClassDescription(const std::string &doc_string)
virtual bool substeppingCapabilityEnabled() override
Does the model include the infrastructure for substep decomposition of the elastic strain initially u...
ScalarType computeResidualInternal(const GenericReal< is_ad > &effective_trial_stress, const ScalarType &scalar)
virtual void computeStressFinalize(const GenericRankTwoTensor< is_ad > &plastic_strain_increment) override
Perform any necessary steps to finalize state after return mapping iterations.
std::vector< Real > _n_exponent
Exponent on the effective stress.
MooseUnits pow(const MooseUnits &, int)
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.
Moose::GenericType< RankTwoTensor, is_ad > GenericRankTwoTensor
DualNumber< ADReal, ADReal > ChainedADReal