From 9143dd14822f7a9910118867fc79ea1ac3603b95 Mon Sep 17 00:00:00 2001 From: npillardou Date: Thu, 5 Feb 2026 13:16:03 +0100 Subject: [PATCH 1/5] Add fix to fracture state in case of high cohesion --- .../kernels/SolidMechanicsALMKernelsBase.hpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/coreComponents/physicsSolvers/solidMechanics/contact/kernels/SolidMechanicsALMKernelsBase.hpp b/src/coreComponents/physicsSolvers/solidMechanics/contact/kernels/SolidMechanicsALMKernelsBase.hpp index 65841f9c66c..39e515378d2 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/contact/kernels/SolidMechanicsALMKernelsBase.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/contact/kernels/SolidMechanicsALMKernelsBase.hpp @@ -144,13 +144,24 @@ 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 very small, 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( 0.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 + LvArray::tensorOps::fill< 3 >( localTractionNew, 0.0 ); + fractureState[k] = fields::contact::FractureState::Slip; + } + // else: cohesion allows stick state, keep traction as computed by updateTraction() } LvArray::tensorOps::copy< 3 >( traction[k], localTractionNew ); From 616626be592d1b9c57f5e9a4635c62f466bb147d Mon Sep 17 00:00:00 2001 From: npillardou Date: Thu, 5 Feb 2026 13:35:21 +0100 Subject: [PATCH 2/5] Correct traction in limit --- .../contact/kernels/SolidMechanicsALMKernelsBase.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/physicsSolvers/solidMechanics/contact/kernels/SolidMechanicsALMKernelsBase.hpp b/src/coreComponents/physicsSolvers/solidMechanics/contact/kernels/SolidMechanicsALMKernelsBase.hpp index 39e515378d2..12c61d17ccd 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/contact/kernels/SolidMechanicsALMKernelsBase.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/contact/kernels/SolidMechanicsALMKernelsBase.hpp @@ -151,7 +151,7 @@ struct UpdateStateKernel // When normal traction is very small, 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( 0.0, dLimitTau_dTraction ); + real64 const limitTau = contactWrapper.computeLimitTangentialTractionNorm( localTractionNew[ 0 ], dLimitTau_dTraction ); real64 const currentTau = LvArray::math::sqrt( localTractionNew[1] * localTractionNew[1] + localTractionNew[2] * localTractionNew[2] ); From 24cf0efea26da40ac1d3463c0d84d6e0bd90f285 Mon Sep 17 00:00:00 2001 From: npillardou Date: Thu, 5 Feb 2026 16:22:49 +0100 Subject: [PATCH 3/5] Add fix on synchronization for ghost issue remaining --- ...lidMechanicsAugmentedLagrangianContact.cpp | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) 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() } ); From 68d789cc665fcb3936010366a3a319c3370d2059 Mon Sep 17 00:00:00 2001 From: Jian HUANG Date: Thu, 5 Feb 2026 13:28:21 -0600 Subject: [PATCH 4/5] uncrustify --- .../contact/kernels/SolidMechanicsALMKernelsBase.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/physicsSolvers/solidMechanics/contact/kernels/SolidMechanicsALMKernelsBase.hpp b/src/coreComponents/physicsSolvers/solidMechanics/contact/kernels/SolidMechanicsALMKernelsBase.hpp index 12c61d17ccd..7c237a8231c 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/contact/kernels/SolidMechanicsALMKernelsBase.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/contact/kernels/SolidMechanicsALMKernelsBase.hpp @@ -153,7 +153,7 @@ struct UpdateStateKernel 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] ); + localTractionNew[2] * localTractionNew[2] ); if( currentTau > limitTau ) { From 26718ebdde50501a4c8e984ae7a3683a8d5fa5ea Mon Sep 17 00:00:00 2001 From: npillardou Date: Mon, 9 Feb 2026 09:24:05 +0100 Subject: [PATCH 5/5] Correct traction in case of slip --- .../contact/kernels/SolidMechanicsALMKernelsBase.hpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/coreComponents/physicsSolvers/solidMechanics/contact/kernels/SolidMechanicsALMKernelsBase.hpp b/src/coreComponents/physicsSolvers/solidMechanics/contact/kernels/SolidMechanicsALMKernelsBase.hpp index 7c237a8231c..213877afb03 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/contact/kernels/SolidMechanicsALMKernelsBase.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/contact/kernels/SolidMechanicsALMKernelsBase.hpp @@ -148,7 +148,7 @@ struct UpdateStateKernel } else if( LvArray::math::abs( localTractionNew[ 0 ] ) < normalTractionTolerance[k] ) { - // When normal traction is very small, check if cohesion allows stick state + // 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 ); @@ -158,7 +158,6 @@ struct UpdateStateKernel if( currentTau > limitTau ) { // Tangential traction exceeds cohesion limit: transition to slip - LvArray::tensorOps::fill< 3 >( localTractionNew, 0.0 ); fractureState[k] = fields::contact::FractureState::Slip; } // else: cohesion allows stick state, keep traction as computed by updateTraction()