From 395e294b00177e6febeb0da53f7a78894d1bff2f Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Fri, 28 Mar 2025 11:01:00 +0100 Subject: [PATCH] Refactor: Move residual oil/gas extraction to RigHydrocarbonTools. --- .../ReservoirDataModel/CMakeLists_files.cmake | 2 + .../RigEclipseContourMapProjection.cpp | 79 +++-------------- .../RigEclipseContourMapProjection.h | 10 --- .../RigHydrocarbonFlowTools.cpp | 87 +++++++++++++++++++ .../RigHydrocarbonFlowTools.h | 45 ++++++++++ 5 files changed, 148 insertions(+), 75 deletions(-) create mode 100644 ApplicationLibCode/ReservoirDataModel/RigHydrocarbonFlowTools.cpp create mode 100644 ApplicationLibCode/ReservoirDataModel/RigHydrocarbonFlowTools.h diff --git a/ApplicationLibCode/ReservoirDataModel/CMakeLists_files.cmake b/ApplicationLibCode/ReservoirDataModel/CMakeLists_files.cmake index 6af4cd5640..0a077a2acb 100644 --- a/ApplicationLibCode/ReservoirDataModel/CMakeLists_files.cmake +++ b/ApplicationLibCode/ReservoirDataModel/CMakeLists_files.cmake @@ -82,6 +82,7 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RigWeightedMeanCalc.h ${CMAKE_CURRENT_LIST_DIR}/RigPolygonTools.h ${CMAKE_CURRENT_LIST_DIR}/RigFloodingSettings.h + ${CMAKE_CURRENT_LIST_DIR}/RigHydrocarbonFlowTools.h ) set(SOURCE_GROUP_SOURCE_FILES @@ -164,6 +165,7 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RigWeightedMeanCalc.cpp ${CMAKE_CURRENT_LIST_DIR}/RigPolygonTools.cpp ${CMAKE_CURRENT_LIST_DIR}/RigFloodingSettings.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigHydrocarbonFlowTools.cpp ) list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) diff --git a/ApplicationLibCode/ReservoirDataModel/ContourMap/RigEclipseContourMapProjection.cpp b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigEclipseContourMapProjection.cpp index b3cd107c86..d0af14c3da 100644 --- a/ApplicationLibCode/ReservoirDataModel/ContourMap/RigEclipseContourMapProjection.cpp +++ b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigEclipseContourMapProjection.cpp @@ -27,6 +27,7 @@ #include "RigEclipseCaseData.h" #include "RigEclipseResultAddress.h" #include "RigHexIntersectionTools.h" +#include "RigHydrocarbonFlowTools.h" #include "RigMainGrid.h" #include @@ -170,8 +171,19 @@ std::vector RigEclipseContourMapProjection::calculateColumnResult( RigCa const auto nSamples = poroResults.size(); - std::vector residualOil = residualOilData( resultData, resultAggregation, floodingSettings, nSamples ); - std::vector residualGas = residualGasData( resultData, resultAggregation, floodingSettings, nSamples ); + auto mapToFlowResultType = []( RigContourMapCalculator::ResultAggregationType t1 ) + { + if ( t1 == RigContourMapCalculator::ResultAggregationType::MOBILE_OIL_COLUMN ) + return RigHydrocarbonFlowTools::ResultType::MOBILE_OIL; + if ( t1 == RigContourMapCalculator::ResultAggregationType::MOBILE_GAS_COLUMN ) + return RigHydrocarbonFlowTools::ResultType::MOBILE_GAS; + if ( t1 == RigContourMapCalculator::ResultAggregationType::MOBILE_HYDROCARBON_COLUMN ) + return RigHydrocarbonFlowTools::ResultType::MOBILE_HYDROCARBON; + return RigHydrocarbonFlowTools::ResultType::NONE; + }; + auto flowResultType = mapToFlowResultType( resultAggregation ); + std::vector residualOil = RigHydrocarbonFlowTools::residualOilData( resultData, flowResultType, floodingSettings, nSamples ); + std::vector residualGas = RigHydrocarbonFlowTools::residualGasData( resultData, flowResultType, floodingSettings, nSamples ); std::vector resultValues( nSamples, 0.0 ); @@ -375,66 +387,3 @@ std::set RigEclipseContourMapProjection::neededResults( 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::sgcr() ), 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/ContourMap/RigEclipseContourMapProjection.h b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigEclipseContourMapProjection.h index 3e2988aa3a..0332ff8c9f 100644 --- a/ApplicationLibCode/ReservoirDataModel/ContourMap/RigEclipseContourMapProjection.h +++ b/ApplicationLibCode/ReservoirDataModel/ContourMap/RigEclipseContourMapProjection.h @@ -85,16 +85,6 @@ protected: 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; RigCaseCellResultsData& m_resultData; diff --git a/ApplicationLibCode/ReservoirDataModel/RigHydrocarbonFlowTools.cpp b/ApplicationLibCode/ReservoirDataModel/RigHydrocarbonFlowTools.cpp new file mode 100644 index 0000000000..8967dceb72 --- /dev/null +++ b/ApplicationLibCode/ReservoirDataModel/RigHydrocarbonFlowTools.cpp @@ -0,0 +1,87 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// 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 "RigHydrocarbonFlowTools.h" + +#include "RiaDefines.h" +#include "RiaResultNames.h" + +#include "RigCaseCellResultsData.h" +#include "RigEclipseResultAddress.h" +#include "RigFloodingSettings.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RigHydrocarbonFlowTools::residualOilData( RigCaseCellResultsData& resultData, + RigHydrocarbonFlowTools::ResultType resultType, + const RigFloodingSettings& floodingSettings, + std::size_t nSamples ) +{ + std::vector residualOil; + + if ( ( resultType == RigHydrocarbonFlowTools::ResultType::MOBILE_OIL ) || + ( resultType == RigHydrocarbonFlowTools::ResultType::MOBILE_HYDROCARBON ) ) + { + 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 RigHydrocarbonFlowTools::residualGasData( RigCaseCellResultsData& resultData, + RigHydrocarbonFlowTools::ResultType resultType, + const RigFloodingSettings& floodingSettings, + std::size_t nSamples ) +{ + std::vector residualGas; + if ( ( resultType == RigHydrocarbonFlowTools::ResultType::MOBILE_GAS ) || + ( resultType == RigHydrocarbonFlowTools::ResultType::MOBILE_HYDROCARBON ) ) + { + if ( floodingSettings.gasFlooding() == RigFloodingSettings::FloodingType::GAS_FLOODING ) + { + residualGas = + resultData.cellScalarResults( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, RiaResultNames::sgcr() ), 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/RigHydrocarbonFlowTools.h b/ApplicationLibCode/ReservoirDataModel/RigHydrocarbonFlowTools.h new file mode 100644 index 0000000000..7f2ef78200 --- /dev/null +++ b/ApplicationLibCode/ReservoirDataModel/RigHydrocarbonFlowTools.h @@ -0,0 +1,45 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// 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 + +#include + +class RigCaseCellResultsData; +class RigFloodingSettings; + +class RigHydrocarbonFlowTools +{ +public: + enum class ResultType + { + NONE, + MOBILE_OIL, + MOBILE_GAS, + MOBILE_HYDROCARBON + }; + + static std::vector residualOilData( RigCaseCellResultsData& resultData, + RigHydrocarbonFlowTools::ResultType resultType, + const RigFloodingSettings& floodingSettings, + std::size_t nSamples ); + + static std::vector residualGasData( RigCaseCellResultsData& resultData, + RigHydrocarbonFlowTools::ResultType resultType, + const RigFloodingSettings& floodingSettings, + std::size_t nSamples ); +};