Reveal: fix transmissibility calculation when filter cake is not present.

The "absolute" filter cake adjustment should only be used for cells when
filter cake is present (i.e filtrate thickness is not zero).
This commit is contained in:
Kristian Bendiksen 2023-11-08 11:14:24 +01:00
parent 02df80e0cc
commit 18c29d5fc7
5 changed files with 35 additions and 5 deletions

View File

@ -73,6 +73,14 @@ QString viscosityResultName()
return "Viscosity";
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString filtrateThicknessResultName()
{
return "FiltrateThickness";
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -98,7 +106,7 @@ QString getExpectedThermalFractureUnit( const QString& name, RiaDefines::Eclipse
{ "Velocity", { "m/sec", "ft/sec" } },
{ "ResPressure", { "BARa", "psia" } },
{ "ResTemperature", { "deg C", "deg F" } },
{ "FiltrateThickness", { "cm", "inches" } },
{ RiaDefines::filtrateThicknessResultName(), { "cm", "inches" } },
{ RiaDefines::filtratePressureDropResultName(), { "bar", "psi" } },
{ "EffectiveResStress", { "bar", "psi" } },
{ "EffectiveFracStress", { "bar", "psi" } },

View File

@ -30,6 +30,7 @@ QString leakoffMobilityResultName();
QString filterCakeMobilityResultName();
QString injectivityFactorResultName();
QString viscosityResultName();
QString filtrateThicknessResultName();
QString getExpectedThermalFractureUnit( const QString& name, RiaDefines::EclipseUnitSystem unitSystem );

View File

@ -85,6 +85,7 @@ void RigEclipseToStimPlanCalculator::computeValues()
std::vector<std::vector<double>> injectivityFactors;
std::vector<std::vector<double>> viscosities;
std::vector<std::vector<double>> filterCakeMobilities;
std::vector<std::vector<double>> filtrateThicknesses;
RimThermalFractureTemplate* thermalFractureTemplate = dynamic_cast<RimThermalFractureTemplate*>( m_fracture->fractureTemplate() );
@ -110,6 +111,12 @@ void RigEclipseToStimPlanCalculator::computeValues()
RiaDefines::getExpectedThermalFractureUnit( RiaDefines::filterCakeMobilityResultName(),
unitSystem ),
timeStep );
filtrateThicknesses =
thermalFractureTemplate->resultValues( RiaDefines::filtrateThicknessResultName(),
RiaDefines::getExpectedThermalFractureUnit( RiaDefines::filtrateThicknessResultName(),
unitSystem ),
timeStep );
}
for ( size_t i = 0; i < m_fractureGrid.fractureCells().size(); i++ )
@ -127,6 +134,7 @@ void RigEclipseToStimPlanCalculator::computeValues()
double injectivityFactor = resultValueAtIJ( injectivityFactors, m_fractureGrid, cellI, cellJ );
double viscosity = resultValueAtIJ( viscosities, m_fractureGrid, cellI, cellJ );
double filterCakeMobility = resultValueAtIJ( filterCakeMobilities, m_fractureGrid, cellI, cellJ );
double filtrateThickness = resultValueAtIJ( filtrateThicknesses, m_fractureGrid, cellI, cellJ );
// Assumed value
double relativePermeability = 1.0;
@ -141,6 +149,7 @@ void RigEclipseToStimPlanCalculator::computeValues()
filterPressureDropType,
injectivityFactor,
filterCakeMobility,
filtrateThickness,
viscosity,
relativePermeability );
}

View File

@ -35,12 +35,14 @@ RigEclipseToThermalCellTransmissibilityCalculator::RigEclipseToThermalCellTransm
RimThermalFractureTemplate::FilterCakePressureDrop filterCakePressureDrop,
double injectivityFactor,
double filterCakeMobility,
double filtrateThickness,
double viscosity,
double relativePermeability )
: RigEclipseToStimPlanCellTransmissibilityCalculator( caseToApply, fractureTransform, skinFactor, cDarcy, stimPlanCell, fracture )
, m_filterCakePressureDrop( filterCakePressureDrop )
, m_injectivityFactor( injectivityFactor )
, m_filterCakeMobility( filterCakeMobility )
, m_filtrateThickness( filtrateThickness )
, m_viscosity( viscosity )
, m_relativePermeability( relativePermeability )
{
@ -60,11 +62,19 @@ double RigEclipseToThermalCellTransmissibilityCalculator::calculateTransmissibil
}
else if ( m_filterCakePressureDrop == RimThermalFractureTemplate::FilterCakePressureDrop::ABSOLUTE )
{
double filterCakeTransmissibility = ( m_viscosity / m_relativePermeability ) * fractureArea * m_filterCakeMobility;
// Take filter cake transmissibility into account only when filter cake exists (i.e. has thickness).
if ( m_filtrateThickness > 0.0 )
{
double filterCakeTransmissibility = ( m_viscosity / m_relativePermeability ) * fractureArea * m_filterCakeMobility;
// Harmonic mean
return ( fractureMatrixTransimissibility * filterCakeTransmissibility ) /
( fractureMatrixTransimissibility + filterCakeTransmissibility );
// Harmonic mean
return ( fractureMatrixTransimissibility * filterCakeTransmissibility ) /
( fractureMatrixTransimissibility + filterCakeTransmissibility );
}
else
{
return fractureMatrixTransimissibility;
}
}
else
{

View File

@ -53,6 +53,7 @@ public:
RimThermalFractureTemplate::FilterCakePressureDrop filterCakePressureDrop,
double injectvityFactor,
double filterCakeMobility,
double filtrateThickness,
double viscosity,
double relativePermeability );
@ -62,6 +63,7 @@ protected:
RimThermalFractureTemplate::FilterCakePressureDrop m_filterCakePressureDrop;
double m_injectivityFactor;
double m_filterCakeMobility;
double m_filtrateThickness;
double m_viscosity;
double m_relativePermeability;
};