https://mooseframework.inl.gov
Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
HillCreepStressUpdateTempl< is_ad > Class Template Reference

This class uses the stress update material for an anisotropic creep model. More...

#include <HillCreepStressUpdate.h>

Inheritance diagram for HillCreepStressUpdateTempl< is_ad >:
[legend]

Public Member Functions

 HillCreepStressUpdateTempl (const InputParameters &parameters)
 

Static Public Member Functions

static InputParameters validParams ()
 

Protected Member Functions

virtual void computeStressInitialize (const GenericDenseVector< is_ad > &stress_dev, const GenericDenseVector< is_ad > &stress, const GenericRankFourTensor< is_ad > &elasticity_tensor) override
 
virtual GenericReal< is_ad > computeResidual (const GenericDenseVector< is_ad > &effective_trial_stress, const GenericDenseVector< is_ad > &stress_new, const GenericReal< is_ad > &scalar) override
 
virtual GenericReal< is_ad > computeDerivative (const GenericDenseVector< is_ad > &effective_trial_stress, const GenericDenseVector< is_ad > &stress_new, const GenericReal< is_ad > &scalar) override
 
virtual Real computeReferenceResidual (const GenericDenseVector< is_ad > &effective_trial_stress, const GenericDenseVector< is_ad > &stress_new, const GenericReal< is_ad > &residual, const GenericReal< is_ad > &scalar_effective_inelastic_strain) override
 
void computeQsigmaChanged (GenericReal< is_ad > &qsigma_changed, const GenericDenseVector< is_ad > &stress_new, const GenericReal< is_ad > &delta_gamma, GenericRankTwoTensor< is_ad > &stress_changed)
 
virtual void computeStrainFinalize (GenericRankTwoTensor< is_ad > &inelasticStrainIncrement, const GenericRankTwoTensor< is_ad > &stress, const GenericDenseVector< is_ad > &stress_dev, const GenericReal< is_ad > &delta_gamma) override
 Perform any necessary steps to finalize strain increment after return mapping iterations. More...
 
virtual void computeStressFinalize (const GenericRankTwoTensor< is_ad > &inelasticStrainIncrement, const GenericReal< is_ad > &delta_gamma, GenericRankTwoTensor< is_ad > &stress, const GenericDenseVector< is_ad > &stress_dev, const GenericRankTwoTensor< is_ad > &stress_old, const GenericRankFourTensor< is_ad > &elasticity_tensor) override
 Perform any necessary steps to finalize state after return mapping iterations. More...
 
virtual GenericReal< is_ad > initialGuess (const GenericDenseVector< is_ad > &) override
 
bool requiresIsotropicTensor () override
 Does the model require the elasticity tensor to be isotropic? Not in principle. More...
 
virtual Real computeIntegrationErrorTimeStep () override
 Compute the limiting value of the time step for this material according to the numerical integration error. More...
 
virtual void initQpStatefulProperties () override
 
virtual void propagateQpStatefulProperties () override
 

Protected Attributes

 usingTransientInterfaceMembers
 
const bool _has_temp
 Flag to determine if temperature is supplied by the user. More...
 
const VariableValue_temperature
 Temperature variable value. More...
 
const Real _coefficient
 Leading coefficient. More...
 
const Real _n_exponent
 Exponent on the effective stress. More...
 
const Real _m_exponent
 Exponent on time. More...
 
const Real _activation_energy
 Activation energy for exp term. More...
 
const Real _gas_constant
 Gas constant for exp term. More...
 
const Real _start_time
 Simulation start time. More...
 
Real _exponential
 Exponential calculated from activation, gas constant, and temperature. More...
 
Real _exp_time
 Exponential calculated from current time. More...
 
const MaterialProperty< std::vector< Real > > & _hill_constants
 Hill constant material. More...
 
const MaterialProperty< DenseMatrix< Real > > * _hill_tensor
 Hill tensor, when global axes do not (somehow) align with those of the material Example: Large rotation due to rigid body and/or large deformation kinematics. More...
 
GenericReal< is_ad > _two_shear_modulus
 2 * shear modulus More...
 
GenericDenseMatrix< is_ad > _C
 Matrix form of the elasticity tensor. More...
 
const std::string _elasticity_tensor_name
 Name of the elasticity tensor material property. More...
 
const GenericMaterialProperty< RankFourTensor, is_ad > & _elasticity_tensor
 Anisotropic elasticity tensor material property. More...
 
bool _anisotropic_elasticity
 Materials's elasticity tensor is anisotropic or not. More...
 
const Function *const _prefactor_function
 Prefactor for scaling creep. More...
 
const Elem *const & _current_elem
 
const MooseArray< Point > & _q_point
 
unsigned int _qp
 
GenericMaterialProperty< RankTwoTensor, is_ad > & _creep_strain
 Creep strain tensor material property. More...
 
const MaterialProperty< RankTwoTensor > & _creep_strain_old
 

Detailed Description

template<bool is_ad>
class HillCreepStressUpdateTempl< is_ad >

This class uses the stress update material for an anisotropic creep model.

This class is one of the basic radial return constitutive models; more complex constitutive models combine creep and plasticity.

This class inherits from AnisotropicReturnCreepStressUpdateBase and must be used in conjunction with ComputeMultipleInelasticStress. This class calculates creep based on stress, temperature, and time effects. This class also computes the creep strain as a stateful material property.

