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);
109 computeQsigmaChanged(qsigma_changed, stress_new, delta_gamma, stress_changed);
112 _coefficient *
std::pow(qsigma_changed, _n_exponent) * _exponential * _exp_time;
114 if (_prefactor_function)
115 creep_rate *= _prefactor_function->value(_t, _q_point[_qp]);
119 return creep_rate * _dt - delta_gamma;
122 template <
bool is_ad>
133 template <
bool is_ad>
145 computeQsigmaChanged(qsigma_changed, stress_new, delta_gamma, stress_changed);
147 ElasticityTensorTools::toMooseVoigtNotation<is_ad>(_C, _elasticity_tensor[_qp]);
148 const unsigned int dimension = _C.n();
151 for (
unsigned int index_i = 0; index_i < dimension; index_i++)
152 for (
unsigned int index_j = 0; index_j < dimension; index_j++)
155 d_stress_d_inelasticStrainIncrement(index_i, index_j) =
158 d_stress_d_inelasticStrainIncrement(index_i, index_j) =
163 const Real &
F = _hill_constants[_qp][0];
164 const Real &
G = _hill_constants[_qp][1];
165 const Real & H = _hill_constants[_qp][2];
166 const Real & L = _hill_constants[_qp][3];
167 const Real & M = _hill_constants[_qp][4];
168 const Real &
N = _hill_constants[_qp][5];
171 for (
unsigned int index_k = 0; index_k < 6; index_k++)
173 d_qsigma_d_inelasticStrainIncrement(index_k) =
174 F * (stress_changed(1, 1) - stress_changed(2, 2)) *
175 (d_stress_d_inelasticStrainIncrement(1, index_k) -
176 d_stress_d_inelasticStrainIncrement(2, index_k)) +
177 G * (stress_changed(2, 2) - stress_changed(0, 0)) *
178 (d_stress_d_inelasticStrainIncrement(2, index_k) -
179 d_stress_d_inelasticStrainIncrement(0, index_k)) +
180 H * (stress_changed(0, 0) - stress_changed(1, 1)) *
181 (d_stress_d_inelasticStrainIncrement(0, index_k) -
182 d_stress_d_inelasticStrainIncrement(1, index_k)) +
183 2.0 * L * stress_changed(1, 2) * d_stress_d_inelasticStrainIncrement(4, index_k) +
184 2.0 * M * stress_changed(2, 0) * d_stress_d_inelasticStrainIncrement(5, index_k) +
185 2.0 *
N * stress_changed(0, 1) * d_stress_d_inelasticStrainIncrement(3, index_k);
186 d_qsigma_d_inelasticStrainIncrement(index_k) /= qsigma_changed;
191 d_qsigma_d_sigma(0) = (H * (stress_changed(0, 0) - stress_changed(1, 1)) -
192 G * (stress_changed(2, 2) - stress_changed(0, 0))) /
194 d_qsigma_d_sigma(1) = (
F * (stress_changed(1, 1) - stress_changed(2, 2)) -
195 H * (stress_changed(0, 0) - stress_changed(1, 1))) /
197 d_qsigma_d_sigma(2) = (
G * (stress_changed(2, 2) - stress_changed(0, 0)) -
198 F * (stress_changed(1, 1) - stress_changed(2, 2))) /
200 d_qsigma_d_sigma(3) = 2.0 *
N * stress_changed(0, 1) / qsigma_changed;
201 d_qsigma_d_sigma(4) = 2.0 * L * stress_changed(1, 2) / qsigma_changed;
202 d_qsigma_d_sigma(5) = 2.0 * M * stress_changed(0, 2) / qsigma_changed;
205 d_qsigma_d_inelasticStrainIncrement.dot(d_qsigma_d_sigma);
207 GenericReal<is_ad> creep_rate_derivative = _coefficient * d_qsigma_d_deltaGamma * _n_exponent *
208 std::pow(qsigma_changed, _n_exponent - 1.0) *
209 _exponential * _exp_time;
211 if (_prefactor_function)
212 creep_rate_derivative *= _prefactor_function->value(_t, _q_point[_qp]);
214 return (creep_rate_derivative * _dt - 1.0);
217 template <
bool is_ad>
226 if (!this->_use_transformation)
229 const Real &
F = _hill_constants[_qp][0];
230 const Real &
G = _hill_constants[_qp][1];
231 const Real & H = _hill_constants[_qp][2];
232 const Real & L = _hill_constants[_qp][3];
233 const Real & M = _hill_constants[_qp][4];
234 const Real &
N = _hill_constants[_qp][5];
237 qsigma_square =
F * (stress(1, 1) - stress(2, 2)) * (stress(1, 1) - stress(2, 2));
238 qsigma_square +=
G * (stress(2, 2) - stress(0, 0)) * (stress(2, 2) - stress(0, 0));
239 qsigma_square += H * (stress(0, 0) - stress(1, 1)) * (stress(0, 0) - stress(1, 1));
240 qsigma_square += 2 * L * stress(1, 2) * stress(1, 2);
241 qsigma_square += 2 * M * stress(0, 2) * stress(0, 2);
242 qsigma_square += 2 *
N * stress(0, 1) * stress(0, 1);
247 (*_hill_tensor)[_qp].vector_mult(Ms, stress_dev);
248 qsigma_square = Ms.dot(stress_dev);
251 if (qsigma_square == 0)
253 inelasticStrainIncrement.zero();
256 inelasticStrainIncrement, stress, stress_dev, delta_gamma);
258 this->_effective_inelastic_strain[_qp] = this->_effective_inelastic_strain_old[_qp];
266 if (!this->_use_transformation)
269 const Real &
F = _hill_constants[_qp][0];
270 const Real &
G = _hill_constants[_qp][1];
271 const Real & H = _hill_constants[_qp][2];
272 const Real & L = _hill_constants[_qp][3];
273 const Real & M = _hill_constants[_qp][4];
274 const Real &
N = _hill_constants[_qp][5];
276 inelasticStrainIncrement(0, 0) =
277 prefactor * (H * (stress(0, 0) - stress(1, 1)) -
G * (stress(2, 2) - stress(0, 0)));
278 inelasticStrainIncrement(1, 1) =
279 prefactor * (
F * (stress(1, 1) - stress(2, 2)) - H * (stress(0, 0) - stress(1, 1)));
280 inelasticStrainIncrement(2, 2) =
281 prefactor * (
G * (stress(2, 2) - stress(0, 0)) -
F * (stress(1, 1) - stress(2, 2)));
283 inelasticStrainIncrement(0, 1) = inelasticStrainIncrement(1, 0) =
284 prefactor * 2.0 *
N * stress(0, 1);
285 inelasticStrainIncrement(0, 2) = inelasticStrainIncrement(2, 0) =
286 prefactor * 2.0 * M * stress(0, 2);
287 inelasticStrainIncrement(1, 2) = inelasticStrainIncrement(2, 1) =
288 prefactor * 2.0 * L * stress(1, 2);
294 (*_hill_tensor)[_qp].vector_mult(Ms, stress_dev);
296 for (
unsigned int i = 0; i < 6; i++)
297 inelastic_strain_increment(i) = Ms(i) * prefactor;
299 inelasticStrainIncrement(0, 0) = inelastic_strain_increment(0);
300 inelasticStrainIncrement(1, 1) = inelastic_strain_increment(1);
301 inelasticStrainIncrement(2, 2) = inelastic_strain_increment(2);
303 inelasticStrainIncrement(0, 1) = inelasticStrainIncrement(1, 0) = inelastic_strain_increment(3);
304 inelasticStrainIncrement(1, 2) = inelasticStrainIncrement(2, 1) = inelastic_strain_increment(4);
305 inelasticStrainIncrement(0, 2) = inelasticStrainIncrement(2, 0) = inelastic_strain_increment(5);
309 inelasticStrainIncrement, stress, stress_dev, delta_gamma);
311 this->_effective_inelastic_strain[_qp] = this->_effective_inelastic_strain_old[_qp] + delta_gamma;
314 template <
bool is_ad>
331 Real elasticity_value =
336 if (std::abs(stress_dif) > TOLERANCE * TOLERANCE)
337 this->_max_integration_error_time_step =
338 _dt / (stress_dif / elasticity_value / this->_max_integration_error);
340 this->_max_integration_error_time_step = std::numeric_limits<Real>::max();
343 template <
bool is_ad>
354 const Real &
F = _hill_constants[_qp][0];
355 const Real &
G = _hill_constants[_qp][1];
356 const Real & H = _hill_constants[_qp][2];
357 const Real & L = _hill_constants[_qp][3];
358 const Real & M = _hill_constants[_qp][4];
359 const Real &
N = _hill_constants[_qp][5];
361 if (!this->_use_transformation)
363 qsigma_square =
F * (stress_new(1) - stress_new(2)) * (stress_new(1) - stress_new(2));
364 qsigma_square +=
G * (stress_new(2) - stress_new(0)) * (stress_new(2) - stress_new(0));
365 qsigma_square += H * (stress_new(0) - stress_new(1)) * (stress_new(0) - stress_new(1));
366 qsigma_square += 2 * L * stress_new(4) * stress_new(4);
367 qsigma_square += 2 * M * stress_new(5) * stress_new(5);
368 qsigma_square += 2 *
N * stress_new(3) * stress_new(3);
373 (*_hill_tensor)[_qp].vector_mult(Ms, stress_new);
374 qsigma_square = Ms.dot(stress_new);
379 if (!_anisotropic_elasticity)
380 qsigma_changed = qsigma - 1.5 * _two_shear_modulus * delta_gamma;
384 stress(0, 0) = stress_new(0);
385 stress(1, 1) = stress_new(1);
386 stress(2, 2) = stress_new(2);
387 stress(0, 1) = stress(1, 0) = stress_new(3);
388 stress(1, 2) = stress(2, 1) = stress_new(4);
389 stress(0, 2) = stress(2, 0) = stress_new(5);
392 b(0) = H * (stress(0, 0) - stress(1, 1)) -
G * (stress(2, 2) - stress(0, 0));
393 b(1) =
F * (stress(1, 1) - stress(2, 2)) - H * (stress(0, 0) - stress(1, 1));
394 b(2) =
G * (stress(2, 2) - stress(0, 0)) -
F * (stress(1, 1) - stress(2, 2));
395 b(3) = 2.0 *
N * stress(0, 1);
396 b(4) = 2.0 * L * stress(1, 2);
397 b(5) = 2.0 * M * stress(0, 2);
400 inelasticStrainIncrement(0, 0) = delta_gamma *
b(0) / qsigma;
401 inelasticStrainIncrement(1, 1) = delta_gamma *
b(1) / qsigma;
402 inelasticStrainIncrement(2, 2) = delta_gamma *
b(2) / qsigma;
403 inelasticStrainIncrement(0, 1) = inelasticStrainIncrement(1, 0) = delta_gamma *
b(3) / qsigma;
404 inelasticStrainIncrement(1, 2) = inelasticStrainIncrement(2, 1) = delta_gamma *
b(4) / qsigma;
405 inelasticStrainIncrement(0, 2) = inelasticStrainIncrement(2, 0) = delta_gamma *
b(5) / qsigma;
407 stress_changed = stress - _elasticity_tensor[_qp] * inelasticStrainIncrement;
410 qsigma_square_changed =
F * (stress_changed(1, 1) - stress_changed(2, 2)) *
411 (stress_changed(1, 1) - stress_changed(2, 2));
412 qsigma_square_changed +=
G * (stress_changed(2, 2) - stress_changed(0, 0)) *
413 (stress_changed(2, 2) - stress_changed(0, 0));
414 qsigma_square_changed += H * (stress_changed(0, 0) - stress_changed(1, 1)) *
415 (stress_changed(0, 0) - stress_changed(1, 1));
416 qsigma_square_changed += 2 * L * stress_changed(1, 2) * stress_changed(1, 2);
417 qsigma_square_changed += 2 * M * stress_changed(0, 2) * stress_changed(0, 2);
418 qsigma_square_changed += 2 *
N * stress_changed(0, 1) * stress_changed(0, 1);
419 qsigma_changed = std::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
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
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
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