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);
125 omega = computeOmega(delta_gamma, stress_trial);
128 for (
unsigned int i = 0; i < 6; i++)
129 K(i) = _eigenvalues_hill(i) /
130 (Utility::pow<2>(1 + _two_shear_modulus * delta_gamma * _eigenvalues_hill(i)));
132 for (
unsigned int i = 0; i < 6; i++)
133 K_deltaGamma(i) = -2.0 * _two_shear_modulus * _eigenvalues_hill(i) * K(i) /
134 (1 + _two_shear_modulus * delta_gamma * _eigenvalues_hill(i));
136 for (
unsigned int i = 0; i < 6; i++)
137 omega_gamma += K_deltaGamma(i) * stress_trial(i) * stress_trial(i);
139 omega_gamma /= 4.0 * omega;
140 sy_gamma = 2.0 * sy_alpha * (omega + delta_gamma * omega_gamma);
165 if (_yield_condition <= 0.0)
170 _eigenvectors_hill.get_transpose(eigenvectors_hill_transpose);
171 eigenvectors_hill_transpose.vector_mult(_stress_np1, stress_dev);
176 _hardening_variable[_qp] = computeHardeningValue(delta_gamma, omega);
178 _hardening_constant *
pow(_hardening_variable[_qp] + 1.0e-30, _hardening_exponent) +
182 residual = s_y / omega - 1.0;
195 if (_yield_condition <= 0.0)
199 _hardening_derivative = computeHardeningDerivative();
202 _hardening_derivative * computeHardeningValue(delta_gamma, omega) + _yield_stress;
208 computeDeltaDerivatives(delta_gamma, _stress_np1, sy_alpha, omega, omega_gamma, sy_gamma);
209 GenericReal<is_ad> residual_derivative = 1 / omega * (sy_gamma - 1 / omega * omega_gamma * sy);
211 return residual_derivative;
217 const DenseMatrix<Real> & hill_tensor)
219 const unsigned int dimension = hill_tensor.n();
222 for (
unsigned int index_i = 0; index_i < dimension; index_i++)
223 for (
unsigned int index_j = 0; index_j < dimension; index_j++)
226 if (isBlockDiagonal(
A))
228 Eigen::SelfAdjointEigenSolver<AnisotropyMatrixRealBlock> es(
A.block<3, 3>(0, 0));
230 auto lambda = es.eigenvalues();
231 auto v = es.eigenvectors();
233 _eigenvalues_hill(0) = lambda(0);
234 _eigenvalues_hill(1) = lambda(1);
235 _eigenvalues_hill(2) = lambda(2);
236 _eigenvalues_hill(3) =
A(3, 3);
237 _eigenvalues_hill(4) =
A(4, 4);
238 _eigenvalues_hill(5) =
A(5, 5);
240 _eigenvectors_hill(0, 0) =
v(0, 0);
241 _eigenvectors_hill(0, 1) =
v(0, 1);
242 _eigenvectors_hill(0, 2) =
v(0, 2);
243 _eigenvectors_hill(1, 0) =
v(1, 0);
244 _eigenvectors_hill(1, 1) =
v(1, 1);
245 _eigenvectors_hill(1, 2) =
v(1, 2);
246 _eigenvectors_hill(2, 0) =
v(2, 0);
247 _eigenvectors_hill(2, 1) =
v(2, 1);
248 _eigenvectors_hill(2, 2) =
v(2, 2);
249 _eigenvectors_hill(3, 3) = 1.0;
250 _eigenvectors_hill(4, 4) = 1.0;
251 _eigenvectors_hill(5, 5) = 1.0;
255 Eigen::SelfAdjointEigenSolver<AnisotropyMatrixReal> es_b(
A);
257 auto lambda_b = es_b.eigenvalues();
258 auto v_b = es_b.eigenvectors();
259 for (
unsigned int index_i = 0; index_i < dimension; index_i++)
260 _eigenvalues_hill(index_i) = lambda_b(index_i);
262 for (
unsigned int index_i = 0; index_i < dimension; index_i++)
263 for (
unsigned int index_j = 0; index_j < dimension; index_j++)
264 _eigenvectors_hill(index_i, index_j) = v_b(index_i, index_j);
273 return _hardening_variable_old[_qp] + 2.0 * delta_gamma * omega;
282 return _hardening_constant * _hardening_exponent *
299 _hill_tensor[_qp].vector_mult(hill_stress, stress_dev);
300 hill_stress.scale(delta_gamma);
301 inelasticStrainIncrement_vector = hill_stress;
303 inelasticStrainIncrement(0, 0) = inelasticStrainIncrement_vector(0);
304 inelasticStrainIncrement(1, 1) = inelasticStrainIncrement_vector(1);
305 inelasticStrainIncrement(2, 2) = inelasticStrainIncrement_vector(2);
306 inelasticStrainIncrement(0, 1) = inelasticStrainIncrement(1, 0) =
307 inelasticStrainIncrement_vector(3) / 2.0;
308 inelasticStrainIncrement(1, 2) = inelasticStrainIncrement(2, 1) =
309 inelasticStrainIncrement_vector(4) / 2.0;
310 inelasticStrainIncrement(0, 2) = inelasticStrainIncrement(2, 0) =
311 inelasticStrainIncrement_vector(5) / 2.0;
315 _hill_tensor[_qp].vector_mult(Mepsilon, inelasticStrainIncrement_vector);
316 GenericReal<is_ad> eq_plastic_strain_inc = Mepsilon.dot(inelasticStrainIncrement_vector);
318 if (eq_plastic_strain_inc > 0.0)
319 eq_plastic_strain_inc = sqrt(eq_plastic_strain_inc);
321 _effective_inelastic_strain[_qp] = _effective_inelastic_strain_old[_qp] + eq_plastic_strain_inc;
324 inelasticStrainIncrement, stress, stress_dev, delta_gamma);
340 if (_yield_condition <= 0.0)
344 for (
unsigned int i = 0; i < 6; i++)
345 inv_matrix(i, i) = 1 / (1 + _two_shear_modulus * delta_gamma * _eigenvalues_hill(i));
349 _eigenvectors_hill.get_transpose(eigenvectors_hill_transpose);
353 inv_matrix.right_multiply(eigenvectors_hill_transpose);
355 eigenvectors_hill_copy.right_multiply(inv_matrix);
358 eigenvectors_hill_copy.vector_mult(stress_np1, stress_dev);
362 stress_new(0, 0) = stress_new_volumetric(0, 0) + stress_np1(0);
363 stress_new(1, 1) = stress_new_volumetric(1, 1) + stress_np1(1);
364 stress_new(2, 2) = stress_new_volumetric(2, 2) + stress_np1(2);
365 stress_new(0, 1) = stress_new(1, 0) = stress_np1(3);
366 stress_new(1, 2) = stress_new(2, 1) = stress_np1(4);
367 stress_new(0, 2) = stress_new(2, 0) = stress_np1(5);
370 _hardening_variable[_qp] = computeHardeningValue(delta_gamma, omega);
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
Eigen::Matrix< Real, 6, 6 > AnisotropyMatrixReal
registerMooseObject("SolidMechanicsApp", ADHillPlasticityStressUpdate)
Moose::GenericType< RankFourTensor, is_ad > GenericRankFourTensor
Moose::GenericType< DenseVector< Real >, is_ad > GenericDenseVector
Moose::GenericType< Real, is_ad > GenericReal
Moose::GenericType< RankTwoTensor, is_ad > GenericRankTwoTensor
Moose::GenericType< DenseMatrix< Real >, is_ad > GenericDenseMatrix
This class provides baseline functionality for anisotropic (Hill-like) plasticity models based on the...
virtual void propagateQpStatefulProperties() override
static InputParameters validParams()
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 uses the stress update material in an anisotropic return mapping.
HillPlasticityStressUpdateTempl(const InputParameters ¶meters)
void computeHillTensorEigenDecomposition(const DenseMatrix< Real > &hill_tensor)
Compute eigendecomposition of Hill's tensor for anisotropic plasticity.
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.
GenericReal< is_ad > computeHardeningValue(const GenericReal< is_ad > &scalar, const GenericReal< is_ad > &omega)
Real computeHardeningDerivative()
static InputParameters validParams()
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)
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.
virtual void computeStressInitialize(const GenericDenseVector< is_ad > &stress_dev, const GenericDenseVector< is_ad > &stress, const GenericRankFourTensor< is_ad > &elasticity_tensor) override
virtual void propagateQpStatefulProperties() override
virtual GenericReal< is_ad > computeDerivative(const GenericDenseVector< is_ad > &effective_trial_stress, const GenericDenseVector< is_ad > &stress_new, const GenericReal< is_ad > &scalar) override
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
virtual GenericReal< is_ad > computeResidual(const GenericDenseVector< is_ad > &effective_trial_stress, const GenericDenseVector< is_ad > &stress_new, const GenericReal< is_ad > &scalar) override
Real elasticity_tensor(unsigned int i, unsigned int j, unsigned int k, unsigned int l)