GRDECL: Import multiple grid files from dialog (#10142)

Add import of N .GRDECL grid files - as done for roff-files
This commit is contained in:
Jørgen Herje 2023-04-21 10:34:29 +02:00 committed by GitHub
parent 93ab49cf02
commit 0d8aee8995
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 170 additions and 53 deletions

View File

@ -249,7 +249,8 @@ void RiaApplication::createMockModelCustomized()
void RiaApplication::createInputMockModel()
{
bool createView = true;
RiaImportEclipseCaseTools::openEclipseInputCaseFromFileNames( QStringList( RiaDefines::mockModelBasicInputCase() ), createView );
RiaImportEclipseCaseTools::openEclipseInputCaseAndPropertiesFromFileNames( QStringList( RiaDefines::mockModelBasicInputCase() ),
createView );
}
//--------------------------------------------------------------------------------------------------

View File

@ -253,24 +253,25 @@ bool RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilter( const QString
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
int RiaImportEclipseCaseTools::openEclipseInputCaseFromFileNames( const QStringList& fileNames, bool createDefaultView )
RiaImportEclipseCaseTools::CaseFileNameAndId
RiaImportEclipseCaseTools::openEclipseInputCaseAndPropertiesFromFileNames( const QStringList& fileNames, bool createDefaultView )
{
auto* rimInputReservoir = new RimEclipseInputCase();
RimProject* project = RimProject::current();
if ( !project ) return -1;
if ( !project ) return { QString(), -1 };
auto* rimInputReservoir = new RimEclipseInputCase();
project->assignCaseIdToCase( rimInputReservoir );
bool gridImportSuccess = rimInputReservoir->openDataFileSet( fileNames );
if ( !gridImportSuccess )
{
RiaLogging::error( "Failed to import grid" );
return -1;
delete rimInputReservoir;
return { QString(), -1 };
}
RimEclipseCaseCollection* analysisModels = project->activeOilField() ? project->activeOilField()->analysisModels() : nullptr;
if ( analysisModels == nullptr ) return false;
if ( analysisModels == nullptr ) return { QString(), -1 };
analysisModels->cases.push_back( rimInputReservoir );
@ -296,7 +297,22 @@ int RiaImportEclipseCaseTools::openEclipseInputCaseFromFileNames( const QStringL
Riu3DMainWindowTools::selectAsCurrentItem( eclipseView->cellResult() );
}
return rimInputReservoir->caseId();
return { rimInputReservoir->gridFileName(), rimInputReservoir->caseId() };
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<int> RiaImportEclipseCaseTools::openEclipseInputCasesFromFileNames( const QStringList& fileNames, bool createDefaultView )
{
std::vector<int> eclipseCaseIds;
for ( const auto& fileName : fileNames )
{
// Open with single file
auto [caseFileName, caseId] = openEclipseInputCaseAndPropertiesFromFileNames( { fileName }, createDefaultView );
eclipseCaseIds.push_back( caseId );
}
return eclipseCaseIds;
}
//--------------------------------------------------------------------------------------------------
@ -317,6 +333,12 @@ int RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl( const QStr
bool createView,
std::shared_ptr<RifReaderSettings> readerSettings )
{
RimProject* project = RimProject::current();
if ( !project ) return -1;
RimEclipseCaseCollection* analysisModels = project->activeOilField() ? project->activeOilField()->analysisModels() : nullptr;
if ( analysisModels == nullptr ) return -1;
QFileInfo gridFileName( fileName );
QString caseName = gridFileName.completeBaseName();
@ -324,16 +346,6 @@ int RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl( const QStr
rimResultReservoir->setCaseInfo( caseName, fileName );
rimResultReservoir->setReaderSettings( readerSettings );
RimProject* project = RimProject::current();
if ( !project ) return -1;
RimEclipseCaseCollection* analysisModels = project->activeOilField() ? project->activeOilField()->analysisModels() : nullptr;
if ( analysisModels == nullptr )
{
delete rimResultReservoir;
return -1;
}
if ( RiaGuiApplication::isRunning() )
{
RicShowMainWindowFeature::showMainWindow();
@ -344,9 +356,7 @@ int RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl( const QStr
if ( !rimResultReservoir->importGridAndResultMetaData( showTimeStepFilter ) )
{
analysisModels->removeCaseFromAllGroups( rimResultReservoir );
delete rimResultReservoir;
return -1;
}
@ -408,7 +418,6 @@ bool RiaImportEclipseCaseTools::addEclipseCases( const QStringList& fileNames, R
if ( !rimResultReservoir->openEclipseGridFile() )
{
delete rimResultReservoir;
return false;
}
@ -508,6 +517,7 @@ std::vector<int> RiaImportEclipseCaseTools::openRoffCasesFromFileNames( const QS
{
const auto errMsg = "Failed to import grid from file: " + fileName.toStdString();
RiaLogging::error( errMsg.c_str() );
delete roffCase;
continue;
}
@ -554,6 +564,7 @@ RimRoffCase* RiaImportEclipseCaseTools::openRoffCaseFromFileName( const QString&
{
const auto errMsg = "Failed to import grid from file: " + fileName.toStdString();
RiaLogging::error( errMsg.c_str() );
delete roffCase;
return nullptr;
}

View File

@ -20,6 +20,7 @@
#include <map>
#include <memory>
#include <utility>
#include <vector>
class QString;
@ -35,7 +36,8 @@ class RifReaderSettings;
class RiaImportEclipseCaseTools
{
public:
using FileCaseIdMap = std::map<QString, int>;
using CaseFileNameAndId = std::pair<QString, int>;
using FileCaseIdMap = std::map<QString, int>;
static bool openEclipseCasesFromFile( const QStringList& fileNames,
bool createView,
@ -45,7 +47,9 @@ public:
static bool openEclipseCaseShowTimeStepFilter( const QString& fileName );
static int openEclipseInputCaseFromFileNames( const QStringList& fileNames, bool createDefaultView );
static CaseFileNameAndId openEclipseInputCaseAndPropertiesFromFileNames( const QStringList& fileNames, bool createDefaultView );
static std::vector<int> openEclipseInputCasesFromFileNames( const QStringList& fileNames, bool createDefaultView );
static bool openMockModel( const QString& name );
static bool addEclipseCases( const QStringList& fileNames, RimIdenticalGridCaseGroup** resultingCaseGroup = nullptr );

View File

@ -25,6 +25,7 @@
#include "RicImportSummaryCasesFeature.h"
#include "RifEclipseInputFileTools.h"
#include "RifRoffFileTools.h"
#include "RimRoffCase.h"
@ -93,7 +94,7 @@ RicImportGeneralDataFeature::OpenCaseResults
}
if ( !eclipseInputFiles.empty() )
{
if ( !openInputEclipseCaseFromFileNames( eclipseInputFiles, createDefaultView, results.createdCaseIds ) )
if ( !openEclipseInputFilesFromFileNames( eclipseInputFiles, createDefaultView, results.createdCaseIds ) )
{
return OpenCaseResults();
}
@ -331,23 +332,6 @@ bool RicImportGeneralDataFeature::openEclipseCaseFromFileNames( const QStringLis
return false;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RicImportGeneralDataFeature::openInputEclipseCaseFromFileNames( const QStringList& fileNames,
bool createDefaultView,
std::vector<int>& createdCaseIds )
{
auto generatedCaseId = RiaImportEclipseCaseTools::openEclipseInputCaseFromFileNames( fileNames, createDefaultView );
if ( generatedCaseId >= 0 )
{
RiaApplication::instance()->addToRecentFiles( fileNames[0] );
createdCaseIds.push_back( generatedCaseId );
return true;
}
return false;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -366,19 +350,109 @@ bool RicImportGeneralDataFeature::openSummaryCaseFromFileNames( const QStringLis
return false;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RicImportGeneralDataFeature::openEclipseInputFilesFromFileNames( const QStringList& fileNames,
bool createDefaultView,
std::vector<int>& createdCaseIds )
{
if ( fileNames.empty() ) return false;
// For single file - assume grid and perform open - to prevent multiple read of grid files
if ( fileNames.size() == 1 )
{
return openGrdeclCaseAndPropertiesFromFileNames( fileNames, createDefaultView, createdCaseIds );
}
auto numGridCases =
static_cast<int>( std::count_if( fileNames.begin(),
fileNames.end(),
[]( const auto& fileName ) { return RifEclipseInputFileTools::hasGridData( fileName ); } ) );
if ( numGridCases != fileNames.size() && numGridCases != 1 )
{
RiaLogging::error( "Select only grid case files or 1 grid case file with N property files" );
return false;
}
if ( numGridCases == 1 )
{
// Open single grid case and connected property files
return openGrdeclCaseAndPropertiesFromFileNames( fileNames, createDefaultView, createdCaseIds );
}
else
{
// Open multiple grid cases
return openGrdeclCasesFromFileNames( fileNames, createDefaultView, createdCaseIds );
}
return false;
}
//--------------------------------------------------------------------------------------------------
/// Assumes N files containing grid info - each file must be grid case
//--------------------------------------------------------------------------------------------------
bool RicImportGeneralDataFeature::openGrdeclCasesFromFileNames( const QStringList& fileNames,
bool createDefaultView,
std::vector<int>& createdCaseIds )
{
if ( fileNames.empty() ) return false;
const size_t initialNumCases = createdCaseIds.size();
const auto generatedCaseIds = RiaImportEclipseCaseTools::openEclipseInputCasesFromFileNames( fileNames, createDefaultView );
if ( fileNames.size() == static_cast<int>( generatedCaseIds.size() ) )
{
RiaLogging::error( "Expected to create one eclipse case per file provided" );
}
for ( int i = 0; i < fileNames.size(); ++i )
{
const auto caseId = generatedCaseIds[static_cast<size_t>( i )];
if ( caseId >= 0 )
{
RiaApplication::instance()->addToRecentFiles( fileNames[i] );
createdCaseIds.push_back( caseId );
}
}
return initialNumCases != createdCaseIds.size();
}
//--------------------------------------------------------------------------------------------------
/// Assuming 1 file with grid data and N files with property info for respective grid file
//--------------------------------------------------------------------------------------------------
bool RicImportGeneralDataFeature::openGrdeclCaseAndPropertiesFromFileNames( const QStringList& fileNames,
bool createDefaultView,
std::vector<int>& createdCaseIds )
{
if ( fileNames.empty() ) return false;
const auto [caseFileName, generatedCaseId] =
RiaImportEclipseCaseTools::openEclipseInputCaseAndPropertiesFromFileNames( fileNames, createDefaultView );
if ( generatedCaseId >= 0 )
{
RiaApplication::instance()->addToRecentFiles( caseFileName );
createdCaseIds.push_back( generatedCaseId );
return true;
}
return false;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RicImportGeneralDataFeature::openRoffFilesFromFileNames( const QStringList& fileNames, bool createDefaultView, std::vector<int>& createdCaseIds )
{
CAF_ASSERT( !fileNames.empty() );
if ( fileNames.empty() ) return false;
auto numGridCases = static_cast<int>(
std::count_if( fileNames.begin(), fileNames.end(), []( const auto& fileName ) { return RifRoffFileTools::hasGridData( fileName ); } ) );
if ( numGridCases != fileNames.size() && numGridCases != 1 )
{
RiaLogging::error( "Select only grid case files or 1 grid case file with N property files!" );
RiaLogging::error( "Select only grid case files or 1 grid case file with N property files" );
return false;
}
@ -401,12 +475,15 @@ bool RicImportGeneralDataFeature::openRoffFilesFromFileNames( const QStringList&
//--------------------------------------------------------------------------------------------------
bool RicImportGeneralDataFeature::openRoffCasesFromFileNames( const QStringList& fileNames, bool createDefaultView, std::vector<int>& createdCaseIds )
{
CAF_ASSERT( !fileNames.empty() );
if ( fileNames.empty() ) return false;
const size_t initialNumCases = createdCaseIds.size();
auto generatedCaseIds = RiaImportEclipseCaseTools::openRoffCasesFromFileNames( fileNames, createDefaultView );
CAF_ASSERT( fileNames.size() == static_cast<int>( generatedCaseIds.size() ) && "Expected to create one roff case per file provided" );
if ( fileNames.size() == static_cast<int>( generatedCaseIds.size() ) )
{
RiaLogging::error( "Expected to create one roff case per file provided" );
}
for ( int i = 0; i < fileNames.size(); ++i )
{
@ -427,7 +504,7 @@ bool RicImportGeneralDataFeature::openRoffCaseAndPropertiesFromFileNames( const
bool createDefaultView,
std::vector<int>& createdCaseIds )
{
CAF_ASSERT( !fileNames.empty() );
if ( fileNames.empty() ) return false;
auto gridCaseItr =
std::find_if( fileNames.begin(), fileNames.end(), []( const auto& fileName ) { return RifRoffFileTools::hasGridData( fileName ); } );

View File

@ -74,9 +74,14 @@ protected:
bool createDefaultView,
std::vector<int>& createdCaseIds,
std::shared_ptr<RifReaderSettings> readerSettings );
static bool openInputEclipseCaseFromFileNames( const QStringList& fileNames, bool createDefaultView, std::vector<int>& createdCaseIds );
static bool openSummaryCaseFromFileNames( const QStringList& fileNames, bool doCreateDefaultPlot = true );
static bool openEclipseInputFilesFromFileNames( const QStringList& fileNames, bool createDefaultView, std::vector<int>& createdCaseIds );
static bool openGrdeclCasesFromFileNames( const QStringList& fileNames, bool createDefaultView, std::vector<int>& createdCaseIds );
static bool
openGrdeclCaseAndPropertiesFromFileNames( const QStringList& fileNames, bool createDefaultView, std::vector<int>& createdCaseIds );
static bool openRoffFilesFromFileNames( const QStringList& fileNames, bool createDefaultView, std::vector<int>& createdCaseIds );
static bool openRoffCasesFromFileNames( const QStringList& fileNames, bool createDefaultView, std::vector<int>& createdCaseIds );
static bool openRoffCaseAndPropertiesFromFileNames( const QStringList& fileNames, bool createDefaultView, std::vector<int>& createdCaseIds );

View File

@ -1401,6 +1401,23 @@ cvf::StructGridInterface::FaceEnum RifEclipseInputFileTools::faceEnumFromText( c
return cvf::StructGridInterface::NO_FACE;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RifEclipseInputFileTools::hasGridData( const QString& fileName )
{
// Look for keyword "COORD" in file
// NOTE: If readKeywordAndValues is slow for large .GRDECL files, consider function in RifEclipseTextFileReader
// reading line for line and returns true on first hit of keyword. This prevents reading entire file on large cases
const auto keywordAndValues = RifEclipseTextFileReader::readKeywordAndValues( fileName.toStdString() );
auto coordKeywordItr = std::find_if( keywordAndValues.begin(),
keywordAndValues.end(),
[]( const auto& keywordAndValue ) { return keywordAndValue.keyword == "COORD"; } );
return coordKeywordItr != keywordAndValues.end();
}
//--------------------------------------------------------------------------------------------------
/// The file pointer is pointing at the line following the FAULTS keyword.
/// Parse content of this keyword until end of file or

View File

@ -122,6 +122,8 @@ public:
static cvf::StructGridInterface::FaceEnum faceEnumFromText( const QString& faceString );
static bool hasGridData( const QString& fileName );
private:
static void readFaults( QFile& data, qint64 filePos, cvf::Collection<RigFault>* faults, bool* isEditKeywordDetected );

View File

@ -144,12 +144,9 @@ bool RimEclipseInputCase::openDataFileSet( const QStringList& fileNames )
if ( this->eclipseCaseData()->mainGrid()->gridPointDimensions() == cvf::Vec3st( 0, 0, 0 ) )
{
if ( !allErrorMessages.empty() )
for ( QString errorMessages : allErrorMessages )
{
for ( QString errorMessages : allErrorMessages )
{
RiaLogging::error( errorMessages );
}
RiaLogging::error( errorMessages );
}
return false; // No grid present
}
@ -174,7 +171,10 @@ bool RimEclipseInputCase::openDataFileSet( const QStringList& fileNames )
}
}
RifInputPropertyLoader::loadAndSynchronizeInputProperties( m_inputPropertyCollection, this->eclipseCaseData(), filesToRead, importFaults );
if ( !filesToRead.empty() )
{
RifInputPropertyLoader::loadAndSynchronizeInputProperties( m_inputPropertyCollection, this->eclipseCaseData(), filesToRead, importFaults );
}
if ( importFaults )
{