23 "This class uses the stress update material in a generalized radial return anisotropic power " 25 "model. This class can be used in conjunction with other creep and plasticity materials for " 26 "more complex simulations.");
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");
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");
38 "creep_prefactor",
"Optional function to use as a scalar prefactor on the creep strain.");
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")),
55 _hill_constants(this->template getMaterialPropertyByName<
std::vector<
Real>>(this->_base_name +
57 _hill_tensor(this->_use_transformation
58 ? &this->template getMaterialPropertyByName<DenseMatrix<
Real>>(
59 this->_base_name +
"hill_tensor")
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)
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");
83 _exponential = std::exp(-_activation_energy / (_gas_constant * _temperature[_qp]));
87 _exp_time =
std::pow(_t - _start_time, _m_exponent);
111 computeQsigmaChanged(qsigma_changed, stress_new, delta_gamma, stress_changed);
114 _coefficient *
pow(qsigma_changed, _n_exponent) * _exponential * _exp_time;
116 if (_prefactor_function)
117 creep_rate *= _prefactor_function->value(_t, _q_point[_qp]);
121 return creep_rate * _dt - delta_gamma;
124 template <
bool is_ad>
135 template <
bool is_ad>
149 computeQsigmaChanged(qsigma_changed, stress_new, delta_gamma, stress_changed);
151 ElasticityTensorTools::toMooseVoigtNotation<is_ad>(_C, _elasticity_tensor[_qp]);
152 const unsigned int dimension = _C.n();
155 for (
unsigned int index_i = 0; index_i < dimension; index_i++)
156 for (
unsigned int index_j = 0; index_j < dimension; index_j++)
159 d_stress_d_inelasticStrainIncrement(index_i, index_j) =
162 d_stress_d_inelasticStrainIncrement(index_i, index_j) =
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];
175 for (
unsigned int index_k = 0; index_k < 6; index_k++)
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;
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))) /
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))) /
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))) /
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;
209 d_qsigma_d_inelasticStrainIncrement.dot(d_qsigma_d_sigma);
211 GenericReal<is_ad> creep_rate_derivative = _coefficient * d_qsigma_d_deltaGamma * _n_exponent *
212 pow(qsigma_changed, _n_exponent - 1.0) * _exponential *
215 if (_prefactor_function)
216 creep_rate_derivative *= _prefactor_function->value(_t, _q_point[_qp]);
218 return (creep_rate_derivative * _dt - 1.0);
221 template <
bool is_ad>
232 if (!this->_use_transformation)
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];
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);
253 (*_hill_tensor)[_qp].vector_mult(Ms, stress_dev);
254 qsigma_square = Ms.dot(stress_dev);
257 if (qsigma_square == 0)
259 inelasticStrainIncrement.zero();
262 inelasticStrainIncrement, stress, stress_dev, delta_gamma);
264 this->_effective_inelastic_strain[_qp] = this->_effective_inelastic_strain_old[_qp];
272 if (!this->_use_transformation)
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];
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)));
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);
300 (*_hill_tensor)[_qp].vector_mult(Ms, stress_dev);
302 for (
unsigned int i = 0; i < 6; i++)
303 inelastic_strain_increment(i) = Ms(i) * prefactor;
305 inelasticStrainIncrement(0, 0) = inelastic_strain_increment(0);
306 inelasticStrainIncrement(1, 1) = inelastic_strain_increment(1);
307 inelasticStrainIncrement(2, 2) = inelastic_strain_increment(2);
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);
315 inelasticStrainIncrement, stress, stress_dev, delta_gamma);
317 this->_effective_inelastic_strain[_qp] = this->_effective_inelastic_strain_old[_qp] + delta_gamma;
320 template <
bool is_ad>
339 Real elasticity_value =
344 if (
abs(stress_dif) > TOLERANCE * TOLERANCE)
345 this->_max_integration_error_time_step =
346 _dt / (stress_dif / elasticity_value / this->_max_integration_error);
348 this->_max_integration_error_time_step = std::numeric_limits<Real>::max();
351 template <
bool is_ad>
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];
371 if (!this->_use_transformation)
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);
383 (*_hill_tensor)[_qp].vector_mult(Ms, stress_new);
384 qsigma_square = Ms.dot(stress_new);
389 if (!_anisotropic_elasticity)
390 qsigma_changed = qsigma - 1.5 * _two_shear_modulus * delta_gamma;
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);
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);
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;
417 stress_changed = stress - _elasticity_tensor[_qp] * inelasticStrainIncrement;
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);
virtual GenericReal< is_ad > computeDerivative(const GenericDenseVector< is_ad > &effective_trial_stress, const GenericDenseVector< is_ad > &stress_new, const GenericReal< is_ad > &scalar) override
MetaPhysicL::DualNumber< V, D, asd > abs(const MetaPhysicL::DualNumber< V, D, asd > &a)
This class uses the stress update material for an anisotropic creep model.
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.
Moose::GenericType< Real, is_ad > GenericReal
static InputParameters validParams()
const Real _m_exponent
Exponent on time.
virtual GenericReal< is_ad > initialGuess(const GenericDenseVector< is_ad > &) override
Moose::GenericType< DenseVector< Real >, is_ad > GenericDenseVector
Moose::GenericType< RankFourTensor, is_ad > GenericRankFourTensor
static const std::string F
static const std::string G
Real elasticity_tensor(unsigned int i, unsigned int j, unsigned int k, unsigned int l)
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.
static InputParameters validParams()
virtual void computeStressInitialize(const GenericDenseVector< is_ad > &stress_dev, const GenericDenseVector< is_ad > &stress, const GenericRankFourTensor< is_ad > &elasticity_tensor) 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
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
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sqrt(_arg)) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tanh
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 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.
registerMooseObject("SolidMechanicsApp", ADHillCreepStressUpdate)
HillCreepStressUpdateTempl(const InputParameters ¶meters)
MooseUnits pow(const MooseUnits &, int)
This class provides baseline functionality for anisotropic (Hill-like) plasticity and creep models ba...
Moose::GenericType< DenseMatrix< Real >, is_ad > GenericDenseMatrix
Moose::GenericType< RankTwoTensor, is_ad > GenericRankTwoTensor