Loading [MathJax]/extensions/tex2jax.js
https://mooseframework.inl.gov
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends
ADMultiplePowerLawCreepStressUpdate.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 <algorithm>
12 
14 
17 {
19  params.addClassDescription(
20  "This class uses the stress update material in a radial return isotropic power law creep "
21  "model. This class can be used in conjunction with other creep and plasticity materials "
22  "for more complex simulations.");
23 
24  // Linear strain hardening parameters
25  params.addCoupledVar("temperature", "Coupled temperature");
26  params.addRequiredParam<std::vector<Real>>("coefficient",
27  "Leading coefficient in power-law equation");
28  params.addRequiredParam<std::vector<Real>>("n_exponent",
29  "Exponent on effective stress in power-law equation");
30  params.addRequiredParam<std::vector<Real>>("m_exponent",
31  "Exponent on time in power-law equation");
32  params.addRequiredParam<std::vector<Real>>("stress_thresholds",
33  "Stress intervals to switch creep behavior");
34  params.addRequiredParam<std::vector<Real>>("activation_energy", "Activation energy");
35  params.addParam<Real>("gas_constant", 8.3143, "Universal gas constant");
36  params.addParam<Real>("start_time", 0.0, "Start time (if not zero)");
37  return params;
38 }
39 
41  const InputParameters & parameters)
43  _temperature(isParamValid("temperature") ? &adCoupledValue("temperature") : nullptr),
44  _coefficient(getParam<std::vector<Real>>("coefficient")),
45  _n_exponent(getParam<std::vector<Real>>("n_exponent")),
46  _m_exponent(getParam<std::vector<Real>>("m_exponent")),
47  _stress_thresholds(getParam<std::vector<Real>>("stress_thresholds")),
48  _activation_energy(getParam<std::vector<Real>>("activation_energy")),
49  _gas_constant(getParam<Real>("gas_constant")),
50  _start_time(getParam<Real>("start_time")),
51  _exponential(1),
52  _exp_time(0),
53  _stress_index(0),
54  _number_of_models(_m_exponent.size())
55 {
56 
57  if (!std::is_sorted(_stress_thresholds.begin(), _stress_thresholds.end()))
58  paramError("stress_thresholds",
59  "Stress thresholds input must be provided in increasing ordered");
60 
61  if (_coefficient.size() != _n_exponent.size() || _coefficient.size() != _m_exponent.size() ||
62  _coefficient.size() != _activation_energy.size())
63  paramError(
64  "n_exponent",
65  "Inputs to ADMultiplePowerLawCreepStressUpdate creep models must have the same size");
66 
67  if (_number_of_models != _stress_thresholds.size() - 1)
68  paramError("stress_thresholds",
69  "The number of creep models must be the number of stress thresholds minute. That "
70  "is, one creep model will be valid between two stress thresholds");
71 
72  for (unsigned int i = 0; i < _number_of_models; i++)
73  if (_start_time < this->_app.getStartTime() && (std::trunc(_m_exponent[i]) != _m_exponent[i]))
74  paramError("start_time",
75  "Start time must be equal to or greater than the Executioner start_time if a "
76  "non-integer m_exponent is used");
77 }
78 
79 void
81  const ADReal & effective_trial_stress, const ADRankFourTensor & elasticity_tensor)
82 {
84 
85  _stress_index = stressIndex(effective_trial_stress);
86 
87  if (_temperature)
88  _exponential =
90 
92 }
93 
94 ADReal
96  const ADReal & scalar)
97 {
98  const ADReal stress_delta = effective_trial_stress - _three_shear_modulus * scalar;
99  const ADReal creep_rate = _coefficient[_stress_index] *
100  std::pow(stress_delta, _n_exponent[_stress_index]) * _exponential *
101  _exp_time;
102  return creep_rate * _dt - scalar;
103 }
104 
105 ADReal
107  const ADReal & scalar)
108 {
109  const ADReal stress_delta = effective_trial_stress - _three_shear_modulus * scalar;
110  const ADReal creep_rate_derivative =
112  std::pow(stress_delta, _n_exponent[_stress_index] - 1.0) * _exponential * _exp_time;
113  return creep_rate_derivative * _dt - 1.0;
114 }
115 
116 Real
118  const ADMaterialProperty<RankTwoTensor> & stress,
119  const ADMaterialProperty<RankTwoTensor> & strain_rate)
120 {
121  if (_n_exponent[_stress_index] <= 1)
122  return 0.0;
123 
124  Real creep_factor = _n_exponent[_stress_index] / (_n_exponent[_stress_index] + 1);
125 
126  return MetaPhysicL::raw_value(creep_factor * stress[_qp].doubleContraction((strain_rate)[_qp]));
127 }
128 
129 bool
131 {
133 }
134 
135 std::size_t
137 {
138  // Check the correct model for *this* radial return
139  std::size_t i = 0;
140  while (i < _number_of_models - 1 && effective_trial_stress > _stress_thresholds[i + 1])
141  ++i;
142 
143  return i;
144 }
SubsteppingType _use_substepping
Whether user has requested the use of substepping technique to improve convergence [make const later]...
unsigned int _stress_index
Quadrature-point value pointing to the right power law parameters.
const std::vector< Real > _n_exponent
Exponent on the effective stress vector.
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
const ADVariableValue *const _temperature
Temperature variable value.
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)
virtual Real computeStrainEnergyRateDensity(const ADMaterialProperty< RankTwoTensor > &stress, const ADMaterialProperty< RankTwoTensor > &strain_rate) override
Real getStartTime() const
GenericReal< is_ad > _three_shear_modulus
3 * shear modulus
DualNumber< Real, DNDerivativeType, true > ADReal
void addRequiredParam(const std::string &name, const std::string &doc_string)
const std::vector< Real > _stress_thresholds
Stress thresholds vector.
virtual ADReal computeDerivative(const ADReal &effective_trial_stress, const ADReal &scalar) override
Real elasticity_tensor(unsigned int i, unsigned int j, unsigned int k, unsigned int l)
ADReal _exponential
Exponential calculated from activation, gas constant, and temperature.
std::size_t stressIndex(const ADReal &effective_trial_stress)
registerMooseObject("SolidMechanicsApp", ADMultiplePowerLawCreepStressUpdate)
Real & _t
const std::vector< Real > _m_exponent
Exponent on time vector.
void paramError(const std::string &param, Args... args) const
virtual bool substeppingCapabilityEnabled() override
Does the model include the infrastructure for substep decomposition of the elastic strain initially u...
void addCoupledVar(const std::string &name, const std::string &doc_string)
const std::vector< Real > _activation_energy
Activation energy for exp term vector.
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
virtual ADReal computeResidual(const ADReal &effective_trial_stress, const ADReal &scalar) override
MooseApp & _app
Real _exp_time
Exponential calculated from current time.
ADMultiplePowerLawCreepStressUpdate(const InputParameters &parameters)
const std::vector< Real > _coefficient
Leading coefficient vector.
void addClassDescription(const std::string &doc_string)
This class uses the stress update material in a radial return isotropic creep model.
const unsigned int _number_of_models
Total number of models provided by the user.
const Real _gas_constant
Gas constant for exp term.
MooseUnits pow(const MooseUnits &, int)
virtual void computeStressInitialize(const ADReal &effective_trial_stress, const ADRankFourTensor &elasticity_tensor) override