diff --git a/ApplicationLibCode/FileInterface/RifOpmFlowDeckFile.cpp b/ApplicationLibCode/FileInterface/RifOpmFlowDeckFile.cpp index b74ba491b1..87abff83b3 100644 --- a/ApplicationLibCode/FileInterface/RifOpmFlowDeckFile.cpp +++ b/ApplicationLibCode/FileInterface/RifOpmFlowDeckFile.cpp @@ -533,6 +533,30 @@ bool RifOpmFlowDeckFile::isRestartFile() return pos.has_value(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::set RifOpmFlowDeckFile::wellGroupsInFile() +{ + std::set values; + + if ( m_fileDeck.get() == nullptr ) return values; + + for ( auto it = m_fileDeck->start(); it != m_fileDeck->stop(); it++ ) + { + auto& kw = m_fileDeck->operator[]( it ); + if ( kw.name() == Opm::ParserKeywords::WELSPECS::keywordName ) + { + for ( int i = 0; i < (int)kw.size(); i++ ) + { + auto& item = kw.getRecord( i ).getItem( Opm::ParserKeywords::WELSPECS::GROUP::itemName ); + values.insert( item.get( 0 ) ); + } + } + } + return values; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/FileInterface/RifOpmFlowDeckFile.h b/ApplicationLibCode/FileInterface/RifOpmFlowDeckFile.h index 99dfb0d935..a525bfb915 100644 --- a/ApplicationLibCode/FileInterface/RifOpmFlowDeckFile.h +++ b/ApplicationLibCode/FileInterface/RifOpmFlowDeckFile.h @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -61,6 +62,8 @@ public: std::vector dateStrings(); std::vector dates(); + std::set wellGroupsInFile(); + std::vector welldims(); bool setWelldims( int maxWells, int maxConnections, int maxGroups, int maxWellsInGroup ); diff --git a/ApplicationLibCode/ProjectDataModel/Jobs/RimOpmFlowJob.cpp b/ApplicationLibCode/ProjectDataModel/Jobs/RimOpmFlowJob.cpp index af9531e3e6..67451c0db6 100644 --- a/ApplicationLibCode/ProjectDataModel/Jobs/RimOpmFlowJob.cpp +++ b/ApplicationLibCode/ProjectDataModel/Jobs/RimOpmFlowJob.cpp @@ -72,8 +72,8 @@ namespace caf template <> void caf::AppEnum::setUp() { - addItem( RimOpmFlowJob::WellOpenType::OPEN_BY_POSITION, "OpenByPosition", "Select Keyword Position in File" ); - addItem( RimOpmFlowJob::WellOpenType::OPEN_AT_DATE, "AtSelectedDate", "Select a Date" ); + addItem( RimOpmFlowJob::WellOpenType::OPEN_BY_POSITION, "OpenByPosition", "By Position in File" ); + addItem( RimOpmFlowJob::WellOpenType::OPEN_AT_DATE, "AtSelectedDate", "By Date" ); setDefault( RimOpmFlowJob::WellOpenType::OPEN_AT_DATE ); } @@ -105,6 +105,9 @@ RimOpmFlowJob::RimOpmFlowJob() CAF_PDM_InitField( &m_useRestart, "UseRestart", false, "Restart Simulation at Well Open Date" ); CAF_PDM_InitField( &m_currentRunId, "CurrentRunID", 0, "Current Run ID" ); + CAF_PDM_InitFieldNoDefault( &m_wellGroupName, "WellGroupName", "Well Group Name" ); + m_wellGroupName.uiCapability()->setUiEditorTypeName( caf::PdmUiComboBoxEditor::uiEditorTypeName() ); + CAF_PDM_InitField( &m_wellOpenType, "WellOpenType", caf::AppEnum( WellOpenType::OPEN_AT_DATE ), "Open Well" ); CAF_PDM_InitField( &m_wellOpenKeyword, "WellOpenKeyword", QString( "WCONPROD" ), "Open Well Keyword" ); m_wellOpenKeyword.uiCapability()->setUiEditorTypeName( caf::PdmUiComboBoxEditor::uiEditorTypeName() ); @@ -196,6 +199,16 @@ void RimOpmFlowJob::defineEditorAttribute( const caf::PdmFieldHandle* field, QSt pbAttribute->m_buttonText = "Reset Ensemble Run Id"; } } + else if ( field == &m_wellGroupName ) + { + auto attr = dynamic_cast( attribute ); + if ( attr ) + { + attr->enableEditableContent = true; + attr->enableAutoComplete = false; + attr->adjustWidthToContents = true; + } + } } //-------------------------------------------------------------------------------------------------- @@ -221,6 +234,7 @@ void RimOpmFlowJob::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& auto wellGrp = uiOrdering.addNewGroup( "New Well Settings" ); wellGrp->add( &m_wellPath ); + wellGrp->add( &m_wellGroupName ); wellGrp->add( &m_wellOpenKeyword ); if ( m_wellOpenKeyword() == "WCONPROD" ) { @@ -311,6 +325,13 @@ QList RimOpmFlowJob::calculateValueOptions( const caf::P options.push_back( caf::PdmOptionItemInfo( "WCONPROD", QVariant::fromValue( QString( "WCONPROD" ) ) ) ); options.push_back( caf::PdmOptionItemInfo( "WCONINJE", QVariant::fromValue( QString( "WCONINJE" ) ) ) ); } + else if ( fieldNeedingOptions == &m_wellGroupName ) + { + for ( auto grp : wellgroupsInFileDeck() ) + { + options.push_back( caf::PdmOptionItemInfo( grp, QVariant::fromValue( grp ) ) ); + } + } return options; } @@ -346,6 +367,17 @@ void RimOpmFlowJob::fieldChangedByUi( const caf::PdmFieldHandle* changedField, c m_openSelectButton = false; selectOpenWellPosition(); } + else if ( changedField == &m_wellPath ) + { + if ( ( m_wellPath() != nullptr ) && ( m_wellPath->completionSettings() != nullptr ) ) + { + auto wellSettings = m_wellPath->completionSettings(); + if ( !wellSettings->groupName().isEmpty() && m_wellGroupName().isEmpty() ) + { + m_wellGroupName = wellSettings->groupName(); + } + } + } } //-------------------------------------------------------------------------------------------------- @@ -600,6 +632,12 @@ bool RimOpmFlowJob::onPrepare() return false; } + if ( m_wellPath->completionSettings() == nullptr ) + { + RiaLogging::error( "The selected well path has no completions defined." ); + return false; + } + auto wellNameInDeck = m_wellPath->completionSettings()->wellName(); if ( wellNameInDeck.isEmpty() ) { @@ -607,9 +645,9 @@ bool RimOpmFlowJob::onPrepare() return false; } - if ( m_wellPath->completionSettings()->groupName().isEmpty() ) + if ( m_wellGroupName().isEmpty() ) { - RiaLogging::error( "Selected Well Path does not have a GROUP NAME set, please check the completion settings." ); + RiaLogging::error( "Please set the well group name." ); return false; } @@ -996,3 +1034,20 @@ std::vector RimOpmFlowJob::datesInFileDeck() return dates; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimOpmFlowJob::wellgroupsInFileDeck() +{ + std::vector groups; + + if ( openDeckFile() ) + { + for ( auto& grp : m_deckFile->wellGroupsInFile() ) + { + groups.push_back( QString::fromStdString( grp ) ); + } + } + return groups; +} diff --git a/ApplicationLibCode/ProjectDataModel/Jobs/RimOpmFlowJob.h b/ApplicationLibCode/ProjectDataModel/Jobs/RimOpmFlowJob.h index 6d3d4230ef..d5fb358a2f 100644 --- a/ApplicationLibCode/ProjectDataModel/Jobs/RimOpmFlowJob.h +++ b/ApplicationLibCode/ProjectDataModel/Jobs/RimOpmFlowJob.h @@ -83,6 +83,7 @@ private: QString restartDeckName() const; std::vector datesInFileDeck(); + std::vector wellgroupsInFileDeck(); static QString readFileContent( QString filename ); @@ -113,6 +114,7 @@ private: caf::PdmField m_addNewWell; caf::PdmField> m_wellOpenType; caf::PdmField m_includeMSWData; + caf::PdmField m_wellGroupName; caf::PdmChildField m_wconprodKeyword; caf::PdmChildField m_wconinjeKeyword;