Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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() } );

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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( 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
LvArray::tensorOps::fill< 3 >( localTractionNew, 0.0 );
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@castelletto1 @jafranc
If fields::contact::FractureState::Slip, why zero out localTractionNew?
For open element, it is correct; but for the slipped ones, I guess the normal traction (localTractionNew[0]) should be preserved?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you're right, I kept it the same as before, but logically the traction should remain the same, if not zero.

fractureState[k] = fields::contact::FractureState::Slip;
}
// else: cohesion allows stick state, keep traction as computed by updateTraction()
}

LvArray::tensorOps::copy< 3 >( traction[k], localTractionNew );
Expand Down
Loading