14 #include "libmesh/string_to_enum.h" 15 #include "libmesh/quadrature.h" 17 #include "libmesh/utility.h" 27 return MooseEnum(
"Geometry Topology",
"Geometry");
44 "The displacements appropriate for the simulation geometry and coordinate system");
46 "The temperature (optional). Must be provided to correctly compute " 47 "stress intensity factors in models with thermal strain gradients.");
48 params.
addParam<MaterialPropertyName>(
49 "functionally_graded_youngs_modulus",
50 "Spatially varying elasticity modulus variable. This input is required when " 51 "using the functionally graded material capability.");
52 params.
addParam<MaterialPropertyName>(
53 "functionally_graded_youngs_modulus_crack_dir_gradient",
54 "Gradient of the spatially varying Young's modulus provided in " 55 "'functionally_graded_youngs_modulus' in the direction of crack extension.");
57 "The CrackFrontDefinition user object name");
58 MooseEnum position_type(
"Angle Distance",
"Distance");
62 "The method used to calculate position along crack front. Options are: " +
65 "K_factor",
"Conversion factor between interaction integral and stress intensity factor K");
66 params.
addParam<
unsigned int>(
"symmetry_plane",
67 "Account for a symmetry plane passing through " 68 "the plane of the crack, normal to the specified " 69 "axis (0=x, 1=y, 2=z)");
72 params.
set<
bool>(
"use_displaced_mesh") =
false;
76 "The method used to define the integration domain. Options are: " +
81 "Stress intensity factor to calculate. Choices are: " +
83 params.
addParam<MaterialPropertyName>(
"eigenstrain_gradient",
84 "Material defining gradient of eigenstrain tensor");
85 params.
addParam<MaterialPropertyName>(
"body_force",
"Material defining body force");
87 "Optional additional eigenstrain variable that will be accounted for in the " 88 "interaction integral (component 00 or XX).");
90 "Optional additional eigenstrain variable that will be accounted for in the " 91 "interaction integral (component 01 or XY).");
93 "Optional additional eigenstrain variable that will be accounted for in the " 94 "interaction integral (component 11 or YY).");
96 "Optional additional eigenstrain variable that will be accounted for in the " 97 "interaction integral (component 22 or ZZ).");
99 "Optional additional eigenstrain variable that will be accounted for in the " 100 "interaction integral (component 02 or XZ).");
102 "Optional additional eigenstrain variable that will be accounted for in the " 103 "interaction integral (component 12 or XZ).");
105 "additional_eigenstrain_00 additional_eigenstrain_01 additional_eigenstrain_11 " 106 "additional_eigenstrain_22 additional_eigenstrain_02 additional_eigenstrain_12",
107 "Generic eigenstrains for the computation of the interaction integral.");
109 "Computes the interaction integral, which is used to compute various " 110 "fracture mechanics parameters at a crack tip, including KI, KII, KIII, " 111 "and the T stress.");
115 template <
bool is_ad>
118 _ndisp(coupledComponents(
"displacements")),
121 _stress(getGenericMaterialPropertyByName<
RankTwoTensor, is_ad>(
"stress")),
122 _strain(getGenericMaterialPropertyByName<
RankTwoTensor, is_ad>(
"elastic_strain")),
123 _fe_vars(getCoupledMooseVars()),
124 _fe_type(_fe_vars[0]->feType()),
125 _disp(coupledValues(
"displacements")),
127 _has_temp(isCoupled(
"temperature")),
128 _grad_temp(_has_temp ? coupledGradient(
"temperature") : _grad_zero),
129 _functionally_graded_youngs_modulus_crack_dir_gradient(
130 isParamSetByUser(
"functionally_graded_youngs_modulus_crack_dir_gradient")
131 ? &getMaterialProperty<
Real>(
"functionally_graded_youngs_modulus_crack_dir_gradient")
133 _functionally_graded_youngs_modulus(
134 isParamSetByUser(
"functionally_graded_youngs_modulus")
135 ? &getMaterialProperty<
Real>(
"functionally_graded_youngs_modulus")
137 _K_factor(getParam<
Real>(
"K_factor")),
138 _has_symmetry_plane(isParamValid(
"symmetry_plane")),
139 _poissons_ratio(getParam<
Real>(
"poissons_ratio")),
140 _youngs_modulus(getParam<
Real>(
"youngs_modulus")),
141 _fgm_crack(isParamSetByUser(
"functionally_graded_youngs_modulus_crack_dir_gradient") &&
142 isParamSetByUser(
"functionally_graded_youngs_modulus")),
143 _ring_index(getParam<unsigned
int>(
"ring_index")),
144 _total_deigenstrain_dT(
146 ? &getGenericMaterialProperty<
RankTwoTensor, is_ad>(
"total_deigenstrain_dT")
148 _has_additional_eigenstrain(false),
149 _additional_eigenstrain_gradient_00(isCoupled(
"additional_eigenstrain_00")
150 ? &coupledGradient(
"additional_eigenstrain_00")
152 _additional_eigenstrain_gradient_01(isCoupled(
"additional_eigenstrain_01")
153 ? &coupledGradient(
"additional_eigenstrain_01")
155 _additional_eigenstrain_gradient_11(isCoupled(
"additional_eigenstrain_11")
156 ? &coupledGradient(
"additional_eigenstrain_11")
158 _additional_eigenstrain_gradient_22(isCoupled(
"additional_eigenstrain_22")
159 ? &coupledGradient(
"additional_eigenstrain_22")
161 _additional_eigenstrain_gradient_02(isCoupled(
"additional_eigenstrain_02")
162 ? &coupledGradient(
"additional_eigenstrain_02")
164 _additional_eigenstrain_gradient_12(isCoupled(
"additional_eigenstrain_12")
165 ? &coupledGradient(
"additional_eigenstrain_12")
167 _q_function_type(getParam<
MooseEnum>(
"q_function_type").template getEnum<
QMethod>()),
170 _x(declareVector(
"x")),
171 _y(declareVector(
"y")),
172 _z(declareVector(
"z")),
173 _position(declareVector(
"id")),
176 _eigenstrain_gradient(nullptr),
180 mooseError(
"InteractionIntegral Error: To include thermal strain term in interaction integral, " 181 "must both couple temperature in DomainIntegral block and compute " 182 "total_deigenstrain_dT using ThermalFractureIntegral material model.");
188 paramError(
"functionally_graded_youngs_modulus_crack_dir_gradient",
189 "You have selected to compute the interaction integral for a crack in FGM. That " 190 "selection requires the user to provide a spatially varying elasticity modulus " 192 "defines the transition of material properties (i.e. " 193 "'functionally_graded_youngs_modulus') and its " 194 "spatial derivative in the crack direction (i.e. " 195 "'functionally_graded_youngs_modulus_crack_dir_gradient').");
204 "InteractionIntegral Error: number of variables supplied in 'displacements' must " 205 "match the mesh dimension.");
208 for (std::size_t i = 0; i <
_ndisp; ++i)
212 for (std::size_t i =
_ndisp; i < 3; ++i)
218 &getGenericMaterialProperty<RankThreeTensor, is_ad>(
"eigenstrain_gradient");
221 "eigenstrain_gradient cannot be specified for materials that provide the " 222 "total_deigenstrain_dT material property");
225 _body_force = &getMaterialProperty<RealVectorValue>(
"body_force");
234 paramError(
"additional_eigenstrain_gradient_12",
235 "If additional eigenstrains are provided for the computation of the interaction " 236 "integral in three dimensions, make sure the six components are provided.");
239 mooseInfo(
"A generic eigenstrain provided by the user will be considered in the interaction " 240 "integral (via domain integral action).");
243 template <
bool is_ad>
247 _treat_as_2d = _crack_front_definition->treatAs2D();
248 _using_mesh_cutter = _crack_front_definition->usingMeshCutter();
251 template <
bool is_ad>
256 if (_treat_as_2d && _using_mesh_cutter ==
false)
259 num_pts = _crack_front_definition->getNumCrackFrontPoints();
261 _x.assign(num_pts, 0.0);
262 _y.assign(num_pts, 0.0);
263 _z.assign(num_pts, 0.0);
264 _position.assign(num_pts, 0.0);
265 _interaction_integral.assign(num_pts, 0.0);
267 for (
const auto * fe_var : _fe_vars)
269 if (fe_var->feType() != _fe_type)
270 mooseError(
"All coupled displacements must have the same type");
274 template <
bool is_ad>
282 if (scalar_q < TOLERANCE * TOLERANCE * TOLERANCE)
289 _crack_front_definition->calculateRThetaToCrackFront(
290 _q_point[_qp], crack_front_point_index, _r, _theta);
297 if (_sif_mode == SifMethod::KI || _sif_mode == SifMethod::KII || _sif_mode == SifMethod::KIII)
298 computeAuxFields(aux_stress, aux_du, aux_strain, aux_disp);
299 else if (_sif_mode == SifMethod::T)
300 computeTFields(aux_stress, aux_du);
303 (*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]);
307 _crack_front_definition->rotateToCrackFrontCoords(grad_of_scalar_q, crack_front_point_index);
309 _crack_front_definition->rotateToCrackFrontCoords(grad_disp, crack_front_point_index);
310 RankTwoTensor stress_cf = _crack_front_definition->rotateToCrackFrontCoords(
312 RankTwoTensor strain_cf = _crack_front_definition->rotateToCrackFrontCoords(
315 _crack_front_definition->rotateToCrackFrontCoords(_grad_temp[_qp], crack_front_point_index);
318 strain_cf(2, 2) = 0.0;
321 dq(0, 0) = crack_direction(0) * grad_q_cf(0);
322 dq(0, 1) = crack_direction(0) * grad_q_cf(1);
323 dq(0, 2) = crack_direction(0) * grad_q_cf(2);
333 Real term2 = grad_disp_cf(0, 0) * tmp2(0, 0) + grad_disp_cf(1, 0) * tmp2(0, 1) +
334 grad_disp_cf(2, 0) * tmp2(0, 2);
346 term4 = scalar_q * sigma_alpha * grad_temp_cf(0);
350 if (_eigenstrain_gradient)
357 _crack_front_definition->getCrackDirection(crack_front_point_index);
360 term4a = scalar_q * aux_stress.doubleContraction(eigenstrain_grad_in_crack_dir);
368 if (_has_additional_eigenstrain)
381 _crack_front_definition->getCrackDirection(crack_front_point_index);
383 const auto eigenstrain_gradient_x =
385 const auto eigenstrain_gradient_xy =
387 const auto eigenstrain_gradient_y =
391 if (_additional_eigenstrain_gradient_22)
392 eigenstrain_gradient_z = I_z.
mixedProductJkI((*_additional_eigenstrain_gradient_22)[_qp]);
403 if (_mesh.dimension() == 3)
407 I_xz(0, 2) = I_xz(2, 0) = 1.0;
408 eigenstrain_gradient_xz = I_xz.
mixedProductJkI((*_additional_eigenstrain_gradient_02)[_qp]);
410 I_yz(1, 2) = I_yz(2, 1) = 1.0;
411 eigenstrain_gradient_yz = I_yz.
mixedProductJkI((*_additional_eigenstrain_gradient_12)[_qp]);
421 term4b = scalar_q * aux_stress.doubleContraction(eigenstrain_grad_in_crack_dir);
430 _crack_front_definition->getCrackDirection(crack_front_point_index);
435 if (_fgm_crack && scalar_q != 0)
445 cijklj *= (*_functionally_graded_youngs_modulus_crack_dir_gradient)[_qp];
446 cijklj_epsilonkl_aux = cijklj * aux_strain;
448 const Real term6_a = grad_disp_cf(0, 0) * cijklj_epsilonkl_aux(0, 0) +
449 grad_disp_cf(1, 0) * cijklj_epsilonkl_aux(0, 1) +
450 grad_disp_cf(2, 0) * cijklj_epsilonkl_aux(0, 2);
454 cijkl1_epsilonkl = -cijklj * strain_cf;
457 term6 = (term6_a + term6_b) * scalar_q;
466 const Real u_r = (*_disp[0])[_qp];
467 const Real radius_qp = _q_point[_qp](0);
470 (u_r / radius_qp * aux_stress(2, 2) + aux_disp(0, 0) / radius_qp * stress_cf(2, 2) -
475 const Real term7b1 = aux_stress(0, 0) * grad_disp_cf(0, 0) +
476 aux_stress(0, 1) * grad_disp_cf(1, 0) +
477 aux_stress(0, 2) * grad_disp_cf(2, 0);
479 const Real term7b = 1.0 / radius_qp *
480 (term7b1 - aux_stress(2, 2) * grad_disp_cf(0, 0) +
481 stress_cf(2, 2) * (aux_du(0, 0) - aux_disp(0, 0) / radius_qp));
483 term7 = (term7a + term7b) * scalar_q;
486 Real q_avg_seg = 1.0;
487 if (!_crack_front_definition->treatAs2D())
490 (_crack_front_definition->getCrackFrontForwardSegmentLength(crack_front_point_index) +
491 _crack_front_definition->getCrackFrontBackwardSegmentLength(crack_front_point_index)) /
495 Real eq = term1 + term2 + term3 + term4 + term4a + term4b + term5 + term6 + term7;
499 const Real radius_qp = _q_point[_qp](0);
502 std::size_t num_crack_front_points = _crack_front_definition->getNumCrackFrontPoints();
503 if (num_crack_front_points != 1)
504 mooseError(
"Crack front has more than one point, but this is a 2D-RZ problem. Please revise " 507 const Point * crack_front_point = _crack_front_definition->getCrackFrontPoint(0);
508 eq = eq / (*crack_front_point)(0);
511 return eq / q_avg_seg;
514 template <
bool is_ad>
519 const std::size_t
dim = _current_elem->dim();
520 std::unique_ptr<FEBase> fe(FEBase::build(
dim, _fe_type));
521 fe->attach_quadrature_rule(const_cast<QBase *>(_qrule));
522 _phi_curr_elem = &fe->get_phi();
523 _dphi_curr_elem = &fe->get_dphi();
524 fe->reinit(_current_elem);
527 std::size_t ring_base = (_q_function_type == QMethod::Topology) ? 0 : 1;
529 for (
auto icfp = beginIndex(_interaction_integral); icfp < _interaction_integral.size(); icfp++)
531 _q_curr_elem.clear();
532 for (std::size_t i = 0; i < _current_elem->n_nodes(); ++i)
534 const Node * this_node = _current_elem->node_ptr(i);
537 if (_q_function_type == QMethod::Geometry)
538 q_this_node = _crack_front_definition->DomainIntegralQFunction(
539 icfp, _ring_index - ring_base, this_node);
541 q_this_node = _crack_front_definition->DomainIntegralTopologicalQFunction(
542 icfp, _ring_index - ring_base, this_node);
544 _q_curr_elem.push_back(q_this_node);
547 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
552 for (std::size_t i = 0; i < _current_elem->n_nodes(); ++i)
554 scalar_q += (*_phi_curr_elem)[i][_qp] * _q_curr_elem[i];
556 for (std::size_t
j = 0;
j < _current_elem->dim(); ++
j)
557 grad_of_scalar_q(
j) += (*_dphi_curr_elem)[i][_qp](
j) * _q_curr_elem[i];
561 _interaction_integral[icfp] +=
562 _JxW[_qp] * _coord[_qp] * computeQpIntegral(icfp, scalar_q, grad_of_scalar_q);
564 _interaction_integral[icfp] +=
565 _JxW[_qp] * computeQpIntegral(icfp, scalar_q, grad_of_scalar_q);
570 template <
bool is_ad>
574 gatherSum(_interaction_integral);
576 for (
auto i = beginIndex(_interaction_integral); i < _interaction_integral.size(); ++i)
578 if (_has_symmetry_plane)
579 _interaction_integral[i] *= 2.0;
581 const auto cfp = _crack_front_definition->getCrackFrontPoint(i);
586 if (_position_type == PositionType::Angle)
587 _position[i] = _crack_front_definition->getAngleAlongFront(i);
589 _position[i] = _crack_front_definition->getDistanceAlongFront(i);
591 if (_sif_mode == SifMethod::T && !_treat_as_2d)
592 _interaction_integral[i] +=
593 _poissons_ratio * _crack_front_definition->getCrackFrontTangentialStrain(i);
595 _interaction_integral[i] *= _K_factor;
599 template <
bool is_ad>
605 for (
auto i = beginIndex(_interaction_integral); i < _interaction_integral.size(); ++i)
609 template <
bool is_ad>
617 if (_sif_mode == SifMethod::KI)
619 else if (_sif_mode == SifMethod::KII)
621 else if (_sif_mode == SifMethod::KIII)
625 Real t2 = _theta / 2.0;
626 Real tt2 = 3.0 * _theta / 2.0;
627 Real st = std::sin(t);
628 Real ct = std::cos(t);
629 Real st2 = std::sin(t2);
630 Real ct2 = std::cos(t2);
631 Real stt2 = std::sin(tt2);
632 Real ctt2 = std::cos(tt2);
633 Real ct2sq = Utility::pow<2>(ct2);
634 Real st2sq = Utility::pow<2>(st2);
635 Real ct2cu = Utility::pow<3>(ct2);
642 1.0 / sqrt2PiR * (
k(0) * ct2 * (1.0 - st2 * stt2) -
k(1) * st2 * (2.0 + ct2 * ctt2));
643 aux_stress(1, 1) = 1.0 / sqrt2PiR * (
k(0) * ct2 * (1.0 + st2 * stt2) +
k(1) * st2 * ct2 * ctt2);
644 aux_stress(0, 1) = 1.0 / sqrt2PiR * (
k(0) * ct2 * st2 * ctt2 +
k(1) * ct2 * (1.0 - st2 * stt2));
645 aux_stress(0, 2) = -1.0 / sqrt2PiR *
k(2) * st2;
646 aux_stress(1, 2) = 1.0 / sqrt2PiR *
k(2) * ct2;
650 aux_stress(2, 2) = _poissons_ratio * (aux_stress(0, 0) + aux_stress(1, 1));
652 aux_stress(1, 0) = aux_stress(0, 1);
653 aux_stress(2, 0) = aux_stress(0, 2);
654 aux_stress(2, 1) = aux_stress(1, 2);
662 (*_functionally_graded_youngs_modulus)[_qp], _poissons_ratio);
663 aux_strain = spatial_elasticity_tensor.
invSymm() * aux_stress;
668 grad_disp(0, 0) =
k(0) / (4.0 * _shear_modulus * sqrt2PiR) *
669 (ct * ct2 * _kappa + ct * ct2 - 2.0 * ct * ct2cu + st * st2 * _kappa +
670 st * st2 - 6.0 * st * st2 * ct2sq) +
671 k(1) / (4.0 * _shear_modulus * sqrt2PiR) *
672 (ct * st2 * _kappa + ct * st2 + 2.0 * ct * st2 * ct2sq - st * ct2 * _kappa +
673 3.0 * st * ct2 - 6.0 * st * ct2cu);
675 grad_disp(0, 1) =
k(0) / (4.0 * _shear_modulus * sqrt2PiR) *
676 (ct * st2 * _kappa + ct * st2 - 2.0 * ct * st2 * ct2sq - st * ct2 * _kappa -
677 5.0 * st * ct2 + 6.0 * st * ct2cu) +
678 k(1) / (4.0 * _shear_modulus * sqrt2PiR) *
679 (-ct * ct2 * _kappa + 3.0 * ct * ct2 - 2.0 * ct * ct2cu -
680 st * st2 * _kappa + 3.0 * st * st2 - 6.0 * st * st2 * ct2sq);
682 grad_disp(0, 2) =
k(2) / (_shear_modulus * sqrt2PiR) * (st2 * ct - ct2 * st);
688 const Real prefactor_rz = std::sqrt(_r / 2.0 /
libMesh::pi) / 2.0 / _shear_modulus;
689 aux_disp(0, 0) = prefactor_rz * ((
k(0) * ct2 * (_kappa - 1.0 + 2.0 * st2sq)) +
690 (
k(1) * st2 * (_kappa + 1.0 + 2.0 * ct2sq)));
691 aux_disp(0, 1) = prefactor_rz * ((
k(0) * st2 * (_kappa + 1.0 - 2.0 * ct2sq)) -
692 (
k(1) * ct2 * (_kappa - 1.0 - 2.0 * st2sq)));
693 aux_disp(0, 2) = prefactor_rz *
k(2) * 4.0 * st2;
697 template <
bool is_ad>
704 Real st = std::sin(t);
705 Real ct = std::cos(t);
706 Real stsq = Utility::pow<2>(st);
707 Real ctsq = Utility::pow<2>(ct);
708 Real ctcu = Utility::pow<3>(ct);
712 aux_stress(0, 0) = -oneOverPiR * ctcu;
713 aux_stress(0, 1) = -oneOverPiR * st * ctsq;
714 aux_stress(1, 0) = -oneOverPiR * st * ctsq;
715 aux_stress(1, 1) = -oneOverPiR * ct * stsq;
716 aux_stress(2, 2) = -oneOverPiR * _poissons_ratio * (ctcu + ct * stsq);
719 grad_disp(0, 0) = oneOverPiR / (4.0 * _youngs_modulus) *
720 (ct * (4.0 * Utility::pow<2>(_poissons_ratio) - 3.0 + _poissons_ratio) -
721 std::cos(3.0 * t) * (1.0 + _poissons_ratio));
722 grad_disp(0, 1) = -oneOverPiR / (4.0 * _youngs_modulus) *
723 (st * (4.0 * Utility::pow<2>(_poissons_ratio) - 3.0 + _poissons_ratio) +
724 std::sin(3.0 * t) * (1.0 + _poissons_ratio));
const VariableGradient * _additional_eigenstrain_gradient_02
Gradient used to add contribution to the interaction integral (XZ)
const GenericMaterialProperty< RankTwoTensor, is_ad > *const _total_deigenstrain_dT
Derivative of the total eigenstrain with respect to temperature.
bool _has_additional_eigenstrain
Whether the user chooses to add other eigenstrain influence (e.g. irradiation-induced) ...
const MaterialProperty< Real > * _functionally_graded_youngs_modulus
Spatial elasticity modulus variable for FGM.
const MaterialProperty< Real > * _functionally_graded_youngs_modulus_crack_dir_gradient
Spatial derivative of the youngs modulus in the crack direction.
void computeAuxFields(RankTwoTensor &aux_stress, RankTwoTensor &grad_disp, RankTwoTensor &aux_strain, RankTwoTensor &aux_disp)
Compute the auxiliary fields, including the auxiliary stress and the gradient of the auxiliary disp...
const VariableGradient & _grad_zero
void mooseError(Args &&... args)
virtual void initialize() override
void mooseInfo(Args &&... args) const
Real _kappa
Kappa Lame constant.
std::vector< const VariableGradient * > _grad_disp
Gradient of displacements.
const VariableGradient * _additional_eigenstrain_gradient_01
Gradient used to add contribution to the interaction integral (XY)
Real _poissons_ratio
Poisson's ratio of the material.
const VariableGradient * _additional_eigenstrain_gradient_11
Gradient used to add contribution to the interaction integral (YY)
const std::vector< double > y
virtual void execute() override
std::string getRawNames() const
virtual const VariableGradient & coupledGradient(const std::string &var_name, unsigned int comp=0) const
static InputParameters validParams()
bool isParamValid(const std::string &name) const
static RankTwoTensorTempl initializeFromRows(const libMesh::TypeVector< Real > &row0, const libMesh::TypeVector< Real > &row1, const libMesh::TypeVector< Real > &row2)
QMethod
Enum used to select the method used to compute the q function used in the fracture integrals...
Class used in fracture integrals to define geometric characteristics of the crack front...
Real computeQpIntegral(const std::size_t crack_front_point_index, const Real scalar_q, const RealVectorValue &grad_of_scalar_q)
Compute the contribution of a specific quadrature point to a fracture integral for a point on the cra...
static MooseEnum qFunctionType()
Get the MooseEnum defining the options for how the q function is defined.
virtual unsigned int dimension() const
const MaterialProperty< RealVectorValue > * _body_force
void fillSymmetricIsotropicEandNu(const T &E, const T &nu)
virtual void finalize() override
Real doubleContraction(const RankTwoTensorTempl< Real > &a) const
void paramError(const std::string ¶m, Args... args) const
This vectorpostprocessor computes the Interaction Integral, which is used to compute various fracture...
registerMooseObject("SolidMechanicsApp", InteractionIntegral)
std::string stringify(const T &t)
InteractionIntegralTempl(const InputParameters ¶meters)
const bool _has_temp
Whether the temperature variable is coupled.
static MooseEnum sifModeType()
Get the MooseEnum defining the options for the integral to be computed.
const VariableGradient * _additional_eigenstrain_gradient_12
Gradient used to add contribution to the interaction integral (YZ)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual void initialSetup() override
RankThreeTensorTempl< Real > mixedProductJkI(const libMesh::VectorValue< Real > &b) const
void mooseError(Args &&... args) const
SifMethod
Enum used to select the type of integral to be performed.
Moose::GenericType< RankThreeTensor, is_ad > GenericRankThreeTensor
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
static InputParameters validParams()
const GenericMaterialProperty< RankThreeTensor, is_ad > * _eigenstrain_gradient
Pointers to optionally-used eigenstrain gradient and body force.
RankFourTensorTempl< T > invSymm() const
void computeTFields(RankTwoTensor &aux_stress, RankTwoTensor &grad_disp)
Compute the auxiliary fields, including the auxiliary stress and the gradient of the auxiliary displa...
static const std::string k
Real _shear_modulus
Shear modulus.
void ErrorVector unsigned int
virtual void threadJoin(const UserObject &y) override
std::size_t _ndisp
Number of displacement components.
const VariableGradient * _additional_eigenstrain_gradient_22
Gradient used to add contribution to the interaction integral (ZZ)
PositionType
Enum used to define how the distance along the crack front is measured (angle or distance) ...
VectorPostprocessorValue & _interaction_integral
Real _youngs_modulus
Young's modulus of the material.
const VariableGradient * _additional_eigenstrain_gradient_00
Gradient used to add contribution to the interaction integral (XX)