From ec191f32e3d4e867858a97c60bed79eb5349f89d Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 28 Apr 2025 18:15:19 +0200 Subject: [PATCH] #12425 Use Qt file operations to establish absolute path to restart case --- .../FileInterface/RifEclipseSummaryTools.cpp | 95 +++++++++++-------- .../FileInterface/RifEclipseSummaryTools.h | 5 +- 2 files changed, 59 insertions(+), 41 deletions(-) diff --git a/ApplicationLibCode/FileInterface/RifEclipseSummaryTools.cpp b/ApplicationLibCode/FileInterface/RifEclipseSummaryTools.cpp index f7d62f1f69..e47134a4b7 100644 --- a/ApplicationLibCode/FileInterface/RifEclipseSummaryTools.cpp +++ b/ApplicationLibCode/FileInterface/RifEclipseSummaryTools.cpp @@ -156,7 +156,8 @@ void RifEclipseSummaryTools::dumpMetaData( RifSummaryReaderInterface* readerEcli //-------------------------------------------------------------------------------------------------- std::vector RifEclipseSummaryTools::getRestartFileNames( const QString& headerFileName, std::vector& warnings ) { - return getRestartFileNames( headerFileName, false, warnings ); + const bool useOpmReader = false; + return getRestartFileNames( headerFileName, useOpmReader, warnings ); } //-------------------------------------------------------------------------------------------------- @@ -199,15 +200,25 @@ std::vector break; } } - QString prevFileName = currentFileName; + QString relativeFilePathFromFile; if ( useOpmReader ) { - currentFileName = getRestartFileNameOpm( currentFileName ); + relativeFilePathFromFile = getRestartRelativeFilePathOpm( currentFileName ); } else { - currentFileName = getRestartFileName( currentFileName ); + relativeFilePathFromFile = getRestartRelativeFilePathResdata( currentFileName ); + } + + QString prevFileName = currentFileName; + if ( !relativeFilePathFromFile.isEmpty() ) + { + currentFileName = getRestartFilePath( currentFileName, relativeFilePathFromFile ); + } + else + { + currentFileName.clear(); } // Fix to stop potential infinite loop @@ -228,6 +239,22 @@ std::vector return restartFiles; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RifEclipseSummaryTools::getRestartFilePath( const QString& headerFileName, const QString& restartCaseNameFromFile ) +{ + QFileInfo sourceFileInfo( headerFileName ); + QString suffix = sourceFileInfo.suffix(); + + QString filePath = sourceFileInfo.absolutePath() + RiaFilePathTools::separator() + restartCaseNameFromFile + "." + suffix; + + QFileInfo restartFileInfo( filePath ); + QString restartFileName = RiaFilePathTools::toInternalSeparator( restartFileInfo.absoluteFilePath() ); + + return restartFileName; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -289,63 +316,53 @@ void RifEclipseSummaryTools::findSummaryHeaderFileInfo( const QString& inputFile //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QString RifEclipseSummaryTools::getRestartFileName( const QString& headerFileName ) +QString RifEclipseSummaryTools::getRestartRelativeFilePathResdata( const QString& headerFileName ) { - ecl_sum_type* ecl_sum = openEclSum( headerFileName, true ); - - const ecl_smspec_type* smspec = ecl_sum ? ecl_sum_get_smspec( ecl_sum ) : nullptr; - const char* rstCase = smspec ? ecl_smspec_get_restart_case( smspec ) : nullptr; - QString restartCase = rstCase ? RiaFilePathTools::canonicalPath( RiaStringEncodingTools::fromNativeEncoded( rstCase ) ) : ""; - closeEclSum( ecl_sum ); - - if ( !restartCase.isEmpty() ) + QString restartCaseNameFromFile; + if ( ecl_file_type* header = ecl_file_open( headerFileName.toStdString().data(), 0 ) ) { - QString path = QFileInfo( restartCase ).dir().path(); - QString restartBase = QDir( restartCase ).dirName(); + // Code taken from ecl_smspec_load_restart() in ecl_smspec.cpp + if ( ecl_file_has_kw( header, RESTART_KW ) ) + { + if ( const ecl_kw_type* restart_kw = ecl_file_iget_named_kw( header, RESTART_KW, 0 ) ) + { + char tmp_base[137]; - char* smspec_header = ecl_util_alloc_exfilename( path.toStdString().data(), - restartBase.toStdString().data(), - ECL_SUMMARY_HEADER_FILE, - false /*unformatted*/, - 0 ); - QString restartFileName = RiaFilePathTools::toInternalSeparator( RiaStringEncodingTools::fromNativeEncoded( smspec_header ) ); - free( smspec_header ); + tmp_base[0] = '\0'; + for ( int i = 0; i < ecl_kw_get_size( restart_kw ); i++ ) + strcat( tmp_base, (const char*)ecl_kw_iget_ptr( restart_kw, i ) ); - return restartFileName; + // The case name is a relative path without the .SMSPEC extension + restartCaseNameFromFile = tmp_base; + restartCaseNameFromFile = restartCaseNameFromFile.trimmed(); + } + } + + ecl_file_close( header ); } - return {}; + + return restartCaseNameFromFile; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QString RifEclipseSummaryTools::getRestartFileNameOpm( const QString& headerFileName ) +QString RifEclipseSummaryTools::getRestartRelativeFilePathOpm( const QString& headerFileName ) { try { Opm::EclIO::EclFile eclFile( headerFileName.toStdString() ); eclFile.loadData( "RESTART" ); - std::string fullRestartFileName; + std::string restartCaseNameFromFile; auto restartData = eclFile.get( "RESTART" ); for ( const auto& string : restartData ) { - fullRestartFileName += string; + restartCaseNameFromFile += string; } - if ( fullRestartFileName.empty() ) return {}; - - QFileInfo sourceFileInfo( headerFileName ); - QString suffix = sourceFileInfo.suffix(); - - QString filePath = sourceFileInfo.absolutePath() + RiaFilePathTools::separator() + QString::fromStdString( fullRestartFileName ) + - "." + suffix; - - QFileInfo restartFileInfo( filePath ); - QString restartFileName = RiaFilePathTools::toInternalSeparator( restartFileInfo.absoluteFilePath() ); - - return restartFileName; + return QString::fromStdString( restartCaseNameFromFile ); } catch ( ... ) { diff --git a/ApplicationLibCode/FileInterface/RifEclipseSummaryTools.h b/ApplicationLibCode/FileInterface/RifEclipseSummaryTools.h index 5c8e30d227..8c1dfd119f 100644 --- a/ApplicationLibCode/FileInterface/RifEclipseSummaryTools.h +++ b/ApplicationLibCode/FileInterface/RifEclipseSummaryTools.h @@ -83,9 +83,10 @@ public: private: static void findSummaryFiles( const QString& inputFile, QString* headerFile, QStringList* dataFiles ); - static QString getRestartFileName( const QString& headerFileName ); - static QString getRestartFileNameOpm( const QString& headerFileName ); + static QString getRestartRelativeFilePathResdata( const QString& headerFileName ); + static QString getRestartRelativeFilePathOpm( const QString& headerFileName ); static std::vector getRestartFileNames( const QString& headerFileName, bool useOpmReader, std::vector& warnings ); + static QString getRestartFilePath( const QString& headerFileName, const QString& restartCaseNameFromFile ); static void findSummaryHeaderFileInfo( const QString& inputFile, QString* headerFile, QString* path, QString* base, bool* isFormatted ); };