#6364 Stimplan: add curve and export for reservoir temperature.

This commit is contained in:
Kristian Bendiksen
2020-08-25 14:11:16 +02:00
parent ddc23fa5ea
commit d0322a98ba
8 changed files with 106 additions and 6 deletions

View File

@@ -41,6 +41,7 @@ void AppEnum<RiaDefines::CurveProperty>::setUp()
addItem( RiaDefines::CurveProperty::K0, "K0", "k0" ); addItem( RiaDefines::CurveProperty::K0, "K0", "k0" );
addItem( RiaDefines::CurveProperty::FLUID_LOSS_COEFFICIENT, "FLUID_LOSS_COEFFICIENT", "Fluid Loss Coefficient" ); addItem( RiaDefines::CurveProperty::FLUID_LOSS_COEFFICIENT, "FLUID_LOSS_COEFFICIENT", "Fluid Loss Coefficient" );
addItem( RiaDefines::CurveProperty::SPURT_LOSS, "SPURT_LOSS", "Spurt Loss" ); addItem( RiaDefines::CurveProperty::SPURT_LOSS, "SPURT_LOSS", "Spurt Loss" );
addItem( RiaDefines::CurveProperty::TEMPERATURE, "TEMPERATURE", "Temperature" );
setDefault( RiaDefines::CurveProperty::UNDEFINED ); setDefault( RiaDefines::CurveProperty::UNDEFINED );
} }
}; // namespace caf }; // namespace caf

View File

@@ -43,6 +43,7 @@ enum class CurveProperty
BIOT_COEFFICIENT, BIOT_COEFFICIENT,
K0, K0,
FLUID_LOSS_COEFFICIENT, FLUID_LOSS_COEFFICIENT,
SPURT_LOSS SPURT_LOSS,
TEMPERATURE,
}; };
}; // namespace RiaDefines }; // namespace RiaDefines

View File

@@ -152,6 +152,7 @@ RimFractureModelPlot*
auto task = progInfo.task( "Creating stress track", 2 ); auto task = progInfo.task( "Creating stress track", 2 );
createStressTrack( plot, fractureModel, eclipseCase, timeStep, RiaDefines::CurveProperty::STRESS ); createStressTrack( plot, fractureModel, eclipseCase, timeStep, RiaDefines::CurveProperty::STRESS );
createStressTrack( plot, fractureModel, eclipseCase, timeStep, RiaDefines::CurveProperty::STRESS_GRADIENT ); createStressTrack( plot, fractureModel, eclipseCase, timeStep, RiaDefines::CurveProperty::STRESS_GRADIENT );
createStressTrack( plot, fractureModel, eclipseCase, timeStep, RiaDefines::CurveProperty::TEMPERATURE );
} }
{ {

View File

@@ -168,6 +168,22 @@ RimFractureModel::RimFractureModel()
"", "",
"" ); "" );
CAF_PDM_InitScriptableField( &m_referenceTemperature, "ReferenceTemperature", 20.0, "Temperature [C]", "", "", "" );
CAF_PDM_InitScriptableField( &m_referenceTemperatureGradient,
"ReferenceTemperatureGradient",
0.025,
"Temperature Gradient [C/m]",
"",
"",
"" );
CAF_PDM_InitScriptableField( &m_referenceTemperatureDepth,
"ReferenceTemperatureDepth",
1000.0,
"Temperature Depth [m]",
"",
"",
"" );
CAF_PDM_InitScriptableField( &m_useDetailedFluidLoss, "UseDetailedFluidLoss", true, "Use Detailed Fluid Loss", "", "", "" ); CAF_PDM_InitScriptableField( &m_useDetailedFluidLoss, "UseDetailedFluidLoss", true, "Use Detailed Fluid Loss", "", "", "" );
CAF_PDM_InitScriptableFieldNoDefault( &m_elasticProperties, "ElasticProperties", "Elastic Properties", "", "", "" ); CAF_PDM_InitScriptableFieldNoDefault( &m_elasticProperties, "ElasticProperties", "Elastic Properties", "", "", "" );
@@ -850,3 +866,27 @@ void RimFractureModel::setMD( double md )
updatePositionFromMeasuredDepth(); updatePositionFromMeasuredDepth();
updateThicknessDirection(); updateThicknessDirection();
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
double RimFractureModel::referenceTemperature() const
{
return m_referenceTemperature;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
double RimFractureModel::referenceTemperatureGradient() const
{
return m_referenceTemperatureGradient;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
double RimFractureModel::referenceTemperatureDepth() const
{
return m_referenceTemperatureDepth;
}

View File

@@ -85,6 +85,10 @@ public:
QString underburdenFormation() const; QString underburdenFormation() const;
QString underburdenFacies() const; QString underburdenFacies() const;
double referenceTemperature() const;
double referenceTemperatureGradient() const;
double referenceTemperatureDepth() const;
bool useDetailedFluidLoss() const; bool useDetailedFluidLoss() const;
// RimWellPathCompletionsInterface overrides. // RimWellPathCompletionsInterface overrides.
@@ -153,5 +157,8 @@ protected:
caf::PdmField<QString> m_underburdenFormation; caf::PdmField<QString> m_underburdenFormation;
caf::PdmField<QString> m_underburdenFacies; caf::PdmField<QString> m_underburdenFacies;
caf::PdmField<double> m_underburdenFluidDensity; caf::PdmField<double> m_underburdenFluidDensity;
caf::PdmField<double> m_referenceTemperature;
caf::PdmField<double> m_referenceTemperatureGradient;
caf::PdmField<double> m_referenceTemperatureDepth;
caf::PdmField<bool> m_useDetailedFluidLoss; caf::PdmField<bool> m_useDetailedFluidLoss;
}; };

