@@ -253,6 +253,13 @@ void SolidMechanicsLagrangeContact::computeTolerances( DomainPartition & domain
253253{
254254 GEOS_MARK_FUNCTION;
255255
256+ real64 minNormalTractionTolerance ( 1e10 );
257+ real64 maxNormalTractionTolerance ( -1e10 );
258+ real64 minNormalDisplacementTolerance ( 1e10 );
259+ real64 maxNormalDisplacementTolerance ( -1e10 );
260+ real64 minSlidingTolerance ( 1e10 );
261+ real64 maxSlidingTolerance ( -1e10 );
262+
256263 forDiscretizationOnMeshTargets ( domain.getMeshBodies (), [&] ( string const &,
257264 MeshLevel & mesh,
258265 arrayView1d< string const > const & )
@@ -302,6 +309,13 @@ void SolidMechanicsLagrangeContact::computeTolerances( DomainPartition & domain
302309 arrayView1d< real64 > const & slidingTolerance =
303310 subRegion.getReference < array1d< real64 > >( viewKeyStruct::slidingToleranceString () );
304311
312+ RAJA::ReduceMin< ReducePolicy< parallelHostPolicy >, real64 > minSubRegionNormalTractionTolerance ( 1e10 );
313+ RAJA::ReduceMax< ReducePolicy< parallelHostPolicy >, real64 > maxSubRegionNormalTractionTolerance ( -1e10 );
314+ RAJA::ReduceMin< ReducePolicy< parallelHostPolicy >, real64 > minSubRegionNormalDisplacementTolerance ( 1e10 );
315+ RAJA::ReduceMax< ReducePolicy< parallelHostPolicy >, real64 > maxSubRegionNormalDisplacementTolerance ( -1e10 );
316+ RAJA::ReduceMin< ReducePolicy< parallelHostPolicy >, real64 > minSubRegionSlidingTolerance ( 1e10 );
317+ RAJA::ReduceMax< ReducePolicy< parallelHostPolicy >, real64 > maxSubRegionSlidingTolerance ( -1e10 );
318+
305319 forAll< parallelHostPolicy >( subRegion.size (), [=] ( localIndex const kfe )
306320 {
307321 if ( ghostRank[kfe] < 0 )
@@ -385,15 +399,36 @@ void SolidMechanicsLagrangeContact::computeTolerances( DomainPartition & domain
385399 LvArray::tensorOps::scale< 3 , 3 >( rotatedInvStiffApprox, area );
386400
387401 // Finally, compute tolerances for the given fracture element
402+
388403 normalDisplacementTolerance[kfe] = rotatedInvStiffApprox[ 0 ][ 0 ] * averageYoungModulus / 2 .e +7 ;
404+ minSubRegionNormalDisplacementTolerance.min ( normalDisplacementTolerance[kfe] );
405+ maxSubRegionNormalDisplacementTolerance.max ( normalDisplacementTolerance[kfe] );
406+
389407 slidingTolerance[kfe] = sqrt ( rotatedInvStiffApprox[ 1 ][ 1 ] * rotatedInvStiffApprox[ 1 ][ 1 ] +
390408 rotatedInvStiffApprox[ 2 ][ 2 ] * rotatedInvStiffApprox[ 2 ][ 2 ] ) * averageYoungModulus / 2 .e +7 ;
409+ minSubRegionSlidingTolerance.min ( slidingTolerance[kfe] );
410+ maxSubRegionSlidingTolerance.max ( slidingTolerance[kfe] );
411+
391412 normalTractionTolerance[kfe] = 1.0 / 2.0 * averageConstrainedModulus / averageBoxSize0 * normalDisplacementTolerance[kfe];
413+ minSubRegionNormalTractionTolerance.min ( normalTractionTolerance[kfe] );
414+ maxSubRegionNormalTractionTolerance.max ( normalTractionTolerance[kfe] );
392415 }
393416 } );
417+
418+ minNormalDisplacementTolerance = std::min ( minNormalDisplacementTolerance, minSubRegionNormalDisplacementTolerance.get () );
419+ maxNormalDisplacementTolerance = std::max ( maxNormalDisplacementTolerance, maxSubRegionNormalDisplacementTolerance.get () );
420+ minSlidingTolerance = std::min ( minSlidingTolerance, minSubRegionSlidingTolerance.get () );
421+ maxSlidingTolerance = std::max ( maxSlidingTolerance, maxSubRegionSlidingTolerance.get () );
422+ minNormalTractionTolerance = std::min ( minNormalTractionTolerance, minSubRegionNormalTractionTolerance.get () );
423+ maxNormalTractionTolerance = std::max ( maxNormalTractionTolerance, maxSubRegionNormalTractionTolerance.get () );
394424 }
395425 } );
396426 } );
427+
428+ GEOS_LOG_LEVEL_RANK_0 ( 2 , GEOS_FMT ( " {}: normal displacement tolerance = [{}, {}], sliding tolerance = [{}, {}], normal traction tolerance = [{}, {}]" ,
429+ this ->getName (), minNormalDisplacementTolerance, maxNormalDisplacementTolerance,
430+ minSlidingTolerance, maxSlidingTolerance,
431+ minNormalTractionTolerance, maxNormalTractionTolerance ) );
397432}
398433
399434void SolidMechanicsLagrangeContact::resetStateToBeginningOfStep ( DomainPartition & domain )
@@ -586,7 +621,7 @@ void SolidMechanicsLagrangeContact::assembleSystem( real64 const time,
586621
587622 assembleContact ( domain, dofManager, localMatrix, localRhs );
588623
589- // for sequenatial : add (fixed) pressure force contribution into residual (no derivatives)
624+ // for sequential : add (fixed) pressure force contribution into residual (no derivatives)
590625 if ( m_isFixedStressPoromechanicsUpdate )
591626 {
592627 forDiscretizationOnMeshTargets ( domain.getMeshBodies (), [&]( string const &,
@@ -2221,20 +2256,24 @@ bool SolidMechanicsLagrangeContact::updateConfiguration( DomainPartition & domai
22212256 if ( ghostRank[kfe] < 0 )
22222257 {
22232258 integer const originalFractureState = fractureState[kfe];
2224- if ( originalFractureState == contact:: FractureState::Open )
2259+ if ( originalFractureState == FractureState::Open )
22252260 {
2226- if ( dispJump[kfe][0 ] > -normalDisplacementTolerance[kfe] )
2261+ if ( dispJump[kfe][0 ] <= -normalDisplacementTolerance[kfe] )
22272262 {
2228- fractureState[kfe] = contact:: FractureState::Open ;
2229- }
2230- else
2231- {
2232- fractureState [kfe] = contact::FractureState::Stick ;
2263+ fractureState[kfe] = FractureState::Stick ;
2264+ if ( getLogLevel () >= 10 )
2265+ GEOS_LOG ( GEOS_FMT ( " {}: {} -> {}: dispJump = {}, normalDisplacementTolerance = {} " ,
2266+ kfe, originalFractureState, fractureState[kfe],
2267+ dispJump [kfe][ 0 ], normalDisplacementTolerance[kfe] ) ) ;
22332268 }
22342269 }
22352270 else if ( traction[kfe][0 ] > normalTractionTolerance[kfe] )
22362271 {
2237- fractureState[kfe] = contact::FractureState::Open;
2272+ fractureState[kfe] = FractureState::Open;
2273+ if ( getLogLevel () >= 10 )
2274+ GEOS_LOG ( GEOS_FMT ( " {}: {} -> {}: traction = {}, normalTractionTolerance = {}" ,
2275+ kfe, originalFractureState, fractureState[kfe],
2276+ traction[kfe][0 ], normalTractionTolerance[kfe] ) );
22382277 }
22392278 else
22402279 {
@@ -2245,29 +2284,33 @@ bool SolidMechanicsLagrangeContact::updateConfiguration( DomainPartition & domai
22452284 contactWrapper.computeLimitTangentialTractionNorm ( traction[kfe][0 ],
22462285 dLimitTangentialTractionNorm_dTraction );
22472286
2248- if ( originalFractureState == contact:: FractureState::Stick && currentTau >= limitTau )
2287+ if ( originalFractureState == FractureState::Stick && currentTau >= limitTau )
22492288 {
22502289 currentTau *= (1.0 - m_slidingCheckTolerance);
22512290 }
2252- else if ( originalFractureState != contact:: FractureState::Stick && currentTau <= limitTau )
2291+ else if ( originalFractureState != FractureState::Stick && currentTau <= limitTau )
22532292 {
22542293 currentTau *= (1.0 + m_slidingCheckTolerance);
22552294 }
22562295 if ( currentTau > limitTau )
22572296 {
2258- if ( originalFractureState == contact:: FractureState::Stick )
2297+ if ( originalFractureState == FractureState::Stick )
22592298 {
2260- fractureState[kfe] = contact:: FractureState::NewSlip;
2299+ fractureState[kfe] = FractureState::NewSlip;
22612300 }
22622301 else
22632302 {
2264- fractureState[kfe] = contact:: FractureState::Slip;
2303+ fractureState[kfe] = FractureState::Slip;
22652304 }
22662305 }
22672306 else
22682307 {
2269- fractureState[kfe] = contact:: FractureState::Stick;
2308+ fractureState[kfe] = FractureState::Stick;
22702309 }
2310+ if ( getLogLevel () >= 10 && fractureState[kfe] != originalFractureState )
2311+ GEOS_LOG ( GEOS_FMT ( " {}: {} -> {}: currentTau = {}, limitTau = {}" ,
2312+ kfe, originalFractureState, fractureState[kfe],
2313+ currentTau, limitTau ) );
22712314 }
22722315
22732316 changed += faceArea[kfe] * !compareFractureStates ( originalFractureState, fractureState[kfe] );
@@ -2289,21 +2332,23 @@ bool SolidMechanicsLagrangeContact::updateConfiguration( DomainPartition & domai
22892332 // and total area of fracture elements
22902333 totalArea = MpiWrapper::sum ( totalArea );
22912334
2335+ GEOS_LOG_LEVEL_RANK_0 ( 2 , GEOS_FMT ( " {}: changed area {} out of {}" , getName (), changedArea, totalArea ) );
2336+
22922337 // Assume converged if changed area is below certain fraction of total area
22932338 return changedArea <= m_nonlinearSolverParameters.m_configurationTolerance * totalArea;
22942339}
22952340
22962341bool SolidMechanicsLagrangeContact::isFractureAllInStickCondition ( DomainPartition const & domain ) const
22972342{
2298- globalIndex numStick, numSlip, numOpen;
2343+ globalIndex numStick, numNewSlip, numSlip, numOpen;
22992344 forDiscretizationOnMeshTargets ( domain.getMeshBodies (), [&] ( string const &,
23002345 MeshLevel const & mesh,
23012346 arrayView1d< string const > const & )
23022347 {
2303- computeFractureStateStatistics ( mesh, numStick, numSlip, numOpen );
2348+ computeFractureStateStatistics ( mesh, numStick, numNewSlip, numSlip, numOpen );
23042349 } );
23052350
2306- return ( ( numSlip + numOpen ) == 0 );
2351+ return ( ( numNewSlip + numSlip + numOpen ) == 0 );
23072352}
23082353
23092354real64 SolidMechanicsLagrangeContact::setNextDt ( real64 const & currentDt,
0 commit comments