From 6b7f87e260037b62aa9ca10781617d8b16ff66ed Mon Sep 17 00:00:00 2001 From: jonjenssen Date: Fri, 10 Jul 2026 16:20:02 +0200 Subject: [PATCH] Make sure to add, not merge, WELSEGS and COMPSEGS keywords --- .../Application/RiaPreferencesOpm.cpp | 2 +- .../FileInterface/RifOpmFlowDeckFile.cpp | 56 +++++++++++++++++++ .../FileInterface/RifOpmFlowDeckFile.h | 3 + .../ProjectDataModel/Jobs/RimOpmFlowJob.cpp | 8 +-- 4 files changed, 64 insertions(+), 5 deletions(-) diff --git a/ApplicationLibCode/Application/RiaPreferencesOpm.cpp b/ApplicationLibCode/Application/RiaPreferencesOpm.cpp index 77da939f7c..e4674e40a7 100644 --- a/ApplicationLibCode/Application/RiaPreferencesOpm.cpp +++ b/ApplicationLibCode/Application/RiaPreferencesOpm.cpp @@ -45,7 +45,7 @@ RiaPreferencesOpm::RiaPreferencesOpm() CAF_PDM_InitField( &m_useWsl, "useWsl", false, "Use WSL to run OPM Flow" ); CAF_PDM_InitField( &m_useMpi, "useMpi", false, "Enable MPI" ); - CAF_PDM_InitField( &m_mpirunCommand, "mpirunCommand", QString( "/usr/bin/mpirun" ), "Path to mpirun executable" ); + CAF_PDM_InitField( &m_mpirunCommand, "mpirunCommand", QString( "/usr/bin/mpirun" ), "Path to mpirun or mpiexec executable" ); m_mpirunCommand.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); CAF_PDM_InitFieldNoDefault( &m_wslDistribution, "wslDistribution", "WSL Distribution to use:" ); diff --git a/ApplicationLibCode/FileInterface/RifOpmFlowDeckFile.cpp b/ApplicationLibCode/FileInterface/RifOpmFlowDeckFile.cpp index c85304859c..54d13ecf16 100644 --- a/ApplicationLibCode/FileInterface/RifOpmFlowDeckFile.cpp +++ b/ApplicationLibCode/FileInterface/RifOpmFlowDeckFile.cpp @@ -351,6 +351,28 @@ bool RifOpmFlowDeckFile::saveDeckInline( std::string folder, std::string filenam return false; } +//-------------------------------------------------------------------------------------------------- +/// Returns updated position due to new inserts if successful, < 0 if failure +//-------------------------------------------------------------------------------------------------- +int RifOpmFlowDeckFile::addKeywordAtPosition( int position, const Opm::DeckKeyword& keyword ) +{ + if ( m_fileDeck.get() == nullptr ) return -1; + + // locate position + auto insertIdx = internal::positionToIndex( position, m_fileDeck ); + if ( !insertIdx.has_value() ) + { + return -1; + } + + // insert a new keyword + m_fileDeck->insert( insertIdx.value(), keyword ); + // update position to keep keyword order + position++; + + return position; +} + //-------------------------------------------------------------------------------------------------- /// Returns updated position due to new inserts if successful, < 0 if failure //-------------------------------------------------------------------------------------------------- @@ -394,6 +416,40 @@ int RifOpmFlowDeckFile::mergeKeywordAtPosition( int position, const Opm::DeckKey return position; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifOpmFlowDeckFile::addKeywordAtTimeStep( int timeStep, const Opm::DeckKeyword& keyword, std::string insertAfterKeyword ) +{ + if ( m_fileDeck.get() == nullptr ) return false; + + auto dateIdx = internal::locateTimeStep( m_fileDeck, timeStep ); + if ( dateIdx.has_value() ) + { + auto insertIdx = dateIdx.value(); + bool insertedOk = false; + if ( !insertAfterKeyword.empty() ) + { + auto insertAfterKw = internal::locateKeywordAtTimeStep( m_fileDeck, timeStep, insertAfterKeyword ); + if ( insertAfterKw.has_value() ) + { + auto afterIdx = insertAfterKw.value(); + afterIdx++; + m_fileDeck->insert( afterIdx, keyword ); + insertedOk = true; + } + } + if ( !insertedOk ) + { + // insert after keyword not found, insert at date position + m_fileDeck->insert( insertIdx, keyword ); + } + return true; + } + + return false; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/FileInterface/RifOpmFlowDeckFile.h b/ApplicationLibCode/FileInterface/RifOpmFlowDeckFile.h index 44cb16c42d..6026f5a31f 100644 --- a/ApplicationLibCode/FileInterface/RifOpmFlowDeckFile.h +++ b/ApplicationLibCode/FileInterface/RifOpmFlowDeckFile.h @@ -51,6 +51,9 @@ public: bool saveDeck( std::string folder, std::string filename ); bool saveDeckInline( std::string folder, std::string filename ); + int addKeywordAtPosition( int deckPosition, const Opm::DeckKeyword& keyword ); + bool addKeywordAtTimeStep( int timeStep, const Opm::DeckKeyword& keyword, std::string insertAfterKeyword = "" ); + int mergeKeywordAtPosition( int deckPosition, const Opm::DeckKeyword& keyword ); bool mergeKeywordAtTimeStep( int timeStep, const Opm::DeckKeyword& keyword, std::string insertAfterKeyword = "" ); diff --git a/ApplicationLibCode/ProjectDataModel/Jobs/RimOpmFlowJob.cpp b/ApplicationLibCode/ProjectDataModel/Jobs/RimOpmFlowJob.cpp index 1ab2598b50..2a9a0fde38 100644 --- a/ApplicationLibCode/ProjectDataModel/Jobs/RimOpmFlowJob.cpp +++ b/ApplicationLibCode/ProjectDataModel/Jobs/RimOpmFlowJob.cpp @@ -1131,8 +1131,8 @@ int RimOpmFlowJob::mergeMswData( int mergePosition ) if ( m_wellOpenType == WellOpenType::OPEN_AT_DATE ) { // make sure we insert after COMPDAT kw - if ( !m_deckFile->mergeKeywordAtTimeStep( m_openTimeStep(), welsegsKw, "COMPDAT" ) ) return failure; - if ( !m_deckFile->mergeKeywordAtTimeStep( m_openTimeStep(), compsegsKw, welsegsKw.name() ) ) return failure; + if ( !m_deckFile->addKeywordAtTimeStep( m_openTimeStep(), welsegsKw, "COMPDAT" ) ) return failure; + if ( !m_deckFile->addKeywordAtTimeStep( m_openTimeStep(), compsegsKw, welsegsKw.name() ) ) return failure; if ( !wsegvalvKw.empty() ) { if ( !m_deckFile->mergeKeywordAtTimeStep( m_openTimeStep(), wsegvalvKw, compsegsKw.name() ) ) return failure; @@ -1150,10 +1150,10 @@ int RimOpmFlowJob::mergeMswData( int mergePosition ) } else { - mergePosition = m_deckFile->mergeKeywordAtPosition( mergePosition, welsegsKw ); + mergePosition = m_deckFile->addKeywordAtPosition( mergePosition, welsegsKw ); if ( mergePosition < 0 ) return failure; mergePosition++; - mergePosition = m_deckFile->mergeKeywordAtPosition( mergePosition, compsegsKw ); + mergePosition = m_deckFile->addKeywordAtPosition( mergePosition, compsegsKw ); if ( mergePosition < 0 ) return failure; mergePosition++; if ( !wsegvalvKw.empty() )