13 #include "libmesh/quadrature.h" 14 #include "libmesh/utility.h" 19 return MooseEnum(
"TaylorExpansion EigenSolution HughesWinget",
"TaylorExpansion");
29 "Compute a strain increment and rotation increment for finite strains.");
32 "Methods to calculate the strain and rotation increments");
38 _Fhat(_fe_problem.getMaxQps()),
40 _use_hw(_decomposition_method ==
DecompMethod::HughesWinget),
41 _def_grad_mid(_use_hw ? &declareProperty<
RankTwoTensor>(_base_name +
"def_grad_mid") : nullptr),
42 _f_bar(_use_hw ? &declareProperty<
RankTwoTensor>(_base_name +
"f_bar") : nullptr)
50 Real ave_dfgrd_det = 0.0;
68 (*_def_grad_mid)[
_qp].setToIdentity();
69 (*_def_grad_mid)[
_qp] += 0.5 * (
A + Fbar);
183 total_strain_increment = -Cinv_I * 0.5 + Cinv_I * Cinv_I * 0.25;
185 const Real a[3] = {invFhat(1, 2) - invFhat(2, 1),
186 invFhat(2, 0) - invFhat(0, 2),
187 invFhat(0, 1) - invFhat(1, 0)};
189 Real q = (
a[0] *
a[0] +
a[1] *
a[1] +
a[2] *
a[2]) / 4.0;
190 Real trFhatinv_1 = invFhat.
trace() - 1.0;
191 const Real p = trFhatinv_1 * trFhatinv_1 / 4.0;
194 const Real C1_squared = p +
195 3.0 * Utility::pow<2>(p) * (1.0 - (p + q)) / Utility::pow<2>(p + q) -
196 2.0 * Utility::pow<3>(p) * (1.0 - (p + q)) / Utility::pow<3>(p + q);
197 if (C1_squared <= 0.0)
199 "Cannot take square root of a number less than or equal to zero in the calculation of " 200 "C1 for the Rashid approximation for the rotation tensor. This zero or negative number " 201 "may occur when elements become heavily distorted.");
208 C2 = (1.0 - C1) / (4.0 * q);
211 C2 = 0.125 + q * 0.03125 * (Utility::pow<2>(p) - 12.0 * (p - 1.0)) / Utility::pow<2>(p) +
212 Utility::pow<2>(q) * (p - 2.0) * (Utility::pow<2>(p) - 10.0 * p + 32.0) /
215 (1104.0 - 992.0 * p + 376.0 * Utility::pow<2>(p) - 72.0 * Utility::pow<3>(p) +
216 5.0 * Utility::pow<4>(p)) /
217 (512.0 * Utility::pow<4>(p));
220 (p * q * (3.0 - q) + Utility::pow<3>(p) + Utility::pow<2>(q)) / Utility::pow<3>(p + q);
224 "Cannot take square root of a number less than or equal to zero in the calculation of " 225 "C3_test for the Rashid approximation for the rotation tensor. This zero or negative " 226 "number may occur when elements become heavily distorted.");
234 for (
unsigned int i = 0; i < 3; ++i)
235 for (
unsigned int j = 0;
j < 3; ++
j)
236 R_incr(i,
j) += C2 *
a[i] *
a[
j];
238 R_incr(0, 1) += C3 *
a[2];
239 R_incr(0, 2) -= C3 *
a[1];
240 R_incr(1, 0) -= C3 *
a[2];
241 R_incr(1, 2) += C3 *
a[0];
242 R_incr(2, 0) += C3 *
a[1];
243 R_incr(2, 1) -= C3 *
a[0];
254 total_strain_increment = MathUtils::log(Uhat).get();
262 total_strain_increment = 0.5 * (
G +
G.transpose());
271 rotation_increment = Q_1.
inverse() * Q_2;
277 mooseError(
"ComputeFiniteStrain Error: Pass valid decomposition type: TaylorExpansion, " 278 "EigenSolution, or HughesWinget.");
static InputParameters validParams()
ComputeFiniteStrain(const InputParameters ¶meters)
RankTwoTensorTempl< Real > inverse() const
const QBase *const & _qrule
const Real & _current_elem_volume
const MaterialProperty< RankTwoTensor > & _total_strain_old
MaterialProperty< RankTwoTensor > & _deformation_gradient
const DecompMethod _decomposition_method
Method for determining rotation and strain increments.
const MooseArray< Real > & _JxW
ADRealEigenVector< T, D, asd > sqrt(const ADRealEigenVector< T, D, asd > &)
void computeProperties() override
virtual void computeQpStrain()
static const std::string G
MaterialProperty< RankTwoTensor > & _strain_increment
static RankTwoTensorTempl initializeFromRows(const libMesh::TypeVector< Real > &row0, const libMesh::TypeVector< Real > &row1, const libMesh::TypeVector< Real > &row2)
const bool _use_hw
Flag if using HughesWinget method.
static InputParameters validParams()
MaterialProperty< RankTwoTensor > & _mechanical_strain
void addIa(const Real &a)
virtual void computeQpIncrements(RankTwoTensor &e, RankTwoTensor &r)
static MooseEnum decompositionType()
MaterialProperty< RankTwoTensor > & _strain_rate
void subtractEigenstrainIncrementFromStrain(RankTwoTensor &strain)
static RankTwoTensorTempl< Real > transposeTimes(const RankTwoTensorTempl< Real > &)
RankTwoTensorTempl< Real > transpose() const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
ComputeFiniteStrain defines a strain increment and rotation increment, for finite strains...
registerMooseObject("SolidMechanicsApp", ComputeFiniteStrain)
const MaterialProperty< RankTwoTensor > & _mechanical_strain_old
std::vector< const VariableGradient * > _grad_disp_old
void mooseError(Args &&... args) const
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
ComputeIncrementalStrainBase is the base class for strain tensors using incremental formulations...
const bool _volumetric_locking_correction
MaterialProperty< RankTwoTensor > & _rotation_increment
const MooseArray< Real > & _coord
const MaterialProperty< RankTwoTensor > *const _global_strain
MaterialProperty< RankTwoTensor > & _total_strain
std::vector< RankTwoTensor > _Fhat
Incremental deformation gradient.
FactorizedRankTwoTensorTempl< T > inverse() const
std::vector< const VariableGradient * > _grad_disp
Gradient of displacements.