-
Notifications
You must be signed in to change notification settings - Fork 288
[ConstitutiveLawsApplication] Double Exponential Hardening Curve for Isotropic Damage Constitutive Law #14280
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
e257419
c14d8d3
33bb0b9
15f60b4
c5e2fc7
ac7e149
109da17
c4e901c
caca1fd
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -151,6 +151,9 @@ class GenericConstitutiveLawIntegratorDamage | |||||
| case static_cast<int>(SofteningType::CurveFittingDamage): | ||||||
| CalculateCurveFittingDamage(UniaxialStress, rThreshold, damage_parameter, CharacteristicLength, rValues, rDamage); | ||||||
| break; | ||||||
| case static_cast<int>(SofteningType::DoubleExponentialHardeningDamage): | ||||||
| CalculateDoubleExponentialHardeningDamage(UniaxialStress, rThreshold, damage_parameter, CharacteristicLength, rValues, rDamage); | ||||||
| break; | ||||||
| default: | ||||||
| KRATOS_ERROR << "SOFTENING_TYPE not defined or wrong..." << softening_type << std::endl; | ||||||
| break; | ||||||
|
|
@@ -228,6 +231,46 @@ class GenericConstitutiveLawIntegratorDamage | |||||
| } | ||||||
| } | ||||||
|
|
||||||
| /** | ||||||
| * @brief This computes the damage variable according to combined exponential hardening and softening | ||||||
| * @param UniaxialStress The equivalent uniaxial stress | ||||||
| * @param Threshold The maximum uniaxial stress achieved previously | ||||||
| * @param rDamage The internal variable of the damage model | ||||||
| * @param rValues Parameters of the constitutive law | ||||||
| * @param CharacteristicLength The equivalent length of the FE | ||||||
| * @param SATISFY_MAXIMUM_STRESS Select either maximum stress or tangency at yield point to be satisfied | ||||||
| */ | ||||||
| static void CalculateDoubleExponentialHardeningDamage( | ||||||
| const double UniaxialStress, | ||||||
| const double Threshold, | ||||||
| const double DamageParameter, | ||||||
| const double CharacteristicLength, | ||||||
| ConstitutiveLaw::Parameters& rValues, | ||||||
| double& rDamage | ||||||
| ) | ||||||
| { | ||||||
| const auto &r_mat_props = rValues.GetMaterialProperties(); | ||||||
| const double max_stress = r_mat_props[MAXIMUM_STRESS]; | ||||||
| const double Gf = r_mat_props[FRACTURE_ENERGY]; | ||||||
| const double E = r_mat_props[YOUNG_MODULUS]; | ||||||
| const bool Max_Stress_Satisfied =r_mat_props[SATISFY_MAXIMUM_STRESS]; | ||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
To follow the style |
||||||
|
|
||||||
| double initial_threshold; | ||||||
| TYieldSurfaceType::GetInitialUniaxialThreshold(rValues, initial_threshold); | ||||||
|
|
||||||
| double X = 0.0; | ||||||
| if (Max_Stress_Satisfied) { | ||||||
| X = -std::sqrt(max_stress/(max_stress - initial_threshold)); | ||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. we must check in advance that the denominator is not 0 to avoid |
||||||
| } else { | ||||||
| X = (initial_threshold*initial_threshold/E + Gf + std::sqrt(initial_threshold*initial_threshold/E*(5.0/4.0*initial_threshold*initial_threshold/E+2.0*Gf))) / (0.5*initial_threshold*initial_threshold/E-Gf); | ||||||
| } | ||||||
|
|
||||||
| const double A = ((3.0*X+1.0)*initial_threshold*(UniaxialStress-initial_threshold))/((X+1.0)*(0.5*initial_threshold*initial_threshold-E*Gf)); | ||||||
|
|
||||||
| rDamage = 1-initial_threshold/(UniaxialStress*(X+1.0)) * (2.0*X*std::exp(A/2.0)+(1.0-X)*std::exp(A)); | ||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. please make sure of format the code so you add all spaces between operations, it improves readability. besides better use |
||||||
|
|
||||||
| } | ||||||
|
|
||||||
| /** | ||||||
| * @brief This computes the damage variable according to linear softening | ||||||
| * @param UniaxialStress The equivalent uniaxial stress | ||||||
|
|
||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
you can check if this variable is present in the properties and assign a default if it is not, more convenient. Something like:
const bool satisfy_max_stress = r_mat_props.Has(SATISFY_MAXIMUM_STRESS) ? r_mat_props[SATISFY_MAXIMUM_STRESS] : true;