This class extends the usage of PowerLawCreep to Hill (i.e. anisotropic) cases. For more information, consult, e.g. Stewart et al, "An anisotropic tertiary creep damage constitutive model for anistropic materials", International Journal of Pressure Vessels and Piping 88 (2011) 356–364.

Definition at line 30 of file HillCreepStressUpdate.h.

Constructor & Destructor Documentation

◆ HillCreepStressUpdateTempl()

template<bool is_ad>
HillCreepStressUpdateTempl< is_ad >::HillCreepStressUpdateTempl ( const InputParameters parameters)

Definition at line 43 of file HillCreepStressUpdate.C.

45  _has_temp(this->isParamValid("temperature")),
46  _temperature(this->_has_temp ? this->coupledValue("temperature") : this->_zero),
47  _coefficient(this->template getParam<Real>("coefficient")),
48  _n_exponent(this->template getParam<Real>("n_exponent")),
49  _m_exponent(this->template getParam<Real>("m_exponent")),
50  _activation_energy(this->template getParam<Real>("activation_energy")),
51  _gas_constant(this->template getParam<Real>("gas_constant")),
52  _start_time(this->template getParam<Real>("start_time")),
53  _exponential(1.0),
54  _exp_time(1.0),
55  _hill_constants(this->template getMaterialPropertyByName<std::vector<Real>>(this->_base_name +
56  "hill_constants")),
57  _hill_tensor(this->_use_transformation
58  ? &this->template getMaterialPropertyByName<DenseMatrix<Real>>(
59  this->_base_name + "hill_tensor")
60  : nullptr),
61  _C(6, 6),
62  _elasticity_tensor_name(this->_base_name + "elasticity_tensor"),
64  this->template getGenericMaterialProperty<RankFourTensor, is_ad>(_elasticity_tensor_name)),
65  _anisotropic_elasticity(this->template getParam<bool>("anisotropic_elasticity")),
67  this->isParamValid("creep_prefactor") ? &this->getFunction("creep_prefactor") : nullptr)
68 {
69  if (_start_time < this->_app.getStartTime() && (std::trunc(_m_exponent) != _m_exponent))
70  this->paramError("start_time",
71  "Start time must be equal to or greater than the Executioner start_time if a "
72  "non-integer m_exponent is used");
73 }
const Real _start_time
Simulation start time.
const Real _m_exponent
Exponent on time.
bool _anisotropic_elasticity
Materials&#39;s elasticity tensor is anisotropic or not.
const bool _has_temp
Flag to determine if temperature is supplied by the user.
Real _exp_time
Exponential calculated from current time.
const Real _n_exponent
Exponent on the effective stress.
const MaterialProperty< DenseMatrix< Real > > * _hill_tensor
Hill tensor, when global axes do not (somehow) align with those of the material Example: Large rotati...
const VariableValue & _temperature
Temperature variable value.
const MaterialProperty< std::vector< Real > > & _hill_constants
Hill constant material.
const Function *const _prefactor_function
Prefactor for scaling creep.
const std::string _elasticity_tensor_name
Name of the elasticity tensor material property.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const Real _gas_constant
Gas constant for exp term.
Real _exponential
Exponential calculated from activation, gas constant, and temperature.
GenericDenseMatrix< is_ad > _C
Matrix form of the elasticity tensor.
const Real _activation_energy
Activation energy for exp term.
This class provides baseline functionality for anisotropic (Hill-like) plasticity and creep models ba...
const GenericMaterialProperty< RankFourTensor, is_ad > & _elasticity_tensor
Anisotropic elasticity tensor material property.
const Real _coefficient
Leading coefficient.

Member Function Documentation

◆ computeDerivative()

template<bool is_ad>
GenericReal< is_ad > HillCreepStressUpdateTempl< is_ad >::computeDerivative ( const GenericDenseVector< is_ad > &  effective_trial_stress,
const GenericDenseVector< is_ad > &  stress_new,
const GenericReal< is_ad > &  scalar 
)
overrideprotectedvirtual

Definition at line 137 of file HillCreepStressUpdate.C.

