diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index cba1657ab23..c7d5b86c465 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3940-15307-53de7ba + baseline: integratedTests/baseline_integratedTests-pr3964-15460-26718eb allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 621dd209242..5538f66607e 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3940 (2026-02-09) +===================== +Fix fracture state update for ALM solver + PR #3940 (2026-01-27) ===================== Fix the transimissibility calculated between a cell and a surface element diff --git a/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsAugmentedLagrangianContact.cpp b/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsAugmentedLagrangianContact.cpp index 2d18a5782a0..b0e00a3e322 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsAugmentedLagrangianContact.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsAugmentedLagrangianContact.cpp @@ -912,6 +912,21 @@ void SolidMechanicsAugmentedLagrangianContact::applySystemSolution( DofManager c contact::incrementalBubbleDisplacement::key(), scalingFactor ); + // Synchronize bubble displacements before computing displacement jump + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + string_array const & ) + { + FieldIdentifiers fieldsToBeSync; + fieldsToBeSync.addFields( FieldLocation::Face, + { contact::incrementalBubbleDisplacement::key(), + contact::totalBubbleDisplacement::key() } ); + + CommunicationTools::getInstance().synchronizeFields( fieldsToBeSync, + mesh, + domain.getNeighbors(), + true ); + } ); // Loop for updating the displacement jump forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const & meshName, @@ -962,19 +977,14 @@ void SolidMechanicsAugmentedLagrangianContact::applySystemSolution( DofManager c } ); } ); + // Synchronize displacement jump after computation forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel & mesh, string_array const & ) - { FieldIdentifiers fieldsToBeSync; - fieldsToBeSync.addFields( FieldLocation::Face, - { contact::incrementalBubbleDisplacement::key(), - contact::totalBubbleDisplacement::key() } ); - - fieldsToBeSync.addElementFields( { contact::traction::key(), - contact::dispJump::key(), + fieldsToBeSync.addElementFields( { contact::dispJump::key(), contact::deltaDispJump::key() }, { getUniqueFractureRegionName() } ); diff --git a/src/coreComponents/physicsSolvers/solidMechanics/contact/kernels/SolidMechanicsALMKernelsBase.hpp b/src/coreComponents/physicsSolvers/solidMechanics/contact/kernels/SolidMechanicsALMKernelsBase.hpp index 65841f9c66c..213877afb03 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/contact/kernels/SolidMechanicsALMKernelsBase.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/contact/kernels/SolidMechanicsALMKernelsBase.hpp @@ -144,13 +144,23 @@ struct UpdateStateKernel if( fractureState[k] == fields::contact::FractureState::Open ) { - LvArray::tensorOps::fill< 3 >( localTractionNew, 0.0 ); } else if( LvArray::math::abs( localTractionNew[ 0 ] ) < normalTractionTolerance[k] ) { - LvArray::tensorOps::fill< 3 >( localTractionNew, 0.0 ); - fractureState[k] = fields::contact::FractureState::Slip; + // When normal traction is lower than normalTractionTolerance, check if cohesion allows stick state + // before deciding to transition to slip (fix for high cohesion materials) + real64 dLimitTau_dTraction = 0.0; + real64 const limitTau = contactWrapper.computeLimitTangentialTractionNorm( localTractionNew[ 0 ], dLimitTau_dTraction ); + real64 const currentTau = LvArray::math::sqrt( localTractionNew[1] * localTractionNew[1] + + localTractionNew[2] * localTractionNew[2] ); + + if( currentTau > limitTau ) + { + // Tangential traction exceeds cohesion limit: transition to slip + fractureState[k] = fields::contact::FractureState::Slip; + } + // else: cohesion allows stick state, keep traction as computed by updateTraction() } LvArray::tensorOps::copy< 3 >( traction[k], localTractionNew );