View File

@@ -480,6 +480,39 @@ std::vector<double> RimFractureModelPlot::calculateStressGradient() const
return stressGradients; return stressGradients;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimFractureModelPlot::calculateTemperature( std::vector<double>& temperatures ) const
{
// Reference temperature. Unit: degrees celsius
const double referenceTemperature = m_fractureModel->referenceTemperature();
// Reference temperature gradient. Unit: degrees Celsius per meter
const double referenceTemperatureGradient = m_fractureModel->referenceTemperatureGradient();
// Reference depth for temperature. Unit: meter.
const double referenceTemperatureDepth = m_fractureModel->referenceTemperatureDepth();
std::vector<std::pair<double, double>> layerBoundaryDepths;
std::vector<std::pair<size_t, size_t>> layerBoundaryIndexes;
calculateLayers( layerBoundaryDepths, layerBoundaryIndexes );
// Calculate the temperatures
for ( size_t i = 0; i < layerBoundaryDepths.size(); i++ )
{
double depthTopOfZone = layerBoundaryDepths[i].first;
// Use difference between reference depth and depth of top of zone
double depthDiff = depthTopOfZone - referenceTemperatureDepth;
double temperature = referenceTemperature + referenceTemperatureGradient * depthDiff;
temperatures.push_back( temperature );
}
return true;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -548,7 +581,17 @@ std::vector<double> RimFractureModelPlot::calculateImmobileFluidSaturation() con
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
std::vector<double> RimFractureModelPlot::calculateTemperature() const std::vector<double> RimFractureModelPlot::calculateTemperature() const
{ {
return std::vector<double>(); std::vector<double> temperaturesCelsius;
calculateTemperature( temperaturesCelsius );
// Convert to Fahrenheit
std::vector<double> temperaturesFahrenheit;
for ( double t : temperaturesCelsius )
{
temperaturesFahrenheit.push_back( t * 1.8 + 32.0 );
}
return temperaturesFahrenheit;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@@ -93,6 +93,8 @@ protected:
RimWellLogExtractionCurve* findCurveByProperty( RiaDefines::CurveProperty curveProperty ) const; RimWellLogExtractionCurve* findCurveByProperty( RiaDefines::CurveProperty curveProperty ) const;
bool calculateStressWithGradients( std::vector<double>& stress, std::vector<double>& stressGradients ) const; bool calculateStressWithGradients( std::vector<double>& stress, std::vector<double>& stressGradients ) const;
bool calculateTemperature( std::vector<double>& temperatures ) const;
static double findValueAtTopOfLayer( const std::vector<double>& values, static double findValueAtTopOfLayer( const std::vector<double>& values,
const std::vector<std::pair<size_t, size_t>>& layerBoundaryIndexes, const std::vector<std::pair<size_t, size_t>>& layerBoundaryIndexes,
size_t layerNo ); size_t layerNo );

View File

@@ -19,6 +19,7 @@
#include "RimFractureModelStressCurve.h" #include "RimFractureModelStressCurve.h"
#include "RiaDefines.h" #include "RiaDefines.h"
#include "RiaFractureModelDefines.h"
#include "RigEclipseCaseData.h" #include "RigEclipseCaseData.h"
#include "RigEclipseWellLogExtractor.h" #include "RigEclipseWellLogExtractor.h"
#include "RigResultAccessorFactory.h" #include "RigResultAccessorFactory.h"
@@ -121,15 +122,19 @@ void RimFractureModelStressCurve::performDataExtraction( bool* isUsingPseudoLeng
tvDepthValues.push_back( RiaEclipseUnitTools::feetToMeter( f ) ); tvDepthValues.push_back( RiaEclipseUnitTools::feetToMeter( f ) );
} }
std::vector<double> stressGradients = fractureModelPlot->calculateStressGradient();
if ( m_curveProperty() == RiaDefines::CurveProperty::STRESS ) if ( m_curveProperty() == RiaDefines::CurveProperty::STRESS )
{ {
values = fractureModelPlot->calculateStress(); values = fractureModelPlot->calculateStress();
std::vector<double> stressGradients = fractureModelPlot->calculateStressGradient();
addDatapointsForBottomOfLayers( tvDepthValues, values, stressGradients ); addDatapointsForBottomOfLayers( tvDepthValues, values, stressGradients );
} }
else else if ( m_curveProperty() == RiaDefines::CurveProperty::STRESS_GRADIENT )
{ {
values = stressGradients; values = fractureModelPlot->calculateStressGradient();
}
else if ( m_curveProperty() == RiaDefines::CurveProperty::TEMPERATURE )
{
values = fractureModelPlot->calculateTemperature();
} }
RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>( m_case.value() ); RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>( m_case.value() );