141 {
142  using std::pow;
143 
144  GenericReal<is_ad> qsigma_changed;
145  GenericRankTwoTensor<is_ad> stress_changed;
146 
147  // Get the qsigma_changed and stress_changed
148  // delta_gamma (scalar plastic strain) will change the stress (and qsigma as well)
149  computeQsigmaChanged(qsigma_changed, stress_new, delta_gamma, stress_changed);
150 
151  ElasticityTensorTools::toMooseVoigtNotation<is_ad>(_C, _elasticity_tensor[_qp]);
152  const unsigned int dimension = _C.n();
153  GenericDenseMatrix<is_ad> d_stress_d_inelasticStrainIncrement(dimension, dimension);
154 
155  for (unsigned int index_i = 0; index_i < dimension; index_i++)
156  for (unsigned int index_j = 0; index_j < dimension; index_j++)
157  {
158  if (index_j < 3)
159  d_stress_d_inelasticStrainIncrement(index_i, index_j) =
160  -1.0 * MetaPhysicL::raw_value(_C(index_i, index_j));
161  else
162  d_stress_d_inelasticStrainIncrement(index_i, index_j) =
163  -2.0 * MetaPhysicL::raw_value(_C(index_i, index_j));
164  }
165 
166  // Hill constants, some constraints apply
167  const Real & F = _hill_constants[_qp][0];
168  const Real & G = _hill_constants[_qp][1];
169  const Real & H = _hill_constants[_qp][2];
170  const Real & L = _hill_constants[_qp][3];
171  const Real & M = _hill_constants[_qp][4];
172  const Real & N = _hill_constants[_qp][5];
173 
174  GenericDenseVector<is_ad> d_qsigma_d_inelasticStrainIncrement(6);
175  for (unsigned int index_k = 0; index_k < 6; index_k++)
176  {
177  d_qsigma_d_inelasticStrainIncrement(index_k) =
178  F * (stress_changed(1, 1) - stress_changed(2, 2)) *
179  (d_stress_d_inelasticStrainIncrement(1, index_k) -
180  d_stress_d_inelasticStrainIncrement(2, index_k)) +
181  G * (stress_changed(2, 2) - stress_changed(0, 0)) *
182  (d_stress_d_inelasticStrainIncrement(2, index_k) -
183  d_stress_d_inelasticStrainIncrement(0, index_k)) +
184  H * (stress_changed(0, 0) - stress_changed(1, 1)) *
185  (d_stress_d_inelasticStrainIncrement(0, index_k) -
186  d_stress_d_inelasticStrainIncrement(1, index_k)) +
187  2.0 * L * stress_changed(1, 2) * d_stress_d_inelasticStrainIncrement(4, index_k) +
188  2.0 * M * stress_changed(2, 0) * d_stress_d_inelasticStrainIncrement(5, index_k) +
189  2.0 * N * stress_changed(0, 1) * d_stress_d_inelasticStrainIncrement(3, index_k);
190  d_qsigma_d_inelasticStrainIncrement(index_k) /= qsigma_changed;
191  }
192 
193  GenericDenseVector<is_ad> d_qsigma_d_sigma(6);
194 
195  d_qsigma_d_sigma(0) = (H * (stress_changed(0, 0) - stress_changed(1, 1)) -
196  G * (stress_changed(2, 2) - stress_changed(0, 0))) /
197  qsigma_changed;
198  d_qsigma_d_sigma(1) = (F * (stress_changed(1, 1) - stress_changed(2, 2)) -
199  H * (stress_changed(0, 0) - stress_changed(1, 1))) /
200  qsigma_changed;
201  d_qsigma_d_sigma(2) = (G * (stress_changed(2, 2) - stress_changed(0, 0)) -
202  F * (stress_changed(1, 1) - stress_changed(2, 2))) /
203  qsigma_changed;
204  d_qsigma_d_sigma(3) = 2.0 * N * stress_changed(0, 1) / qsigma_changed;
205  d_qsigma_d_sigma(4) = 2.0 * L * stress_changed(1, 2) / qsigma_changed;
206  d_qsigma_d_sigma(5) = 2.0 * M * stress_changed(0, 2) / qsigma_changed;
207 
208  GenericReal<is_ad> d_qsigma_d_deltaGamma =
209  d_qsigma_d_inelasticStrainIncrement.dot(d_qsigma_d_sigma);
210 
211  GenericReal<is_ad> creep_rate_derivative = _coefficient * d_qsigma_d_deltaGamma * _n_exponent *
212  pow(qsigma_changed, _n_exponent - 1.0) * _exponential *
213  _exp_time;
214 
216  creep_rate_derivative *= _prefactor_function->value(_t, _q_point[_qp]);
217 
218  return (creep_rate_derivative * _dt - 1.0);
219 }
Moose::GenericType< Real, is_ad > GenericReal
auto raw_value(const Eigen::Map< T > &in)
Moose::GenericType< DenseVector< Real >, is_ad > GenericDenseVector
static const std::string F
Definition: NS.h:165
static const std::string G
Definition: NS.h:166
Real _exp_time
Exponential calculated from current time.
const Real _n_exponent
Exponent on the effective stress.
const MaterialProperty< std::vector< Real > > & _hill_constants
Hill constant material.
const Function *const _prefactor_function
Prefactor for scaling creep.
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
void computeQsigmaChanged(GenericReal< is_ad > &qsigma_changed, const GenericDenseVector< is_ad > &stress_new, const GenericReal< is_ad > &delta_gamma, GenericRankTwoTensor< is_ad > &stress_changed)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
int N
Real _exponential
Exponential calculated from activation, gas constant, and temperature.
GenericDenseMatrix< is_ad > _C
Matrix form of the elasticity tensor.
virtual Real value(Real t, const Point &p) const
MooseUnits pow(const MooseUnits &, int)
Moose::GenericType< DenseMatrix< Real >, is_ad > GenericDenseMatrix
const GenericMaterialProperty< RankFourTensor, is_ad > & _elasticity_tensor
Anisotropic elasticity tensor material property.
const Real _coefficient
Leading coefficient.
Moose::GenericType< RankTwoTensor, is_ad > GenericRankTwoTensor

◆ computeIntegrationErrorTimeStep()

template<bool is_ad>
virtual Real HillCreepStressUpdateTempl< is_ad >::computeIntegrationErrorTimeStep ( )
inlineoverrideprotectedvirtual

Compute the limiting value of the time step for this material according to the numerical integration error.

Returns
Limiting time step

Definition at line 109 of file HillCreepStressUpdate.h.

110  {
111  return this->_max_integration_error_time_step;
112  }

◆ computeQsigmaChanged()

