mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#6364 Stimplan: add curve and export for reservoir temperature.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -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 );
|
||||||
|
|||||||
@@ -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() );
|
||||||
|
|||||||
Reference in New Issue
Block a user