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() void RiaApplication::createInputMockModel()
{ {
bool createView = true; 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(); RimProject* project = RimProject::current();
if ( !project ) return -1; if ( !project ) return { QString(), -1 };
auto* rimInputReservoir = new RimEclipseInputCase();
project->assignCaseIdToCase( rimInputReservoir ); project->assignCaseIdToCase( rimInputReservoir );
bool gridImportSuccess = rimInputReservoir->openDataFileSet( fileNames ); bool gridImportSuccess = rimInputReservoir->openDataFileSet( fileNames );
if ( !gridImportSuccess ) if ( !gridImportSuccess )
{ {
RiaLogging::error( "Failed to import grid" ); RiaLogging::error( "Failed to import grid" );
return -1; delete rimInputReservoir;
return { QString(), -1 };
} }
RimEclipseCaseCollection* analysisModels = project->activeOilField() ? project->activeOilField()->analysisModels() : nullptr; RimEclipseCaseCollection* analysisModels = project->activeOilField() ? project->activeOilField()->analysisModels() : nullptr;
if ( analysisModels == nullptr ) return false; if ( analysisModels == nullptr ) return { QString(), -1 };
analysisModels->cases.push_back( rimInputReservoir ); analysisModels->cases.push_back( rimInputReservoir );
@ -296,7 +297,22 @@ int RiaImportEclipseCaseTools::openEclipseInputCaseFromFileNames( const QStringL
Riu3DMainWindowTools::selectAsCurrentItem( eclipseView->cellResult() ); 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, bool createView,
std::shared_ptr<RifReaderSettings> readerSettings ) 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 ); QFileInfo gridFileName( fileName );
QString caseName = gridFileName.completeBaseName(); QString caseName = gridFileName.completeBaseName();
@ -324,16 +346,6 @@ int RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl( const QStr
rimResultReservoir->setCaseInfo( caseName, fileName ); rimResultReservoir->setCaseInfo( caseName, fileName );
rimResultReservoir->setReaderSettings( readerSettings ); 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() ) if ( RiaGuiApplication::isRunning() )
{ {
RicShowMainWindowFeature::showMainWindow(); RicShowMainWindowFeature::showMainWindow();
@ -344,9 +356,7 @@ int RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl( const QStr
if ( !rimResultReservoir->importGridAndResultMetaData( showTimeStepFilter ) ) if ( !rimResultReservoir->importGridAndResultMetaData( showTimeStepFilter ) )
{ {
analysisModels->removeCaseFromAllGroups( rimResultReservoir ); analysisModels->removeCaseFromAllGroups( rimResultReservoir );
delete rimResultReservoir; delete rimResultReservoir;
return -1; return -1;
} }
@ -408,7 +418,6 @@ bool RiaImportEclipseCaseTools::addEclipseCases( const QStringList& fileNames, R
if ( !rimResultReservoir->openEclipseGridFile() ) if ( !rimResultReservoir->openEclipseGridFile() )
{ {
delete rimResultReservoir; delete rimResultReservoir;
return false; return false;
} }
@ -508,6 +517,7 @@ std::vector<int> RiaImportEclipseCaseTools::openRoffCasesFromFileNames( const QS
{ {
const auto errMsg = "Failed to import grid from file: " + fileName.toStdString(); const auto errMsg = "Failed to import grid from file: " + fileName.toStdString();
RiaLogging::error( errMsg.c_str() ); RiaLogging::error( errMsg.c_str() );
delete roffCase;
continue; continue;
} }
@ -554,6 +564,7 @@ RimRoffCase* RiaImportEclipseCaseTools::openRoffCaseFromFileName( const QString&
{ {
const auto errMsg = "Failed to import grid from file: " + fileName.toStdString(); const auto errMsg = "Failed to import grid from file: " + fileName.toStdString();
RiaLogging::error( errMsg.c_str() ); RiaLogging::error( errMsg.c_str() );
delete roffCase;
return nullptr; return nullptr;
} }

View File

@ -20,6 +20,7 @@
#include <map> #include <map>
#include <memory> #include <memory>
#include <utility>
#include <vector> #include <vector>
class QString; class QString;
@ -35,7 +36,8 @@ class RifReaderSettings;
class RiaImportEclipseCaseTools class RiaImportEclipseCaseTools
{ {
public: 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, static bool openEclipseCasesFromFile( const QStringList& fileNames,
bool createView, bool createView,
@ -45,7 +47,9 @@ public:
static bool openEclipseCaseShowTimeStepFilter( const QString& fileName ); 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 openMockModel( const QString& name );
static bool addEclipseCases( const QStringList& fileNames, RimIdenticalGridCaseGroup** resultingCaseGroup = nullptr ); static bool addEclipseCases( const QStringList& fileNames, RimIdenticalGridCaseGroup** resultingCaseGroup = nullptr );

View File

@ -25,6 +25,7 @@
#include "RicImportSummaryCasesFeature.h" #include "RicImportSummaryCasesFeature.h"
#include "RifEclipseInputFileTools.h"
#include "RifRoffFileTools.h" #include "RifRoffFileTools.h"
#include "RimRoffCase.h" #include "RimRoffCase.h"
@ -93,7 +94,7 @@ RicImportGeneralDataFeature::OpenCaseResults
} }
if ( !eclipseInputFiles.empty() ) if ( !eclipseInputFiles.empty() )
{ {
if ( !openInputEclipseCaseFromFileNames( eclipseInputFiles, createDefaultView, results.createdCaseIds ) ) if ( !openEclipseInputFilesFromFileNames( eclipseInputFiles, createDefaultView, results.createdCaseIds ) )
{ {
return OpenCaseResults(); return OpenCaseResults();
} }
@ -331,23 +332,6 @@ bool RicImportGeneralDataFeature::openEclipseCaseFromFileNames( const QStringLis
return false; 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; 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 ) 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>( auto numGridCases = static_cast<int>(
std::count_if( fileNames.begin(), fileNames.end(), []( const auto& fileName ) { return RifRoffFileTools::hasGridData( fileName ); } ) ); std::count_if( fileNames.begin(), fileNames.end(), []( const auto& fileName ) { return RifRoffFileTools::hasGridData( fileName ); } ) );
if ( numGridCases != fileNames.size() && numGridCases != 1 ) 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; return false;
} }
@ -401,12 +475,15 @@ bool RicImportGeneralDataFeature::openRoffFilesFromFileNames( const QStringList&
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool RicImportGeneralDataFeature::openRoffCasesFromFileNames( const QStringList& fileNames, bool createDefaultView, std::vector<int>& createdCaseIds ) 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(); const size_t initialNumCases = createdCaseIds.size();
auto generatedCaseIds = RiaImportEclipseCaseTools::openRoffCasesFromFileNames( fileNames, createDefaultView ); 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 ) for ( int i = 0; i < fileNames.size(); ++i )
{ {
@ -427,7 +504,7 @@ bool RicImportGeneralDataFeature::openRoffCaseAndPropertiesFromFileNames( const
bool createDefaultView, bool createDefaultView,
std::vector<int>& createdCaseIds ) std::vector<int>& createdCaseIds )
{ {
CAF_ASSERT( !fileNames.empty() ); if ( fileNames.empty() ) return false;
auto gridCaseItr = auto gridCaseItr =
std::find_if( fileNames.begin(), fileNames.end(), []( const auto& fileName ) { return RifRoffFileTools::hasGridData( fileName ); } ); std::find_if( fileNames.begin(), fileNames.end(), []( const auto& fileName ) { return RifRoffFileTools::hasGridData( fileName ); } );

View File

@ -74,9 +74,14 @@ protected:
bool createDefaultView, bool createDefaultView,
std::vector<int>& createdCaseIds, std::vector<int>& createdCaseIds,
std::shared_ptr<RifReaderSettings> readerSettings ); 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 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 openRoffFilesFromFileNames( const QStringList& fileNames, bool createDefaultView, std::vector<int>& createdCaseIds );
static bool openRoffCasesFromFileNames( 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 ); 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; 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. /// The file pointer is pointing at the line following the FAULTS keyword.
/// Parse content of this keyword until end of file or /// 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 cvf::StructGridInterface::FaceEnum faceEnumFromText( const QString& faceString );
static bool hasGridData( const QString& fileName );
private: private:
static void readFaults( QFile& data, qint64 filePos, cvf::Collection<RigFault>* faults, bool* isEditKeywordDetected ); 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 ( 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 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 ) if ( importFaults )
{ {