template<bool is_ad>
void HillCreepStressUpdateTempl< is_ad >::computeQsigmaChanged ( GenericReal< is_ad > &  qsigma_changed,
const GenericDenseVector< is_ad > &  stress_new,
const GenericReal< is_ad > &  delta_gamma,
GenericRankTwoTensor< is_ad > &  stress_changed 
)
protected

Definition at line 353 of file HillCreepStressUpdate.C.

358 {
359  using std::sqrt;
360 
361  GenericReal<is_ad> qsigma_square;
362 
363  // Hill constants, some constraints apply
364  const Real & F = _hill_constants[_qp][0];
365  const Real & G = _hill_constants[_qp][1];
366  const Real & H = _hill_constants[_qp][2];
367  const Real & L = _hill_constants[_qp][3];
368  const Real & M = _hill_constants[_qp][4];
369  const Real & N = _hill_constants[_qp][5];
370 
371  if (!this->_use_transformation)
372  {
373  qsigma_square = F * (stress_new(1) - stress_new(2)) * (stress_new(1) - stress_new(2));
374  qsigma_square += G * (stress_new(2) - stress_new(0)) * (stress_new(2) - stress_new(0));
375  qsigma_square += H * (stress_new(0) - stress_new(1)) * (stress_new(0) - stress_new(1));
376  qsigma_square += 2 * L * stress_new(4) * stress_new(4);
377  qsigma_square += 2 * M * stress_new(5) * stress_new(5);
378  qsigma_square += 2 * N * stress_new(3) * stress_new(3);
379  }
380  else
381  {
383  (*_hill_tensor)[_qp].vector_mult(Ms, stress_new);
384  qsigma_square = Ms.dot(stress_new);
385  }
386 
387  GenericReal<is_ad> qsigma = sqrt(qsigma_square);
388 
390  qsigma_changed = qsigma - 1.5 * _two_shear_modulus * delta_gamma;
391  else
392  {
394  stress(0, 0) = stress_new(0);
395  stress(1, 1) = stress_new(1);
396  stress(2, 2) = stress_new(2);
397  stress(0, 1) = stress(1, 0) = stress_new(3);
398  stress(1, 2) = stress(2, 1) = stress_new(4);
399  stress(0, 2) = stress(2, 0) = stress_new(5);
400 
402  b(0) = H * (stress(0, 0) - stress(1, 1)) - G * (stress(2, 2) - stress(0, 0));
403  b(1) = F * (stress(1, 1) - stress(2, 2)) - H * (stress(0, 0) - stress(1, 1));
404  b(2) = G * (stress(2, 2) - stress(0, 0)) - F * (stress(1, 1) - stress(2, 2));
405  b(3) = 2.0 * N * stress(0, 1);
406  b(4) = 2.0 * L * stress(1, 2);
407  b(5) = 2.0 * M * stress(0, 2);
408 
409  GenericRankTwoTensor<is_ad> inelasticStrainIncrement;
410  inelasticStrainIncrement(0, 0) = delta_gamma * b(0) / qsigma;
411  inelasticStrainIncrement(1, 1) = delta_gamma * b(1) / qsigma;
412  inelasticStrainIncrement(2, 2) = delta_gamma * b(2) / qsigma;
413  inelasticStrainIncrement(0, 1) = inelasticStrainIncrement(1, 0) = delta_gamma * b(3) / qsigma;
414  inelasticStrainIncrement(1, 2) = inelasticStrainIncrement(2, 1) = delta_gamma * b(4) / qsigma;
415  inelasticStrainIncrement(0, 2) = inelasticStrainIncrement(2, 0) = delta_gamma * b(5) / qsigma;
416 
417  stress_changed = stress - _elasticity_tensor[_qp] * inelasticStrainIncrement;
418 
419  GenericReal<is_ad> qsigma_square_changed;
420  qsigma_square_changed = F * (stress_changed(1, 1) - stress_changed(2, 2)) *
421  (stress_changed(1, 1) - stress_changed(2, 2));
422  qsigma_square_changed += G * (stress_changed(2, 2) - stress_changed(0, 0)) *
423  (stress_changed(2, 2) - stress_changed(0, 0));
424  qsigma_square_changed += H * (stress_changed(0, 0) - stress_changed(1, 1)) *
425  (stress_changed(0, 0) - stress_changed(1, 1));
426  qsigma_square_changed += 2 * L * stress_changed(1, 2) * stress_changed(1, 2);
427  qsigma_square_changed += 2 * M * stress_changed(0, 2) * stress_changed(0, 2);
428  qsigma_square_changed += 2 * N * stress_changed(0, 1) * stress_changed(0, 1);
429  qsigma_changed = sqrt(qsigma_square_changed);
430  }
431 }
Moose::GenericType< Real, is_ad > GenericReal
bool _anisotropic_elasticity
Materials&#39;s elasticity tensor is anisotropic or not.
Moose::GenericType< DenseVector< Real >, is_ad > GenericDenseVector
static const std::string F
Definition: NS.h:165
static const std::string G
Definition: NS.h:166
const MaterialProperty< std::vector< Real > > & _hill_constants
Hill constant material.
GenericReal< is_ad > _two_shear_modulus
2 * shear modulus
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
int N
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sqrt(_arg)) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tanh
const GenericMaterialProperty< RankFourTensor, is_ad > & _elasticity_tensor
Anisotropic elasticity tensor material property.
Moose::GenericType< RankTwoTensor, is_ad > GenericRankTwoTensor

