Improve radial grid import

* Remove unused includes
* Use designated initializers struct members
* Add warning for active cell opm grid reader
* Moves radial grid import to file readers
* Adapts cell range filter labels for radial grids
This commit is contained in:
Magne Sjaastad authored and GitHub committed 2025-09-26 10:26:43 +02:00
1 parent d56722782a
commit b07e49258e
28 files changed
+234 -132

No files matched your search

@@ -24,7 +24,6 @@
#include "cvfObject.h"
#include "RiaDefines.h"
#include "RifReaderInterface.h"
#include "RigFault.h"
#include "ert/ecl/ecl_kw.h"
@@ -30,7 +30,6 @@
#include "ert/ecl_well/well_info.hpp"
#include "RifEclipseReportKeywords.h"
#include "RifReaderInterface.h"
//==================================================================================================
//
@@ -18,7 +18,8 @@
#pragma once
#include "RifReaderInterface.h"
#include <string>
#include <vector>
class RifEclipseKeywordContent;
@@ -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();
}
@@ -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<size_t>( 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;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -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<RifEclipseRestartDataAccess> m_dynamicResultsAccess; // File access to dynamic results
std::unique_ptr<RifHdf5ReaderInterface> m_hdfReaderInterface;
bool m_isRadialGrid = false;
};
@@ -113,6 +113,14 @@ std::set<RiaDefines::PhaseType> RifReaderInterface::availablePhases() const
return std::set<RiaDefines::PhaseType>();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
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;
}
@@ -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<RigFault>* faults );
bool isTimeStepIncludedByFilter( size_t timeStepIndex ) const;
size_t timeStepIndexOnFile( size_t timeStepIndex ) const;
void importFaults( const QStringList& fileSet, cvf::Collection<RigFault>* faults );
RifReaderSettings readerSettings() const;
private:
std::vector<QString> m_filenamesWithFaults;
@@ -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<QDateTime> RifReaderOpmCommon::timeStepsOnFile( QString gridFileName
return dateTimes;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RifReaderOpmCommon::isRadialGrid() const
{
return m_radialGridDetected;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -61,6 +61,8 @@ public:
std::vector<QDateTime> 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<Opm::EclIO::ERst> m_restartFile;
std::unique_ptr<Opm::EclIO::EInit> m_initFile;
bool m_radialGridDetected = false;
};
@@ -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" );
@@ -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;
};