-
Notifications
You must be signed in to change notification settings - Fork 273
[GeoMechanicsApplication] Implement hardening process for Mohr-Coulomb, based on the modified class structure #13965
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
Changes from 3 commits
18d02d5
193f999
a337918
7b2fa35
bad8482
31b63a1
9b064e0
4e72305
35f0ad1
78e86fc
c15c117
d01e531
163654c
a5bde4b
3f502fd
e5da12e
cbae902
064546b
58d7c68
5345b79
4f973a4
1b2c0fc
5439346
f0ba844
277c5a0
051834a
5c28601
9d0845c
c7a7088
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 |
|---|---|---|
|
|
@@ -24,6 +24,16 @@ namespace | |
|
|
||
| using namespace Kratos; | ||
|
|
||
| double CalculatePlasticMultiplier(const Vector& rSigmaTau, | ||
| const Vector& rDerivativeOfFlowFunction, | ||
| double FrictionAngleInRadians, | ||
| double Cohesion) | ||
| { | ||
| const auto sin_phi = std::sin(FrictionAngleInRadians); | ||
| const auto numerator = sin_phi * rDerivativeOfFlowFunction[0] + rDerivativeOfFlowFunction[1]; | ||
| return (Cohesion * std::cos(FrictionAngleInRadians) - rSigmaTau[0] * sin_phi - rSigmaTau[1]) / numerator; | ||
| } | ||
|
|
||
| double CalculateApex(double FrictionAngleInRadians, double Cohesion) | ||
| { | ||
| return Cohesion / std::tan(FrictionAngleInRadians); | ||
|
|
@@ -84,10 +94,8 @@ Vector ReturnStressAtRegularFailureZone(const Vector& rSigmaTau, | |
| double FrictionAngleInRadians, | ||
| double Cohesion) | ||
| { | ||
| const auto sin_phi = std::sin(FrictionAngleInRadians); | ||
| const auto numerator = sin_phi * rDerivativeOfFlowFunction[0] + rDerivativeOfFlowFunction[1]; | ||
| const auto lambda = | ||
| (Cohesion * std::cos(FrictionAngleInRadians) - rSigmaTau[0] * sin_phi - rSigmaTau[1]) / numerator; | ||
| CalculatePlasticMultiplier(rSigmaTau, rDerivativeOfFlowFunction, FrictionAngleInRadians, Cohesion); | ||
| return rSigmaTau + lambda * rDerivativeOfFlowFunction; | ||
| } | ||
|
|
||
|
|
@@ -113,34 +121,55 @@ bool CoulombWithTensionCutOffImpl::IsAdmissibleSigmaTau(const Vector& rTrialSigm | |
|
|
||
| Vector CoulombWithTensionCutOffImpl::DoReturnMapping(const Properties& rProperties, | ||
| const Vector& rTrialSigmaTau, | ||
| CoulombYieldSurface::CoulombAveragingType AveragingType) const | ||
| CoulombYieldSurface::CoulombAveragingType AveragingType) | ||
| { | ||
| const auto apex = CalculateApex(mCoulombYieldSurface.GetFrictionAngleInRadians(), | ||
| mCoulombYieldSurface.GetCohesion()); | ||
|
|
||
| if (IsStressAtTensionApexReturnZone(rTrialSigmaTau, mTensionCutOff.GetTensileStrength(), apex)) { | ||
| return ReturnStressAtTensionApexReturnZone(mTensionCutOff.GetTensileStrength()); | ||
| } | ||
|
|
||
| const auto corner_point = | ||
| CalculateCornerPoint(mCoulombYieldSurface.GetFrictionAngleInRadians(), | ||
| mCoulombYieldSurface.GetCohesion(), mTensionCutOff.GetTensileStrength()); | ||
| if (IsStressAtTensionCutoffReturnZone(rTrialSigmaTau, mTensionCutOff.GetTensileStrength(), apex, corner_point)) { | ||
| return ReturnStressAtTensionCutoffReturnZone( | ||
| rTrialSigmaTau, mTensionCutOff.DerivativeOfFlowFunction(rTrialSigmaTau), | ||
| mTensionCutOff.GetTensileStrength()); | ||
| } | ||
|
|
||
| if (IsStressAtCornerReturnZone( | ||
| Vector result = ZeroVector(2); | ||
|
|
||
| const double kappa_start = mCoulombYieldSurface.GetKappa(); | ||
| double error = 1.0; | ||
| int counter = 0; | ||
| while (error > 1.0e-8) { | ||
mnabideltares marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| const auto apex = CalculateApex(mCoulombYieldSurface.GetFrictionAngleInRadians(), | ||
| mCoulombYieldSurface.GetCohesion()); | ||
mnabideltares marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| if (IsStressAtTensionApexReturnZone(rTrialSigmaTau, mTensionCutOff.GetTensileStrength(), apex)) { | ||
| return ReturnStressAtTensionApexReturnZone(mTensionCutOff.GetTensileStrength()); | ||
| } | ||
|
|
||
| const auto corner_point = CalculateCornerPoint(mCoulombYieldSurface.GetFrictionAngleInRadians(), | ||
| mCoulombYieldSurface.GetCohesion(), | ||
| mTensionCutOff.GetTensileStrength()); | ||
| if (IsStressAtTensionCutoffReturnZone(rTrialSigmaTau, mTensionCutOff.GetTensileStrength(), | ||
| apex, corner_point)) { | ||
| return ReturnStressAtTensionCutoffReturnZone( | ||
| rTrialSigmaTau, mTensionCutOff.DerivativeOfFlowFunction(rTrialSigmaTau), | ||
| mTensionCutOff.GetTensileStrength()); | ||
| } | ||
|
|
||
| if (IsStressAtCornerReturnZone( | ||
| rTrialSigmaTau, mCoulombYieldSurface.DerivativeOfFlowFunction(rTrialSigmaTau, AveragingType), | ||
| corner_point)) { | ||
| result = corner_point; | ||
| } | ||
|
|
||
mnabideltares marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| else { // Regular failure region | ||
| result = ReturnStressAtRegularFailureZone( | ||
| rTrialSigmaTau, mCoulombYieldSurface.DerivativeOfFlowFunction(rTrialSigmaTau, AveragingType), | ||
| mCoulombYieldSurface.GetFrictionAngleInRadians(), mCoulombYieldSurface.GetCohesion()); | ||
| } | ||
|
|
||
| const auto lambda = CalculatePlasticMultiplier( | ||
| rTrialSigmaTau, mCoulombYieldSurface.DerivativeOfFlowFunction(rTrialSigmaTau, AveragingType), | ||
| corner_point)) { | ||
| return corner_point; | ||
| mCoulombYieldSurface.GetFrictionAngleInRadians(), mCoulombYieldSurface.GetCohesion()); | ||
| const double kappa = | ||
| kappa_start + CalculateEquivalentPlasticStrain(rTrialSigmaTau, AveragingType, lambda); | ||
mnabideltares marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| mCoulombYieldSurface.SetKappa(kappa); | ||
|
|
||
| error = std::abs(mCoulombYieldSurface.YieldFunctionValue(result)); | ||
mnabideltares marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| counter++; | ||
| if (counter > 50) break; | ||
| } | ||
|
|
||
| // Regular failure region | ||
| return ReturnStressAtRegularFailureZone( | ||
| rTrialSigmaTau, mCoulombYieldSurface.DerivativeOfFlowFunction(rTrialSigmaTau, AveragingType), | ||
| mCoulombYieldSurface.GetFrictionAngleInRadians(), mCoulombYieldSurface.GetCohesion()); | ||
| return result; | ||
|
Contributor
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. With the proposed |
||
| } | ||
|
|
||
| void CoulombWithTensionCutOffImpl::save(Serializer& rSerializer) const | ||
|
|
@@ -155,4 +184,18 @@ void CoulombWithTensionCutOffImpl::load(Serializer& rSerializer) | |
| rSerializer.load("TensionCutOff", mTensionCutOff); | ||
| } | ||
|
|
||
| double CoulombWithTensionCutOffImpl::CalculateEquivalentPlasticStrain(const Vector& rSigmaTau, | ||
mnabideltares marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| CoulombYieldSurface::CoulombAveragingType AveragingType, | ||
| double lambda) const | ||
| { | ||
| Vector dGdsigma = mCoulombYieldSurface.DerivativeOfFlowFunction(rSigmaTau, AveragingType); | ||
| const auto g1 = (dGdsigma[0] + dGdsigma[1]) * 0.5; | ||
| const auto g3 = (dGdsigma[0] - dGdsigma[1]) * 0.5; | ||
| const auto mean = (g1 + g3) / 3.0; | ||
| const auto deviatoric = std::sqrt(std::pow(g1 - mean, 2) + std::pow(g3 - mean, 2)); | ||
| const auto alpha = std::sqrt(2.0 / 3.0) * deviatoric; | ||
| return -alpha * lambda; | ||
| ; | ||
| } | ||
|
|
||
| } // namespace Kratos | ||
Uh oh!
There was an error while loading. Please reload this page.