mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
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:
parent
93ab49cf02
commit
0d8aee8995
@ -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 );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 );
|
||||
|
@ -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 ); } );
|
||||
|
@ -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 );
|
||||
|
@ -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
|
||||
|
@ -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 );
|
||||
|
||||
|
@ -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 )
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user