20 params.
addParam<MaterialPropertyName>(
21 "elasticity_tensor",
"elasticity_tensor",
"The name of the elasticity tensor.");
23 "The material defining the flow stress");
31 _elasticity_tensor_name(_base_name + getParam<MaterialPropertyName>(
"elasticity_tensor")),
32 _elasticity_tensor(getMaterialProperty<
RankFourTensor>(_elasticity_tensor_name)),
33 _F_old(getMaterialPropertyOld<
RankTwoTensor>(_base_name +
"deformation_gradient")),
34 _ep_name(_base_name +
"effective_plastic_strain"),
35 _ep(declareProperty<Real>(_ep_name)),
36 _ep_old(getMaterialPropertyOldByName<Real>(_ep_name)),
38 "volume_preserving_elastic_left_cauchy_green_strain")),
40 _base_name +
"volume_preserving_elastic_left_cauchy_green_strain")),
41 _Np(declareProperty<
RankTwoTensor>(_base_name +
"flow_direction")),
42 _flow_stress_material(nullptr),
43 _flow_stress_name(_base_name +
"flow_stress"),
44 _H(getMaterialPropertyByName<Real>(_flow_stress_name)),
45 _dH(getDefaultMaterialPropertyByName<Real, false>(
46 derivativePropertyName(_flow_stress_name, {
_ep_name}))),
47 _d2H(getDefaultMaterialPropertyByName<Real, false>(
48 derivativePropertyName(_flow_stress_name, {_ep_name, _ep_name})))
61 mooseError(
"ComputeSimoHughesJ2PlasticityStress requires an isotropic elasticity tensor");
68 _be[_qp].setToIdentity();
75 usingTensorIndices(i, j, k, l, m);
79 const auto Fit = _F[_qp].inverse().transpose();
80 const auto detJ = _F[_qp].det();
89 _Np[_qp] = MooseUtils::absoluteFuzzyEqual(s.norm(), 0) ? std::sqrt(1. / 2.) * I
90 : std::sqrt(3. / 2.) * s / s.norm();
94 if (_fe_problem.currentlyComputingJacobian())
97 I.times<j, k, i, l>(f_bar *
_be_old[_qp])) /
99 2. / 3. *
_be[_qp].times<i, j, l, k>(_inv_df[_qp]));
106 if (_fe_problem.currentlyComputingJacobian())
109 if (MooseUtils::absoluteFuzzyEqual(s.norm(), 0))
112 _d_n_d_be = G / std::sqrt(6) / s.norm() *
113 (3 * I.times<i, k, j, l>(I) - 2 *
_Np[_qp].times<i, j, k, l>(
_Np[_qp]) -
114 I.times<i, j, k, l>(I));
120 if (_fe_problem.currentlyComputingJacobian())
124 delta_ep *
_Np[_qp].times<i, j, k, l>(I) + delta_ep *
_be[_qp].trace() *
_d_n_d_be) *
130 _be[_qp] -= 2. / 3. * delta_ep *
_be[_qp].trace() *
_Np[_qp];
131 s = G *
_be[_qp].deviatoric();
133 _pk1_stress[_qp] = tau * Fit;
137 if (_fe_problem.currentlyComputingJacobian())
139 RankFourTensor d_tau_d_F = K * detJ * detJ * I.times<i, j, k, l>(Fit) +
141 _pk1_jacobian[_qp] = Fit.times<m, j, i, m, k, l>(d_tau_d_F) - Fit.times<k, j, i, l>(tau * Fit);
150 return effective_trial_stress - G * scalar *
_be[_qp].trace();
163 return effective_trial_stress - G * scalar *
_be[_qp].trace() -
_H[_qp];
176 return -G *
_be[_qp].trace() -
_dH[_qp];
182 if (!_fe_problem.currentlyComputingJacobian())
Real f(Real x)
Test function for Brents method.
registerMooseObject("SolidMechanicsApp", ComputeSimoHughesJ2PlasticityStress)
void mooseError(Args &&... args)
virtual void initialSetup() override
Derive _large_kinematics from the strain calculator's LARGE_KINEMATICS guarantee.
Native interface for providing the 1st Piola Kirchhoff stress.
virtual void initQpStatefulProperties() override
virtual Real computeDerivative(const Real &effective_trial_stress, const Real &scalar) override
MaterialProperty< RankTwoTensor > & _Np
virtual Real computeResidual(const Real &effective_trial_stress, const Real &scalar) override
virtual void initialSetup() override
MaterialProperty< RankTwoTensor > & _be
const MaterialProperty< Real > & _dH
const MaterialProperty< Real > & _H
RankTwoTensor _d_R_d_betr
virtual void computeQpPK1Stress() override
RankTwoTensor _d_J_d_betr
const MaterialPropertyName _elasticity_tensor_name
MaterialBase * _flow_stress_material
const MaterialProperty< RankFourTensor > & _elasticity_tensor
static InputParameters validParams()
const MaterialProperty< Real > & _ep_old
const std::string _ep_name
const MaterialProperty< RankTwoTensor > & _F_old
MaterialProperty< Real > & _ep
virtual Real computeReferenceResidual(const Real &effective_trial_stress, const Real &scalar) override
The return mapping residual and derivative.
ComputeSimoHughesJ2PlasticityStress(const InputParameters ¶meters)
const MaterialProperty< RankTwoTensor > & _be_old
virtual void preStep(const Real &scalar_old, const Real &residual, const Real &jacobian) override
RankFourTensor _d_be_d_F
Helper (dummy) variables for iteratively updating the consistant tangent during return mapping.
RankTwoTensor _d_deltaep_d_betr
const MaterialProperty< Real > & _d2H
virtual void initQpStatefulProperties()
virtual void computePropertiesAtQp(unsigned int qp)
RankFourTensorTempl< T > inverse() const
T doubleContraction(const RankTwoTensorTempl< T > &a) const
RankTwoTensorTempl< T > inverse() const
RankTwoTensorTempl< T > transpose() const
static RankTwoTensorTempl Identity()
Base class that provides capability for Newton return mapping iterations on a single variable.
static InputParameters validParams()
void returnMappingSolve(const GenericReal< is_ad > &effective_trial_stress, GenericReal< is_ad > &scalar, const ConsoleStream &console)
Perform the return mapping iterations.