From d0322a98ba854c9f1e190983af95d95aefb12ce7 Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Tue, 25 Aug 2020 14:11:16 +0200 Subject: [PATCH] #6364 Stimplan: add curve and export for reservoir temperature. --- .../Application/RiaFractureModelDefines.cpp | 1 + .../Application/RiaFractureModelDefines.h | 3 +- .../RicNewFractureModelPlotFeature.cpp | 1 + .../Completions/RimFractureModel.cpp | 40 +++++++++++++++++ .../Completions/RimFractureModel.h | 7 +++ .../ProjectDataModel/RimFractureModelPlot.cpp | 45 ++++++++++++++++++- .../ProjectDataModel/RimFractureModelPlot.h | 2 + .../RimFractureModelStressCurve.cpp | 13 ++++-- 8 files changed, 106 insertions(+), 6 deletions(-) diff --git a/ApplicationCode/Application/RiaFractureModelDefines.cpp b/ApplicationCode/Application/RiaFractureModelDefines.cpp index 1e73d7c278..5dc3cdaf3a 100644 --- a/ApplicationCode/Application/RiaFractureModelDefines.cpp +++ b/ApplicationCode/Application/RiaFractureModelDefines.cpp @@ -41,6 +41,7 @@ void AppEnum::setUp() addItem( RiaDefines::CurveProperty::K0, "K0", "k0" ); addItem( RiaDefines::CurveProperty::FLUID_LOSS_COEFFICIENT, "FLUID_LOSS_COEFFICIENT", "Fluid Loss Coefficient" ); addItem( RiaDefines::CurveProperty::SPURT_LOSS, "SPURT_LOSS", "Spurt Loss" ); + addItem( RiaDefines::CurveProperty::TEMPERATURE, "TEMPERATURE", "Temperature" ); setDefault( RiaDefines::CurveProperty::UNDEFINED ); } }; // namespace caf diff --git a/ApplicationCode/Application/RiaFractureModelDefines.h b/ApplicationCode/Application/RiaFractureModelDefines.h index fee543822d..b781d36069 100644 --- a/ApplicationCode/Application/RiaFractureModelDefines.h +++ b/ApplicationCode/Application/RiaFractureModelDefines.h @@ -43,6 +43,7 @@ enum class CurveProperty BIOT_COEFFICIENT, K0, FLUID_LOSS_COEFFICIENT, - SPURT_LOSS + SPURT_LOSS, + TEMPERATURE, }; }; // namespace RiaDefines diff --git a/ApplicationCode/Commands/CompletionCommands/RicNewFractureModelPlotFeature.cpp b/ApplicationCode/Commands/CompletionCommands/RicNewFractureModelPlotFeature.cpp index 54cc7f7243..aeab479fcb 100644 --- a/ApplicationCode/Commands/CompletionCommands/RicNewFractureModelPlotFeature.cpp +++ b/ApplicationCode/Commands/CompletionCommands/RicNewFractureModelPlotFeature.cpp @@ -152,6 +152,7 @@ RimFractureModelPlot* auto task = progInfo.task( "Creating stress track", 2 ); createStressTrack( plot, fractureModel, eclipseCase, timeStep, RiaDefines::CurveProperty::STRESS ); createStressTrack( plot, fractureModel, eclipseCase, timeStep, RiaDefines::CurveProperty::STRESS_GRADIENT ); + createStressTrack( plot, fractureModel, eclipseCase, timeStep, RiaDefines::CurveProperty::TEMPERATURE ); } { diff --git a/ApplicationCode/ProjectDataModel/Completions/RimFractureModel.cpp b/ApplicationCode/ProjectDataModel/Completions/RimFractureModel.cpp index 32d1385501..6a24c39e4a 100644 --- a/ApplicationCode/ProjectDataModel/Completions/RimFractureModel.cpp +++ b/ApplicationCode/ProjectDataModel/Completions/RimFractureModel.cpp @@ -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_InitScriptableFieldNoDefault( &m_elasticProperties, "ElasticProperties", "Elastic Properties", "", "", "" ); @@ -850,3 +866,27 @@ void RimFractureModel::setMD( double md ) updatePositionFromMeasuredDepth(); updateThicknessDirection(); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimFractureModel::referenceTemperature() const +{ + return m_referenceTemperature; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimFractureModel::referenceTemperatureGradient() const +{ + return m_referenceTemperatureGradient; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimFractureModel::referenceTemperatureDepth() const +{ + return m_referenceTemperatureDepth; +} diff --git a/ApplicationCode/ProjectDataModel/Completions/RimFractureModel.h b/ApplicationCode/ProjectDataModel/Completions/RimFractureModel.h index 98d25d07dc..151940b5c4 100644 --- a/ApplicationCode/ProjectDataModel/Completions/RimFractureModel.h +++ b/ApplicationCode/ProjectDataModel/Completions/RimFractureModel.h @@ -85,6 +85,10 @@ public: QString underburdenFormation() const; QString underburdenFacies() const; + double referenceTemperature() const; + double referenceTemperatureGradient() const; + double referenceTemperatureDepth() const; + bool useDetailedFluidLoss() const; // RimWellPathCompletionsInterface overrides. @@ -153,5 +157,8 @@ protected: caf::PdmField m_underburdenFormation; caf::PdmField m_underburdenFacies; caf::PdmField m_underburdenFluidDensity; + caf::PdmField m_referenceTemperature; + caf::PdmField m_referenceTemperatureGradient; + caf::PdmField m_referenceTemperatureDepth; caf::PdmField m_useDetailedFluidLoss; }; diff --git a/ApplicationCode/ProjectDataModel/RimFractureModelPlot.cpp b/ApplicationCode/ProjectDataModel/RimFractureModelPlot.cpp index 4ac1e72618..466e8b6780 100644 --- a/ApplicationCode/ProjectDataModel/RimFractureModelPlot.cpp +++ b/ApplicationCode/ProjectDataModel/RimFractureModelPlot.cpp @@ -480,6 +480,39 @@ std::vector RimFractureModelPlot::calculateStressGradient() const return stressGradients; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimFractureModelPlot::calculateTemperature( std::vector& 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> layerBoundaryDepths; + std::vector> 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 RimFractureModelPlot::calculateImmobileFluidSaturation() con //-------------------------------------------------------------------------------------------------- std::vector RimFractureModelPlot::calculateTemperature() const { - return std::vector(); + std::vector temperaturesCelsius; + calculateTemperature( temperaturesCelsius ); + + // Convert to Fahrenheit + std::vector temperaturesFahrenheit; + for ( double t : temperaturesCelsius ) + { + temperaturesFahrenheit.push_back( t * 1.8 + 32.0 ); + } + + return temperaturesFahrenheit; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimFractureModelPlot.h b/ApplicationCode/ProjectDataModel/RimFractureModelPlot.h index 50cbc714e3..995335adca 100644 --- a/ApplicationCode/ProjectDataModel/RimFractureModelPlot.h +++ b/ApplicationCode/ProjectDataModel/RimFractureModelPlot.h @@ -93,6 +93,8 @@ protected: RimWellLogExtractionCurve* findCurveByProperty( RiaDefines::CurveProperty curveProperty ) const; bool calculateStressWithGradients( std::vector& stress, std::vector& stressGradients ) const; + bool calculateTemperature( std::vector& temperatures ) const; + static double findValueAtTopOfLayer( const std::vector& values, const std::vector>& layerBoundaryIndexes, size_t layerNo ); diff --git a/ApplicationCode/ProjectDataModel/RimFractureModelStressCurve.cpp b/ApplicationCode/ProjectDataModel/RimFractureModelStressCurve.cpp index 5eecaff273..08ecedeadb 100644 --- a/ApplicationCode/ProjectDataModel/RimFractureModelStressCurve.cpp +++ b/ApplicationCode/ProjectDataModel/RimFractureModelStressCurve.cpp @@ -19,6 +19,7 @@ #include "RimFractureModelStressCurve.h" #include "RiaDefines.h" +#include "RiaFractureModelDefines.h" #include "RigEclipseCaseData.h" #include "RigEclipseWellLogExtractor.h" #include "RigResultAccessorFactory.h" @@ -121,15 +122,19 @@ void RimFractureModelStressCurve::performDataExtraction( bool* isUsingPseudoLeng tvDepthValues.push_back( RiaEclipseUnitTools::feetToMeter( f ) ); } - std::vector stressGradients = fractureModelPlot->calculateStressGradient(); if ( m_curveProperty() == RiaDefines::CurveProperty::STRESS ) { - values = fractureModelPlot->calculateStress(); + values = fractureModelPlot->calculateStress(); + std::vector stressGradients = fractureModelPlot->calculateStressGradient(); 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( m_case.value() );