https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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.
 
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.
 
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.
 
virtual Real computeIntegrationErrorTimeStep () override
 Compute the limiting value of the time step for this material according to the numerical integration error.
 
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.
 
const VariableValue_temperature
 Temperature variable value.
 
const Real _coefficient
 Leading coefficient.
 
const Real _n_exponent
 Exponent on the effective stress.
 
const Real _m_exponent
 Exponent on time.
 
const Real _activation_energy
 Activation energy for exp term.
 
const Real _gas_constant
 Gas constant for exp term.
 
const Real _start_time
 Simulation start time.
 
Real _exponential
 Exponential calculated from activation, gas constant, and temperature.
 
Real _exp_time
 Exponential calculated from current time.
 
const MaterialProperty< std::vector< Real > > & _hill_constants
 Hill constant material.
 
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.
 
GenericReal< is_ad > _two_shear_modulus
 2 * shear modulus
 
GenericDenseMatrix< is_ad > _C
 Matrix form of the elasticity tensor.
 
const std::string _elasticity_tensor_name
 Name of the elasticity tensor material property.
 
const GenericMaterialProperty< RankFourTensor, is_ad > & _elasticity_tensor
 Anisotropic elasticity tensor material property.
 
bool _anisotropic_elasticity
 Materials's elasticity tensor is anisotropic or not.
 
const Function *const _prefactor_function
 Prefactor for scaling creep.
 
const Elem *const & _current_elem
 
const MooseArray< Point > & _q_point
 
unsigned int _qp
 
GenericMaterialProperty< RankTwoTensor, is_ad > & _creep_strain
 Creep strain tensor material property.
 
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}
This class provides baseline functionality for anisotropic (Hill-like) plasticity and creep models ba...
const MaterialProperty< DenseMatrix< Real > > * _hill_tensor
Hill tensor, when global axes do not (somehow) align with those of the material Example: Large rotati...
Real _exponential
Exponential calculated from activation, gas constant, and temperature.
bool _anisotropic_elasticity
Materials's elasticity tensor is anisotropic or not.
GenericDenseMatrix< is_ad > _C
Matrix form of the elasticity tensor.
const GenericMaterialProperty< RankFourTensor, is_ad > & _elasticity_tensor
Anisotropic elasticity tensor material property.
const std::string _elasticity_tensor_name
Name of the elasticity tensor material property.
const Real _start_time
Simulation start time.
const Real _coefficient
Leading coefficient.
Real _exp_time
Exponential calculated from current time.
const Real _n_exponent
Exponent on the effective stress.
const Real _m_exponent
Exponent on time.
const Real _activation_energy
Activation energy for exp term.
const MaterialProperty< std::vector< Real > > & _hill_constants
Hill constant material.
const Real _gas_constant
Gas constant for exp term.
const Function *const _prefactor_function
Prefactor for scaling creep.
const VariableValue & _temperature
Temperature variable value.
const bool _has_temp
Flag to determine if temperature is supplied by the user.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

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}
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
const double M
Moose::GenericType< DenseVector< Real >, is_ad > GenericDenseVector
Moose::GenericType< Real, is_ad > GenericReal
Moose::GenericType< RankTwoTensor, is_ad > GenericRankTwoTensor
Moose::GenericType< DenseMatrix< Real >, is_ad > GenericDenseMatrix
virtual Real value(Real t, const Point &p) const
void computeQsigmaChanged(GenericReal< is_ad > &qsigma_changed, const GenericDenseVector< is_ad > &stress_new, const GenericReal< is_ad > &delta_gamma, GenericRankTwoTensor< is_ad > &stress_changed)
const MooseArray< Point > & _q_point
auto raw_value(const Eigen::Map< T > &in)

◆ 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}
GenericReal< is_ad > _two_shear_modulus
2 * shear modulus
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sqrt(_arg)) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tanh

◆ 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}

◆ 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}
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.

◆ 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 *
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)
Real elasticity_tensor(unsigned int i, unsigned int j, unsigned int k, unsigned int l)

◆ 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
87 _exp_time = std::pow(_t - _start_time, _m_exponent);
88}
T getIsotropicShearModulus(const RankFourTensorTempl< T > &elasticity_tensor)
Get the shear modulus for an isotropic elasticity tensor param elasticity_tensor the tensor (must be ...

◆ 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}
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{
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 addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
void addCoupledVar(const std::string &name, 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: