Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: enable BartonBandis model for contact solver #3556

Open
wants to merge 18 commits into
base: develop
Choose a base branch
from

Conversation

jhuang2601
Copy link
Contributor

@jhuang2601 jhuang2601 commented Feb 18, 2025

Following #3197, this PR

  • enable BartonBandis model for contact solver and other fracture models
  • add smoke tests for this feature

real64 const hydraulicAperture = ( aperture >= 0.0 ) ? (aperture + m_aperture0) : m_aperture0 / ( 1 + 9*normalTraction/m_referenceNormalStress );
dHydraulicAperture_dNormalStress = ( aperture >= 0.0 ) ? 0.0 : -hydraulicAperture / ( 1 + 9*normalTraction/m_referenceNormalStress ) * 9/m_referenceNormalStress;
dHydraulicAperture_aperture = ( aperture >= 0.0 ) ? 1.0 : 0.0;
real64 const hydraulicAperture = ( fractureState >= 3.0 ) ? (aperture + m_aperture0) : m_aperture0 / ( 1 + 9*normalTraction/m_referenceNormalStress );
Copy link
Contributor

Choose a reason for hiding this comment

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

We may want to be cautious about the convention of the normalTraction here. Here normalTraction is defined as positive for compression.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yes, we need to ensure that the sign convention for normalTraction and referenceNormalStress is consistent.

@jhuang2601 jhuang2601 added type: feature New feature or request Theme - FF Faults & fractures modeling flag: ready for review labels Feb 20, 2025
dHydraulicAperture_dNormalStress = ( aperture >= 0.0 ) ? 0.0 : -hydraulicAperture / ( 1 + 9*normalTraction/m_referenceNormalStress ) * 9/m_referenceNormalStress;
dHydraulicAperture_aperture = ( aperture >= 0.0 ) ? 1.0 : 0.0;
real64 const hydraulicAperture = ( fractureState >= 3.0 ) ? (aperture + m_aperture0) : m_aperture0 / ( 1 + 9*LvArray::math::abs(normalTraction)/m_referenceNormalStress );
dHydraulicAperture_dNormalStress = ( fractureState >= 3.0 ) ? 0.0 : -hydraulicAperture / ( 1 + 9*LvArray::math::abs(normalTraction)/m_referenceNormalStress ) * 9/m_referenceNormalStress;
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
dHydraulicAperture_dNormalStress = ( fractureState >= 3.0 ) ? 0.0 : -hydraulicAperture / ( 1 + 9*LvArray::math::abs(normalTraction)/m_referenceNormalStress ) * 9/m_referenceNormalStress;
dHydraulicAperture_dNormalStress = ( fractureState == FractureState::Open ) ? 0.0 : -hydraulicAperture / ( 1 + 9*LvArray::math::abs(normalTraction)/m_referenceNormalStress ) * 9/m_referenceNormalStress;

dHydraulicAperture_aperture = ( aperture >= 0.0 ) ? 1.0 : 0.0;
real64 const hydraulicAperture = ( fractureState >= 3.0 ) ? (aperture + m_aperture0) : m_aperture0 / ( 1 + 9*LvArray::math::abs(normalTraction)/m_referenceNormalStress );
dHydraulicAperture_dNormalStress = ( fractureState >= 3.0 ) ? 0.0 : -hydraulicAperture / ( 1 + 9*LvArray::math::abs(normalTraction)/m_referenceNormalStress ) * 9/m_referenceNormalStress;
dHydraulicAperture_aperture = ( fractureState >= 3.0 ) ? 1.0 : 0.0;
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
dHydraulicAperture_aperture = ( fractureState >= 3.0 ) ? 1.0 : 0.0;
dHydraulicAperture_aperture = ( fractureState >= fractureState == FractureState::Open ) ? 1.0 : 0.0;

Copy link
Collaborator

Choose a reason for hiding this comment

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

you may just need to include FractureState.hpp

