18 params.
addClassDescription(
"Base class for damage model based on a scalar damage parameter");
22 "Whether to use the damage index from the previous step in the stress computation");
24 "residual_stiffness_fraction",
26 "residual_stiffness_fraction>=0 & residual_stiffness_fraction<1",
27 "Minimum fraction of original material stiffness retained for fully "
28 "damaged material (when damage_index=1)");
30 "maximum_damage_increment",
32 "maximum_damage_increment>0 & maximum_damage_increment<1",
33 "maximum damage increment allowed for simulations with adaptive time step");
36 "maximum_damage>=0 & maximum_damage<=1",
37 "Maximum value allowed for damage index");
38 params.
addParam<MaterialPropertyName>(
41 "name of the material property where the damage index is stored");
48 _damage_index_name(this->template getParam<MaterialPropertyName>(
"damage_index_name")),
50 this->template declareGenericPropertyByName<Real, is_ad>(_base_name + _damage_index_name)),
51 _damage_index_old(this->template getMaterialPropertyOld<Real>(_base_name + _damage_index_name)),
53 this->template getMaterialPropertyOlder<Real>(_base_name + _damage_index_name)),
54 _use_old_damage(this->template getParam<bool>(
"use_old_damage")),
55 _residual_stiffness_fraction(this->template getParam<Real>(
"residual_stiffness_fraction")),
56 _maximum_damage_increment(this->template getParam<Real>(
"maximum_damage_increment")),
57 _maximum_damage(this->template getParam<Real>(
"maximum_damage"))
65 _damage_index[_qp] = 0.0;
74 return _damage_index[_qp];
82 updateQpDamageIndex();
83 _damage_index[_qp] = min(_maximum_damage, _damage_index[_qp]);
93 stress_new *= max((1.0 - (_use_old_damage ? _damage_index_old[_qp] : _damage_index[_qp])), 0.0);
100 Real damage_index_old =
101 std::max((1.0 - (_use_old_damage ? _damage_index_older[_qp] : _damage_index_old[_qp])), 0.0);
103 if (damage_index_old > 0.0)
104 stress_old /= damage_index_old;
111 jacobian_mult *= std::max((1.0 - (_use_old_damage ? _damage_index_old[_qp]
113 _residual_stiffness_fraction);
120 Real current_damage_increment =
122 if (MooseUtils::absoluteFuzzyEqual(current_damage_increment, 0.0))
123 return std::numeric_limits<Real>::max();
125 return _dt * _maximum_damage_increment / current_damage_increment;
Moose::GenericType< Real, is_ad > GenericReal
Moose::GenericType< RankTwoTensor, is_ad > GenericRankTwoTensor
DamageBase is a base class for damage models, which modify the stress tensor computed by another mode...
static InputParameters validParams()
Base class for scalar damage models.
virtual Real computeTimeStepLimit() override
Compute the limiting value of the time step for this material.
virtual void computeUndamagedOldStress(RankTwoTensor &stress_old) override
virtual void updateDamage() override
Update the internal variable(s) that evolve the damage.
virtual void updateJacobianMultForDamage(RankFourTensor &jacobian_mult) override
Update the material constitutive matrix.
ScalarDamageBaseTempl(const InputParameters ¶meters)
const GenericReal< is_ad > & getQpDamageIndex(unsigned int qp)
Get the value of the damage index for the current quadrature point.
virtual void updateStressForDamage(GenericRankTwoTensor< is_ad > &stress_new) override
Update the current stress tensor for effects of damage.
virtual void initQpStatefulProperties() override
static InputParameters validParams()