[Mohr-Coulomb] Add corner return for simultaneous tension-shear yielding#116
[Mohr-Coulomb] Add corner return for simultaneous tension-shear yielding#116Curiim wants to merge 9 commits into
Conversation
bodhinandach
left a comment
There was a problem hiding this comment.
I'm blocking this for now, but I think we should take a closer look at this, @ningyiw01.
…stitutive/mohr_coulomb
…stitutive/mohr_coulomb
Co-authored-by: Copilot <copilot@github.com>
| yield_function(0) <= -Tolerance) { | ||
| (*state_vars).at("yield_state") = 1; // Shear | ||
| } else { | ||
| (*state_vars).at("yield_state") = 0; // Elastic |
There was a problem hiding this comment.
Should this not be possible?
There was a problem hiding this comment.
Talked this through with Ningyi a bit. I think the purpose is just to finalize the yield state on that final iteration of the loop depending on which surface we're closest too. Arguably this should be accomplished as a part of the compute_yield_state functionality. Regardless, I'd think that we shouldn't ever be able to return an elastic yield state if we need to enter this iteration loop.
There was a problem hiding this comment.
Better to change this to a corner state
| // A. Re-evaluate invariants and active surface at current stress. | ||
| // --------------------------------------------------------------------- | ||
| this->compute_stress_invariants(current_stress, state_vars); | ||
| yield_type = this->compute_yield_state(&yield_function, (*state_vars)); |
There was a problem hiding this comment.
In the first step, this will be the same as Line 373-377, right? Maybe we should just evaluate this at the very end of the iteration instead?
| if (yield_function(0) > yield_function(1)) { | ||
| yield_type = mpm::mohrcoulomb::FailureState::Tensile; | ||
| } else { | ||
| yield_type = mpm::mohrcoulomb::FailureState::Shear; | ||
| } |
There was a problem hiding this comment.
Do we need to assign (*state_vars).at("yield_state") here?
| if (corner_success) { | ||
| stress_correction = corner_correction; | ||
| dpdstrain_inc = corner_dpdstrain; |
There was a problem hiding this comment.
what is the suitable (*state_vars).at("yield_state") here?
cgeudeker
left a comment
There was a problem hiding this comment.
Quite a discrepancy in evaluated stresses in the test cases right now. Often on the order of 25% increases in magnitude, so it seems likely that there may be some bug here. May also be best to limit the determination of the yield state to the associated compute_yield_state function and have any following if else statements to be determined by that evaluation.
| const mpm::dense_map& state_vars) { | ||
| // Tolerance for yield function | ||
| const double Tolerance = -1E-1; | ||
| const double Tolerance = 1E-7; |
There was a problem hiding this comment.
This reduction leads to issues with identifying the expected yield state for some of the test cases. Reverting back to the previous value fixes the issue.
| yield_function(0) <= -Tolerance) { | ||
| (*state_vars).at("yield_state") = 1; // Shear | ||
| } else { | ||
| (*state_vars).at("yield_state") = 0; // Elastic |
There was a problem hiding this comment.
Talked this through with Ningyi a bit. I think the purpose is just to finalize the yield state on that final iteration of the loop depending on which surface we're closest too. Arguably this should be accomplished as a part of the compute_yield_state functionality. Regardless, I'd think that we shouldn't ever be able to return an elastic yield state if we need to enter this iteration loop.
| // --------------------------------------------------------------------- | ||
| // B. Convergence check | ||
| // --------------------------------------------------------------------- | ||
| if (yield_function(0) <= Tolerance && yield_function(1) <= Tolerance) { |
There was a problem hiding this comment.
This should be an absolute value to avoid overshooting.
| yield_function(0) <= -Tolerance) { | ||
| (*state_vars).at("yield_state") = 1; // Shear | ||
| } else { | ||
| (*state_vars).at("yield_state") = 0; // Elastic |
There was a problem hiding this comment.
Better to change this to a corner state
Summary
This PR extracts only the theory-critical changes in Mohr-Coulomb stress integration.
Changes
compute_yield_state(1e-7)compute_stressinto:compute_single_surface_returncompute_corner_returnupdate_softening_parameters