@@ -156,10 +157,11 @@ GEOS_HOST_DEVICE
GEOS_FORCE_INLINE
real64 HydraulicApertureTableUpdates::computeHydraulicAperture( real64 const aperture,
real64 const normalTraction,
integer const fractureState,
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
integer const fractureState,
FractureState const fractureState,

@@ -770,6 +770,7 @@ void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::updateHydraulic
arrayView1d< real64 > const aperture = subRegion.getElementAperture();
arrayView1d< real64 > const hydraulicAperture = subRegion.getField< flow::hydraulicAperture >();
arrayView1d< real64 > const deltaVolume = subRegion.getField< flow::deltaVolume >();
arrayView1d< integer > const & fractureState = subRegion.getField< contact::fractureState >();
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
arrayView1d< integer > const & fractureState = subRegion.getField< contact::fractureState >();
arrayView1d< FractureState > const & fractureState = subRegion.getField< contact::fractureState >();

@@ -505,6 +505,8 @@ void SinglePhasePoromechanicsEmbeddedFractures::updateState( DomainPartition & d

arrayView2d< real64 > const & fractureContactTraction = subRegion.template getField< contact::traction >();

arrayView1d< integer > const & fractureState = subRegion.template getField< contact::fractureState >();
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
arrayView1d< integer > const & fractureState = subRegion.template getField< contact::fractureState >();
arrayView1d< FractureState > const & fractureState = subRegion.template getField< contact::fractureState >();

@@ -341,7 +341,8 @@ struct StateUpdateKernel
arrayView1d< real64 > const & aperture,
arrayView1d< real64 const > const & oldHydraulicAperture,
arrayView1d< real64 > const & hydraulicAperture,
arrayView2d< real64 > const & fractureEffectiveTraction )
arrayView2d< real64 > const & fractureEffectiveTraction,
arrayView1d< integer > const & fractureState )
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
arrayView1d< integer > const & fractureState )
arrayView1d< FractureState > const & fractureState )

@@ -150,8 +152,10 @@ struct FluidMassResidualDerivativeAssemblyKernel
real64 dHydraulicAperture_dNormalJump = 0.0;
real64 dHydraulicAperture_dTraction = 0.0;
real64 fractureTraction = 0.0;
integer fractureState = 0;
Copy link
Collaborator

Choose a reason for hiding this comment

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

why forcing this to be 0?

using namespace fields::contact;

real64 const hydraulicAperture = ( fractureState == FractureState::Open ) ? (aperture + m_aperture0) : m_aperture0 / ( 1 + 9*LvArray::math::abs(normalTraction)/m_referenceNormalStress );
dHydraulicAperture_dNormalStress = ( fractureState == FractureState::Open ) ? 0.0 : -hydraulicAperture / ( 1 + 9*LvArray::math::abs(normalTraction)/m_referenceNormalStress ) * 9/m_referenceNormalStress;
Copy link
Contributor

Choose a reason for hiding this comment

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

For fractureState != FractureState::Open, shouldn't it be dHydraulicAperture_dNormalStress = -hydraulicAperture / ( 1 + 9*abs(normalTraction)/m_referenceNormalStress ) * 9/m_referenceNormalStress * normalTraction/abs(normalTraction)?


real64 const hydraulicAperture = ( fractureState == FractureState::Open ) ? (aperture + m_aperture0) : m_aperture0 / ( 1 + 9*LvArray::math::abs(normalTraction)/m_referenceNormalStress );
dHydraulicAperture_dNormalStress = ( fractureState == FractureState::Open ) ? 0.0 : -hydraulicAperture / ( 1 + 9*LvArray::math::abs(normalTraction)/m_referenceNormalStress ) * 9/m_referenceNormalStress;
dHydraulicAperture_aperture = ( fractureState == FractureState::Open ) ? 1.0 : 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.

For current HydroFractureSolver, if the fracture is not open, this cannot be zero if we update HydraulicAperture implicitly using the current aperture. It should be something like dHydraulicAperture_aperture = dHydraulicAperture_dNormalStress * dNormalStress_dAperture where dNormalStress_dAperture = penaltyStiffness.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
flag: ready for review Theme - FF Faults & fractures modeling type: feature New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants