www.mooseframework.org
PowerLawCreepStressUpdate.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 
14 
15 template <bool is_ad>
18 {
20  params.addClassDescription(
21  "This class uses the stress update material in a radial return isotropic power law creep "
22  "model. This class can be used in conjunction with other creep and plasticity materials "
23  "for more complex simulations.");
24 
25  // Linear strain hardening parameters
26  params.addCoupledVar("temperature", "Coupled temperature");
27  params.addRequiredParam<Real>("coefficient", "Leading coefficient in power-law equation");
28  params.addRequiredParam<Real>("n_exponent", "Exponent on effective stress in power-law equation");
29  params.addParam<Real>("m_exponent", 0.0, "Exponent on time in power-law equation");
30  params.addRequiredParam<Real>("activation_energy", "Activation energy");
31  params.addParam<Real>("gas_constant", 8.3143, "Universal gas constant");
32  params.addParam<Real>("start_time", 0.0, "Start time (if not zero)");
33  return params;
34 }
35 
36 template <bool is_ad>
38  const InputParameters & parameters)
39  : RadialReturnCreepStressUpdateBaseTempl<is_ad>(parameters),
40  _temperature(this->isParamValid("temperature")
41  ? &this->template coupledGenericValue<is_ad>("temperature")
42  : nullptr),
43  _coefficient(this->template getParam<Real>("coefficient")),
44  _n_exponent(this->template getParam<Real>("n_exponent")),
45  _m_exponent(this->template getParam<Real>("m_exponent")),
46  _activation_energy(this->template getParam<Real>("activation_energy")),
47  _gas_constant(this->template getParam<Real>("gas_constant")),
48  _start_time(this->template getParam<Real>("start_time")),
49  _exponential(1.0)
50 {
51  if (_start_time < this->_app.getStartTime() && (std::trunc(_m_exponent) != _m_exponent))
52  this->paramError("start_time",
53  "Start time must be equal to or greater than the Executioner start_time if a "
54  "non-integer m_exponent is used");
55 }
56 
57 template <bool is_ad>
58 void
60  const GenericReal<is_ad> & effective_trial_stress,
61  const GenericRankFourTensor<is_ad> & elasticity_tensor)
62 {
65 
66  if (_temperature)
67  _exponential = std::exp(-_activation_energy / (_gas_constant * (*_temperature)[_qp]));
68 
69  _exp_time = std::pow(_t - _start_time, _m_exponent);
70 }
71 
72 template <bool is_ad>
73 template <typename ScalarType>
74 ScalarType
76  const GenericReal<is_ad> & effective_trial_stress, const ScalarType & scalar)
77 {
78  const ScalarType stress_delta = effective_trial_stress - _three_shear_modulus * scalar;
79  const ScalarType creep_rate =
80  _coefficient * std::pow(stress_delta, _n_exponent) * _exponential * _exp_time;
81  return creep_rate * _dt - scalar;
82 }
83 
84 template <bool is_ad>
87  const GenericReal<is_ad> & effective_trial_stress, const GenericReal<is_ad> & scalar)
88 {
89  const GenericReal<is_ad> stress_delta = effective_trial_stress - _three_shear_modulus * scalar;
90  const GenericReal<is_ad> creep_rate_derivative =
91  -_coefficient * _three_shear_modulus * _n_exponent *
92  std::pow(stress_delta, _n_exponent - 1.0) * _exponential * _exp_time;
93  return creep_rate_derivative * _dt - 1.0;
94 }
95 
96 template <bool is_ad>
97 Real
101 {
102  if (_n_exponent <= 1)
103  return 0.0;
104 
105  Real creep_factor = _n_exponent / (_n_exponent + 1);
106 
107  return MetaPhysicL::raw_value(creep_factor * stress[_qp].doubleContraction((strain_rate)[_qp]));
108 }
109 
110 template <bool is_ad>
111 void
113  const GenericRankTwoTensor<is_ad> & plastic_strain_increment)
114 {
115  _creep_strain[_qp] += plastic_strain_increment;
116 }
117 
118 template <bool is_ad>
119 void
121 {
122  _creep_strain[_qp] = _creep_strain_old[_qp];
123 }
124 
125 template <bool is_ad>
126 bool
128 {
129  return this->_use_substepping != RadialReturnStressUpdateTempl<is_ad>::SubsteppingType::NONE;
130 }
131 
135  const Real &);
136 template ADReal
138  const ADReal &);
139 template ChainedReal
141  const ChainedReal &);
142 template ChainedADReal
144  const ChainedADReal &);
typename Moose::GenericType< RankFourTensor, is_ad > GenericRankFourTensor
This class uses the stress update material in a radial return isotropic creep model.
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
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 Real _m_exponent
Exponent on time.
void addRequiredParam(const std::string &name, const std::string &doc_string)
virtual bool substeppingCapabilityEnabled() override
Does the model include the infrastructure for substep decomposition of the elastic strain initially u...
Real elasticity_tensor(unsigned int i, unsigned int j, unsigned int k, unsigned int l)
virtual void computeStressFinalize(const GenericRankTwoTensor< is_ad > &plastic_strain_increment) override
Perform any necessary steps to finalize state after return mapping iterations.
typename GenericMaterialPropertyStruct< T, is_ad >::type GenericMaterialProperty
DualReal ADReal
ScalarType computeResidualInternal(const GenericReal< is_ad > &effective_trial_stress, const ScalarType &scalar)
void paramError(const std::string &param, Args... args) const
virtual void resetIncrementalMaterialProperties() override
Reset material properties.
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 addCoupledVar(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
registerMooseObject("SolidMechanicsApp", PowerLawCreepStressUpdate)
typename Moose::GenericType< RankTwoTensor, is_ad > GenericRankTwoTensor
void addClassDescription(const std::string &doc_string)
typename Moose::GenericType< Real, is_ad > GenericReal
PowerLawCreepStressUpdateTempl(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.
MooseUnits pow(const MooseUnits &, int)
DualNumber< ADReal, ADReal > ChainedADReal