diff --git a/ApplicationLibCode/ProjectDataModel/RimWellTargetMapping.cpp b/ApplicationLibCode/ProjectDataModel/RimWellTargetMapping.cpp index 85723f83cb..852b796d5e 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellTargetMapping.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimWellTargetMapping.cpp @@ -26,7 +26,9 @@ #include "RiuMainWindow.h" #include "RigCaseCellResultsData.h" +#include "RigEclipseCaseData.h" #include "RigEclipseResultAddress.h" +#include "RigFloodingSettings.h" #include "RigStatisticsMath.h" #include "Well/RigWellTargetMapping.h" @@ -72,11 +74,13 @@ void caf::AppEnum::setUp() template <> void caf::AppEnum::setUp() { - addItem( RigWellTargetMapping::VolumesType::RESERVOIR_VOLUMES, "RESERVOIR", "Reservoir Volumes (RFIPOIL, RFIPGAS)" ); - addItem( RigWellTargetMapping::VolumesType::SURFACE_VOLUMES_SFIP, "SURFACE_SFIP", "Surface Volumes (SFIPOIL, SFIPGAS)" ); - addItem( RigWellTargetMapping::VolumesType::SURFACE_VOLUMES_FIP, "SURFACE_FIP", "Surface Volumes (FIPOIL, FIPGAS)" ); - addItem( RigWellTargetMapping::VolumesType::COMPUTED_VOLUMES, "COMPUTED", "Computed Volumes (PORV*SOIL, PORV*SGAS)" ); - setDefault( RigWellTargetMapping::VolumesType::COMPUTED_VOLUMES ); + addItem( RigWellTargetMapping::VolumesType::RESERVOIR_VOLUMES, "RESERVOIR_VOLUMES", "Reservoir Volumes (RFIPOIL, RFIPGAS)" ); + addItem( RigWellTargetMapping::VolumesType::SURFACE_VOLUMES_SFIP, "SURFACE_VOLUMES_SFIP", "Surface Volumes (SFIPOIL, SFIPGAS)" ); + addItem( RigWellTargetMapping::VolumesType::SURFACE_VOLUMES_FIP, "SURFACE_VOLUMES_FIP", "Surface Volumes (FIPOIL, FIPGAS)" ); + addItem( RigWellTargetMapping::VolumesType::RESERVOIR_VOLUMES_COMPUTED, + "RESERVOIR_VOLUMES_COMPUTED", + "Reservoir Volumes (PORV*SOIL, PORV*SGAS)" ); + setDefault( RigWellTargetMapping::VolumesType::RESERVOIR_VOLUMES_COMPUTED ); } } // End namespace caf @@ -94,6 +98,19 @@ RimWellTargetMapping::RimWellTargetMapping() CAF_PDM_InitFieldNoDefault( &m_volumeResultType, "VolumeResultType", "Result" ); CAF_PDM_InitFieldNoDefault( &m_volumesType, "VolumesType", "" ); + 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_InitField( &m_gasFloodingType, "GasFloodingType", RigFloodingSettings::FloodingType::GAS_FLOODING, "Residual Oil-in-Gas Given By" ); + caf::AppEnum::setEnumSubset( &m_gasFloodingType, + { RigFloodingSettings::FloodingType::GAS_FLOODING, + RigFloodingSettings::FloodingType::USER_DEFINED } ); + + CAF_PDM_InitField( &m_userDefinedFloodingGas, "UserDefinedFloodingGas", 0.0, "" ); + m_userDefinedFloodingGas.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() ); + CAF_PDM_InitField( &m_pressure, "Pressure", 0.0, "Pressure" ); m_pressure.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() ); @@ -319,6 +336,16 @@ void RimWellTargetMapping::defineEditorAttribute( const caf::PdmFieldHandle* fie attrib->m_buttonText = "Reset to P90"; } } + + 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; + } + } } //-------------------------------------------------------------------------------------------------- @@ -335,7 +362,9 @@ cvf::Vec3st RimWellTargetMapping::getResultGridCellCount() const void RimWellTargetMapping::generateCandidates( RimEclipseCase* eclipseCase ) { RigWellTargetMapping::ClusteringLimits limits = getClusteringLimits(); - RigWellTargetMapping::generateCandidates( eclipseCase, m_timeStep(), m_volumeType(), m_volumesType(), m_volumeResultType(), limits ); + RigFloodingSettings floodingSettings( m_oilFloodingType(), m_userDefinedFloodingOil(), m_gasFloodingType(), m_userDefinedFloodingGas() ); + + RigWellTargetMapping::generateCandidates( eclipseCase, m_timeStep(), m_volumeType(), m_volumesType(), m_volumeResultType(), floodingSettings, limits ); } //-------------------------------------------------------------------------------------------------- @@ -348,12 +377,15 @@ void RimWellTargetMapping::generateEnsembleStatistics() const cvf::Vec3st& resultGridCellCount = getResultGridCellCount(); RigWellTargetMapping::ClusteringLimits limits = getClusteringLimits(); - RimRegularGridCase* regularGridCase = RigWellTargetMapping::generateEnsembleCandidates( *ensemble, + RigFloodingSettings floodingSettings( m_oilFloodingType(), m_userDefinedFloodingOil(), m_gasFloodingType(), m_userDefinedFloodingGas() ); + + RimRegularGridCase* regularGridCase = RigWellTargetMapping::generateEnsembleCandidates( *ensemble, m_timeStep(), resultGridCellCount, m_volumeType(), m_volumesType(), m_volumeResultType(), + floodingSettings, limits ); regularGridCase->setCustomCaseName( "Ensemble Grid" ); @@ -384,6 +416,32 @@ void RimWellTargetMapping::defineUiOrdering( QString uiConfigName, caf::PdmUiOrd resultGroup->add( &m_timeStep ); resultGroup->add( &m_volumeType ); resultGroup->add( &m_volumeResultType ); + + if ( m_volumeResultType() == RigWellTargetMapping::VolumeResultType::MOBILE ) + { + bool showGasOptions = m_volumeType() == RigWellTargetMapping::VolumeType::GAS || + m_volumeType() == RigWellTargetMapping::VolumeType::HYDROCARBON; + bool showOilOptions = m_volumeType() == RigWellTargetMapping::VolumeType::OIL || + m_volumeType() == RigWellTargetMapping::VolumeType::HYDROCARBON; + + if ( showOilOptions ) + { + resultGroup->add( &m_oilFloodingType ); + if ( m_oilFloodingType() == RigFloodingSettings::FloodingType::USER_DEFINED ) + { + resultGroup->add( &m_userDefinedFloodingOil ); + } + } + if ( showGasOptions ) + { + resultGroup->add( &m_gasFloodingType ); + if ( m_gasFloodingType() == RigFloodingSettings::FloodingType::USER_DEFINED ) + { + resultGroup->add( &m_userDefinedFloodingGas ); + } + } + } + resultGroup->add( &m_volumesType ); caf::PdmUiGroup* minimumCellValuesGroup = uiOrdering.addNewGroup( "Minimum Cell Values" ); @@ -480,7 +538,7 @@ void RimWellTargetMapping::setDefaults() if ( std::find( available.begin(), available.end(), pri ) != available.end() ) return pri; } - return RigWellTargetMapping::VolumesType::COMPUTED_VOLUMES; + return RigWellTargetMapping::VolumesType::RESERVOIR_VOLUMES_COMPUTED; }; // Use last available time step @@ -491,7 +549,7 @@ void RimWellTargetMapping::setDefaults() std::vector volumesTypesByPriority = { RigWellTargetMapping::VolumesType::RESERVOIR_VOLUMES, RigWellTargetMapping::VolumesType::SURFACE_VOLUMES_SFIP, RigWellTargetMapping::VolumesType::SURFACE_VOLUMES_FIP, - RigWellTargetMapping::VolumesType::COMPUTED_VOLUMES }; + RigWellTargetMapping::VolumesType::RESERVOIR_VOLUMES_COMPUTED }; std::vector availableVolumesTypes = findAvailableVolumesTypes( eclipseCase ); m_volumesType = findFirstByPriority( volumesTypesByPriority, availableVolumesTypes ); @@ -526,7 +584,7 @@ std::vector RimWellTargetMapping::findAvailab std::vector availableVolumesTypes; if ( hasResult( *resultsData, RiaResultNames::riPorvSoil() ) || hasResult( *resultsData, RiaResultNames::riPorvSgas() ) ) - availableVolumesTypes.push_back( RigWellTargetMapping::VolumesType::COMPUTED_VOLUMES ); + availableVolumesTypes.push_back( RigWellTargetMapping::VolumesType::RESERVOIR_VOLUMES_COMPUTED ); if ( hasResult( *resultsData, "RFIPOIL" ) || hasResult( *resultsData, "RFIPGAS" ) ) availableVolumesTypes.push_back( RigWellTargetMapping::VolumesType::RESERVOIR_VOLUMES ); diff --git a/ApplicationLibCode/ProjectDataModel/RimWellTargetMapping.h b/ApplicationLibCode/ProjectDataModel/RimWellTargetMapping.h index fab2f28d39..f57be9bc10 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellTargetMapping.h +++ b/ApplicationLibCode/ProjectDataModel/RimWellTargetMapping.h @@ -21,8 +21,8 @@ #include "cafAppEnum.h" #include "cafPdmField.h" #include "cafPdmObject.h" -#include "cafPdmPtrField.h" +#include "RigFloodingSettings.h" #include "Well/RigWellTargetMapping.h" class RimEclipseResultDefinition; @@ -37,6 +37,8 @@ class RimWellTargetMapping : public caf::PdmObject CAF_PDM_HEADER_INIT; public: + using FloodingType = caf::AppEnum; + RimWellTargetMapping(); ~RimWellTargetMapping() override; @@ -73,6 +75,11 @@ private: caf::PdmField> m_volumeResultType; caf::PdmField> m_volumesType; + caf::PdmField m_oilFloodingType; + caf::PdmField m_gasFloodingType; + caf::PdmField m_userDefinedFloodingGas; + caf::PdmField m_userDefinedFloodingOil; + caf::PdmField m_pressure; caf::PdmField m_permeability; caf::PdmField m_transmissibility; diff --git a/ApplicationLibCode/ReservoirDataModel/Well/RigWellTargetMapping.cpp b/ApplicationLibCode/ReservoirDataModel/Well/RigWellTargetMapping.cpp index 0b49326dc6..b9c3c1b91d 100644 --- a/ApplicationLibCode/ReservoirDataModel/Well/RigWellTargetMapping.cpp +++ b/ApplicationLibCode/ReservoirDataModel/Well/RigWellTargetMapping.cpp @@ -18,6 +18,8 @@ #include "RigWellTargetMapping.h" +#include "RiaDefines.h" +#include "RiaEclipseUnitTools.h" #include "RiaLogging.h" #include "RiaPorosityModel.h" #include "RiaPreferencesSystem.h" @@ -28,6 +30,8 @@ #include "RigCaseCellResultsData.h" #include "RigEclipseCaseData.h" #include "RigEclipseResultAddress.h" +#include "RigFloodingSettings.h" +#include "RigHydrocarbonFlowTools.h" #include "RigMainGrid.h" #include "RigNNCData.h" #include "RigStatisticsMath.h" @@ -53,12 +57,13 @@ //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RigWellTargetMapping::generateCandidates( RimEclipseCase* eclipseCase, - size_t timeStepIdx, - VolumeType volumeType, - VolumesType volumesType, - VolumeResultType volumeResultType, - const ClusteringLimits& limits ) +void RigWellTargetMapping::generateCandidates( RimEclipseCase* eclipseCase, + size_t timeStepIdx, + VolumeType volumeType, + VolumesType volumesType, + VolumeResultType volumeResultType, + const RigFloodingSettings& floodingSettings, + const ClusteringLimits& limits ) { if ( !eclipseCase->ensureReservoirCaseIsOpen() ) return; @@ -74,9 +79,13 @@ void RigWellTargetMapping::generateCandidates( RimEclipseCase* eclipseCa auto resultsData = eclipseCase->results( RiaDefines::PorosityModelType::MATRIX_MODEL ); if ( !resultsData ) return; - DataContainer data; + auto caseData = eclipseCase->eclipseCaseData(); + if ( !caseData ) return; - data.volume = getVolumeVector( *resultsData, volumeType, volumesType, volumeResultType, timeStepIdx ); + RiaDefines::EclipseUnitSystem unitsType = caseData->unitsType(); + + DataContainer data; + data.volume = getVolumeVector( *resultsData, unitsType, volumeType, volumesType, volumeResultType, timeStepIdx, floodingSettings ); if ( data.volume.empty() ) { RiaLogging::error( "Unable to produce volume vector." ); @@ -553,83 +562,202 @@ double RigWellTargetMapping::getTransmissibilityValueForFace( const std::vector< //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RigWellTargetMapping::getVolumeVector( RigCaseCellResultsData& resultsData, - VolumeType volumeType, - VolumesType volumesType, - VolumeResultType volumeResultType, - size_t timeStepIdx ) +std::vector RigWellTargetMapping::loadVectorByName( RigCaseCellResultsData& resultsData, const QString& resultName, size_t timeStepIdx ) { - auto loadVectorByName = []( RigCaseCellResultsData& resultsData, const QString& resultName, size_t timeStepIdx ) -> std::vector - { - RigEclipseResultAddress address( RiaDefines::ResultCatType::DYNAMIC_NATIVE, resultName ); - if ( !resultsData.ensureKnownResultLoaded( address ) ) return {}; - return resultsData.cellScalarResults( address, timeStepIdx ); - }; + RigEclipseResultAddress address( RiaDefines::ResultCatType::DYNAMIC_NATIVE, resultName ); + if ( !resultsData.ensureKnownResultLoaded( address ) ) return {}; + return resultsData.cellScalarResults( address, timeStepIdx ); +} - auto getOilVectorName = []( VolumesType volumesType ) -> QString +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RigWellTargetMapping::getOilVectorName( VolumesType volumesType ) +{ + switch ( volumesType ) { - switch ( volumesType ) + case VolumesType::RESERVOIR_VOLUMES_COMPUTED: + return RiaResultNames::riPorvSoil(); + case VolumesType::RESERVOIR_VOLUMES: + return "RFIPOIL"; + case VolumesType::SURFACE_VOLUMES_SFIP: + return "SFIPOIL"; + case VolumesType::SURFACE_VOLUMES_FIP: + return "FIPOIL"; + default: { - case VolumesType::COMPUTED_VOLUMES: - return RiaResultNames::riPorvSoil(); - case VolumesType::RESERVOIR_VOLUMES: - return "RFIPOIL"; - case VolumesType::SURFACE_VOLUMES_SFIP: - return "SFIPOIL"; - case VolumesType::SURFACE_VOLUMES_FIP: - return "FIPOIL"; - default: + CAF_ASSERT( false ); + return ""; + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RigWellTargetMapping::getGasVectorName( VolumesType volumesType ) +{ + switch ( volumesType ) + { + case VolumesType::RESERVOIR_VOLUMES_COMPUTED: + return RiaResultNames::riPorvSgas(); + case VolumesType::RESERVOIR_VOLUMES: + return "RFIPGAS"; + case VolumesType::SURFACE_VOLUMES_SFIP: + return "SFIPGAS"; + case VolumesType::SURFACE_VOLUMES_FIP: + return "FIPGAS"; + default: + { + CAF_ASSERT( false ); + return ""; + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RigWellTargetMapping::loadOilVectorByName( RigCaseCellResultsData& resultsData, + VolumesType volumesType, + VolumeResultType volumeResultType, + size_t timeStepIdx, + const RigFloodingSettings& floodingSettings ) +{ + std::vector volume = loadVectorByName( resultsData, getOilVectorName( volumesType ), timeStepIdx ); + if ( volumeResultType == RigWellTargetMapping::VolumeResultType::MOBILE ) + { + std::vector residualOil = RigHydrocarbonFlowTools::residualOilData( resultsData, + RigHydrocarbonFlowTools::ResultType::MOBILE_OIL, + floodingSettings, + volume.size() ); + if ( volumesType == RigWellTargetMapping::VolumesType::RESERVOIR_VOLUMES_COMPUTED ) + { + const std::vector& porvResults = + resultsData.cellScalarResults( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, "PORV" ), 0 ); + + for ( size_t i = 0; i < volume.size(); i++ ) { - CAF_ASSERT( false ); - return ""; + volume[i] = std::max( volume[i] - ( porvResults[i] * residualOil[i] ), 0.0 ); } } - }; - - auto getGasVectorName = []( VolumesType volumesType ) -> QString - { - switch ( volumesType ) + else { - case VolumesType::COMPUTED_VOLUMES: - return RiaResultNames::riPorvSgas(); - case VolumesType::RESERVOIR_VOLUMES: - return "RFIPGAS"; - case VolumesType::SURFACE_VOLUMES_SFIP: - return "SFIPGAS"; - case VolumesType::SURFACE_VOLUMES_FIP: - return "FIPGAS"; - default: + const std::vector& soilResults = + resultsData.cellScalarResults( RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::soil() ), + timeStepIdx ); + + for ( size_t i = 0; i < volume.size(); i++ ) { - CAF_ASSERT( false ); - return ""; + if ( soilResults[i] != 0.0 ) + { + volume[i] = std::max( volume[i] * ( soilResults[i] - residualOil[i] ) / soilResults[i], 0.0 ); + } + else + { + volume[i] = 0.0; + } } } - }; + } - std::vector volume; + return volume; +} +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RigWellTargetMapping::loadGasVectorByName( RigCaseCellResultsData& resultsData, + RiaDefines::EclipseUnitSystem unitsType, + VolumesType volumesType, + VolumeResultType volumeResultType, + size_t timeStepIdx, + const RigFloodingSettings& floodingSettings ) +{ + std::vector volume = loadVectorByName( resultsData, getGasVectorName( volumesType ), timeStepIdx ); + + if ( volumeResultType == RigWellTargetMapping::VolumeResultType::MOBILE ) + { + std::vector residualGas = RigHydrocarbonFlowTools::residualGasData( resultsData, + RigHydrocarbonFlowTools::ResultType::MOBILE_GAS, + floodingSettings, + volume.size() ); + if ( volumesType == RigWellTargetMapping::VolumesType::RESERVOIR_VOLUMES_COMPUTED ) + { + const std::vector& porvResults = + resultsData.cellScalarResults( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, "PORV" ), 0 ); + + for ( size_t i = 0; i < volume.size(); i++ ) + { + volume[i] = std::max( volume[i] - ( porvResults[i] * residualGas[i] ), 0.0 ); + } + } + else + { + const std::vector& sgasResults = + resultsData.cellScalarResults( RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::sgas() ), + timeStepIdx ); + + for ( size_t i = 0; i < volume.size(); i++ ) + { + if ( sgasResults[i] != 0.0 ) + { + volume[i] = std::max( volume[i] * ( sgasResults[i] - residualGas[i] ) / sgasResults[i], 0.0 ); + } + else + { + volume[i] = 0.0; + } + } + } + } + + // Convert to gas volumes to oil equivalents + for ( size_t i = 0; i < volume.size(); i++ ) + { + volume[i] = RiaEclipseUnitTools::convertSurfaceGasFlowRateToOilEquivalents( unitsType, volume[i] ); + } + + return volume; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RigWellTargetMapping::getVolumeVector( RigCaseCellResultsData& resultsData, + RiaDefines::EclipseUnitSystem unitsType, + VolumeType volumeType, + VolumesType volumesType, + VolumeResultType volumeResultType, + size_t timeStepIdx, + const RigFloodingSettings& floodingSettings ) +{ if ( volumeType == VolumeType::OIL ) { - volume = loadVectorByName( resultsData, getOilVectorName( volumesType ), timeStepIdx ); + return loadOilVectorByName( resultsData, volumesType, volumeResultType, timeStepIdx, floodingSettings ); } else if ( volumeType == VolumeType::GAS ) { - volume = loadVectorByName( resultsData, getGasVectorName( volumesType ), timeStepIdx ); + return loadGasVectorByName( resultsData, unitsType, volumesType, volumeResultType, timeStepIdx, floodingSettings ); } else if ( volumeType == VolumeType::HYDROCARBON ) { - std::vector oilVolume = loadVectorByName( resultsData, getOilVectorName( volumesType ), timeStepIdx ); - std::vector gasVolume = loadVectorByName( resultsData, getGasVectorName( volumesType ), timeStepIdx ); - if ( oilVolume.empty() || gasVolume.empty() || oilVolume.size() != gasVolume.size() ) return volume; + std::vector oilVolume = loadOilVectorByName( resultsData, volumesType, volumeResultType, timeStepIdx, floodingSettings ); + std::vector gasVolume = + loadGasVectorByName( resultsData, unitsType, volumesType, volumeResultType, timeStepIdx, floodingSettings ); + if ( oilVolume.empty() || gasVolume.empty() || oilVolume.size() != gasVolume.size() ) return {}; + std::vector volume; volume.resize( oilVolume.size(), std::numeric_limits::infinity() ); for ( size_t i = 0; i < oilVolume.size(); i++ ) { volume[i] = oilVolume[i] + gasVolume[i]; } + return volume; } - return volume; + CAF_ASSERT( false && "Unknown volume type" ); + return {}; } //-------------------------------------------------------------------------------------------------- @@ -721,13 +849,14 @@ std::vector RigWellTargetMapping::gener //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimRegularGridCase* RigWellTargetMapping::generateEnsembleCandidates( RimEclipseCaseEnsemble& ensemble, - size_t timeStepIdx, - const cvf::Vec3st& resultGridCellCount, - VolumeType volumeType, - VolumesType volumesType, - VolumeResultType volumeResultType, - const ClusteringLimits& limits ) +RimRegularGridCase* RigWellTargetMapping::generateEnsembleCandidates( RimEclipseCaseEnsemble& ensemble, + size_t timeStepIdx, + const cvf::Vec3st& resultGridCellCount, + VolumeType volumeType, + VolumesType volumesType, + VolumeResultType volumeResultType, + const RigFloodingSettings& floodingSettings, + const ClusteringLimits& limits ) { RiaLogging::debug( "Generating ensemble statistics" ); @@ -737,7 +866,7 @@ RimRegularGridCase* RigWellTargetMapping::generateEnsembleCandidates( RimEclipse { auto task = progInfo.task( "Generating realization statistics.", 1 ); - generateCandidates( eclipseCase, timeStepIdx, volumeType, volumesType, volumeResultType, limits ); + generateCandidates( eclipseCase, timeStepIdx, volumeType, volumesType, volumeResultType, floodingSettings, limits ); } cvf::BoundingBox boundingBox; diff --git a/ApplicationLibCode/ReservoirDataModel/Well/RigWellTargetMapping.h b/ApplicationLibCode/ReservoirDataModel/Well/RigWellTargetMapping.h index 167fa16393..acdbd177d7 100644 --- a/ApplicationLibCode/ReservoirDataModel/Well/RigWellTargetMapping.h +++ b/ApplicationLibCode/ReservoirDataModel/Well/RigWellTargetMapping.h @@ -36,6 +36,7 @@ class RigMainGrid; class RimEclipseCase; class RimEclipseCaseEnsemble; class RimRegularGridCase; +class RigFloodingSettings; //================================================================================================== /// @@ -64,7 +65,7 @@ public: RESERVOIR_VOLUMES, SURFACE_VOLUMES_SFIP, SURFACE_VOLUMES_FIP, - COMPUTED_VOLUMES + RESERVOIR_VOLUMES_COMPUTED }; struct ClusteringLimits @@ -91,26 +92,30 @@ public: const std::vector* transmissibilityNNC; }; - static void generateCandidates( RimEclipseCase* eclipseCase, - size_t timeStepIdx, - VolumeType volumeType, - VolumesType volumesType, - VolumeResultType volumeResultType, - const ClusteringLimits& limits ); + static void generateCandidates( RimEclipseCase* eclipseCase, + size_t timeStepIdx, + VolumeType volumeType, + VolumesType volumesType, + VolumeResultType volumeResultType, + const RigFloodingSettings& floodingSettings, + const ClusteringLimits& limits ); - static std::vector getVolumeVector( RigCaseCellResultsData& resultsData, - VolumeType volumeType, - VolumesType volumesType, - VolumeResultType volumeResultType, - size_t timeStepIdx ); + static std::vector getVolumeVector( RigCaseCellResultsData& resultsData, + RiaDefines::EclipseUnitSystem unitsType, + VolumeType volumeType, + VolumesType volumesType, + VolumeResultType volumeResultType, + size_t timeStepIdx, + const RigFloodingSettings& floodingSettings ); - static RimRegularGridCase* generateEnsembleCandidates( RimEclipseCaseEnsemble& ensemble, - size_t timeStepIdx, - const cvf::Vec3st& resultGridCellCount, - VolumeType volumeType, - VolumesType volumesType, - VolumeResultType volumeResultType, - const ClusteringLimits& limits ); + static RimRegularGridCase* generateEnsembleCandidates( RimEclipseCaseEnsemble& ensemble, + size_t timeStepIdx, + const cvf::Vec3st& resultGridCellCount, + VolumeType volumeType, + VolumesType volumesType, + VolumeResultType volumeResultType, + const RigFloodingSettings& floodingSettings, + const ClusteringLimits& limits ); static QString wellTargetResultName(); @@ -213,4 +218,22 @@ private: static cvf::BoundingBox computeBoundingBoxForResult( RimEclipseCase& eclipseCase, const QString& resultName, size_t timeStepIndex ); static std::list, size_t>> nncConnectionCellAndResult( size_t cellIdx, RigMainGrid* mainGrid ); + + static std::vector loadVectorByName( RigCaseCellResultsData& resultsData, const QString& resultName, size_t timeStepIdx ); + + static std::vector loadOilVectorByName( RigCaseCellResultsData& resultsData, + VolumesType volumesType, + VolumeResultType volumeResultType, + size_t timeStepIdx, + const RigFloodingSettings& floodingSettings ); + + static std::vector loadGasVectorByName( RigCaseCellResultsData& resultsData, + RiaDefines::EclipseUnitSystem unitsType, + VolumesType volumesType, + VolumeResultType volumeResultType, + size_t timeStepIdx, + const RigFloodingSettings& floodingSettings ); + + static QString getOilVectorName( VolumesType volumesType ); + static QString getGasVectorName( VolumesType volumesType ); };