diff --git a/ApplicationLibCode/Application/RiaPreferencesGrid.cpp b/ApplicationLibCode/Application/RiaPreferencesGrid.cpp index 6e89a69fab..1959604add 100644 --- a/ApplicationLibCode/Application/RiaPreferencesGrid.cpp +++ b/ApplicationLibCode/Application/RiaPreferencesGrid.cpp @@ -21,6 +21,9 @@ #include "RiaApplication.h" #include "RiaLogging.h" #include "RiaPreferences.h" +#include "RiaPreferencesSystem.h" + +#include "RifReaderSettings.h" #include "cafPdmUiCheckBoxEditor.h" @@ -155,20 +158,8 @@ void RiaPreferencesGrid::appendItems( caf::PdmUiOrdering& uiOrdering ) //-------------------------------------------------------------------------------------------------- RifReaderSettings RiaPreferencesGrid::gridOnlyReaderSettings() { - RifReaderSettings rs{ - // Disable as much as possible - false, // import faults - false, // import NNCs - false, // includeInactiveCellsInFaultGeometry - false, // importAdvancedMswData - false, // useResultIndexFile - true, // skipWellData - false, // import summary data - "", // include prefix, - false, // only active cells - true // ignore long thin cells - }; - return rs; + // Use the default settings, as they disable most options + return {}; } //-------------------------------------------------------------------------------------------------- @@ -176,16 +167,19 @@ RifReaderSettings RiaPreferencesGrid::gridOnlyReaderSettings() //-------------------------------------------------------------------------------------------------- RifReaderSettings RiaPreferencesGrid::readerSettings() { - RifReaderSettings rs{ m_importFaults, - m_importNNCs, - m_includeInactiveCellsInFaultGeometry, - m_importAdvancedMswData, - m_useResultIndexFile, - m_skipWellData, - true, // import summary data - m_includeFileAbsolutePathPrefix, - onlyLoadActiveCells(), - m_invalidateLongThinCells }; + RifReaderSettings rs{ .importFaults = m_importFaults, + .importNNCs = m_importNNCs, + .includeInactiveCellsInFaultGeometry = m_includeInactiveCellsInFaultGeometry, + .importAdvancedMswData = m_importAdvancedMswData, + .skipWellData = m_skipWellData, + .importSummaryData = true, + .includeFileAbsolutePathPrefix = m_includeFileAbsolutePathPrefix, + .onlyLoadActiveCells = m_onlyLoadActiveCells, + .invalidateLongThinCells = m_invalidateLongThinCells, + .useCylindricalCoordinates = RiaPreferencesSystem::current()->useCylindricalCoordinates(), + .minimumAngularCellCount = RiaPreferencesSystem::current()->minimumAngularCellCount() + + }; return rs; } diff --git a/ApplicationLibCode/Application/RiaPreferencesGrid.h b/ApplicationLibCode/Application/RiaPreferencesGrid.h index 8e95831dc8..189c7d419c 100644 --- a/ApplicationLibCode/Application/RiaPreferencesGrid.h +++ b/ApplicationLibCode/Application/RiaPreferencesGrid.h @@ -24,10 +24,10 @@ #include "RiaDefines.h" -#include "RifReaderSettings.h" - #include +struct RifReaderSettings; + //================================================================================================== /// /// diff --git a/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.cpp b/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.cpp index c4f88f2837..5b7300821f 100644 --- a/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.cpp +++ b/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.cpp @@ -31,7 +31,6 @@ #include "RiaViewRedrawScheduler.h" #include "RifEclipseSummaryTools.h" -#include "RifReaderSettings.h" #include "RifSummaryCaseRestartSelector.h" #include "RifSummaryReaderInterface.h" diff --git a/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.h b/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.h index e3a52837f1..486fc75d2c 100644 --- a/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.h +++ b/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.h @@ -20,18 +20,17 @@ #include -#include "RifReaderSettings.h" - #include #include #include #include class QString; - class RimIdenticalGridCaseGroup; class RimRoffCase; +struct RifReaderSettings; + //================================================================================================== /// //================================================================================================== diff --git a/ApplicationLibCode/Commands/EclipseCommands/RicImportEclipseCaseFeature.cpp b/ApplicationLibCode/Commands/EclipseCommands/RicImportEclipseCaseFeature.cpp index 8d85dcaaf0..d759dc48ad 100644 --- a/ApplicationLibCode/Commands/EclipseCommands/RicImportEclipseCaseFeature.cpp +++ b/ApplicationLibCode/Commands/EclipseCommands/RicImportEclipseCaseFeature.cpp @@ -22,6 +22,8 @@ #include "RiaApplication.h" #include "RiaPreferencesGrid.h" +#include "RifReaderSettings.h" + #include "RimEclipseCaseCollection.h" #include "Riu3DMainWindowTools.h" diff --git a/ApplicationLibCode/Commands/RicImportGeneralDataFeature.h b/ApplicationLibCode/Commands/RicImportGeneralDataFeature.h index 34a3932b69..b08dc5d6d0 100644 --- a/ApplicationLibCode/Commands/RicImportGeneralDataFeature.h +++ b/ApplicationLibCode/Commands/RicImportGeneralDataFeature.h @@ -27,7 +27,7 @@ #include #include -#include "RifReaderSettings.h" +struct RifReaderSettings; //================================================================================================== /// diff --git a/ApplicationLibCode/FileInterface/RifEclipseInputFileTools.h b/ApplicationLibCode/FileInterface/RifEclipseInputFileTools.h index ce23b7041d..cbf38e579e 100644 --- a/ApplicationLibCode/FileInterface/RifEclipseInputFileTools.h +++ b/ApplicationLibCode/FileInterface/RifEclipseInputFileTools.h @@ -24,7 +24,6 @@ #include "cvfObject.h" #include "RiaDefines.h" -#include "RifReaderInterface.h" #include "RigFault.h" #include "ert/ecl/ecl_kw.h" diff --git a/ApplicationLibCode/FileInterface/RifEclipseRestartDataAccess.h b/ApplicationLibCode/FileInterface/RifEclipseRestartDataAccess.h index 7319c4a255..43162ae028 100644 --- a/ApplicationLibCode/FileInterface/RifEclipseRestartDataAccess.h +++ b/ApplicationLibCode/FileInterface/RifEclipseRestartDataAccess.h @@ -30,7 +30,6 @@ #include "ert/ecl_well/well_info.hpp" #include "RifEclipseReportKeywords.h" -#include "RifReaderInterface.h" //================================================================================================== // diff --git a/ApplicationLibCode/FileInterface/RifEclipseTextFileReader.h b/ApplicationLibCode/FileInterface/RifEclipseTextFileReader.h index 259a49e9d9..6621cbf46c 100644 --- a/ApplicationLibCode/FileInterface/RifEclipseTextFileReader.h +++ b/ApplicationLibCode/FileInterface/RifEclipseTextFileReader.h @@ -18,7 +18,8 @@ #pragma once -#include "RifReaderInterface.h" +#include +#include class RifEclipseKeywordContent; diff --git a/ApplicationLibCode/FileInterface/RifEclipseUnifiedRestartFileAccess.cpp b/ApplicationLibCode/FileInterface/RifEclipseUnifiedRestartFileAccess.cpp index 81a7fd9322..2f1328bfac 100644 --- a/ApplicationLibCode/FileInterface/RifEclipseUnifiedRestartFileAccess.cpp +++ b/ApplicationLibCode/FileInterface/RifEclipseUnifiedRestartFileAccess.cpp @@ -134,6 +134,7 @@ bool RifEclipseUnifiedRestartFileAccess::openFile() //-------------------------------------------------------------------------------------------------- bool RifEclipseUnifiedRestartFileAccess::useResultIndexFile() const { + // Refactoring note: Consider using RifReaderSettings instead of RiaPreferencesGrid directly RiaPreferencesGrid* prefs = RiaPreferencesGrid::current(); return prefs->useResultIndexFile(); } diff --git a/ApplicationLibCode/FileInterface/RifReaderEclipseOutput.cpp b/ApplicationLibCode/FileInterface/RifReaderEclipseOutput.cpp index d9f338c214..3a9750be3f 100644 --- a/ApplicationLibCode/FileInterface/RifReaderEclipseOutput.cpp +++ b/ApplicationLibCode/FileInterface/RifReaderEclipseOutput.cpp @@ -31,6 +31,7 @@ #include "RifEclipseRestartDataAccess.h" #include "RifEdfmTools.h" #include "RifHdf5ReaderInterface.h" +#include "RifOpmRadialGridTools.h" #include "RifReaderEclipseWell.h" #ifdef USE_HDF5 @@ -427,6 +428,33 @@ bool RifReaderEclipseOutput::open( const QString& fileName, RigEclipseCaseData* buildMetaData( mainEclGrid ); } + if ( readerSettings().useCylindricalCoordinates ) + { + // Check if min J coordinate is close to 0.0 and max is close to 360. This is a workaround for import of simulation cases that + // has an invalid header and is not possible to import using opm-common + RigMainGrid* mainGrid = eclipseCaseData->mainGrid(); + + if ( !mainGrid->boundingBox().isValid() ) + { + mainGrid->computeBoundingBox(); + } + + auto bb = mainGrid->boundingBox(); + const double epsilon = 1.0; + if ( bb.isValid() && ( std::abs( bb.min().y() ) < epsilon ) && ( std::abs( bb.max().y() - 360.0 ) < epsilon ) ) + { + m_isRadialGrid = true; + + size_t minimumAngularCellCount = static_cast( readerSettings().minimumAngularCellCount ); + if ( mainGrid->cellCountJ() < minimumAngularCellCount ) + { + auto angularRefinement = ( minimumAngularCellCount / mainGrid->cellCountJ() ) + 1; + + RifOpmRadialGridTools::createAngularGridRefinement( eclipseCaseData, angularRefinement ); + } + } + } + { auto task = progress.task( "Handling NCC data", 20 ); if ( isNNCsEnabled() ) @@ -1120,6 +1148,14 @@ void RifReaderEclipseOutput::updateFromGridCount( size_t gridCount ) } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifReaderEclipseOutput::isRadialGrid() const +{ + return m_isRadialGrid; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/FileInterface/RifReaderEclipseOutput.h b/ApplicationLibCode/FileInterface/RifReaderEclipseOutput.h index b7aee2dfb7..8f750ead17 100644 --- a/ApplicationLibCode/FileInterface/RifReaderEclipseOutput.h +++ b/ApplicationLibCode/FileInterface/RifReaderEclipseOutput.h @@ -88,6 +88,8 @@ public: void updateFromGridCount( size_t gridCount ) override; + bool isRadialGrid() const override; + private: bool readActiveCellInfo(); @@ -124,4 +126,5 @@ private: mutable cvf::ref m_dynamicResultsAccess; // File access to dynamic results std::unique_ptr m_hdfReaderInterface; + bool m_isRadialGrid = false; }; diff --git a/ApplicationLibCode/FileInterface/RifReaderInterface.cpp b/ApplicationLibCode/FileInterface/RifReaderInterface.cpp index a52a73a613..d37640a28e 100644 --- a/ApplicationLibCode/FileInterface/RifReaderInterface.cpp +++ b/ApplicationLibCode/FileInterface/RifReaderInterface.cpp @@ -113,6 +113,14 @@ std::set RifReaderInterface::availablePhases() const return std::set(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifReaderInterface::isRadialGrid() const +{ + return false; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -199,3 +207,11 @@ void RifReaderInterface::importFaults( const QStringList& fileSet, cvf::Collecti } } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RifReaderSettings RifReaderInterface::readerSettings() const +{ + return m_readerSettings; +} diff --git a/ApplicationLibCode/FileInterface/RifReaderInterface.h b/ApplicationLibCode/FileInterface/RifReaderInterface.h index bcb99924ef..c2aff25763 100644 --- a/ApplicationLibCode/FileInterface/RifReaderInterface.h +++ b/ApplicationLibCode/FileInterface/RifReaderInterface.h @@ -79,10 +79,13 @@ public: virtual void updateFromGridCount( size_t gridCount ) {}; + virtual bool isRadialGrid() const; + protected: - bool isTimeStepIncludedByFilter( size_t timeStepIndex ) const; - size_t timeStepIndexOnFile( size_t timeStepIndex ) const; - void importFaults( const QStringList& fileSet, cvf::Collection* faults ); + bool isTimeStepIncludedByFilter( size_t timeStepIndex ) const; + size_t timeStepIndexOnFile( size_t timeStepIndex ) const; + void importFaults( const QStringList& fileSet, cvf::Collection* faults ); + RifReaderSettings readerSettings() const; private: std::vector m_filenamesWithFaults; diff --git a/ApplicationLibCode/FileInterface/RifReaderOpmCommon.cpp b/ApplicationLibCode/FileInterface/RifReaderOpmCommon.cpp index 96c402fa1c..441177109c 100644 --- a/ApplicationLibCode/FileInterface/RifReaderOpmCommon.cpp +++ b/ApplicationLibCode/FileInterface/RifReaderOpmCommon.cpp @@ -118,6 +118,16 @@ bool RifReaderOpmCommon::open( const QString& fileName, RigEclipseCaseData* ecli buildMetaData( eclipseCaseData, progress ); } + if ( readerSettings().useCylindricalCoordinates && m_radialGridDetected ) + { + auto task = progress.task( "Check for Radial Grid", 25 ); + bool isLgrCreated = RifOpmRadialGridTools::importCylindricalCoordinates( fileName.toStdString(), m_eclipseCaseData ); + if ( isLgrCreated ) + { + m_eclipseCaseData->clearWellCellsInGridCache(); + } + } + if ( isNNCsEnabled() ) { auto task = progress.task( "Handling NCC Result data", 25 ); @@ -158,6 +168,8 @@ bool RifReaderOpmCommon::importGrid( RigMainGrid* mainGrid, RigEclipseCaseData* Opm::EclIO::EGrid opmGrid( m_gridFileName ); + m_radialGridDetected = opmGrid.is_radial(); + const auto& dims = opmGrid.dimension(); mainGrid->setCellCounts( cvf::Vec3st( dims[0], dims[1], dims[2] ) ); mainGrid->setGridName( "Main grid" ); @@ -1048,6 +1060,14 @@ std::vector RifReaderOpmCommon::timeStepsOnFile( QString gridFileName return dateTimes; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifReaderOpmCommon::isRadialGrid() const +{ + return m_radialGridDetected; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/FileInterface/RifReaderOpmCommon.h b/ApplicationLibCode/FileInterface/RifReaderOpmCommon.h index 0ae25b7871..3e2ce679b2 100644 --- a/ApplicationLibCode/FileInterface/RifReaderOpmCommon.h +++ b/ApplicationLibCode/FileInterface/RifReaderOpmCommon.h @@ -61,6 +61,8 @@ public: std::vector timeStepsOnFile( QString gridFileName ); + bool isRadialGrid() const override; + protected: virtual bool importGrid( RigMainGrid* mainGrid, RigEclipseCaseData* caseData ); @@ -123,4 +125,5 @@ private: std::string m_restartFileName; std::unique_ptr m_restartFile; std::unique_ptr m_initFile; + bool m_radialGridDetected = false; }; diff --git a/ApplicationLibCode/FileInterface/RifReaderOpmCommonActive.cpp b/ApplicationLibCode/FileInterface/RifReaderOpmCommonActive.cpp index 357ab0b1e5..97956da156 100644 --- a/ApplicationLibCode/FileInterface/RifReaderOpmCommonActive.cpp +++ b/ApplicationLibCode/FileInterface/RifReaderOpmCommonActive.cpp @@ -62,6 +62,15 @@ bool RifReaderOpmCommonActive::importGrid( RigMainGrid* /* mainGrid*/, RigEclips Opm::EclIO::EGrid opmGrid( m_gridFileName ); + if ( opmGrid.is_radial() ) + { + QString txt = QString( "Radial grid detected in file '%1'. This grid reader (opm-common with only active cells) does not support " + "radial grids. Adjust grid reader in Preferences. The grid is imported as estimated Cartesian grid." ) + .arg( QString::fromStdString( m_gridFileName ) ); + + RiaLogging::warning( txt ); + } + const auto& dims = opmGrid.dimension(); activeGrid->setCellCounts( cvf::Vec3st( dims[0], dims[1], dims[2] ) ); activeGrid->setGridName( "Main grid" ); diff --git a/ApplicationLibCode/FileInterface/RifReaderSettings.h b/ApplicationLibCode/FileInterface/RifReaderSettings.h index da664225b6..8ec06c0bc7 100644 --- a/ApplicationLibCode/FileInterface/RifReaderSettings.h +++ b/ApplicationLibCode/FileInterface/RifReaderSettings.h @@ -27,14 +27,15 @@ //================================================================================================== struct RifReaderSettings { - bool importFaults; - bool importNNCs; - bool includeInactiveCellsInFaultGeometry; - bool importAdvancedMswData; - bool useResultIndexFile; - bool skipWellData; - bool importSummaryData; - QString includeFileAbsolutePathPrefix; - bool onlyLoadActiveCells; - bool invalidateLongThinCells; + bool importFaults = false; + bool importNNCs = false; + bool includeInactiveCellsInFaultGeometry = false; + bool importAdvancedMswData = false; + bool skipWellData = true; + bool importSummaryData = false; + QString includeFileAbsolutePathPrefix = ""; + bool onlyLoadActiveCells = false; + bool invalidateLongThinCells = true; + bool useCylindricalCoordinates = false; + int minimumAngularCellCount = 20; }; diff --git a/ApplicationLibCode/ProjectDataModel/CellFilters/RimCellRangeFilter.cpp b/ApplicationLibCode/ProjectDataModel/CellFilters/RimCellRangeFilter.cpp index 807cf1d2ef..0778dcc98c 100644 --- a/ApplicationLibCode/ProjectDataModel/CellFilters/RimCellRangeFilter.cpp +++ b/ApplicationLibCode/ProjectDataModel/CellFilters/RimCellRangeFilter.cpp @@ -92,29 +92,36 @@ RimCellRangeFilter::~RimCellRangeFilter() //-------------------------------------------------------------------------------------------------- QString RimCellRangeFilter::fullName() const { - QString postfix; - if ( ( cellCountI == 1 ) && ( cellCountJ > 1 ) && ( cellCountK > 1 ) ) - { - postfix = QString( "I-slice %1" ).arg( QString::number( startIndexI ) ); - } - else if ( ( cellCountJ == 1 ) && ( cellCountI > 1 ) && ( cellCountK > 1 ) ) - { - postfix = QString( "J-slice %1" ).arg( QString::number( startIndexJ ) ); - } - else if ( ( cellCountK == 1 ) && ( cellCountI > 1 ) && ( cellCountJ > 1 ) ) - { - postfix = QString( "K-slice %1" ).arg( QString::number( startIndexK ) ); - } - else - { - QString irange = QString( "I=%1-%2" ).arg( QString::number( startIndexI ), QString::number( startIndexI + cellCountI - 1 ) ); - QString jrange = QString( "J=%1-%2" ).arg( QString::number( startIndexJ ), QString::number( startIndexJ + cellCountJ - 1 ) ); - QString krange = QString( "K=%1-%2" ).arg( QString::number( startIndexK ), QString::number( startIndexK + cellCountK - 1 ) ); + bool isRadialGrid = isMainGridRadial(); - postfix = QString( "%1 %2 %3" ).arg( irange, jrange, krange ); - } + auto axisI = isRadialGrid ? "R" : "I"; + auto axisJ = isRadialGrid ? "θ" : "J"; + auto axisK = isRadialGrid ? "Z" : "K"; - return QString( "%1 [%2]" ).arg( RimCellFilter::fullName(), postfix ); + auto makePostfix = [&]() -> QString + { + if ( ( cellCountI == 1 ) && ( cellCountJ > 1 ) && ( cellCountK > 1 ) ) + { + return QString( "%1-slice %2" ).arg( axisI ).arg( startIndexI ); + } + else if ( ( cellCountJ == 1 ) && ( cellCountI > 1 ) && ( cellCountK > 1 ) ) + { + return QString( "%1-slice %2" ).arg( axisJ ).arg( startIndexJ ); + } + else if ( ( cellCountK == 1 ) && ( cellCountI > 1 ) && ( cellCountJ > 1 ) ) + { + return QString( "%1-slice %2" ).arg( axisK ).arg( startIndexK ); + } + else + { + QString irange = QString( "%1=%2-%3" ).arg( axisI ).arg( startIndexI ).arg( startIndexI + cellCountI - 1 ); + QString jrange = QString( "%1=%2-%3" ).arg( axisJ ).arg( startIndexJ ).arg( startIndexJ + cellCountJ - 1 ); + QString krange = QString( "%1=%2-%3" ).arg( axisK ).arg( startIndexK ).arg( startIndexK + cellCountK - 1 ); + return QString( "%1 %2 %3" ).arg( irange, jrange, krange ); + } + }; + + return QString( "%1 [%2]" ).arg( RimCellFilter::fullName(), makePostfix() ); } //-------------------------------------------------------------------------------------------------- @@ -169,6 +176,16 @@ void RimCellRangeFilter::computeAndSetValidValues() updateIconState(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimCellRangeFilter::isMainGridRadial() const +{ + auto rimCase = firstAncestorOrThisOfTypeAsserted()->ownerCase(); + + return RigReservoirGridTools::isRadialGrid( rimCase ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -303,6 +320,8 @@ void RimCellRangeFilter::defineUiOrdering( QString uiConfigName, caf::PdmUiOrder auto rimView = firstAncestorOrThisOfType(); auto actCellInfo = RigReservoirGridTools::activeCellInfo( rimView ); + bool isRadialGrid = isMainGridRadial(); + if ( grid == mainGrid && actCellInfo ) { auto [min, max] = actCellInfo->ijkBoundingBox(); @@ -318,23 +337,43 @@ void RimCellRangeFilter::defineUiOrdering( QString uiConfigName, caf::PdmUiOrder QString label; - label = QString( "I Active Cell Range %1 to %2, %3 cells" ).arg( min.x() ).arg( max.x() ).arg( max.x() - min.x() + 1 ); + if ( isRadialGrid ) + { + label = QString( "I (Radial) Active Cell Range %1 to %2, %3 cells" ).arg( min.x() ).arg( max.x() ).arg( max.x() - min.x() + 1 ); + m_labelI.uiCapability()->setUiName( label ); - m_labelI.uiCapability()->setUiName( label ); + label = QString( "J (Angular) Active Cell Range %1 to %2, %3 cells" ).arg( min.y() ).arg( max.y() ).arg( max.y() - min.y() + 1 ); + m_labelJ.uiCapability()->setUiName( label ); - label = QString( "J Active Cell Range %1 to %2, %3 cells" ).arg( min.y() ).arg( max.y() ).arg( max.y() - min.y() + 1 ); + label = QString( "K (Height) Active Cell Range %1 to %2, %3 cells" ).arg( min.z() ).arg( max.z() ).arg( max.z() - min.z() + 1 ); + m_labelK.uiCapability()->setUiName( label ); + } + else + { + label = QString( "I Active Cell Range %1 to %2, %3 cells" ).arg( min.x() ).arg( max.x() ).arg( max.x() - min.x() + 1 ); + m_labelI.uiCapability()->setUiName( label ); - m_labelJ.uiCapability()->setUiName( label ); + label = QString( "J Active Cell Range %1 to %2, %3 cells" ).arg( min.y() ).arg( max.y() ).arg( max.y() - min.y() + 1 ); + m_labelJ.uiCapability()->setUiName( label ); - label = QString( "K Active Cell Range %1 to %2, %3 cells" ).arg( min.z() ).arg( max.z() ).arg( max.z() - min.z() + 1 ); - - m_labelK.uiCapability()->setUiName( label ); + label = QString( "K Active Cell Range %1 to %2, %3 cells" ).arg( min.z() ).arg( max.z() ).arg( max.z() - min.z() + 1 ); + m_labelK.uiCapability()->setUiName( label ); + } } else { - m_labelI.uiCapability()->setUiName( "" ); - m_labelJ.uiCapability()->setUiName( "" ); - m_labelK.uiCapability()->setUiName( "" ); + if ( isRadialGrid ) + { + m_labelI.uiCapability()->setUiName( "I (Radial)" ); + m_labelJ.uiCapability()->setUiName( "J (Angular)" ); + m_labelK.uiCapability()->setUiName( "K (Height)" ); + } + else + { + m_labelI.uiCapability()->setUiName( "I" ); + m_labelJ.uiCapability()->setUiName( "J" ); + m_labelK.uiCapability()->setUiName( "K" ); + } } auto group = uiOrdering.addNewGroup( "Range Selection" ); diff --git a/ApplicationLibCode/ProjectDataModel/CellFilters/RimCellRangeFilter.h b/ApplicationLibCode/ProjectDataModel/CellFilters/RimCellRangeFilter.h index 54207bed41..607addd509 100644 --- a/ApplicationLibCode/ProjectDataModel/CellFilters/RimCellRangeFilter.h +++ b/ApplicationLibCode/ProjectDataModel/CellFilters/RimCellRangeFilter.h @@ -72,6 +72,7 @@ protected: private: void computeAndSetValidValues(); + bool isMainGridRadial() const; caf::PdmField m_labelI; caf::PdmField m_labelJ; diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.cpp index 9df9ee8640..0c87a57b30 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.cpp @@ -24,7 +24,6 @@ #include "RiaFieldHandleTools.h" #include "RiaLogging.h" #include "RiaPreferencesGrid.h" -#include "RiaPreferencesSystem.h" #include "RiaRegressionTestRunner.h" #include "RiaResultNames.h" @@ -33,7 +32,6 @@ #include "RifEclipseOutputFileTools.h" #include "RifEclipseRestartDataAccess.h" #include "RifInputPropertyLoader.h" -#include "RifOpmRadialGridTools.h" #include "RifReaderEclipseOutput.h" #include "RifReaderEclipseRft.h" #include "RifReaderMockModel.h" @@ -45,7 +43,6 @@ #include "RigEclipseCaseData.h" #include "RigFlowDiagSolverInterface.h" #include "RigMainGrid.h" -#include "RigReservoirGridTools.h" #include "Formations/RimFormationNames.h" #include "Formations/RimFormationTools.h" @@ -153,49 +150,6 @@ bool RimEclipseResultCase::showTimeStepFilterGUI() return true; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimEclipseResultCase::checkAndImportRadialGrid() -{ - bool refreshEclipseCaseData = false; - if ( RiaPreferencesSystem::current()->useCylindricalCoordinates() ) - { - // Check if radial grid data is available. Create LGR if radial section count is below specified limit. Rebuild cached data if - // required. - bool isLgrCreated = RifOpmRadialGridTools::importCylindricalCoordinates( gridFileName().toStdString(), eclipseCaseData() ); - if ( !isLgrCreated ) - { - // Check if min J coordinate is close to 0.0 and max is close to 360. This is a workaround for import of simulation cases that - // has an invalid header and is not possible to import using opm-common - auto bb = mainGrid()->boundingBox(); - const double epsilon = 1.0; - if ( ( std::abs( bb.min().y() ) < epsilon ) && ( std::abs( bb.max().y() - 360.0 ) < epsilon ) ) - { - size_t minimumAngularCellCount = static_cast( RiaPreferencesSystem::current()->minimumAngularCellCount() ); - if ( mainGrid()->cellCountJ() < minimumAngularCellCount ) - { - auto angularRefinement = ( minimumAngularCellCount / mainGrid()->cellCountJ() ) + 1; - - isLgrCreated = RifOpmRadialGridTools::createAngularGridRefinement( eclipseCaseData(), angularRefinement ); - } - } - } - - refreshEclipseCaseData = isLgrCreated; - } - else - { - refreshEclipseCaseData = - RifOpmRadialGridTools::importCoordinatesForRadialGrid( gridFileName().toStdString(), eclipseCaseData()->mainGrid() ); - } - - if ( refreshEclipseCaseData ) - { - RigReservoirGridTools::refreshEclipseCaseDataAndViews( this ); - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -344,8 +298,6 @@ bool RimEclipseResultCase::importGridAndResultMetaData( bool showTimeStepFilter results( RiaDefines::PorosityModelType::MATRIX_MODEL )->computeCellVolumes(); } - checkAndImportRadialGrid(); - return true; } diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.h b/ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.h index e8ecdfdd86..7b13eae8c0 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.h +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.h @@ -89,7 +89,6 @@ private: void loadAndUpdateSourSimData(); void ensureRftDataIsImported(); bool showTimeStepFilterGUI(); - void checkAndImportRadialGrid(); cvf::ref createMockModel( QString modelName ); void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; diff --git a/ApplicationLibCode/ProjectDataModel/RimIdenticalGridCaseGroup.h b/ApplicationLibCode/ProjectDataModel/RimIdenticalGridCaseGroup.h index e982a1bd8f..c5d463d937 100644 --- a/ApplicationLibCode/ProjectDataModel/RimIdenticalGridCaseGroup.h +++ b/ApplicationLibCode/ProjectDataModel/RimIdenticalGridCaseGroup.h @@ -20,7 +20,7 @@ #pragma once -#include "RifReaderInterface.h" +#include "RiaPorosityModel.h" #include "cafPdmChildField.h" #include "cafPdmField.h" diff --git a/ApplicationLibCode/ReservoirDataModel/ResultAccessors/RigResultAccessorFactory.h b/ApplicationLibCode/ReservoirDataModel/ResultAccessors/RigResultAccessorFactory.h index e841340463..c6ea52448b 100644 --- a/ApplicationLibCode/ReservoirDataModel/ResultAccessors/RigResultAccessorFactory.h +++ b/ApplicationLibCode/ReservoirDataModel/ResultAccessors/RigResultAccessorFactory.h @@ -19,13 +19,14 @@ #pragma once -#include "RifReaderInterface.h" #include "RigResultAccessor.h" #include "RiaDefines.h" +#include "RiaPorosityModel.h" class RigActiveCellInfo; class RigGridBase; +class RigEclipseCaseData; class RimEclipseResultDefinition; class RigEclipseResultAddress; diff --git a/ApplicationLibCode/ReservoirDataModel/RigEclipseCaseData.h b/ApplicationLibCode/ReservoirDataModel/RigEclipseCaseData.h index b37a9d527b..e831456ce4 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigEclipseCaseData.h +++ b/ApplicationLibCode/ReservoirDataModel/RigEclipseCaseData.h @@ -20,9 +20,8 @@ #pragma once -#include "RifReaderInterface.h" - #include "RiaDefines.h" +#include "RiaPorosityModel.h" #include "cvfArray.h" #include "cvfAssert.h" diff --git a/ApplicationLibCode/ReservoirDataModel/RigReservoirGridTools.cpp b/ApplicationLibCode/ReservoirDataModel/RigReservoirGridTools.cpp index 35c9ed312d..a9e9ed3204 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigReservoirGridTools.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigReservoirGridTools.cpp @@ -20,6 +20,8 @@ #include "RiaGuiApplication.h" +#include "RifReaderInterface.h" + #include "RigActiveCellInfo.h" #include "RigCaseCellResultsData.h" #include "RigEclipseCaseData.h" @@ -29,6 +31,7 @@ #include "RigMainGrid.h" #include "RimEclipseCase.h" +#include "RimEclipseResultCase.h" #include "RimEclipseView.h" #include "RimGeoMechCase.h" #include "RimGridCollection.h" @@ -105,6 +108,26 @@ QString RigReservoirGridTools::gridName( RimCase* rimCase, int gridIndex ) return ""; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RigReservoirGridTools::isRadialGrid( RimCase* rimCase ) +{ + RimEclipseResultCase* eclipseResultCase = dynamic_cast( rimCase ); + if ( !eclipseResultCase ) return false; + + auto eclipseCaseData = eclipseResultCase->eclipseCaseData(); + if ( !eclipseCaseData ) return false; + + auto results = eclipseCaseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL ); + if ( !results ) return false; + + auto readerInterface = results->readerInterface(); + if ( !readerInterface ) return false; + + return readerInterface->isRadialGrid(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ReservoirDataModel/RigReservoirGridTools.h b/ApplicationLibCode/ReservoirDataModel/RigReservoirGridTools.h index 74d2f9b84c..a09fab184b 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigReservoirGridTools.h +++ b/ApplicationLibCode/ReservoirDataModel/RigReservoirGridTools.h @@ -47,6 +47,7 @@ public: static const cvf::StructGridInterface* mainGrid( RimCase* rimCase ); static const cvf::StructGridInterface* gridByIndex( RimCase* rimCase, int gridIndex ); static QString gridName( RimCase* rimCase, int gridIndex ); + static bool isRadialGrid( RimCase* rimCase ); static const RigActiveCellInfo* activeCellInfo( Rim3dView* rimView ); diff --git a/ApplicationLibCode/ReservoirDataModel/RigResultModifierFactory.h b/ApplicationLibCode/ReservoirDataModel/RigResultModifierFactory.h index 36c165bfb0..1230b41a62 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigResultModifierFactory.h +++ b/ApplicationLibCode/ReservoirDataModel/RigResultModifierFactory.h @@ -19,7 +19,9 @@ #pragma once -#include "RifReaderInterface.h" +#include "RiaPorosityModel.h" + +#include "cvfObject.h" class RigEclipseCaseData; class RigResultModifier;