◆ computeReferenceResidual()

template<bool is_ad>
Real HillCreepStressUpdateTempl< is_ad >::computeReferenceResidual ( const GenericDenseVector< is_ad > &  effective_trial_stress,
const GenericDenseVector< is_ad > &  stress_new,
const GenericReal< is_ad > &  residual,
const GenericReal< is_ad > &  scalar_effective_inelastic_strain 
)
overrideprotectedvirtual

Definition at line 126 of file HillCreepStressUpdate.C.

131 {
132  return 1.0;
133 }

◆ computeResidual()

template<bool is_ad>
GenericReal< is_ad > HillCreepStressUpdateTempl< is_ad >::computeResidual ( const GenericDenseVector< is_ad > &  effective_trial_stress,
const GenericDenseVector< is_ad > &  stress_new,
const GenericReal< is_ad > &  scalar 
)
overrideprotectedvirtual

Definition at line 99 of file HillCreepStressUpdate.C.

103 {
104  using std::pow;
105 
106  GenericReal<is_ad> qsigma_changed;
107  GenericRankTwoTensor<is_ad> stress_changed;
108 
109  // Get the qsigma_changed and stress_changed (not used)
110  // delta_gamma (scalar plastic strain) will change the stress (and qsigma as well)
111  computeQsigmaChanged(qsigma_changed, stress_new, delta_gamma, stress_changed);
112 
113  GenericReal<is_ad> creep_rate =
114  _coefficient * pow(qsigma_changed, _n_exponent) * _exponential * _exp_time;
115 
117  creep_rate *= _prefactor_function->value(_t, _q_point[_qp]);
118 
119  this->_inelastic_strain_rate[_qp] = MetaPhysicL::raw_value(creep_rate);
120  // Return iteration difference between creep strain and inelastic strain multiplier
121  return creep_rate * _dt - delta_gamma;
122 }
Moose::GenericType< Real, is_ad > GenericReal
auto raw_value(const Eigen::Map< T > &in)
Real _exp_time
Exponential calculated from current time.
const Real _n_exponent
Exponent on the effective stress.
const Function *const _prefactor_function
Prefactor for scaling creep.
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
void computeQsigmaChanged(GenericReal< is_ad > &qsigma_changed, const GenericDenseVector< is_ad > &stress_new, const GenericReal< is_ad > &delta_gamma, GenericRankTwoTensor< is_ad > &stress_changed)
Real _exponential
Exponential calculated from activation, gas constant, and temperature.
virtual Real value(Real t, const Point &p) const
MooseUnits pow(const MooseUnits &, int)
const Real _coefficient
Leading coefficient.
Moose::GenericType< RankTwoTensor, is_ad > GenericRankTwoTensor

◆ computeStrainFinalize()

template<bool is_ad>
void HillCreepStressUpdateTempl< is_ad >::computeStrainFinalize ( GenericRankTwoTensor< is_ad > &  inelasticStrainIncrement,
const GenericRankTwoTensor< is_ad > &  stress,
const GenericDenseVector< is_ad > &  stress_dev,
const GenericReal< is_ad > &  delta_gamma 
)
overrideprotectedvirtual

Perform any necessary steps to finalize strain increment after return mapping iterations.

Parameters
inelasticStrainIncrementInelastic strain increment
stressCauchy stresss tensor
stress_devDeviatoric partt of the Cauchy stresss tensor
delta_gammaGeneralized radial return's plastic multiplier

Reimplemented from AnisotropicReturnCreepStressUpdateBaseTempl< is_ad >.

Definition at line 223 of file HillCreepStressUpdate.C.

