23 "strain energy density and the first " 24 "Piola-Kirchhoff stress");
27 "The displacements appropriate for the simulation geometry and coordinate system");
28 params.
addParam<std::string>(
"base_name",
29 "Optional parameter that allows the user to define " 30 "multiple mechanics material systems on the same " 31 "block, i.e. for multiple phases");
33 "compute_dissipation",
35 "Whether to compute Eshelby tensor's dissipation (or rate of change). This tensor" 36 "yields the increase in dissipation per unit crack advanced");
44 _base_name(isParamValid(
"base_name") ? getParam<
std::string>(
"base_name") +
"_" :
""),
45 _compute_dissipation(getParam<bool>(
"compute_dissipation")),
46 _sed(getMaterialPropertyByName<
Real>(_base_name +
"strain_energy_density")),
47 _serd(_compute_dissipation
48 ? &getMaterialPropertyByName<
Real>(_base_name +
"strain_energy_rate_density")
50 _eshelby_tensor(declareProperty<
RankTwoTensor>(_base_name +
"Eshelby_tensor")),
51 _eshelby_tensor_dissipation(
53 ? &declareProperty<
RankTwoTensor>(_base_name +
"Eshelby_tensor_dissipation")
55 _stress(getGenericMaterialProperty<
RankTwoTensor, is_ad>(_base_name +
"stress")),
56 _stress_old(getMaterialPropertyOld<
RankTwoTensor>(_base_name +
"stress")),
59 _J_thermal_term_vec(declareProperty<
RealVectorValue>(
"J_thermal_term_vec")),
60 _grad_temp(coupledGradient(
"temperature")),
61 _has_temp(isCoupled(
"temperature")),
62 _total_deigenstrain_dT(getOptionalMaterialProperty<
RankTwoTensor>(
"total_deigenstrain_dT"))
69 "The number of variables supplied in 'displacements' must match the mesh dimension.");
72 for (
unsigned int i = 0; i < ndisp; ++i)
76 for (
unsigned i = ndisp; i < 3; ++i)
83 for (
unsigned int i = 0; i < ndisp; ++i)
87 for (
unsigned i = ndisp; i < 3; ++i)
96 if (_has_temp && !_total_deigenstrain_dT)
97 mooseError(
"EshelbyTensor Error: To include thermal strain term in Fracture integral " 98 "calculation, must both couple temperature in DomainIntegral block and compute " 99 "total_deigenstrain_dT using ThermalFractureIntegral material model.");
102 template <
bool is_ad>
108 template <
bool is_ad>
114 (*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]);
128 WI *= (_sed[_qp] * detF);
130 _eshelby_tensor[_qp] = WI - HTP;
133 if (_compute_dissipation ==
true)
136 (*_grad_disp_old[0])[_qp], (*_grad_disp_old[1])[_qp], (*_grad_disp_old[2])[_qp]);
139 Wdot *= ((*_serd)[_qp] * detF);
147 (*_eshelby_tensor_dissipation)[_qp] = Wdot - FdotTP;
152 const Real sigma_alpha =
154 _J_thermal_term_vec[_qp] = sigma_alpha * _grad_temp[_qp];
157 _J_thermal_term_vec[_qp].zero();
registerMooseObject("SolidMechanicsApp", EshelbyTensor)
virtual void initQpStatefulProperties() override
const VariableGradient & _grad_zero
EshelbyTensorTempl(const InputParameters ¶meters)
void mooseError(Args &&... args)
EshelbyTensor defines a strain increment and rotation increment, for finite strains.
virtual void computeQpProperties() override
virtual const VariableGradient & coupledGradient(const std::string &var_name, unsigned int comp=0) const
std::vector< const VariableGradient * > _grad_disp_old
static const std::string F
static RankTwoTensorTempl initializeFromRows(const libMesh::TypeVector< Real > &row0, const libMesh::TypeVector< Real > &row1, const libMesh::TypeVector< Real > &row2)
static InputParameters validParams()
virtual const VariableGradient & coupledGradientOld(const std::string &var_name, unsigned int comp=0) const
static InputParameters validParams()
virtual unsigned int dimension() const
const bool _compute_dissipation
Whether to also compute Eshelby tensor's dissipation for C(t) integral.
std::vector< const VariableGradient * > _grad_disp
unsigned int coupledComponents(const std::string &var_name) const
RankTwoTensorTempl< Real > transpose() const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void mooseError(Args &&... args) const
virtual void initialSetup() override