12#include "libmesh/utility.h"
19 return MooseEnum(
"TaylorExpansion EigenSolution",
"TaylorExpansion");
27 "Class for computing nodal quantities for residual and jacobian calculation "
28 "for peridynamic correspondence models under finite strain assumptions");
32 "Methods to calculate the strain and rotation increments");
40 _strain_increment(declareProperty<
RankTwoTensor>(
"strain_increment")),
41 _rotation_increment(declareProperty<
RankTwoTensor>(
"rotation_increment")),
42 _deformation_gradient_old(getMaterialPropertyOld<
RankTwoTensor>(
"deformation_gradient")),
43 _mechanical_strain_old(getMaterialPropertyOld<
RankTwoTensor>(
"mechanical_strain")),
44 _total_strain_old(getMaterialPropertyOld<
RankTwoTensor>(
"total_strain")),
45 _eigenstrains_old(_eigenstrain_names.size()),
86 if (_bond_status_var->getElementalValue(_current_elem) < 0.5)
123 total_strain_increment = -Cinv_I * 0.5 + Cinv_I * Cinv_I * 0.25;
125 const Real
a[3] = {invFhat(1, 2) - invFhat(2, 1),
126 invFhat(2, 0) - invFhat(0, 2),
127 invFhat(0, 1) - invFhat(1, 0)};
129 Real q = (
a[0] *
a[0] +
a[1] *
a[1] +
a[2] *
a[2]) / 4.0;
130 Real trFhatinv_1 = invFhat.
trace() - 1.0;
131 const Real
p = trFhatinv_1 * trFhatinv_1 / 4.0;
134 const Real C1_squared =
p +
135 3.0 * Utility::pow<2>(
p) * (1.0 - (
p + q)) / Utility::pow<2>(
p + q) -
136 2.0 * Utility::pow<3>(
p) * (1.0 - (
p + q)) / Utility::pow<3>(
p + q);
137 if (C1_squared <= 0.0)
139 "Cannot take square root of a number less than or equal to zero in the calculation of "
140 "C1 for the Rashid approximation for the rotation tensor.");
142 const Real C1 = std::sqrt(C1_squared);
147 C2 = (1.0 - C1) / (4.0 * q);
150 C2 = 0.125 + q * 0.03125 * (Utility::pow<2>(
p) - 12.0 * (
p - 1.0)) / Utility::pow<2>(
p) +
151 Utility::pow<2>(q) * (
p - 2.0) * (Utility::pow<2>(
p) - 10.0 *
p + 32.0) /
154 (1104.0 - 992.0 *
p + 376.0 * Utility::pow<2>(
p) - 72.0 * Utility::pow<3>(
p) +
155 5.0 * Utility::pow<4>(
p)) /
156 (512.0 * Utility::pow<4>(
p));
159 (
p * q * (3.0 - q) + Utility::pow<3>(
p) + Utility::pow<2>(q)) / Utility::pow<3>(
p + q);
163 "Cannot take square root of a number less than or equal to zero in the calculation of "
164 "C3_test for the Rashid approximation for the rotation tensor.");
166 const Real C3 = 0.5 * std::sqrt(C3_test);
172 for (
unsigned int i = 0; i < 3; ++i)
173 for (
unsigned int j = 0; j < 3; ++j)
174 R_incr(i, j) += C2 *
a[i] *
a[j];
176 R_incr(0, 1) += C3 *
a[2];
177 R_incr(0, 2) -= C3 *
a[1];
178 R_incr(1, 0) -= C3 *
a[2];
179 R_incr(1, 2) += C3 *
a[0];
180 R_incr(2, 0) += C3 *
a[1];
181 R_incr(2, 1) -= C3 *
a[0];
191 total_strain_increment = MathUtils::log(Uhat).get();
196 mooseError(
"ComputeFiniteStrainNOSPD Error: Invalid decomposition type! Please specify : "
197 "TaylorExpansion or "
registerMooseObject("PeridynamicsApp", ComputeFiniteStrainNOSPD)
void mooseError(Args &&... args)
Material class for peridynamic correspondence model for finite strain.
void subtractEigenstrainIncrementFromStrain(RankTwoTensor &strain)
Function to compute the mechanical strain tensor by subtracting thermal strain from the total strain.
static MooseEnum decompositionType()
MaterialProperty< RankTwoTensor > & _strain_increment
virtual void computeQpFhat()
ComputeFiniteStrainNOSPD(const InputParameters ¶meters)
DecompMethod
Method to decompose into rotation increment and strain increment.
void computeQpStrainRotationIncrements(RankTwoTensor &e, RankTwoTensor &r)
Function to compute strain and rotational increments.
MaterialProperty< RankTwoTensor > & _rotation_increment
const MaterialProperty< RankTwoTensor > & _total_strain_old
const MaterialProperty< RankTwoTensor > & _deformation_gradient_old
Material properties to fetch.
const DecompMethod _decomposition_method
const MaterialProperty< RankTwoTensor > & _mechanical_strain_old
std::vector< const MaterialProperty< RankTwoTensor > * > _eigenstrains_old
static InputParameters validParams()
std::vector< RankTwoTensor > _Fhat
'Incremental' deformation gradient
MaterialProperty< RankTwoTensor > & _strain_rate
Material properties to store.
virtual void computeQpStrain() override
Function to compute strain tensors.
Base material class for correspondence material model.
std::vector< const MaterialProperty< RankTwoTensor > * > _eigenstrains
MaterialProperty< RankTwoTensor > & _total_strain
static InputParameters validParams()
std::vector< MaterialPropertyName > _eigenstrain_names
virtual void computeQpDeformationGradient()
Function to compute deformation gradient for peridynamic correspondence model.
MaterialProperty< RankTwoTensor > & _mechanical_strain
MaterialProperty< RankTwoTensor > & _deformation_gradient
FactorizedRankTwoTensorTempl< T > inverse() const
RankTwoTensorTempl< T > transpose() const
static RankTwoTensorTempl< T > transposeTimes(const RankTwoTensorTempl< T > &)