Line data Source code
1 : //* This file is part of the MOOSE framework 2 : //* https://mooseframework.inl.gov 3 : //* 4 : //* All rights reserved, see COPYRIGHT for full restrictions 5 : //* https://github.com/idaholab/moose/blob/master/COPYRIGHT 6 : //* 7 : //* Licensed under LGPL 2.1, please see LICENSE for details 8 : //* https://www.gnu.org/licenses/lgpl-2.1.html 9 : 10 : #pragma once 11 : 12 : #include "StressUpdateBase.h" 13 : 14 : template <bool is_ad> 15 : class ViscoplasticityStressUpdateBaseTempl : public StressUpdateBaseTempl<is_ad> 16 : { 17 : public: 18 : static InputParameters validParams(); 19 : 20 : ViscoplasticityStressUpdateBaseTempl(const InputParameters & parameters); 21 : 22 : virtual Real computeTimeStepLimit() override; 23 762 : bool requiresIsotropicTensor() override { return true; } 24 : 25 : using StressUpdateBaseTempl<is_ad>::updateState; 26 : 27 : protected: 28 : virtual void initQpStatefulProperties() override; 29 : 30 : virtual void propagateQpStatefulProperties() override; 31 : 32 : /** 33 : * Perform any necessary initialization before return mapping iterations 34 : * @param effective_trial_stress Effective trial stress 35 : * @param elasticityTensor Elasticity tensor 36 : */ 37 446432 : virtual void computeStressInitialize(const GenericReal<is_ad> & /*effective_trial_stress*/, 38 : const GenericRankFourTensor<is_ad> & /*elasticity_tensor*/) 39 : { 40 446432 : } 41 : 42 : /** 43 : * Perform any necessary steps to finalize state after return mapping iterations 44 : * @param inelasticStrainIncrement Inelastic strain increment 45 : */ 46 : virtual void 47 446432 : computeStressFinalize(const GenericRankTwoTensor<is_ad> & /*plastic_strain_increment*/) 48 : { 49 446432 : } 50 : 51 : void updateIntermediatePorosity(const GenericRankTwoTensor<is_ad> & elastic_strain_increment); 52 : 53 : /// String designating the base name of the total strain 54 : const std::string _total_strain_base_name; 55 : 56 : /// Material property for the total strain increment 57 : const GenericMaterialProperty<RankTwoTensor, is_ad> & _strain_increment; 58 : 59 : ///@{ Effective inelastic strain material property 60 : GenericMaterialProperty<Real, is_ad> & _effective_inelastic_strain; 61 : const MaterialProperty<Real> & _effective_inelastic_strain_old; 62 : ///@} 63 : 64 : ///@{ Creep strain material property 65 : GenericMaterialProperty<RankTwoTensor, is_ad> & _inelastic_strain; 66 : const MaterialProperty<RankTwoTensor> & _inelastic_strain_old; 67 : ///@} 68 : 69 : /// Max increment for inelastic strain 70 : Real _max_inelastic_increment; 71 : 72 : /// Container for the porosity calculated from all other intelastic models except the current model 73 : GenericReal<is_ad> _intermediate_porosity; 74 : 75 : /// Material property for the old porosity 76 : const MaterialProperty<Real> & _porosity_old; 77 : 78 : /// Flag to enable verbose output 79 : const bool _verbose; 80 : 81 : /// Initial porosity 82 : const Real _initial_porosity; 83 : 84 : enum class NegativeBehavior 85 : { 86 : ZERO, 87 : INITIAL_CONDITION, 88 : EXCEPTION 89 : }; 90 : 91 : /// Enum for negative porosity handling 92 : const NegativeBehavior _negative_behavior; 93 : 94 : using StressUpdateBaseTempl<is_ad>::_dt; 95 : using StressUpdateBaseTempl<is_ad>::_name; 96 : using StressUpdateBaseTempl<is_ad>::_q_point; 97 : using StressUpdateBaseTempl<is_ad>::_qp; 98 : using StressUpdateBaseTempl<is_ad>::_base_name; 99 : }; 100 : 101 : #define usingViscoplasticityStressUpdateBaseMembers \ 102 : usingTransientInterfaceMembers; \ 103 : using ViscoplasticityStressUpdateBaseTempl<is_ad>::_name; \ 104 : using ViscoplasticityStressUpdateBaseTempl<is_ad>::_qp; \ 105 : using ViscoplasticityStressUpdateBaseTempl<is_ad>::isParamValid; \ 106 : using ViscoplasticityStressUpdateBaseTempl<is_ad>::paramError; \ 107 : using ViscoplasticityStressUpdateBaseTempl<is_ad>::paramWarning; \ 108 : using ViscoplasticityStressUpdateBaseTempl<is_ad>::updateState; \ 109 : using ViscoplasticityStressUpdateBaseTempl<is_ad>::_console; \ 110 : using ViscoplasticityStressUpdateBaseTempl<is_ad>::_q_point; \ 111 : using ViscoplasticityStressUpdateBaseTempl<is_ad>::_verbose; \ 112 : using ViscoplasticityStressUpdateBaseTempl<is_ad>::_intermediate_porosity; \ 113 : using ViscoplasticityStressUpdateBaseTempl<is_ad>::_effective_inelastic_strain; \ 114 : using ViscoplasticityStressUpdateBaseTempl<is_ad>::_effective_inelastic_strain_old; \ 115 : using ViscoplasticityStressUpdateBaseTempl<is_ad>::_inelastic_strain; \ 116 : using ViscoplasticityStressUpdateBaseTempl<is_ad>::_inelastic_strain_old; \ 117 : using ViscoplasticityStressUpdateBaseTempl<is_ad>::_porosity_old; \ 118 : using ViscoplasticityStressUpdateBaseTempl<is_ad>::updateIntermediatePorosity; \ 119 : using ViscoplasticityStressUpdateBaseTempl<is_ad>::computeStressFinalize; \ 120 : using ViscoplasticityStressUpdateBaseTempl<is_ad>::computeStressInitialize 121 : 122 : typedef ViscoplasticityStressUpdateBaseTempl<false> ViscoplasticityStressUpdateBase; 123 : typedef ViscoplasticityStressUpdateBaseTempl<true> ADViscoplasticityStressUpdateBase;