228 {
229  using std::sqrt;
230 
231  GenericReal<is_ad> qsigma_square;
232  if (!this->_use_transformation)
233  {
234  // Hill constants, some constraints apply
235  const Real & F = _hill_constants[_qp][0];
236  const Real & G = _hill_constants[_qp][1];
237  const Real & H = _hill_constants[_qp][2];
238  const Real & L = _hill_constants[_qp][3];
239  const Real & M = _hill_constants[_qp][4];
240  const Real & N = _hill_constants[_qp][5];
241 
242  // Equivalent deviatoric stress function.
243  qsigma_square = F * (stress(1, 1) - stress(2, 2)) * (stress(1, 1) - stress(2, 2));
244  qsigma_square += G * (stress(2, 2) - stress(0, 0)) * (stress(2, 2) - stress(0, 0));
245  qsigma_square += H * (stress(0, 0) - stress(1, 1)) * (stress(0, 0) - stress(1, 1));
246  qsigma_square += 2 * L * stress(1, 2) * stress(1, 2);
247  qsigma_square += 2 * M * stress(0, 2) * stress(0, 2);
248  qsigma_square += 2 * N * stress(0, 1) * stress(0, 1);
249  }
250  else
251  {
253  (*_hill_tensor)[_qp].vector_mult(Ms, stress_dev);
254  qsigma_square = Ms.dot(stress_dev);
255  }
256 
257  if (qsigma_square == 0)
258  {
259  inelasticStrainIncrement.zero();
260 
262  inelasticStrainIncrement, stress, stress_dev, delta_gamma);
263 
264  this->_effective_inelastic_strain[_qp] = this->_effective_inelastic_strain_old[_qp];
265 
266  return;
267  }
268 
269  // Use Hill-type flow rule to compute the time step inelastic increment.
270  GenericReal<is_ad> prefactor = delta_gamma / sqrt(qsigma_square);
271 
272  if (!this->_use_transformation)
273  {
274  // Hill constants, some constraints apply
275  const Real & F = _hill_constants[_qp][0];
276  const Real & G = _hill_constants[_qp][1];
277  const Real & H = _hill_constants[_qp][2];
278  const Real & L = _hill_constants[_qp][3];
279  const Real & M = _hill_constants[_qp][4];
280  const Real & N = _hill_constants[_qp][5];
281 
282  inelasticStrainIncrement(0, 0) =
283  prefactor * (H * (stress(0, 0) - stress(1, 1)) - G * (stress(2, 2) - stress(0, 0)));
284  inelasticStrainIncrement(1, 1) =
285  prefactor * (F * (stress(1, 1) - stress(2, 2)) - H * (stress(0, 0) - stress(1, 1)));
286  inelasticStrainIncrement(2, 2) =
287  prefactor * (G * (stress(2, 2) - stress(0, 0)) - F * (stress(1, 1) - stress(2, 2)));
288 
289  inelasticStrainIncrement(0, 1) = inelasticStrainIncrement(1, 0) =
290  prefactor * 2.0 * N * stress(0, 1);
291  inelasticStrainIncrement(0, 2) = inelasticStrainIncrement(2, 0) =
292  prefactor * 2.0 * M * stress(0, 2);
293  inelasticStrainIncrement(1, 2) = inelasticStrainIncrement(2, 1) =
294  prefactor * 2.0 * L * stress(1, 2);
295  }
296  else
297  {
298  GenericDenseVector<is_ad> inelastic_strain_increment(6);
300  (*_hill_tensor)[_qp].vector_mult(Ms, stress_dev);
301 
302  for (unsigned int i = 0; i < 6; i++)
303  inelastic_strain_increment(i) = Ms(i) * prefactor;
304 
305  inelasticStrainIncrement(0, 0) = inelastic_strain_increment(0);
306  inelasticStrainIncrement(1, 1) = inelastic_strain_increment(1);
307  inelasticStrainIncrement(2, 2) = inelastic_strain_increment(2);
308 
309  inelasticStrainIncrement(0, 1) = inelasticStrainIncrement(1, 0) = inelastic_strain_increment(3);
310  inelasticStrainIncrement(1, 2) = inelasticStrainIncrement(2, 1) = inelastic_strain_increment(4);
311  inelasticStrainIncrement(0, 2) = inelasticStrainIncrement(2, 0) = inelastic_strain_increment(5);
312  }
313 
315  inelasticStrainIncrement, stress, stress_dev, delta_gamma);
316 
317  this->_effective_inelastic_strain[_qp] = this->_effective_inelastic_strain_old[_qp] + delta_gamma;
318 }
Moose::GenericType< Real, is_ad > GenericReal
Moose::GenericType< DenseVector< Real >, is_ad > GenericDenseVector
static const std::string F
Definition: NS.h:165
static const std::string G
Definition: NS.h:166
virtual void computeStrainFinalize(GenericRankTwoTensor< is_ad > &, const GenericRankTwoTensor< is_ad > &, const GenericDenseVector< is_ad > &, const GenericReal< is_ad > &) override
Perform any necessary steps to finalize strain increment after return mapping iterations.
const MaterialProperty< std::vector< Real > > & _hill_constants
Hill constant material.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
int N
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sqrt(_arg)) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tanh

◆ computeStressFinalize()

template<bool is_ad>
void HillCreepStressUpdateTempl< is_ad >::computeStressFinalize ( const GenericRankTwoTensor< is_ad > &  inelasticStrainIncrement,
const GenericReal< is_ad > &  delta_gamma,
GenericRankTwoTensor< is_ad > &  stress,
const GenericDenseVector< is_ad > &  stress_dev,
const GenericRankTwoTensor< is_ad > &  stress_old,
const GenericRankFourTensor< is_ad > &  elasticity_tensor 
)
overrideprotectedvirtual

Perform any necessary steps to finalize state after return mapping iterations.

Parameters
inelasticStrainIncrementInelastic strain increment
delta_gammaGeneralized radial return's plastic multiplier
stressCauchy stresss tensor
stress_devDeviatoric partt of the Cauchy stresss tensor

Definition at line 322 of file HillCreepStressUpdate.C.

329 {
330  using std::abs;
331 
332  // Class only valid for isotropic elasticity (for now)
333  stress_new -= elasticity_tensor * creepStrainIncrement;
334 
335  // Compute the maximum time step allowed due to creep strain numerical integration error
336  Real stress_dif = MetaPhysicL::raw_value(stress_new - stress_old).L2norm();
337 
338  // Get a representative value of the elasticity tensor
339  Real elasticity_value =
340  1.0 / 3.0 *
341  MetaPhysicL::raw_value((elasticity_tensor(0, 0, 0, 0) + elasticity_tensor(1, 1, 1, 1) +
342  elasticity_tensor(2, 2, 2, 2)));
343 
344  if (abs(stress_dif) > TOLERANCE * TOLERANCE)
345  this->_max_integration_error_time_step =
346  _dt / (stress_dif / elasticity_value / this->_max_integration_error);
347  else
348  this->_max_integration_error_time_step = std::numeric_limits<Real>::max();
349 }
MetaPhysicL::DualNumber< V, D, asd > abs(const MetaPhysicL::DualNumber< V, D, asd > &a)
auto raw_value(const Eigen::Map< T > &in)
Real elasticity_tensor(unsigned int i, unsigned int j, unsigned int k, unsigned int l)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ computeStressInitialize()

