22 "This class uses the generalized radial return for anisotropic plasticity model." 23 "This class can be used in conjunction with other creep and plasticity materials for " 24 "more complex simulations.");
27 "Hardening constant (H) for anisotropic plasticity");
29 "hardening_exponent", 1.0,
"Hardening exponent (n) for anisotropic plasticity");
31 "Yield stress (constant value) for anisotropic plasticity");
42 _eigenvectors_hill(6, 6),
43 _hardening_constant(this->template getParam<
Real>(
"hardening_constant")),
44 _hardening_exponent(this->template getParam<
Real>(
"hardening_exponent")),
45 _hardening_variable(this->template declareGenericProperty<
Real, is_ad>(this->_base_name +
46 "hardening_variable")),
47 _hardening_variable_old(
48 this->template getMaterialPropertyOld<
Real>(this->_base_name +
"hardening_variable")),
49 _hardening_derivative(0.0),
50 _yield_condition(1.0),
51 _yield_stress(this->template getParam<
Real>(
"yield_stress")),
52 _hill_tensor(this->template getMaterialPropertyByName<DenseMatrix<
Real>>(this->_base_name +
62 _hardening_variable[_qp] = _hardening_variable_old[_qp];
63 _plasticity_strain[_qp] = _plasticity_strain_old[_qp];
74 _hardening_variable[_qp] = _hardening_variable_old[_qp];
75 _plasticity_strain[_qp] = _plasticity_strain_old[_qp];
76 _effective_inelastic_strain[_qp] = _effective_inelastic_strain_old[_qp];
82 computeHillTensorEigenDecomposition(_hill_tensor[_qp]);
84 _yield_condition = 1.0;
85 _yield_condition = -computeResidual(stress_dev, stress_dev, 0.0);
96 for (
unsigned int i = 0; i < 6; i++)
98 K(i) = _eigenvalues_hill(i) /
99 (Utility::pow<2>(1 + _two_shear_modulus * delta_gamma * _eigenvalues_hill(i)));
100 omega +=
K(i) * stress_trial(i) * stress_trial(i);
107 return std::sqrt(omega);
110 template <
bool is_ad>
124 omega = computeOmega(delta_gamma, stress_trial);
127 for (
unsigned int i = 0; i < 6; i++)
128 K(i) = _eigenvalues_hill(i) /
129 (Utility::pow<2>(1 + _two_shear_modulus * delta_gamma * _eigenvalues_hill(i)));
131 for (
unsigned int i = 0; i < 6; i++)
132 K_deltaGamma(i) = -2.0 * _two_shear_modulus * _eigenvalues_hill(i) *
K(i) /
133 (1 + _two_shear_modulus * delta_gamma * _eigenvalues_hill(i));
135 for (
unsigned int i = 0; i < 6; i++)
136 omega_gamma += K_deltaGamma(i) * stress_trial(i) * stress_trial(i);
138 omega_gamma /= 4.0 * omega;
139 sy_gamma = 2.0 * sy_alpha * (omega + delta_gamma * omega_gamma);
142 template <
bool is_ad>
154 template <
bool is_ad>
163 if (_yield_condition <= 0.0)
168 _eigenvectors_hill.get_transpose(eigenvectors_hill_transpose);
169 eigenvectors_hill_transpose.vector_mult(_stress_np1, stress_dev);
174 _hardening_variable[_qp] = computeHardeningValue(delta_gamma, omega);
176 _hardening_constant *
std::pow(_hardening_variable[_qp] + 1.0e-30, _hardening_exponent) +
180 residual = s_y / omega - 1.0;
185 template <
bool is_ad>
193 if (_yield_condition <= 0.0)
197 _hardening_derivative = computeHardeningDerivative();
200 _hardening_derivative * computeHardeningValue(delta_gamma, omega) + _yield_stress;
206 computeDeltaDerivatives(delta_gamma, _stress_np1, sy_alpha, omega, omega_gamma, sy_gamma);
207 GenericReal<is_ad> residual_derivative = 1 / omega * (sy_gamma - 1 / omega * omega_gamma * sy);
209 return residual_derivative;
212 template <
bool is_ad>
217 const unsigned int dimension = hill_tensor.
n();
220 for (
unsigned int index_i = 0; index_i < dimension; index_i++)
221 for (
unsigned int index_j = 0; index_j < dimension; index_j++)
224 if (isBlockDiagonal(
A))
226 Eigen::SelfAdjointEigenSolver<AnisotropyMatrixRealBlock> es(
A.block<3, 3>(0, 0));
228 auto lambda = es.eigenvalues();
229 auto v = es.eigenvectors();
231 _eigenvalues_hill(0) = lambda(0);
232 _eigenvalues_hill(1) = lambda(1);
233 _eigenvalues_hill(2) = lambda(2);
234 _eigenvalues_hill(3) =
A(3, 3);
235 _eigenvalues_hill(4) =
A(4, 4);
236 _eigenvalues_hill(5) =
A(5, 5);
238 _eigenvectors_hill(0, 0) =
v(0, 0);
239 _eigenvectors_hill(0, 1) =
v(0, 1);
240 _eigenvectors_hill(0, 2) =
v(0, 2);
241 _eigenvectors_hill(1, 0) =
v(1, 0);
242 _eigenvectors_hill(1, 1) =
v(1, 1);
243 _eigenvectors_hill(1, 2) =
v(1, 2);
244 _eigenvectors_hill(2, 0) =
v(2, 0);
245 _eigenvectors_hill(2, 1) =
v(2, 1);
246 _eigenvectors_hill(2, 2) =
v(2, 2);
247 _eigenvectors_hill(3, 3) = 1.0;
248 _eigenvectors_hill(4, 4) = 1.0;
249 _eigenvectors_hill(5, 5) = 1.0;
253 Eigen::SelfAdjointEigenSolver<AnisotropyMatrixReal> es_b(
A);
255 auto lambda_b = es_b.eigenvalues();
256 auto v_b = es_b.eigenvectors();
257 for (
unsigned int index_i = 0; index_i < dimension; index_i++)
258 _eigenvalues_hill(index_i) = lambda_b(index_i);
260 for (
unsigned int index_i = 0; index_i < dimension; index_i++)
261 for (
unsigned int index_j = 0; index_j < dimension; index_j++)
262 _eigenvectors_hill(index_i, index_j) = v_b(index_i, index_j);
266 template <
bool is_ad>
271 return _hardening_variable_old[_qp] + 2.0 * delta_gamma * omega;
274 template <
bool is_ad>
278 return _hardening_constant * _hardening_exponent *
280 std::pow(_hardening_variable[_qp] + 1.0e-30, _hardening_exponent - 1));
283 template <
bool is_ad>
294 _hill_tensor[_qp].vector_mult(hill_stress, stress_dev);
295 hill_stress.scale(delta_gamma);
296 inelasticStrainIncrement_vector = hill_stress;
298 inelasticStrainIncrement(0, 0) = inelasticStrainIncrement_vector(0);
299 inelasticStrainIncrement(1, 1) = inelasticStrainIncrement_vector(1);
300 inelasticStrainIncrement(2, 2) = inelasticStrainIncrement_vector(2);
301 inelasticStrainIncrement(0, 1) = inelasticStrainIncrement(1, 0) =
302 inelasticStrainIncrement_vector(3) / 2.0;
303 inelasticStrainIncrement(1, 2) = inelasticStrainIncrement(2, 1) =
304 inelasticStrainIncrement_vector(4) / 2.0;
305 inelasticStrainIncrement(0, 2) = inelasticStrainIncrement(2, 0) =
306 inelasticStrainIncrement_vector(5) / 2.0;
310 _hill_tensor[_qp].vector_mult(Mepsilon, inelasticStrainIncrement_vector);
311 GenericReal<is_ad> eq_plastic_strain_inc = Mepsilon.dot(inelasticStrainIncrement_vector);
313 if (eq_plastic_strain_inc > 0.0)
314 eq_plastic_strain_inc = std::sqrt(eq_plastic_strain_inc);
316 _effective_inelastic_strain[_qp] = _effective_inelastic_strain_old[_qp] + eq_plastic_strain_inc;
319 inelasticStrainIncrement, stress, stress_dev, delta_gamma);
322 template <
bool is_ad>
335 if (_yield_condition <= 0.0)
339 for (
unsigned int i = 0; i < 6; i++)
340 inv_matrix(i, i) = 1 / (1 + _two_shear_modulus * delta_gamma * _eigenvalues_hill(i));
344 _eigenvectors_hill.get_transpose(eigenvectors_hill_transpose);
348 inv_matrix.right_multiply(eigenvectors_hill_transpose);
350 eigenvectors_hill_copy.right_multiply(inv_matrix);
353 eigenvectors_hill_copy.vector_mult(stress_np1, stress_dev);
357 stress_new(0, 0) = stress_new_volumetric(0, 0) + stress_np1(0);
358 stress_new(1, 1) = stress_new_volumetric(1, 1) + stress_np1(1);
359 stress_new(2, 2) = stress_new_volumetric(2, 2) + stress_np1(2);
360 stress_new(0, 1) = stress_new(1, 0) = stress_np1(3);
361 stress_new(1, 2) = stress_new(2, 1) = stress_np1(4);
362 stress_new(0, 2) = stress_new(2, 0) = stress_np1(5);
365 _hardening_variable[_qp] = computeHardeningValue(delta_gamma, omega);
Moose::GenericType< Real, is_ad > GenericReal
virtual void computeStressInitialize(const GenericDenseVector< is_ad > &stress_dev, const GenericDenseVector< is_ad > &stress, const GenericRankFourTensor< is_ad > &elasticity_tensor) override
static InputParameters validParams()
GenericReal< is_ad > computeHardeningValue(const GenericReal< is_ad > &scalar, const GenericReal< is_ad > &omega)
Eigen::Matrix< Real, 6, 6 > AnisotropyMatrixReal
static const std::string K
registerMooseObject("SolidMechanicsApp", ADHillPlasticityStressUpdate)
virtual GenericReal< is_ad > computeDerivative(const GenericDenseVector< is_ad > &effective_trial_stress, const GenericDenseVector< is_ad > &stress_new, const GenericReal< is_ad > &scalar) override
void computeHillTensorEigenDecomposition(const DenseMatrix< Real > &hill_tensor)
Compute eigendecomposition of Hill's tensor for anisotropic plasticity.
Moose::GenericType< DenseVector< Real >, is_ad > GenericDenseVector
This class uses the stress update material in an anisotropic return mapping.
Moose::GenericType< RankFourTensor, is_ad > GenericRankFourTensor
Real computeHardeningDerivative()
Real elasticity_tensor(unsigned int i, unsigned int j, unsigned int k, unsigned int l)
void computeDeltaDerivatives(const GenericReal< is_ad > &delta_gamma, const GenericDenseVector< is_ad > &stress_trial, const GenericReal< is_ad > &sy_alpha, GenericReal< is_ad > &omega, GenericReal< is_ad > &omega_gamma, GenericReal< is_ad > &sy_gamma)
virtual void computeStressFinalize(const GenericRankTwoTensor< is_ad > &inelasticStrainIncrement, const GenericReal< is_ad > &delta_gamma, GenericRankTwoTensor< is_ad > &stress, const GenericDenseVector< is_ad > &, const GenericRankTwoTensor< is_ad > &, const GenericRankFourTensor< is_ad > &) override
Perform any necessary steps to finalize state after return mapping iterations.
virtual void computeStrainFinalize(GenericRankTwoTensor< is_ad > &, const GenericRankTwoTensor< is_ad > &, const GenericDenseVector< is_ad > &, const GenericReal< is_ad > &) override
Perform any necessary steps to finalize strain increment after return mapping iterations.
virtual GenericReal< is_ad > computeResidual(const GenericDenseVector< is_ad > &effective_trial_stress, const GenericDenseVector< is_ad > &stress_new, const GenericReal< is_ad > &scalar) override
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static const std::string v
virtual void propagateQpStatefulProperties() override
HillPlasticityStressUpdateTempl(const InputParameters ¶meters)
GenericReal< is_ad > computeOmega(const GenericReal< is_ad > &delta_gamma, const GenericDenseVector< is_ad > &stress_trial)
virtual void computeStrainFinalize(GenericRankTwoTensor< is_ad > &, const GenericRankTwoTensor< is_ad > &, const GenericDenseVector< is_ad > &, const GenericReal< is_ad > &) override
Perform any necessary steps to finalize strain increment after return mapping iterations.
This class provides baseline functionality for anisotropic (Hill-like) plasticity models based on the...
virtual Real computeReferenceResidual(const GenericDenseVector< is_ad > &effective_trial_stress, const GenericDenseVector< is_ad > &stress_new, const GenericReal< is_ad > &residual, const GenericReal< is_ad > &scalar_effective_inelastic_strain) override
MooseUnits pow(const MooseUnits &, int)
Moose::GenericType< DenseMatrix< Real >, is_ad > GenericDenseMatrix
Moose::GenericType< RankTwoTensor, is_ad > GenericRankTwoTensor
virtual void propagateQpStatefulProperties() override
static InputParameters validParams()