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 " void computeQpStrainRotationIncrements(RankTwoTensor &e, RankTwoTensor &r)
Function to compute strain and rotational increments.
Material class for peridynamic correspondence model for finite strain.
virtual void computeQpStrain() override
Function to compute strain tensors.
virtual void computeQpDeformationGradient()
Function to compute deformation gradient for peridynamic correspondence model.
MaterialProperty< RankTwoTensor > & _deformation_gradient
const MaterialProperty< RankTwoTensor > & _total_strain_old
void mooseError(Args &&... args)
MaterialProperty< RankTwoTensor > & _strain_increment
ComputeFiniteStrainNOSPD(const InputParameters ¶meters)
virtual void computeQpFhat()
const DecompMethod _decomposition_method
static InputParameters validParams()
void subtractEigenstrainIncrementFromStrain(RankTwoTensor &strain)
Function to compute the mechanical strain tensor by subtracting thermal strain from the total strain...
std::vector< RankTwoTensor > _Fhat
'Incremental' deformation gradient
static InputParameters validParams()
Base material class for correspondence material model.
void addIa(const Real &a)
const MaterialProperty< RankTwoTensor > & _mechanical_strain_old
std::vector< const MaterialProperty< RankTwoTensor > * > _eigenstrains
static RankTwoTensorTempl< Real > transposeTimes(const RankTwoTensorTempl< Real > &)
RankTwoTensorTempl< Real > transpose() const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const MaterialProperty< RankTwoTensor > & _deformation_gradient_old
Material properties to fetch.
std::vector< MaterialPropertyName > _eigenstrain_names
MaterialProperty< RankTwoTensor > & _strain_rate
Material properties to store.
std::vector< const MaterialProperty< RankTwoTensor > * > _eigenstrains_old
MaterialProperty< RankTwoTensor > & _rotation_increment
MaterialProperty< RankTwoTensor > & _total_strain
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
static MooseEnum decompositionType()
DecompMethod
Method to decompose into rotation increment and strain increment.
FactorizedRankTwoTensorTempl< T > inverse() const
registerMooseObject("PeridynamicsApp", ComputeFiniteStrainNOSPD)
MaterialProperty< RankTwoTensor > & _mechanical_strain