From 8567841b8795c753273f2dc43f45af5d40e4ccdd Mon Sep 17 00:00:00 2001 From: jonjenssen <69144954+jonjenssen@users.noreply.github.com> Date: Fri, 7 Feb 2025 07:24:54 +0100 Subject: [PATCH] Add support for mobile oil/gas/hc columns (#12129) * Add support for calculating mobile oil/gas/hc columns in contour maps --- .../Application/RiaResultNames.cpp | 16 ++ .../Application/RiaResultNames.h | 3 + ApplicationLibCode/CMakeLists.txt | 1 + .../RicContourMapPickEventHandler.cpp | 2 +- .../RicCreateContourMapPolygonTools.cpp | 2 +- .../RicExportContourMapToTextFeature.cpp | 2 +- .../RivContourMapProjectionPartMgr.cpp | 4 +- .../RivContourMapProjectionPartMgr.h | 2 +- .../ContourMap/RimContourMapProjection.cpp | 85 ++++++- .../ContourMap/RimContourMapProjection.h | 12 +- .../RimEclipseContourMapProjection.cpp | 14 +- .../ContourMap/RimStatisticsContourMap.cpp | 62 +++++- .../ContourMap/RimStatisticsContourMap.h | 7 +- .../RimStatisticsContourMapProjection.cpp | 8 +- .../RimGeoMechContourMapProjection.cpp | 8 +- .../Rim3dOverlayInfoConfig.cpp | 2 +- .../RimHistogramCalculator.cpp | 2 +- .../ReservoirDataModel/CMakeLists_files.cmake | 20 -- .../ContourMap/CMakeLists_files.cmake | 28 +++ .../RigContourMapCalculator.cpp | 16 +- .../RigContourMapCalculator.h | 6 +- .../{ => ContourMap}/RigContourMapGrid.cpp | 0 .../{ => ContourMap}/RigContourMapGrid.h | 0 .../RigContourMapProjection.cpp | 0 .../RigContourMapProjection.h | 0 .../RigContourMapTrianglesGenerator.cpp | 0 .../RigContourMapTrianglesGenerator.h | 0 .../RigContourPolygonsTools.cpp | 0 .../RigContourPolygonsTools.h | 0 .../RigEclipseContourMapProjection.cpp | 208 ++++++++++++++---- .../RigEclipseContourMapProjection.h | 33 ++- .../ContourMap/RigFloodingSettings.cpp | 88 ++++++++ .../ContourMap/RigFloodingSettings.h | 48 ++++ .../RigGeoMechContourMapProjection.cpp | 0 .../RigGeoMechContourMapProjection.h | 0 .../RigStatisticsContourMapProjection.cpp | 0 .../RigStatisticsContourMapProjection.h | 0 37 files changed, 565 insertions(+), 114 deletions(-) create mode 100644 ApplicationLibCode/ReservoirDataModel/ContourMap/CMakeLists_files.cmake rename ApplicationLibCode/ReservoirDataModel/{ => ContourMap}/RigContourMapCalculator.cpp (96%) rename ApplicationLibCode/ReservoirDataModel/{ => ContourMap}/RigContourMapCalculator.h (96%) rename ApplicationLibCode/ReservoirDataModel/{ => ContourMap}/RigContourMapGrid.cpp (100%) rename ApplicationLibCode/ReservoirDataModel/{ => ContourMap}/RigContourMapGrid.h (100%) rename ApplicationLibCode/ReservoirDataModel/{ => ContourMap}/RigContourMapProjection.cpp (100%) rename ApplicationLibCode/ReservoirDataModel/{ => ContourMap}/RigContourMapProjection.h (100%) rename ApplicationLibCode/ReservoirDataModel/{ => ContourMap}/RigContourMapTrianglesGenerator.cpp (100%) rename ApplicationLibCode/ReservoirDataModel/{ => ContourMap}/RigContourMapTrianglesGenerator.h (100%) rename ApplicationLibCode/ReservoirDataModel/{ => ContourMap}/RigContourPolygonsTools.cpp (100%) rename ApplicationLibCode/ReservoirDataModel/{ => ContourMap}/RigContourPolygonsTools.h (100%) rename ApplicationLibCode/ReservoirDataModel/{ => ContourMap}/RigEclipseContourMapProjection.cpp (59%) rename ApplicationLibCode/ReservoirDataModel/{ => ContourMap}/RigEclipseContourMapProjection.h (70%) create mode 100644 ApplicationLibCode/ReservoirDataModel/ContourMap/RigFloodingSettings.cpp create mode 100644 ApplicationLibCode/ReservoirDataModel/ContourMap/RigFloodingSettings.h rename ApplicationLibCode/ReservoirDataModel/{ => ContourMap}/RigGeoMechContourMapProjection.cpp (100%) rename ApplicationLibCode/ReservoirDataModel/{ => ContourMap}/RigGeoMechContourMapProjection.h (100%) rename ApplicationLibCode/ReservoirDataModel/{ => ContourMap}/RigStatisticsContourMapProjection.cpp (100%) rename ApplicationLibCode/ReservoirDataModel/{ => ContourMap}/RigStatisticsContourMapProjection.h (100%) diff --git a/ApplicationLibCode/Application/RiaResultNames.cpp b/ApplicationLibCode/Application/RiaResultNames.cpp index 74f19a0bef..f0caa86158 100644 --- a/ApplicationLibCode/Application/RiaResultNames.cpp +++ b/ApplicationLibCode/Application/RiaResultNames.cpp @@ -461,6 +461,22 @@ QString RiaResultNames::swat() return "SWAT"; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaResultNames::sowcr() +{ + return "SOWCR"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaResultNames::sogcr() +{ + return "SOGCR"; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/RiaResultNames.h b/ApplicationLibCode/Application/RiaResultNames.h index 08729868a0..ff56b5fd26 100644 --- a/ApplicationLibCode/Application/RiaResultNames.h +++ b/ApplicationLibCode/Application/RiaResultNames.h @@ -87,6 +87,9 @@ QString soil(); QString sgas(); QString swat(); +QString sowcr(); +QString sogcr(); + // Well path derived results QString wbsAzimuthResult(); QString wbsInclinationResult(); diff --git a/ApplicationLibCode/CMakeLists.txt b/ApplicationLibCode/CMakeLists.txt index 68be6908e1..fa513f67a5 100644 --- a/ApplicationLibCode/CMakeLists.txt +++ b/ApplicationLibCode/CMakeLists.txt @@ -93,6 +93,7 @@ list( ReservoirDataModel/CMakeLists_files.cmake ReservoirDataModel/CMakeLists_filesNotToUnitTest.cmake ReservoirDataModel/Completions/CMakeLists_files.cmake + ReservoirDataModel/ContourMap/CMakeLists_files.cmake ReservoirDataModel/ResultAccessors/CMakeLists_files.cmake ReservoirDataModel/ResultCalculators/CMakeLists_files.cmake ReservoirDataModel/Well/CMakeLists_files.cmake diff --git a/ApplicationLibCode/Commands/RicContourMapPickEventHandler.cpp b/ApplicationLibCode/Commands/RicContourMapPickEventHandler.cpp index 9704354312..55545bcc55 100644 --- a/ApplicationLibCode/Commands/RicContourMapPickEventHandler.cpp +++ b/ApplicationLibCode/Commands/RicContourMapPickEventHandler.cpp @@ -18,7 +18,7 @@ #include "RicContourMapPickEventHandler.h" -#include "RigContourMapProjection.h" +#include "ContourMap/RigContourMapProjection.h" #include "ContourMap/RimContourMapProjection.h" #include "ContourMap/RimEclipseContourMapView.h" diff --git a/ApplicationLibCode/Commands/RicCreateContourMapPolygonTools.cpp b/ApplicationLibCode/Commands/RicCreateContourMapPolygonTools.cpp index f2e869f9e1..4e880050a9 100644 --- a/ApplicationLibCode/Commands/RicCreateContourMapPolygonTools.cpp +++ b/ApplicationLibCode/Commands/RicCreateContourMapPolygonTools.cpp @@ -20,7 +20,7 @@ #include "RicExportContourMapToTextFeature.h" -#include "RigContourMapProjection.h" +#include "ContourMap/RigContourMapProjection.h" #include "RigPolygonTools.h" #include "ContourMap/RimContourMapProjection.h" diff --git a/ApplicationLibCode/Commands/RicExportContourMapToTextFeature.cpp b/ApplicationLibCode/Commands/RicExportContourMapToTextFeature.cpp index 23a2f538c6..b50a62ac9a 100644 --- a/ApplicationLibCode/Commands/RicExportContourMapToTextFeature.cpp +++ b/ApplicationLibCode/Commands/RicExportContourMapToTextFeature.cpp @@ -24,7 +24,7 @@ #include "RifTextDataTableFormatter.h" -#include "RigContourMapProjection.h" +#include "ContourMap/RigContourMapProjection.h" #include "ContourMap/RimContourMapProjection.h" #include "ContourMap/RimEclipseContourMapView.h" diff --git a/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp index 9a3558ea1b..77ceca1018 100644 --- a/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp @@ -21,8 +21,8 @@ #include "RiaColorTools.h" #include "RiaFontCache.h" -#include "RigContourMapGrid.h" -#include "RigContourPolygonsTools.h" +#include "ContourMap/RigContourMapGrid.h" +#include "ContourMap/RigContourPolygonsTools.h" #include "RivMeshLinesSourceInfo.h" #include "RivPartPriority.h" diff --git a/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.h b/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.h index 237bd3d410..8812cbf6b1 100644 --- a/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.h +++ b/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.h @@ -18,7 +18,7 @@ #pragma once -#include "RigContourPolygonsTools.h" +#include "ContourMap/RigContourPolygonsTools.h" #include "RiaNumberFormat.h" diff --git a/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapProjection.cpp b/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapProjection.cpp index 624423dbf4..3e05dd7447 100644 --- a/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapProjection.cpp +++ b/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapProjection.cpp @@ -18,10 +18,11 @@ #include "RimContourMapProjection.h" -#include "RigContourMapCalculator.h" -#include "RigContourMapGrid.h" -#include "RigContourMapProjection.h" -#include "RigContourMapTrianglesGenerator.h" +#include "ContourMap//RigFloodingSettings.h" +#include "ContourMap/RigContourMapCalculator.h" +#include "ContourMap/RigContourMapGrid.h" +#include "ContourMap/RigContourMapProjection.h" +#include "ContourMap/RigContourMapTrianglesGenerator.h" #include "RimCase.h" #include "RimGridView.h" @@ -47,6 +48,10 @@ void RimContourMapProjection::ResultAggregation::setUp() addItem( RigContourMapCalculator::GAS_COLUMN, "GAS_COLUMN", "Gas Column" ); addItem( RigContourMapCalculator::HYDROCARBON_COLUMN, "HC_COLUMN", "Hydrocarbon Column" ); + addItem( RigContourMapCalculator::MOBILE_OIL_COLUMN, "MOBILE_OIL_COLUMN", "Mobile Oil Column" ); + addItem( RigContourMapCalculator::MOBILE_GAS_COLUMN, "MOBILE_GAS_COLUMN", "Mobile Gas Column" ); + addItem( RigContourMapCalculator::MOBILE_HYDROCARBON_COLUMN, "MOBILE_HC_COLUMN", "Mobile Hydrocarbon Column" ); + addItem( RigContourMapCalculator::MEAN, "MEAN_VALUE", "Arithmetic Mean" ); addItem( RigContourMapCalculator::HARMONIC_MEAN, "HARM_VALUE", "Harmonic Mean" ); addItem( RigContourMapCalculator::GEOMETRIC_MEAN, "GEOM_VALUE", "Geometric Mean" ); @@ -59,6 +64,15 @@ void RimContourMapProjection::ResultAggregation::setUp() setDefault( RigContourMapCalculator::MEAN ); } + +template <> +void RimContourMapProjection::FloodingType::setUp() +{ + addItem( RigFloodingSettings::FloodingType::WATER_FLOODING, "WATER_FLOODING", "Water Flooding (SOWCR)" ); + addItem( RigFloodingSettings::FloodingType::GAS_FLOODING, "GAS_FLOODING", "Gas Flooding (SOGCR)" ); + addItem( RigFloodingSettings::FloodingType::USER_DEFINED, "USER_DEFINED", "User Defined Value" ); +} + } // namespace caf CAF_PDM_ABSTRACT_SOURCE_INIT( RimContourMapProjection, "RimContourMapProjection" ); @@ -80,6 +94,16 @@ RimContourMapProjection::RimContourMapProjection() CAF_PDM_InitFieldNoDefault( &m_resultAggregation, "ResultAggregation", "Result Aggregation" ); + CAF_PDM_InitFieldNoDefault( &m_oilFloodingType, "OilFloodingType", "Residual Oil Given By" ); + m_oilFloodingType.setValue( RigFloodingSettings::FloodingType::WATER_FLOODING ); + CAF_PDM_InitField( &m_userDefinedFloodingOil, "UserDefinedFloodingOil", 0.0, "" ); + m_userDefinedFloodingOil.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() ); + + CAF_PDM_InitFieldNoDefault( &m_gasFloodingType, "GasFloodingType", "Residual Oil-in-Gas Given By" ); + m_gasFloodingType.setValue( RigFloodingSettings::FloodingType::GAS_FLOODING ); + CAF_PDM_InitField( &m_userDefinedFloodingGas, "UserDefinedFloodingGas", 0.0, "" ); + m_userDefinedFloodingGas.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() ); + CAF_PDM_InitField( &m_showContourLines, "ContourLines", true, "Show Contour Lines" ); CAF_PDM_InitField( &m_showContourLabels, "ContourLabels", true, "Show Contour Labels" ); CAF_PDM_InitField( &m_smoothContourLines, "SmoothContourLines", true, "Smooth Contour Lines" ); @@ -507,7 +531,8 @@ double RimContourMapProjection::gridEdgeOffset() const //-------------------------------------------------------------------------------------------------- void RimContourMapProjection::fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) { - if ( changedField == &m_resultAggregation ) + if ( ( changedField == &m_resultAggregation ) || ( changedField == &m_oilFloodingType ) || ( changedField == &m_gasFloodingType ) || + ( changedField == &m_userDefinedFloodingOil ) || ( changedField == &m_userDefinedFloodingGas ) ) { ResultAggregation previousAggregation = static_cast( oldValue.toInt() ); if ( RigContourMapCalculator::isStraightSummationResult( previousAggregation ) != isStraightSummationResult() ) @@ -535,6 +560,26 @@ void RimContourMapProjection::fieldChangedByUi( const caf::PdmFieldHandle* chang baseView()->scheduleCreateDisplayModelAndRedraw(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList RimContourMapProjection::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) +{ + QList options; + + if ( &m_gasFloodingType == fieldNeedingOptions ) + { + options.push_back( + caf::PdmOptionItemInfo( caf::AppEnum::uiText( RigFloodingSettings::FloodingType::GAS_FLOODING ), + RigFloodingSettings::FloodingType::GAS_FLOODING ) ); + options.push_back( + caf::PdmOptionItemInfo( caf::AppEnum::uiText( RigFloodingSettings::FloodingType::USER_DEFINED ), + RigFloodingSettings::FloodingType::USER_DEFINED ) ); + } + + return options; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -549,6 +594,15 @@ void RimContourMapProjection::defineEditorAttribute( const caf::PdmFieldHandle* myAttr->m_sliderTickCount = 20; } } + else if ( ( &m_userDefinedFloodingOil == field ) || ( &m_userDefinedFloodingGas == field ) ) + { + if ( auto myAttr = dynamic_cast( attribute ) ) + { + myAttr->m_minimum = 0.0; + myAttr->m_maximum = 1.0; + myAttr->m_sliderTickCount = 20; + } + } } //-------------------------------------------------------------------------------------------------- @@ -558,6 +612,27 @@ void RimContourMapProjection::defineUiOrdering( QString uiConfigName, caf::PdmUi { caf::PdmUiGroup* mainGroup = uiOrdering.addNewGroup( "Projection Settings" ); mainGroup->add( &m_resultAggregation ); + + if ( RigContourMapCalculator::isMobileColumnResult( m_resultAggregation() ) ) + { + if ( m_resultAggregation() != RigContourMapCalculator::MOBILE_GAS_COLUMN ) + { + mainGroup->add( &m_oilFloodingType ); + if ( m_oilFloodingType() == RigFloodingSettings::FloodingType::USER_DEFINED ) + { + mainGroup->add( &m_userDefinedFloodingOil ); + } + } + if ( m_resultAggregation() != RigContourMapCalculator::MOBILE_OIL_COLUMN ) + { + mainGroup->add( &m_gasFloodingType ); + if ( m_gasFloodingType() == RigFloodingSettings::FloodingType::USER_DEFINED ) + { + mainGroup->add( &m_userDefinedFloodingGas ); + } + } + } + legendConfig()->uiOrdering( "NumLevelsOnly", *mainGroup ); mainGroup->add( &m_resolution ); mainGroup->add( &m_showContourLines ); diff --git a/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapProjection.h b/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapProjection.h index d678f49c47..c154488fa6 100644 --- a/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapProjection.h +++ b/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapProjection.h @@ -22,8 +22,9 @@ #include "RimCheckableNamedObject.h" #include "RimIntersectionEnums.h" -#include "RigContourMapCalculator.h" -#include "RigContourPolygonsTools.h" +#include "ContourMap/RigContourMapCalculator.h" +#include "ContourMap/RigContourPolygonsTools.h" +#include "ContourMap/RigFloodingSettings.h" #include "cafPdmField.h" #include "cafPdmObject.h" @@ -49,6 +50,7 @@ class RimContourMapProjection : public RimCheckableNamedObject public: using ResultAggregation = caf::AppEnum; using ContourPolygons = std::vector; + using FloodingType = caf::AppEnum; RimContourMapProjection(); ~RimContourMapProjection() override; @@ -128,6 +130,7 @@ protected: void defineEditorAttribute( const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override; void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "" ) override; + QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; void appendValueFilterGroup( caf::PdmUiOrdering& uiOrdering ); @@ -149,6 +152,11 @@ protected: caf::PdmField m_showContourLabels; caf::PdmField m_smoothContourLines; + caf::PdmField m_oilFloodingType; + caf::PdmField m_gasFloodingType; + caf::PdmField m_userDefinedFloodingGas; + caf::PdmField m_userDefinedFloodingOil; + cvf::Vec2d m_pickPoint; std::vector m_contourPolygons; std::vector m_contourLevelCumulativeAreas; diff --git a/ApplicationLibCode/ProjectDataModel/ContourMap/RimEclipseContourMapProjection.cpp b/ApplicationLibCode/ProjectDataModel/ContourMap/RimEclipseContourMapProjection.cpp index 1b723fb578..b5d6dea7f8 100644 --- a/ApplicationLibCode/ProjectDataModel/ContourMap/RimEclipseContourMapProjection.cpp +++ b/ApplicationLibCode/ProjectDataModel/ContourMap/RimEclipseContourMapProjection.cpp @@ -18,12 +18,12 @@ #include "RimEclipseContourMapProjection.h" +#include "ContourMap/RigContourMapCalculator.h" +#include "ContourMap/RigContourMapGrid.h" +#include "ContourMap/RigEclipseContourMapProjection.h" #include "RiaPorosityModel.h" #include "RigCaseCellResultsData.h" -#include "RigContourMapCalculator.h" -#include "RigContourMapGrid.h" #include "RigEclipseCaseData.h" -#include "RigEclipseContourMapProjection.h" #include "RigEclipseResultAddress.h" #include "RigMainGrid.h" @@ -183,8 +183,10 @@ std::vector RimEclipseContourMapProjection::generateResults( int timeSte cellColors->timeLapseBaseTimeStep(), cellColors->caseDiffIndex() ); + RigFloodingSettings fl( m_oilFloodingType(), m_userDefinedFloodingOil(), m_gasFloodingType(), m_userDefinedFloodingGas() ); + return dynamic_cast( m_contourMapProjection.get() ) - ->generateResults( resAddr, m_resultAggregation(), timeStep ); + ->generateResults( resAddr, m_resultAggregation(), timeStep, fl ); } return {}; @@ -205,8 +207,10 @@ void RimEclipseContourMapProjection::generateAndSaveResults( int timeStep ) cellColors->timeLapseBaseTimeStep(), cellColors->caseDiffIndex() ); + RigFloodingSettings fl( m_oilFloodingType(), m_userDefinedFloodingOil(), m_gasFloodingType(), m_userDefinedFloodingGas() ); + dynamic_cast( m_contourMapProjection.get() ) - ->generateAndSaveResults( resAddr, m_resultAggregation(), timeStep ); + ->generateAndSaveResults( resAddr, m_resultAggregation(), timeStep, fl ); } } diff --git a/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.cpp b/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.cpp index 97b792db66..f016f28872 100644 --- a/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.cpp +++ b/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.cpp @@ -26,11 +26,11 @@ #include "RifReaderSettings.h" +#include "ContourMap/RigContourMapCalculator.h" +#include "ContourMap/RigContourMapGrid.h" +#include "ContourMap/RigEclipseContourMapProjection.h" #include "RigCaseCellResultsData.h" -#include "RigContourMapCalculator.h" -#include "RigContourMapGrid.h" #include "RigEclipseCaseData.h" -#include "RigEclipseContourMapProjection.h" #include "RigEclipseResultAddress.h" #include "RigFormationNames.h" #include "RigMainGrid.h" @@ -54,6 +54,7 @@ #include "Riu3DMainWindowTools.h" #include "cafCmdFeatureMenuBuilder.h" +#include "cafPdmUiDoubleSliderEditor.h" #include "cafPdmUiPushButtonEditor.h" #include "cafPdmUiTreeSelectionEditor.h" #include "cafProgressInfo.h" @@ -97,6 +98,16 @@ RimStatisticsContourMap::RimStatisticsContourMap() CAF_PDM_InitFieldNoDefault( &m_resultAggregation, "ResultAggregation", "Result Aggregation" ); + CAF_PDM_InitFieldNoDefault( &m_oilFloodingType, "OilFloodingType", "Residual Oil Given By" ); + m_oilFloodingType.setValue( RigFloodingSettings::FloodingType::WATER_FLOODING ); + CAF_PDM_InitField( &m_userDefinedFloodingOil, "UserDefinedFloodingOil", 0.0, "User Defined Value" ); + m_userDefinedFloodingOil.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() ); + + CAF_PDM_InitFieldNoDefault( &m_gasFloodingType, "GasFloodingType", "Residual Oil-in-Gas Given By" ); + m_gasFloodingType.setValue( RigFloodingSettings::FloodingType::GAS_FLOODING ); + CAF_PDM_InitField( &m_userDefinedFloodingGas, "UserDefinedFloodingGas", 0.0, "User Defined Value" ); + m_userDefinedFloodingGas.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() ); + CAF_PDM_InitFieldNoDefault( &m_selectedTimeSteps, "SelectedTimeSteps", "Time Step Selection" ); m_selectedTimeSteps.uiCapability()->setUiEditorTypeName( caf::PdmUiTreeSelectionEditor::uiEditorTypeName() ); @@ -162,6 +173,27 @@ void RimStatisticsContourMap::defineUiOrdering( QString uiConfigName, caf::PdmUi auto genGrp = uiOrdering.addNewGroup( "General" ); genGrp->add( &m_resultAggregation ); + + if ( RigContourMapCalculator::isMobileColumnResult( m_resultAggregation() ) ) + { + if ( m_resultAggregation() != RigContourMapCalculator::MOBILE_GAS_COLUMN ) + { + genGrp->add( &m_oilFloodingType ); + if ( m_oilFloodingType() == RigFloodingSettings::FloodingType::USER_DEFINED ) + { + genGrp->add( &m_userDefinedFloodingOil ); + } + } + if ( m_resultAggregation() != RigContourMapCalculator::MOBILE_OIL_COLUMN ) + { + genGrp->add( &m_gasFloodingType ); + if ( m_gasFloodingType() == RigFloodingSettings::FloodingType::USER_DEFINED ) + { + genGrp->add( &m_userDefinedFloodingGas ); + } + } + } + genGrp->add( &m_resolution ); genGrp->add( &m_primaryCase ); genGrp->add( &m_boundingBoxExpPercent ); @@ -363,6 +395,15 @@ QList RimStatisticsContourMap::calculateValueOptions( co } } } + else if ( &m_gasFloodingType == fieldNeedingOptions ) + { + options.push_back( + caf::PdmOptionItemInfo( caf::AppEnum::uiText( RigFloodingSettings::FloodingType::GAS_FLOODING ), + RigFloodingSettings::FloodingType::GAS_FLOODING ) ); + options.push_back( + caf::PdmOptionItemInfo( caf::AppEnum::uiText( RigFloodingSettings::FloodingType::USER_DEFINED ), + RigFloodingSettings::FloodingType::USER_DEFINED ) ); + } return options; } @@ -379,6 +420,16 @@ void RimStatisticsContourMap::defineEditorAttribute( const caf::PdmFieldHandle* attrib->m_buttonText = "Compute"; } } + else if ( ( &m_userDefinedFloodingOil == field ) || ( &m_userDefinedFloodingGas == field ) ) + { + if ( auto myAttr = dynamic_cast( attribute ) ) + { + myAttr->m_minimum = 0.0; + myAttr->m_maximum = 1.0; + myAttr->m_sliderTickCount = 20; + myAttr->m_delaySliderUpdateUntilRelease = true; + } + } } //-------------------------------------------------------------------------------------------------- @@ -472,6 +523,7 @@ void RimStatisticsContourMap::computeStatistics() if ( ensemble->cases().empty() ) return; if ( eclipseCase() == nullptr ) return; + RigFloodingSettings floodSettings( m_oilFloodingType(), m_userDefinedFloodingOil(), m_gasFloodingType(), m_userDefinedFloodingGas() ); RigContourMapCalculator::ResultAggregationType resultAggregation = m_resultAggregation(); cvf::BoundingBox gridBoundingBox = eclipseCase()->activeCellsBoundingBox(); @@ -526,14 +578,14 @@ void RimStatisticsContourMap::computeStatistics() for ( auto ts : selectedTimeSteps() ) { std::vector result = - contourMapProjection.generateResults( m_resultDefinition()->eclipseResultAddress(), resultAggregation, ts ); + contourMapProjection.generateResults( m_resultDefinition()->eclipseResultAddress(), resultAggregation, ts, floodSettings ); timestep_results[ts].push_back( result ); } } else { std::vector result = - contourMapProjection.generateResults( m_resultDefinition()->eclipseResultAddress(), resultAggregation, 0 ); + contourMapProjection.generateResults( m_resultDefinition()->eclipseResultAddress(), resultAggregation, 0, floodSettings ); timestep_results[0].push_back( result ); } } diff --git a/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.h b/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.h index 45ce82525b..36a5a5ed5b 100644 --- a/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.h +++ b/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.h @@ -42,8 +42,6 @@ class RigPolyLinesData; //================================================================================================== // -// -// //================================================================================================== class RimStatisticsContourMap : public RimNamedObject { @@ -112,6 +110,11 @@ private: caf::PdmField> m_resolution; + caf::PdmField> m_oilFloodingType; + caf::PdmField> m_gasFloodingType; + caf::PdmField m_userDefinedFloodingGas; + caf::PdmField m_userDefinedFloodingOil; + std::unique_ptr m_contourMapGrid; std::map>> m_timeResults; diff --git a/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMapProjection.cpp b/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMapProjection.cpp index 15b24c04f9..7d3a87000a 100644 --- a/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMapProjection.cpp +++ b/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMapProjection.cpp @@ -18,12 +18,12 @@ #include "RimStatisticsContourMapProjection.h" +#include "ContourMap/RigContourMapCalculator.h" +#include "ContourMap/RigContourMapGrid.h" +#include "ContourMap/RigContourMapProjection.h" +#include "ContourMap/RigStatisticsContourMapProjection.h" #include "RigCaseCellResultsData.h" -#include "RigContourMapCalculator.h" -#include "RigContourMapGrid.h" -#include "RigContourMapProjection.h" #include "RigEclipseCaseData.h" -#include "RigStatisticsContourMapProjection.h" #include "RimEclipseCase.h" #include "RimEclipseCellColors.h" diff --git a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechContourMapProjection.cpp b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechContourMapProjection.cpp index 2d8ec29710..77f84ff22e 100644 --- a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechContourMapProjection.cpp +++ b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechContourMapProjection.cpp @@ -17,16 +17,16 @@ ///////////////////////////////////////////////////////////////////////////////// #include "RimGeoMechContourMapProjection.h" -#include "RigContourMapCalculator.h" -#include "RigContourMapGrid.h" -#include "RigContourMapProjection.h" +#include "ContourMap/RigContourMapCalculator.h" +#include "ContourMap/RigContourMapGrid.h" +#include "ContourMap/RigContourMapProjection.h" +#include "ContourMap/RigGeoMechContourMapProjection.h" #include "RigFemAddressDefines.h" #include "RigFemPart.h" #include "RigFemPartCollection.h" #include "RigFemPartGrid.h" #include "RigFemPartResultsCollection.h" #include "RigGeoMechCaseData.h" -#include "RigGeoMechContourMapProjection.h" #include "RimCellFilterCollection.h" #include "RimGeoMechCase.h" diff --git a/ApplicationLibCode/ProjectDataModel/Rim3dOverlayInfoConfig.cpp b/ApplicationLibCode/ProjectDataModel/Rim3dOverlayInfoConfig.cpp index 1e3c5364a6..8ed70b77dd 100644 --- a/ApplicationLibCode/ProjectDataModel/Rim3dOverlayInfoConfig.cpp +++ b/ApplicationLibCode/ProjectDataModel/Rim3dOverlayInfoConfig.cpp @@ -26,9 +26,9 @@ #include "RicGridStatisticsDialog.h" +#include "ContourMap/RigContourMapProjection.h" #include "RigActiveCellInfo.h" #include "RigCaseCellResultsData.h" -#include "RigContourMapProjection.h" #include "RigEclipseCaseData.h" #include "RigFemPartCollection.h" #include "RigFemPartResultsCollection.h" diff --git a/ApplicationLibCode/ProjectDataModel/RimHistogramCalculator.cpp b/ApplicationLibCode/ProjectDataModel/RimHistogramCalculator.cpp index 074913d9b5..8fac6aba67 100644 --- a/ApplicationLibCode/ProjectDataModel/RimHistogramCalculator.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimHistogramCalculator.cpp @@ -18,7 +18,7 @@ #include "RimHistogramCalculator.h" -#include "RigContourMapProjection.h" +#include "ContourMap/RigContourMapProjection.h" #include "RigEclipseMultiPropertyStatCalc.h" #include "RigEclipseNativeVisibleCellsStatCalc.h" #include "RigFemNativeVisibleCellsStatCalc.h" diff --git a/ApplicationLibCode/ReservoirDataModel/CMakeLists_files.cmake b/ApplicationLibCode/ReservoirDataModel/CMakeLists_files.cmake index e432fc7ff7..fe6706bed5 100644 --- a/ApplicationLibCode/ReservoirDataModel/CMakeLists_files.cmake +++ b/ApplicationLibCode/ReservoirDataModel/CMakeLists_files.cmake @@ -13,9 +13,6 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RigCellFaceGeometryTools.h ${CMAKE_CURRENT_LIST_DIR}/RigCellGeometryTools.h ${CMAKE_CURRENT_LIST_DIR}/RigCellGeometryTools.h - ${CMAKE_CURRENT_LIST_DIR}/RigContourMapCalculator.h - ${CMAKE_CURRENT_LIST_DIR}/RigContourMapGrid.h - ${CMAKE_CURRENT_LIST_DIR}/RigContourPolygonsTools.h ${CMAKE_CURRENT_LIST_DIR}/RigConvexHull.h ${CMAKE_CURRENT_LIST_DIR}/RigEclipseAllanFaultsStatCalc.h ${CMAKE_CURRENT_LIST_DIR}/RigEclipseCaseData.h @@ -83,12 +80,6 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RigVisibleCategoriesCalculator.h ${CMAKE_CURRENT_LIST_DIR}/RigWbsParameter.h ${CMAKE_CURRENT_LIST_DIR}/RigWeightedMeanCalc.h - ${CMAKE_CURRENT_LIST_DIR}/RigContourMapCalculator.h - ${CMAKE_CURRENT_LIST_DIR}/RigContourMapProjection.h - ${CMAKE_CURRENT_LIST_DIR}/RigContourMapTrianglesGenerator.h - ${CMAKE_CURRENT_LIST_DIR}/RigEclipseContourMapProjection.h - ${CMAKE_CURRENT_LIST_DIR}/RigGeoMechContourMapProjection.h - ${CMAKE_CURRENT_LIST_DIR}/RigStatisticsContourMapProjection.h ${CMAKE_CURRENT_LIST_DIR}/RigPolygonTools.h ) @@ -106,9 +97,6 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RigCellFaceGeometryTools.cpp ${CMAKE_CURRENT_LIST_DIR}/RigCellGeometryTools.cpp ${CMAKE_CURRENT_LIST_DIR}/RigCellGeometryTools.cpp - ${CMAKE_CURRENT_LIST_DIR}/RigContourMapCalculator.cpp - ${CMAKE_CURRENT_LIST_DIR}/RigContourMapGrid.cpp - ${CMAKE_CURRENT_LIST_DIR}/RigContourPolygonsTools.cpp ${CMAKE_CURRENT_LIST_DIR}/RigConvexHull.cpp ${CMAKE_CURRENT_LIST_DIR}/RigDeclineCurveCalculator.cpp ${CMAKE_CURRENT_LIST_DIR}/RigEclipseAllanFaultsStatCalc.cpp @@ -173,14 +161,6 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RigVisibleCategoriesCalculator.cpp ${CMAKE_CURRENT_LIST_DIR}/RigWbsParameter.cpp ${CMAKE_CURRENT_LIST_DIR}/RigWeightedMeanCalc.cpp - ${CMAKE_CURRENT_LIST_DIR}/RigContourMapGrid.cpp - ${CMAKE_CURRENT_LIST_DIR}/RigContourPolygonsTools.cpp - ${CMAKE_CURRENT_LIST_DIR}/RigContourMapCalculator.cpp - ${CMAKE_CURRENT_LIST_DIR}/RigContourMapProjection.cpp - ${CMAKE_CURRENT_LIST_DIR}/RigContourMapTrianglesGenerator.cpp - ${CMAKE_CURRENT_LIST_DIR}/RigEclipseContourMapProjection.cpp - ${CMAKE_CURRENT_LIST_DIR}/RigGeoMechContourMapProjection.cpp - ${CMAKE_CURRENT_LIST_DIR}/RigStatisticsContourMapProjection.cpp ${CMAKE_CURRENT_LIST_DIR}/RigPolygonTools.cpp ) diff --git a/ApplicationLibCode/ReservoirDataModel/ContourMap/CMakeLists_files.cmake b/ApplicationLibCode/ReservoirDataModel/ContourMap/CMakeLists_files.cmake new file mode 100644 index 0000000000..9f13445ce8 --- /dev/null +++ b/ApplicationLibCode/ReservoirDataModel/ContourMap/CMakeLists_files.cmake @@ -0,0 +1,28 @@ +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RigContourMapCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RigContourMapGrid.h + ${CMAKE_CURRENT_LIST_DIR}/RigContourPolygonsTools.h + ${CMAKE_CURRENT_LIST_DIR}/RigContourMapCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RigContourMapProjection.h + ${CMAKE_CURRENT_LIST_DIR}/RigContourMapTrianglesGenerator.h + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseContourMapProjection.h + ${CMAKE_CURRENT_LIST_DIR}/RigGeoMechContourMapProjection.h + ${CMAKE_CURRENT_LIST_DIR}/RigStatisticsContourMapProjection.h + ${CMAKE_CURRENT_LIST_DIR}/RigFloodingSettings.h +) + +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RigContourMapCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigContourMapGrid.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigContourPolygonsTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigContourMapCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigContourMapProjection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigContourMapTrianglesGenerator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseContourMapProjection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigGeoMechContourMapProjection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigStatisticsContourMapProjection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigFloodingSettings.cpp +) + +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) diff --git a/ApplicationLibCode/ReservoirDataModel/RigContourMapCalculator.cpp b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourMapCalculator.cpp similarity index 96% rename from ApplicationLibCode/ReservoirDataModel/RigContourMapCalculator.cpp rename to ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourMapCalculator.cpp index e5d7ba8806..70b0a3dcd3 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigContourMapCalculator.cpp +++ b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourMapCalculator.cpp @@ -61,6 +61,9 @@ double RigContourMapCalculator::calculateValueInMapCell( const RigContourMapProj case OIL_COLUMN: case GAS_COLUMN: case HYDROCARBON_COLUMN: + case MOBILE_OIL_COLUMN: + case MOBILE_GAS_COLUMN: + case MOBILE_HYDROCARBON_COLUMN: return calculateSum( contourMapProjection, matchingCells, gridCellValues ); default: { @@ -435,7 +438,8 @@ std::vector //-------------------------------------------------------------------------------------------------- bool RigContourMapCalculator::isColumnResult( ResultAggregationType aggregationType ) { - return aggregationType == OIL_COLUMN || aggregationType == GAS_COLUMN || aggregationType == HYDROCARBON_COLUMN; + return aggregationType == OIL_COLUMN || aggregationType == GAS_COLUMN || aggregationType == HYDROCARBON_COLUMN || + isMobileColumnResult( aggregationType ); } //-------------------------------------------------------------------------------------------------- @@ -451,5 +455,13 @@ bool RigContourMapCalculator::isMeanResult( ResultAggregationType aggregationTyp //-------------------------------------------------------------------------------------------------- bool RigContourMapCalculator::isStraightSummationResult( ResultAggregationType aggregationType ) { - return aggregationType == OIL_COLUMN || aggregationType == GAS_COLUMN || aggregationType == HYDROCARBON_COLUMN || aggregationType == SUM; + return isColumnResult( aggregationType ) || aggregationType == SUM; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RigContourMapCalculator::isMobileColumnResult( ResultAggregationType aggregationType ) +{ + return aggregationType == MOBILE_OIL_COLUMN || aggregationType == MOBILE_GAS_COLUMN || aggregationType == MOBILE_HYDROCARBON_COLUMN; } diff --git a/ApplicationLibCode/ReservoirDataModel/RigContourMapCalculator.h b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourMapCalculator.h similarity index 96% rename from ApplicationLibCode/ReservoirDataModel/RigContourMapCalculator.h rename to ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourMapCalculator.h index cfb95a0b83..c5b0256c53 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigContourMapCalculator.h +++ b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourMapCalculator.h @@ -50,7 +50,10 @@ public: SUM, OIL_COLUMN, GAS_COLUMN, - HYDROCARBON_COLUMN + HYDROCARBON_COLUMN, + MOBILE_OIL_COLUMN, + MOBILE_GAS_COLUMN, + MOBILE_HYDROCARBON_COLUMN }; static std::vector>> @@ -81,6 +84,7 @@ public: static bool isColumnResult( ResultAggregationType aggregationType ); static bool isMeanResult( ResultAggregationType aggregationType ); static bool isStraightSummationResult( ResultAggregationType aggregationType ); + static bool isMobileColumnResult( ResultAggregationType aggregationType ); private: static double calculateTopValue( const RigContourMapProjection& contourMapProjection, diff --git a/ApplicationLibCode/ReservoirDataModel/RigContourMapGrid.cpp b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourMapGrid.cpp similarity index 100% rename from ApplicationLibCode/ReservoirDataModel/RigContourMapGrid.cpp rename to ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourMapGrid.cpp diff --git a/ApplicationLibCode/ReservoirDataModel/RigContourMapGrid.h b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourMapGrid.h similarity index 100% rename from ApplicationLibCode/ReservoirDataModel/RigContourMapGrid.h rename to ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourMapGrid.h diff --git a/ApplicationLibCode/ReservoirDataModel/RigContourMapProjection.cpp b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourMapProjection.cpp similarity index 100% rename from ApplicationLibCode/ReservoirDataModel/RigContourMapProjection.cpp rename to ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourMapProjection.cpp diff --git a/ApplicationLibCode/ReservoirDataModel/RigContourMapProjection.h b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourMapProjection.h similarity index 100% rename from ApplicationLibCode/ReservoirDataModel/RigContourMapProjection.h rename to ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourMapProjection.h diff --git a/ApplicationLibCode/ReservoirDataModel/RigContourMapTrianglesGenerator.cpp b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourMapTrianglesGenerator.cpp similarity index 100% rename from ApplicationLibCode/ReservoirDataModel/RigContourMapTrianglesGenerator.cpp rename to ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourMapTrianglesGenerator.cpp diff --git a/ApplicationLibCode/ReservoirDataModel/RigContourMapTrianglesGenerator.h b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourMapTrianglesGenerator.h similarity index 100% rename from ApplicationLibCode/ReservoirDataModel/RigContourMapTrianglesGenerator.h rename to ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourMapTrianglesGenerator.h diff --git a/ApplicationLibCode/ReservoirDataModel/RigContourPolygonsTools.cpp b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourPolygonsTools.cpp similarity index 100% rename from ApplicationLibCode/ReservoirDataModel/RigContourPolygonsTools.cpp rename to ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourPolygonsTools.cpp diff --git a/ApplicationLibCode/ReservoirDataModel/RigContourPolygonsTools.h b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourPolygonsTools.h similarity index 100% rename from ApplicationLibCode/ReservoirDataModel/RigContourPolygonsTools.h rename to ApplicationLibCode/ReservoirDataModel/ContourMap/RigContourPolygonsTools.h diff --git a/ApplicationLibCode/ReservoirDataModel/RigEclipseContourMapProjection.cpp b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigEclipseContourMapProjection.cpp similarity index 59% rename from ApplicationLibCode/ReservoirDataModel/RigEclipseContourMapProjection.cpp rename to ApplicationLibCode/ReservoirDataModel/ContourMap/RigEclipseContourMapProjection.cpp index 0d81fd1cdb..50a6501605 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigEclipseContourMapProjection.cpp +++ b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigEclipseContourMapProjection.cpp @@ -60,10 +60,11 @@ RigEclipseContourMapProjection::~RigEclipseContourMapProjection() //-------------------------------------------------------------------------------------------------- void RigEclipseContourMapProjection::generateAndSaveResults( const RigEclipseResultAddress& resultAddress, RigContourMapCalculator::ResultAggregationType resultAggregation, - int timeStep ) + int timeStep, + RigFloodingSettings& floodingSettings ) { std::tie( m_useActiveCellInfo, m_aggregatedResults ) = - generateResults( *this, m_contourMapGrid, m_resultData, resultAddress, resultAggregation, timeStep ); + generateResults( *this, m_contourMapGrid, m_resultData, resultAddress, resultAggregation, timeStep, floodingSettings ); } //-------------------------------------------------------------------------------------------------- @@ -71,10 +72,11 @@ void RigEclipseContourMapProjection::generateAndSaveResults( const RigEclipseRes //-------------------------------------------------------------------------------------------------- std::vector RigEclipseContourMapProjection::generateResults( const RigEclipseResultAddress& resultAddress, RigContourMapCalculator::ResultAggregationType resultAggregation, - int timeStep ) const + int timeStep, + RigFloodingSettings& floodingSettings ) const { std::pair> result = - generateResults( *this, m_contourMapGrid, m_resultData, resultAddress, resultAggregation, timeStep ); + generateResults( *this, m_contourMapGrid, m_resultData, resultAddress, resultAggregation, timeStep, floodingSettings ); return result.second; } @@ -87,7 +89,8 @@ std::pair> RigCaseCellResultsData& resultData, const RigEclipseResultAddress& resultAddress, RigContourMapCalculator::ResultAggregationType resultAggregation, - int timeStep ) + int timeStep, + RigFloodingSettings& floodingSettings ) { size_t nCells = contourMapProjection.numberOfCells(); @@ -107,20 +110,17 @@ std::pair> std::vector gridResultValues; if ( RigContourMapCalculator::isColumnResult( resultAggregation ) ) { - resultData.ensureKnownResultLoaded( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, "PORO" ) ); - resultData.ensureKnownResultLoaded( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, "NTG" ) ); - resultData.ensureKnownResultLoaded( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, "DZ" ) ); - if ( resultAggregation == RigContourMapCalculator::OIL_COLUMN || resultAggregation == RigContourMapCalculator::HYDROCARBON_COLUMN ) + bool missingResults = false; + + for ( const auto& resAddr : neededResults( resultAggregation, floodingSettings ) ) { - resultData.ensureKnownResultLoaded( - RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::soil() ) ); + missingResults = missingResults || !resultData.ensureKnownResultLoaded( resAddr ); } - if ( resultAggregation == RigContourMapCalculator::GAS_COLUMN || resultAggregation == RigContourMapCalculator::HYDROCARBON_COLUMN ) + + if ( !missingResults ) { - resultData.ensureKnownResultLoaded( - RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::sgas() ) ); + gridResultValues = calculateColumnResult( resultData, resultAggregation, timeStep, floodingSettings ); } - gridResultValues = calculateColumnResult( resultData, resultAggregation, timeStep ); } else { @@ -151,28 +151,14 @@ std::pair> return { useActiveCellInfo, aggregatedResults }; } -std::vector RigEclipseContourMapProjection::calculateColumnResult( RigContourMapCalculator::ResultAggregationType resultAggregation, - int timeStep ) const -{ - return calculateColumnResult( m_resultData, resultAggregation, timeStep ); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::vector RigEclipseContourMapProjection::calculateColumnResult( RigCaseCellResultsData& resultData, RigContourMapCalculator::ResultAggregationType resultAggregation, - int timeStep ) + int timeStep, + RigFloodingSettings& floodingSettings ) { - bool hasPoroResult = resultData.hasResultEntry( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, "PORO" ) ); - bool hasNtgResult = resultData.hasResultEntry( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, "NTG" ) ); - bool hasDzResult = resultData.hasResultEntry( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, "DZ" ) ); - - if ( !( hasPoroResult && hasNtgResult && hasDzResult ) ) - { - return std::vector(); - } - const std::vector& poroResults = resultData.cellScalarResults( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, "PORO" ), 0 ); const std::vector& ntgResults = @@ -182,38 +168,42 @@ std::vector RigEclipseContourMapProjection::calculateColumnResult( RigCa CVF_ASSERT( poroResults.size() == ntgResults.size() && ntgResults.size() == dzResults.size() ); - std::vector resultValues( poroResults.size(), 0.0 ); + const auto nSamples = poroResults.size(); - if ( resultAggregation == RigContourMapCalculator::OIL_COLUMN || resultAggregation == RigContourMapCalculator::HYDROCARBON_COLUMN ) + std::vector residualOil = residualOilData( resultData, resultAggregation, floodingSettings, nSamples ); + std::vector residualGas = residualGasData( resultData, resultAggregation, floodingSettings, nSamples ); + + std::vector resultValues( nSamples, 0.0 ); + + if ( ( resultAggregation == RigContourMapCalculator::OIL_COLUMN || resultAggregation == RigContourMapCalculator::HYDROCARBON_COLUMN ) || + ( resultAggregation == RigContourMapCalculator::MOBILE_OIL_COLUMN || + resultAggregation == RigContourMapCalculator::MOBILE_HYDROCARBON_COLUMN ) ) { const std::vector& soilResults = resultData.cellScalarResults( RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::soil() ), timeStep ); - for ( size_t cellResultIdx = 0; cellResultIdx < resultValues.size(); ++cellResultIdx ) + for ( size_t n = 0; n < nSamples; n++ ) { - resultValues[cellResultIdx] = soilResults[cellResultIdx]; + resultValues[n] = std::max( soilResults[n] - residualOil[n], 0.0 ); } } - if ( resultAggregation == RigContourMapCalculator::GAS_COLUMN || resultAggregation == RigContourMapCalculator::HYDROCARBON_COLUMN ) + if ( ( resultAggregation == RigContourMapCalculator::GAS_COLUMN || resultAggregation == RigContourMapCalculator::HYDROCARBON_COLUMN ) || + ( resultAggregation == RigContourMapCalculator::MOBILE_GAS_COLUMN || + resultAggregation == RigContourMapCalculator::MOBILE_HYDROCARBON_COLUMN ) ) { - bool hasGasResult = - resultData.hasResultEntry( RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::sgas() ) ); - if ( hasGasResult ) + const std::vector& sgasResults = + resultData.cellScalarResults( RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::sgas() ), + timeStep ); + for ( size_t n = 0; n < nSamples; n++ ) { - const std::vector& sgasResults = - resultData.cellScalarResults( RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::sgas() ), - timeStep ); - for ( size_t cellResultIdx = 0; cellResultIdx < resultValues.size(); ++cellResultIdx ) - { - resultValues[cellResultIdx] += sgasResults[cellResultIdx]; - } + resultValues[n] += std::max( sgasResults[n] - residualGas[n], 0.0 ); } } - for ( size_t cellResultIdx = 0; cellResultIdx < resultValues.size(); ++cellResultIdx ) + for ( size_t n = 0; n < nSamples; n++ ) { - resultValues[cellResultIdx] *= poroResults[cellResultIdx] * ntgResults[cellResultIdx] * dzResults[cellResultIdx]; + resultValues[n] *= poroResults[n] * ntgResults[n] * dzResults[n]; } return resultValues; @@ -330,3 +320,125 @@ std::vector RigEclipseContourMapProjection::getMapCellVisibility( int { return std::vector( numberOfCells(), true ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::set RigEclipseContourMapProjection::neededResults( RigContourMapCalculator::ResultAggregationType resultAggregation, + RigFloodingSettings& floodingSettings ) +{ + std::set results; + + if ( RigContourMapCalculator::isColumnResult( resultAggregation ) ) + { + results.emplace( RiaDefines::ResultCatType::STATIC_NATIVE, "PORO" ); + results.emplace( RiaDefines::ResultCatType::STATIC_NATIVE, "NTG" ); + results.emplace( RiaDefines::ResultCatType::STATIC_NATIVE, "DZ" ); + + if ( resultAggregation == RigContourMapCalculator::OIL_COLUMN || resultAggregation == RigContourMapCalculator::HYDROCARBON_COLUMN || + resultAggregation == RigContourMapCalculator::MOBILE_OIL_COLUMN || + resultAggregation == RigContourMapCalculator::MOBILE_HYDROCARBON_COLUMN ) + { + results.emplace( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::soil() ); + } + if ( resultAggregation == RigContourMapCalculator::GAS_COLUMN || resultAggregation == RigContourMapCalculator::HYDROCARBON_COLUMN || + resultAggregation == RigContourMapCalculator::MOBILE_GAS_COLUMN || + resultAggregation == RigContourMapCalculator::MOBILE_HYDROCARBON_COLUMN ) + { + results.emplace( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::sgas() ); + } + } + + if ( RigContourMapCalculator::isMobileColumnResult( resultAggregation ) ) + { + if ( ( resultAggregation == RigContourMapCalculator::ResultAggregationType::MOBILE_OIL_COLUMN ) || + ( resultAggregation == RigContourMapCalculator::ResultAggregationType::MOBILE_HYDROCARBON_COLUMN ) ) + { + if ( floodingSettings.oilFlooding() == RigFloodingSettings::FloodingType::WATER_FLOODING ) + { + results.emplace( RiaDefines::ResultCatType::STATIC_NATIVE, RiaResultNames::sowcr() ); + } + else if ( floodingSettings.oilFlooding() == RigFloodingSettings::FloodingType::GAS_FLOODING ) + { + results.emplace( RiaDefines::ResultCatType::STATIC_NATIVE, RiaResultNames::sogcr() ); + } + } + if ( ( resultAggregation == RigContourMapCalculator::ResultAggregationType::MOBILE_GAS_COLUMN ) || + ( resultAggregation == RigContourMapCalculator::ResultAggregationType::MOBILE_HYDROCARBON_COLUMN ) ) + { + if ( floodingSettings.gasFlooding() == RigFloodingSettings::FloodingType::WATER_FLOODING ) + { + results.emplace( RiaDefines::ResultCatType::STATIC_NATIVE, RiaResultNames::sowcr() ); + } + else if ( floodingSettings.gasFlooding() == RigFloodingSettings::FloodingType::GAS_FLOODING ) + { + results.emplace( RiaDefines::ResultCatType::STATIC_NATIVE, RiaResultNames::sogcr() ); + } + } + } + + return results; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- + +std::vector RigEclipseContourMapProjection::residualOilData( RigCaseCellResultsData& resultData, + RigContourMapCalculator::ResultAggregationType resultAggregation, + RigFloodingSettings& floodingSettings, + size_t nSamples ) +{ + std::vector residualOil; + + if ( ( resultAggregation == RigContourMapCalculator::MOBILE_OIL_COLUMN ) || + ( resultAggregation == RigContourMapCalculator::MOBILE_HYDROCARBON_COLUMN ) ) + { + if ( floodingSettings.oilFlooding() == RigFloodingSettings::FloodingType::GAS_FLOODING ) + { + residualOil = + resultData.cellScalarResults( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, RiaResultNames::sogcr() ), 0 ); + } + else if ( floodingSettings.oilFlooding() == RigFloodingSettings::FloodingType::WATER_FLOODING ) + { + residualOil = + resultData.cellScalarResults( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, RiaResultNames::sowcr() ), 0 ); + } + else + { + residualOil.resize( nSamples, floodingSettings.oilUserDefFlooding() ); + } + } + + if ( residualOil.empty() ) residualOil.resize( nSamples, 0.0 ); + + return residualOil; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RigEclipseContourMapProjection::residualGasData( RigCaseCellResultsData& resultData, + RigContourMapCalculator::ResultAggregationType resultAggregation, + RigFloodingSettings& floodingSettings, + size_t nSamples ) +{ + std::vector residualGas; + + if ( ( resultAggregation == RigContourMapCalculator::MOBILE_GAS_COLUMN ) || + ( resultAggregation == RigContourMapCalculator::MOBILE_HYDROCARBON_COLUMN ) ) + { + if ( floodingSettings.gasFlooding() == RigFloodingSettings::FloodingType::GAS_FLOODING ) + { + residualGas = + resultData.cellScalarResults( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, RiaResultNames::sogcr() ), 0 ); + } + else if ( floodingSettings.gasFlooding() == RigFloodingSettings::FloodingType::USER_DEFINED ) + { + residualGas.resize( nSamples, floodingSettings.gasUserDefFlooding() ); + } + } + if ( residualGas.empty() ) residualGas.resize( nSamples, 0.0 ); + + return residualGas; +} diff --git a/ApplicationLibCode/ReservoirDataModel/RigEclipseContourMapProjection.h b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigEclipseContourMapProjection.h similarity index 70% rename from ApplicationLibCode/ReservoirDataModel/RigEclipseContourMapProjection.h rename to ApplicationLibCode/ReservoirDataModel/ContourMap/RigEclipseContourMapProjection.h index 0e825b7abe..3e2988aa3a 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigEclipseContourMapProjection.h +++ b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigEclipseContourMapProjection.h @@ -20,16 +20,19 @@ #include "RigContourMapCalculator.h" #include "RigContourMapProjection.h" +#include "RigEclipseResultAddress.h" +#include "RigFloodingSettings.h" #include "cvfBoundingBox.h" +#include + class RigActiveCellInfo; class RigMainGrid; class RigContourMapGrid; class RigResultAccessor; class RigEclipseCaseData; class RigCaseCellResultsData; -class RigEclipseResultAddress; //================================================================================================== /// @@ -45,18 +48,21 @@ public: void generateAndSaveResults( const RigEclipseResultAddress& resultAddress, RigContourMapCalculator::ResultAggregationType resultAggregation, - int timeStep ); + int timeStep, + RigFloodingSettings& floodingSettings ); std::vector generateResults( const RigEclipseResultAddress& resultAddress, RigContourMapCalculator::ResultAggregationType resultAggregation, - int timeStep ) const; + int timeStep, + RigFloodingSettings& floodingSettings ) const; static std::pair> generateResults( const RigEclipseContourMapProjection& contourMapProjection, const RigContourMapGrid& contourMapGrid, RigCaseCellResultsData& resultData, const RigEclipseResultAddress& resultAddress, RigContourMapCalculator::ResultAggregationType resultAggregation, - int timeStep ); + int timeStep, + RigFloodingSettings& floodingSettings ); std::vector getMapCellVisibility( int viewStepIndex, RigContourMapCalculator::ResultAggregationType resultAggregation ) override; @@ -71,12 +77,23 @@ protected: double getParameterWeightForCell( size_t cellResultIdx, const std::vector& parameterWeights ) const override; size_t gridResultIndex( size_t globalCellIdx ) const override; - // Eclipse implementation specific data generation methods - std::vector calculateColumnResult( RigContourMapCalculator::ResultAggregationType resultAggregation, int timeStep ) const; - static std::vector calculateColumnResult( RigCaseCellResultsData& resultData, RigContourMapCalculator::ResultAggregationType resultAggregation, - int timeStep ); + int timeStep, + RigFloodingSettings& floodingSettings ); + + static std::set neededResults( RigContourMapCalculator::ResultAggregationType resultAggregation, + RigFloodingSettings& floodingSettings ); + + static std::vector residualOilData( RigCaseCellResultsData& resultData, + RigContourMapCalculator::ResultAggregationType resultAggregation, + RigFloodingSettings& floodingSettings, + size_t nSamples ); + + static std::vector residualGasData( RigCaseCellResultsData& resultData, + RigContourMapCalculator::ResultAggregationType resultAggregation, + RigFloodingSettings& floodingSettings, + size_t nSamples ); protected: RigEclipseCaseData& m_eclipseCaseData; diff --git a/ApplicationLibCode/ReservoirDataModel/ContourMap/RigFloodingSettings.cpp b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigFloodingSettings.cpp new file mode 100644 index 0000000000..2d6b2ab424 --- /dev/null +++ b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigFloodingSettings.cpp @@ -0,0 +1,88 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2025 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RigFloodingSettings.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RigFloodingSettings::RigFloodingSettings( FloodingType oilFloodingType, + double userDefFloodingOil, + FloodingType gasFloodingType, + double userDefFloodingGas ) +{ + m_gasFloodingType = gasFloodingType; + m_oilFloodingType = oilFloodingType; + m_userDefFloodingGas = userDefFloodingGas; + m_userDefFloodingOil = userDefFloodingOil; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RigFloodingSettings::~RigFloodingSettings() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RigFloodingSettings::FloodingType RigFloodingSettings::oilFlooding() const +{ + return m_oilFloodingType; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RigFloodingSettings::FloodingType RigFloodingSettings::gasFlooding() const +{ + return m_gasFloodingType; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigFloodingSettings::oilUserDefFlooding() const +{ + return m_userDefFloodingOil; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigFloodingSettings::gasUserDefFlooding() const +{ + return m_userDefFloodingGas; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RigFloodingSettings::needsSogcr() const +{ + return ( m_gasFloodingType == FloodingType::GAS_FLOODING ) || ( m_oilFloodingType == FloodingType::GAS_FLOODING ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RigFloodingSettings::needsSowcr() const +{ + return ( m_gasFloodingType == FloodingType::WATER_FLOODING ) || ( m_oilFloodingType == FloodingType::WATER_FLOODING ); +} diff --git a/ApplicationLibCode/ReservoirDataModel/ContourMap/RigFloodingSettings.h b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigFloodingSettings.h new file mode 100644 index 0000000000..ce2338534f --- /dev/null +++ b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigFloodingSettings.h @@ -0,0 +1,48 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2025 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#pragma once + +class RigFloodingSettings +{ +public: + enum class FloodingType + { + WATER_FLOODING, + GAS_FLOODING, + USER_DEFINED + }; + +public: + RigFloodingSettings( FloodingType oilFloodingType, double userDefFloodingOil, FloodingType gasFloodingType, double userDefFloodingGas ); + ~RigFloodingSettings(); + + FloodingType oilFlooding() const; + FloodingType gasFlooding() const; + double oilUserDefFlooding() const; + double gasUserDefFlooding() const; + + bool needsSogcr() const; + bool needsSowcr() const; + +protected: + FloodingType m_oilFloodingType; + double m_userDefFloodingOil; + + FloodingType m_gasFloodingType; + double m_userDefFloodingGas; +}; \ No newline at end of file diff --git a/ApplicationLibCode/ReservoirDataModel/RigGeoMechContourMapProjection.cpp b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigGeoMechContourMapProjection.cpp similarity index 100% rename from ApplicationLibCode/ReservoirDataModel/RigGeoMechContourMapProjection.cpp rename to ApplicationLibCode/ReservoirDataModel/ContourMap/RigGeoMechContourMapProjection.cpp diff --git a/ApplicationLibCode/ReservoirDataModel/RigGeoMechContourMapProjection.h b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigGeoMechContourMapProjection.h similarity index 100% rename from ApplicationLibCode/ReservoirDataModel/RigGeoMechContourMapProjection.h rename to ApplicationLibCode/ReservoirDataModel/ContourMap/RigGeoMechContourMapProjection.h diff --git a/ApplicationLibCode/ReservoirDataModel/RigStatisticsContourMapProjection.cpp b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigStatisticsContourMapProjection.cpp similarity index 100% rename from ApplicationLibCode/ReservoirDataModel/RigStatisticsContourMapProjection.cpp rename to ApplicationLibCode/ReservoirDataModel/ContourMap/RigStatisticsContourMapProjection.cpp diff --git a/ApplicationLibCode/ReservoirDataModel/RigStatisticsContourMapProjection.h b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigStatisticsContourMapProjection.h similarity index 100% rename from ApplicationLibCode/ReservoirDataModel/RigStatisticsContourMapProjection.h rename to ApplicationLibCode/ReservoirDataModel/ContourMap/RigStatisticsContourMapProjection.h