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"))
64 unsigned int ndisp = coupledComponents(
"displacements");
67 if (ndisp != _mesh.dimension())
69 "The number of variables supplied in 'displacements' must match the mesh dimension.");
72 for (
unsigned int i = 0; i < ndisp; ++i)
73 _grad_disp[i] = &coupledGradient(
"displacements", 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.");
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)
void mooseError(Args &&... args)
EshelbyTensor defines a strain increment and rotation increment, for finite strains.
const bool _compute_dissipation
Whether to also compute Eshelby tensor's dissipation for C(t) integral.
std::vector< const VariableGradient * > _grad_disp_old
static InputParameters validParams()
virtual void initQpStatefulProperties() override
virtual void computeQpProperties() override
virtual void initialSetup() override
EshelbyTensorTempl(const InputParameters ¶meters)
std::vector< const VariableGradient * > _grad_disp
static InputParameters validParams()
static RankTwoTensorTempl initializeFromRows(const libMesh::TypeVector< T > &row0, const libMesh::TypeVector< T > &row1, const libMesh::TypeVector< T > &row2)
RankTwoTensorTempl< T > transpose() const