template<bool is_ad>
void HillCreepStressUpdateTempl< is_ad >::computeStressInitialize ( const GenericDenseVector< is_ad > &  stress_dev,
const GenericDenseVector< is_ad > &  stress,
const GenericRankFourTensor< is_ad > &  elasticity_tensor 
)
overrideprotectedvirtual

Definition at line 77 of file HillCreepStressUpdate.C.

81 {
82  if (_has_temp)
84 
86 
88 }
const Real _start_time
Simulation start time.
T getIsotropicShearModulus(const RankFourTensorTempl< T > &elasticity_tensor)
Get the shear modulus for an isotropic elasticity tensor param elasticity_tensor the tensor (must be ...
const Real _m_exponent
Exponent on time.
const bool _has_temp
Flag to determine if temperature is supplied by the user.
Real _exp_time
Exponential calculated from current time.
const VariableValue & _temperature
Temperature variable value.
GenericReal< is_ad > _two_shear_modulus
2 * shear modulus
const Real _gas_constant
Gas constant for exp term.
Real _exponential
Exponential calculated from activation, gas constant, and temperature.
const Real _activation_energy
Activation energy for exp term.
MooseUnits pow(const MooseUnits &, int)

◆ initialGuess()

template<bool is_ad>
GenericReal< is_ad > HillCreepStressUpdateTempl< is_ad >::initialGuess ( const GenericDenseVector< is_ad > &  )
overrideprotectedvirtual

Definition at line 92 of file HillCreepStressUpdate.C.

93 {
94  return 0.0;
95 }

◆ initQpStatefulProperties()

template<bool is_ad>
void AnisotropicReturnCreepStressUpdateBaseTempl< is_ad >::initQpStatefulProperties ( )
overrideprotectedvirtualinherited

Definition at line 37 of file AnisotropicReturnCreepStressUpdateBase.C.

38 {
39  _creep_strain[this->_qp].zero();
40 
42 }
GenericMaterialProperty< RankTwoTensor, is_ad > & _creep_strain
Creep strain tensor material property.

◆ propagateQpStatefulProperties()

template<bool is_ad>
void AnisotropicReturnCreepStressUpdateBaseTempl< is_ad >::propagateQpStatefulProperties ( )
overrideprotectedvirtualinherited

Definition at line 46 of file AnisotropicReturnCreepStressUpdateBase.C.

47 {
48  _creep_strain[this->_qp] = _creep_strain_old[this->_qp];
49 
50  this->propagateQpStatefulPropertiesRadialReturn();
51 }
GenericMaterialProperty< RankTwoTensor, is_ad > & _creep_strain
Creep strain tensor material property.
const MaterialProperty< RankTwoTensor > & _creep_strain_old

◆ requiresIsotropicTensor()

template<bool is_ad>
bool HillCreepStressUpdateTempl< is_ad >::requiresIsotropicTensor ( )
inlineoverrideprotected

Does the model require the elasticity tensor to be isotropic? Not in principle.

TODO: Take care of rotation of anisotropy parameters

Definition at line 102 of file HillCreepStressUpdate.h.

102 { return false; }

◆ validParams()

template<bool is_ad>
InputParameters HillCreepStressUpdateTempl< is_ad >::validParams ( )
static

Definition at line 19 of file HillCreepStressUpdate.C.

20 {
22  params.addClassDescription(
23  "This class uses the stress update material in a generalized radial return anisotropic power "
24  "law creep "
25  "model. This class can be used in conjunction with other creep and plasticity materials for "
26  "more complex simulations.");
27 
28  // Linear strain hardening parameters
29  params.addCoupledVar("temperature", "Coupled temperature");
30  params.addRequiredParam<Real>("coefficient", "Leading coefficient in power-law equation");
31  params.addRequiredParam<Real>("n_exponent", "Exponent on effective stress in power-law equation");
32  params.addParam<Real>("m_exponent", 0.0, "Exponent on time in power-law equation");
33  params.addRequiredParam<Real>("activation_energy", "Activation energy");
34  params.addParam<Real>("gas_constant", 8.3143, "Universal gas constant");
35  params.addParam<Real>("start_time", 0.0, "Start time (if not zero)");
36  params.addParam<bool>("anisotropic_elasticity", false, "Enable using anisotropic elasticity");
37  params.addParam<FunctionName>(
38  "creep_prefactor", "Optional function to use as a scalar prefactor on the creep strain.");
39  return params;
40 }
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addCoupledVar(const std::string &name, const std::string &doc_string)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void addClassDescription(const std::string &doc_string)

Member Data Documentation

◆ _activation_energy

template<bool is_ad>
const Real HillCreepStressUpdateTempl< is_ad >::_activation_energy
protected

Activation energy for exp term.

Definition at line 130 of file HillCreepStressUpdate.h.

◆ _anisotropic_elasticity

template<bool is_ad>
bool HillCreepStressUpdateTempl< is_ad >::_anisotropic_elasticity
protected

Materials's elasticity tensor is anisotropic or not.

Definition at line 164 of file HillCreepStressUpdate.h.

◆ _C

template<bool is_ad>
GenericDenseMatrix<is_ad> HillCreepStressUpdateTempl< is_ad >::_C
protected

Matrix form of the elasticity tensor.

Definition at line 155 of file HillCreepStressUpdate.h.

◆ _coefficient

template<bool is_ad>
const Real HillCreepStressUpdateTempl< is_ad >::_coefficient
protected

Leading coefficient.

Definition at line 121 of file HillCreepStressUpdate.h.

◆ _creep_strain

template<bool is_ad>
GenericMaterialProperty<RankTwoTensor, is_ad>& AnisotropicReturnCreepStressUpdateBaseTempl< is_ad >::_creep_strain
protectedinherited

Creep strain tensor material property.

Definition at line 51 of file AnisotropicReturnCreepStressUpdateBase.h.

◆ _creep_strain_old

template<bool is_ad>
const MaterialProperty<RankTwoTensor>& AnisotropicReturnCreepStressUpdateBaseTempl< is_ad >::_creep_strain_old
protectedinherited

Definition at line 52 of file AnisotropicReturnCreepStressUpdateBase.h.

◆ _current_elem

template<bool is_ad>
const Elem *const & Material::_current_elem
protected

◆ _elasticity_tensor

template<bool is_ad>
const GenericMaterialProperty<RankFourTensor, is_ad>& HillCreepStressUpdateTempl< is_ad >::_elasticity_tensor
protected

Anisotropic elasticity tensor material property.

Definition at line 161 of file HillCreepStressUpdate.h.

◆ _elasticity_tensor_name

template<bool is_ad>
const std::string HillCreepStressUpdateTempl< is_ad >::_elasticity_tensor_name
protected

Name of the elasticity tensor material property.

Definition at line 158 of file HillCreepStressUpdate.h.

◆ _exp_time

template<bool is_ad>
Real HillCreepStressUpdateTempl< is_ad >::_exp_time
protected

Exponential calculated from current time.

Definition at line 142 of file HillCreepStressUpdate.h.

◆ _exponential

template<bool is_ad>
Real HillCreepStressUpdateTempl< is_ad >::_exponential
protected

Exponential calculated from activation, gas constant, and temperature.

Definition at line 139 of file HillCreepStressUpdate.h.

◆ _gas_constant

template<bool is_ad>
const Real HillCreepStressUpdateTempl< is_ad >::_gas_constant
protected

Gas constant for exp term.

Definition at line 133 of file HillCreepStressUpdate.h.

◆ _has_temp

template<bool is_ad>
const bool HillCreepStressUpdateTempl< is_ad >::_has_temp
protected

Flag to determine if temperature is supplied by the user.

Definition at line 115 of file HillCreepStressUpdate.h.

◆ _hill_constants

template<bool is_ad>
const MaterialProperty<std::vector<Real> >& HillCreepStressUpdateTempl< is_ad >::_hill_constants
protected

Hill constant material.

Definition at line 145 of file HillCreepStressUpdate.h.

◆ _hill_tensor

template<bool is_ad>
const MaterialProperty<DenseMatrix<Real> >* HillCreepStressUpdateTempl< is_ad >::_hill_tensor
protected

Hill tensor, when global axes do not (somehow) align with those of the material Example: Large rotation due to rigid body and/or large deformation kinematics.

Definition at line 149 of file HillCreepStressUpdate.h.

◆ _m_exponent

template<bool is_ad>
const Real HillCreepStressUpdateTempl< is_ad >::_m_exponent
protected

Exponent on time.

Definition at line 127 of file HillCreepStressUpdate.h.

Referenced by HillCreepStressUpdateTempl< is_ad >::HillCreepStressUpdateTempl().

◆ _n_exponent

template<bool is_ad>
const Real HillCreepStressUpdateTempl< is_ad >::_n_exponent
protected

Exponent on the effective stress.

Definition at line 124 of file HillCreepStressUpdate.h.

◆ _prefactor_function

template<bool is_ad>
const Function* const HillCreepStressUpdateTempl< is_ad >::_prefactor_function
protected

Prefactor for scaling creep.

Definition at line 167 of file HillCreepStressUpdate.h.

◆ _q_point

template<bool is_ad>
const MooseArray< Point > & Material::_q_point
protected

◆ _qp

template<bool is_ad>
unsigned int Material::_qp
protected

◆ _start_time

template<bool is_ad>
const Real HillCreepStressUpdateTempl< is_ad >::_start_time
protected

Simulation start time.

Definition at line 136 of file HillCreepStressUpdate.h.

◆ _temperature

template<bool is_ad>
const VariableValue& HillCreepStressUpdateTempl< is_ad >::_temperature
protected

Temperature variable value.

Definition at line 118 of file HillCreepStressUpdate.h.

◆ _two_shear_modulus

template<bool is_ad>
GenericReal<is_ad> HillCreepStressUpdateTempl< is_ad >::_two_shear_modulus
protected

2 * shear modulus

Definition at line 152 of file HillCreepStressUpdate.h.

◆ usingTransientInterfaceMembers

template<bool is_ad>
HillCreepStressUpdateTempl< is_ad >::usingTransientInterfaceMembers
protected

Definition at line 38 of file HillCreepStressUpdate.h.


The documentation for this class was generated from the following files: