16 MooseEnum integration(
"backward-euler mid-point newmark zienkiewicz",
"backward-euler");
21 "describes how the viscoelastic behavior is integrated through time");
24 "theta > 0 & theta <= 1",
25 "coefficient for Newmark integration rule (between 0 and 1)");
26 params.
addParam<std::string>(
"driving_eigenstrain",
27 "name of the eigenstrain that increases the creep strains");
29 "elastic_strain_name",
"elastic_strain",
"name of the true elastic strain of the material");
30 params.
addParam<std::string>(
"creep_strain_name",
32 "name of the true creep strain of the material" 33 "(computed by LinearViscoelasticStressUpdate or" 34 "ComputeLinearViscoelasticStress)");
35 params.
addParam<
bool>(
"force_recompute_properties",
37 "forces the computation of the viscoelastic properties at each step of" 38 "the solver (default: false)");
40 "need_viscoelastic_properties_inverse",
42 "checks whether the model requires the computation of the inverse viscoelastic" 43 "properties (default: false)");
51 _theta(getParam<
Real>(
"theta")),
52 _apparent_elasticity_tensor(
53 declareProperty<
RankFourTensor>(_base_name +
"apparent_elasticity_tensor")),
54 _apparent_elasticity_tensor_inv(
55 declareProperty<
RankFourTensor>(_base_name +
"apparent_elasticity_tensor_inv")),
56 _elasticity_tensor_inv(declareProperty<
RankFourTensor>(_elasticity_tensor_name +
"_inv")),
57 _need_viscoelastic_properties_inverse(getParam<bool>(
"need_viscoelastic_properties_inverse")),
58 _has_longterm_dashpot(false),
60 _first_elasticity_tensor(
61 declareProperty<
RankFourTensor>(_base_name +
"spring_elasticity_tensor_0")),
62 _first_elasticity_tensor_inv(
63 _need_viscoelastic_properties_inverse
64 ? &declareProperty<
RankFourTensor>(_base_name +
"spring_elasticity_tensor_0_inv")
66 _apparent_creep_strain(declareProperty<
RankTwoTensor>(_base_name +
"apparent_creep_strain")),
67 _apparent_creep_strain_old(
68 getMaterialPropertyOld<
RankTwoTensor>(_base_name +
"apparent_creep_strain")),
70 getMaterialPropertyOld<
RankTwoTensor>(getParam<
std::string>(
"elastic_strain_name"))),
72 getMaterialPropertyOld<
RankTwoTensor>(getParam<
std::string>(
"creep_strain_name"))),
73 _has_driving_eigenstrain(isParamValid(
"driving_eigenstrain")),
74 _driving_eigenstrain_name(
75 _has_driving_eigenstrain ? getParam<
std::string>(
"driving_eigenstrain") :
""),
76 _driving_eigenstrain(_has_driving_eigenstrain
77 ? &getMaterialPropertyByName<
RankTwoTensor>(_driving_eigenstrain_name)
79 _driving_eigenstrain_old(_has_driving_eigenstrain
80 ? &getMaterialPropertyOld<
RankTwoTensor>(_driving_eigenstrain_name)
82 _force_recompute_properties(getParam<bool>(
"force_recompute_properties")),
83 _step_zero(declareRestartableData<bool>(
"step_zero", true))
86 mooseWarning(
"theta parameter for LinearViscoelasticityBase is below 0.5; time integration may " 90 getMaterialPropertyOld<RankFourTensor>(
_base_name +
"apparent_elasticity_tensor");
91 getMaterialPropertyOld<RankFourTensor>(
_base_name +
"apparent_elasticity_tensor_inv");
94 getMaterialPropertyOld<RankFourTensor>(
_base_name +
"spring_elasticity_tensor_0");
96 getMaterialPropertyOld<RankFourTensor>(
_base_name +
"spring_elasticity_tensor_0_inv");
109 &declareProperty<RankFourTensor>(
_base_name +
"spring_elasticity_tensor_" + ith));
110 getMaterialPropertyOld<RankFourTensor>(
_base_name +
"spring_elasticity_tensor_" + ith);
115 &getMaterialPropertyOld<Real>(
_base_name +
"dashpot_viscosity_" + ith));
118 &declareProperty<RankTwoTensor>(
_base_name +
"viscous_strain_" + ith));
120 &getMaterialPropertyOld<RankTwoTensor>(
_base_name +
"viscous_strain_" + ith));
125 _base_name +
"spring_elasticity_tensor_" + ith +
"_inv"));
127 _base_name +
"spring_elasticity_tensor_" + ith +
"_inv"));
137 "inconsistent numbers of dashpots and viscous strains in LinearViscoelasticityBase;" 138 " Make sure declareViscoelasticProperties has been called in the viscoelastic model");
146 (*_first_elasticity_tensor_inv)[
_qp].zero();
165 unsigned int qp_prev =
_qp;
200 (*_first_elasticity_tensor_inv)[
_qp].zero();
217 mooseError(
"linear viscoelasticity cannot be integrated over a dt of ", dt);
228 return 1. / (1. - std::exp(-dt / viscosity)) - viscosity / dt;
bool & _step_zero
checks whether we are at the first time step
std::vector< MaterialProperty< RankFourTensor > * > _springs_elasticity_tensors_inv
bool absoluteFuzzyEqual(const T &var1, const T2 &var2, const T3 &tol=libMesh::TOLERANCE *libMesh::TOLERANCE)
LinearViscoelasticityBase(const InputParameters ¶meters)
ComputeElasticityTensorBase the base class for computing elasticity tensors.
void recomputeQpApparentProperties(unsigned int qp)
Compute the apparent properties at a quadrature point.
std::vector< MaterialProperty< RankFourTensor > * > _springs_elasticity_tensors
List of elasticity tensor of each subsequent spring in the chain.
std::vector< const MaterialProperty< RankTwoTensor > * > _viscous_strains_old
virtual void initQpStatefulProperties() override
theta defined by the user
void declareViscoelasticProperties()
Declare all necessary MaterialProperties for the model.
static InputParameters validParams()
std::vector< const MaterialProperty< Real > * > _dashpot_viscosities_old
bool _has_longterm_dashpot
Indicates if the spring-dashpot assembly has a single dashpot not associated with a spring...
void mooseWarning(Args &&... args) const
bool _force_recompute_properties
If activated, the time-stepping scheme will be re-initialized at each step of the solver...
bool _need_viscoelastic_properties_inverse
If active, indicates that we need to call computeQpViscoelasticPropertiesInv()
theta automatically adjusted as a function of the time step and the viscosity
MaterialProperty< RankFourTensor > & _apparent_elasticity_tensor
Apparent elasticity tensor. This is NOT the elasticity tensor of the material.
static InputParameters validParams()
std::vector< MaterialProperty< Real > * > _dashpot_viscosities
List of viscosities of each subsequent dashpot in the chain.
IntegrationRule
Determines how theta is calculated for the time-integration system.
MaterialProperty< RankFourTensor > & _first_elasticity_tensor
Elasticity tensor of a stand-alone elastic spring in the chain.
MaterialProperty< RankFourTensor > * _first_elasticity_tensor_inv
std::vector< const MaterialProperty< RankFourTensor > * > _springs_elasticity_tensors_inv_old
std::string stringify(const T &t)
Real _theta
User-defined value for theta.
virtual void computeQpApparentElasticityTensors()=0
This method computes the apparent elasticity tensor used in the internal time-stepping scheme...
virtual void computeQpViscoelasticProperties()=0
This method assigns the mechanical properties of each spring and dashpot in the system.
unsigned int _components
This is the number of internal variables required by the model.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual void computeQpElasticityTensor() final
Inherited from ComputeElasticityTensorBase.
MaterialProperty< RankTwoTensor > & _apparent_creep_strain
The apparent creep strain resulting from the internal viscous strains.
virtual void computeQpApparentCreepStrain()=0
This method computes the apparent creep strain corresponding to the current viscous_strain of each da...
std::string _elasticity_tensor_name
MaterialProperty< RankFourTensor > & _elasticity_tensor_inv
Instantaneous elasticity tensor. This IS the real elasticity tensor of the material.
void mooseError(Args &&... args) const
IntegrationRule _integration_rule
Determines how theta is computed.
std::vector< MaterialProperty< RankTwoTensor > * > _viscous_strains
virtual void computeQpViscoelasticPropertiesInv()
This method computes the inverse elasticity tensor of each spring in the system (if required)...
Real computeTheta(Real dt, Real viscosity) const
Provides theta as a function of the time step and a viscosity.
virtual void updateQpViscousStrains()=0
Update the internal viscous strains at a quadrature point.
MaterialProperty< RankFourTensor > & _apparent_elasticity_tensor_inv
Inverse of the apparent elasticity tensor.
const std::string _base_name
Base name of the material system.