20 params.
addParam<MaterialPropertyName>(
21 "elasticity_tensor",
"elasticity_tensor",
"The name of the elasticity tensor.");
23 "The material defining the flow stress");
32 _elasticity_tensor_name(_base_name + getParam<MaterialPropertyName>(
"elasticity_tensor")),
33 _elasticity_tensor(getMaterialProperty<
RankFourTensor>(_elasticity_tensor_name)),
34 _F_old(getMaterialPropertyOld<
RankTwoTensor>(_base_name +
"deformation_gradient")),
35 _ep_name(_base_name +
"effective_plastic_strain"),
36 _ep(declareProperty<
Real>(_ep_name)),
37 _ep_old(getMaterialPropertyOldByName<
Real>(_ep_name)),
39 "volume_preserving_elastic_left_cauchy_green_strain")),
41 _base_name +
"volume_preserving_elastic_left_cauchy_green_strain")),
42 _Np(declareProperty<
RankTwoTensor>(_base_name +
"flow_direction")),
43 _flow_stress_material(nullptr),
44 _flow_stress_name(_base_name +
"flow_stress"),
45 _H(getMaterialPropertyByName<
Real>(_flow_stress_name)),
46 _dH(getDefaultMaterialPropertyByName<
Real, false>(
47 derivativePropertyName(_flow_stress_name, {
_ep_name}))),
48 _d2H(getDefaultMaterialPropertyByName<Real, false>(
49 derivativePropertyName(_flow_stress_name, {_ep_name, _ep_name})))
60 mooseError(
"ComputeSimoHughesJ2PlasticityStress requires an isotropic elasticity tensor");
67 _be[_qp].setToIdentity();
74 usingTensorIndices(i,
j,
k, l, m);
78 const auto Fit = _F[_qp].inverse().transpose();
79 const auto detJ = _F[_qp].det();
89 : std::sqrt(3. / 2.) * s / s.
norm();
93 if (_fe_problem.currentlyComputingJacobian())
95 (I.times<i,
k,
j, l>(f_bar *
_be_old[_qp].transpose()) +
96 I.times<
j,
k, i, l>(f_bar *
_be_old[_qp])) /
98 2. / 3. *
_be[_qp].times<i, j, l, k>(_inv_df[_qp]));
105 if (_fe_problem.currentlyComputingJacobian())
112 (3 * I.times<i,
k,
j, l>(I) - 2 *
_Np[_qp].times<i, j, k, l>(
_Np[_qp]) -
113 I.times<i,
j,
k, l>(I));
119 if (_fe_problem.currentlyComputingJacobian())
123 delta_ep *
_Np[_qp].times<i, j, k, l>(I) + delta_ep *
_be[_qp].trace() *
_d_n_d_be) *
129 _be[_qp] -= 2. / 3. * delta_ep *
_be[_qp].trace() *
_Np[_qp];
130 s =
G *
_be[_qp].deviatoric();
132 _pk1_stress[_qp] = tau * Fit;
136 if (_fe_problem.currentlyComputingJacobian())
140 _pk1_jacobian[_qp] = Fit.times<m,
j, i, m,
k, l>(d_tau_d_F) - Fit.times<
k,
j, i, l>(tau * Fit);
149 return effective_trial_stress -
G * scalar *
_be[_qp].trace();
162 return effective_trial_stress -
G * scalar *
_be[_qp].trace() -
_H[_qp];
175 return -
G *
_be[_qp].trace() -
_dH[_qp];
181 if (!_fe_problem.currentlyComputingJacobian())
Native interface for providing the 1st Piola Kirchhoff stress.
const MaterialProperty< RankFourTensor > & _elasticity_tensor
virtual Real computeReferenceResidual(const Real &effective_trial_stress, const Real &scalar) override
The return mapping residual and derivative.
const MaterialProperty< Real > & _H
bool absoluteFuzzyEqual(const T &var1, const T2 &var2, const T3 &tol=libMesh::TOLERANCE *libMesh::TOLERANCE)
registerMooseObject("SolidMechanicsApp", ComputeSimoHughesJ2PlasticityStress)
const MaterialProperty< Real > & _ep_old
void mooseError(Args &&... args)
static const std::string K
virtual Real computeResidual(const Real &effective_trial_stress, const Real &scalar) override
static RankTwoTensorTempl Identity()
static InputParameters validParams()
static InputParameters validParams()
const MaterialProperty< RankTwoTensor > & _be_old
auto norm() const -> decltype(std::norm(T()))
virtual void computeQpPK1Stress() override
static const std::string G
virtual void initQpStatefulProperties() override
Initialize everything with zeros.
virtual void initialSetup() override
void returnMappingSolve(const GenericReal< is_ad > &effective_trial_stress, GenericReal< is_ad > &scalar, const ConsoleStream &console)
Perform the return mapping iterations.
const MaterialProperty< RankTwoTensor > & _F_old
InputParameters validParams()
const MaterialPropertyName _elasticity_tensor_name
Real f(Real x)
Test function for Brents method.
const MaterialProperty< Real > & _dH
virtual Real computeDerivative(const Real &effective_trial_stress, const Real &scalar) override
Base class that provides capability for Newton return mapping iterations on a single variable...
Real doubleContraction(const RankTwoTensorTempl< Real > &a) const
MaterialProperty< RankTwoTensor > & _be
virtual void preStep(const Real &scalar_old, const Real &residual, const Real &jacobian) override
static const std::string R
RankTwoTensorTempl< Real > transpose() const
ComputeSimoHughesJ2PlasticityStress(const InputParameters ¶meters)
virtual void initQpStatefulProperties() override
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
RankTwoTensor _d_deltaep_d_betr
const MaterialProperty< Real > & _d2H
RankTwoTensor _d_J_d_betr
MaterialProperty< RankTwoTensor > & _Np
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
virtual void computePropertiesAtQp(unsigned int qp)
const std::string _ep_name
bool hasGuaranteedMaterialProperty(const MaterialPropertyName &prop, Guarantee guarantee)
MaterialProperty< Real > & _ep
Add-on class that provides the functionality to check if guarantees for material properties are provi...
RankFourTensor _d_be_d_F
Helper (dummy) variables for iteratively updating the consistant tangent during return mapping...
static const std::string k
MaterialBase * _flow_stress_material
RankTwoTensor _d_R_d_betr