From ef2de3e5c667ef50e4518f3285d1a121af2992cd Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Tue, 15 Aug 2023 13:37:23 +0200 Subject: [PATCH] Support well path geometry for summary RFT data * Compare well path names when matching sim well names * 10501 Make it possible to use well path geo when plotting summary RFT data --- ...cImportGridModelFromSummaryCaseFeature.cpp | 2 +- ...RicImportGridModelFromSummaryCaseFeature.h | 7 ++++--- .../FileInterface/RifDataSourceForRftPlt.cpp | 3 ++- .../FileInterface/RifDataSourceForRftPlt.h | 4 +--- .../Flow/RimDataSourceForRftPlt.cpp | 2 +- .../Flow/RimWellPlotTools.cpp | 21 ++++++++++--------- .../ProjectDataModel/Flow/RimWellRftPlot.cpp | 11 ++++++++-- .../ProjectDataModel/RimProject.cpp | 8 +++++++ 8 files changed, 37 insertions(+), 21 deletions(-) diff --git a/ApplicationLibCode/Commands/RicImportGridModelFromSummaryCaseFeature.cpp b/ApplicationLibCode/Commands/RicImportGridModelFromSummaryCaseFeature.cpp index 4c832db25b..eb66a3977e 100644 --- a/ApplicationLibCode/Commands/RicImportGridModelFromSummaryCaseFeature.cpp +++ b/ApplicationLibCode/Commands/RicImportGridModelFromSummaryCaseFeature.cpp @@ -133,7 +133,7 @@ bool RicImportGridModelFromSummaryCaseFeature::findAndActivateFirstView( const R //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimEclipseCase* RicImportGridModelFromSummaryCaseFeature::gridModelFromSummaryCase( const RimFileSummaryCase* summaryCase ) +RimEclipseCase* RicImportGridModelFromSummaryCaseFeature::gridModelFromSummaryCase( const RimSummaryCase* summaryCase ) { if ( summaryCase ) { diff --git a/ApplicationLibCode/Commands/RicImportGridModelFromSummaryCaseFeature.h b/ApplicationLibCode/Commands/RicImportGridModelFromSummaryCaseFeature.h index 7ea4a8d7bc..d2c43ac6dd 100644 --- a/ApplicationLibCode/Commands/RicImportGridModelFromSummaryCaseFeature.h +++ b/ApplicationLibCode/Commands/RicImportGridModelFromSummaryCaseFeature.h @@ -22,6 +22,7 @@ class RimEclipseCase; class RimFileSummaryCase; +class RimSummaryCase; //================================================================================================== /// @@ -31,12 +32,12 @@ class RicImportGridModelFromSummaryCaseFeature : public caf::CmdFeature CAF_CMD_HEADER_INIT; public: - static bool openOrImportGridModelFromSummaryCase( const RimFileSummaryCase* summaryCase ); + static bool openOrImportGridModelFromSummaryCase( const RimFileSummaryCase* summaryCase ); + static RimEclipseCase* gridModelFromSummaryCase( const RimSummaryCase* summaryCase ); protected: void onActionTriggered( bool isChecked ) override; void setupActionLook( QAction* actionToSetup ) override; - static bool findAndActivateFirstView( const RimFileSummaryCase* summaryCase ); - static RimEclipseCase* gridModelFromSummaryCase( const RimFileSummaryCase* summaryCase ); + static bool findAndActivateFirstView( const RimFileSummaryCase* summaryCase ); }; diff --git a/ApplicationLibCode/FileInterface/RifDataSourceForRftPlt.cpp b/ApplicationLibCode/FileInterface/RifDataSourceForRftPlt.cpp index 023dd5abe6..26ff0d08d0 100644 --- a/ApplicationLibCode/FileInterface/RifDataSourceForRftPlt.cpp +++ b/ApplicationLibCode/FileInterface/RifDataSourceForRftPlt.cpp @@ -93,11 +93,12 @@ RifDataSourceForRftPlt::RifDataSourceForRftPlt( RimSummaryCaseCollection* ensemb //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RifDataSourceForRftPlt::RifDataSourceForRftPlt( RimSummaryCase* summaryCase, RimSummaryCaseCollection* ensemble ) +RifDataSourceForRftPlt::RifDataSourceForRftPlt( RimSummaryCase* summaryCase, RimSummaryCaseCollection* ensemble, RimEclipseCase* eclipseCase ) { m_sourceType = SourceType::SUMMARY_RFT; m_summaryCase = summaryCase; m_ensemble = ensemble; + m_eclCase = eclipseCase; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/FileInterface/RifDataSourceForRftPlt.h b/ApplicationLibCode/FileInterface/RifDataSourceForRftPlt.h index ccdaa21f45..fab7278ce5 100644 --- a/ApplicationLibCode/FileInterface/RifDataSourceForRftPlt.h +++ b/ApplicationLibCode/FileInterface/RifDataSourceForRftPlt.h @@ -59,7 +59,7 @@ public: RifDataSourceForRftPlt(); RifDataSourceForRftPlt( SourceType sourceType, RimEclipseCase* eclCase ); RifDataSourceForRftPlt( RimSummaryCaseCollection* ensemble ); - RifDataSourceForRftPlt( RimSummaryCase* summaryCase, RimSummaryCaseCollection* ensemble ); + RifDataSourceForRftPlt( RimSummaryCase* summaryCase, RimSummaryCaseCollection* ensemble, RimEclipseCase* eclipseCase ); RifDataSourceForRftPlt( RimWellLogFile* wellLogFile ); RifDataSourceForRftPlt( RimObservedFmuRftData* observedFmuRftData ); RifDataSourceForRftPlt( RimPressureDepthData* pressureDepthData ); @@ -78,8 +78,6 @@ public: std::vector availableUnitSystems() const; - friend QTextStream& operator>>( QTextStream& str, RifDataSourceForRftPlt& addr ); - auto operator<=>( const RifDataSourceForRftPlt& rhs ) const -> std::strong_ordering; // When operator<=>() is overloaded, no operator==() nor operator!=() are defined by default by the compiler diff --git a/ApplicationLibCode/ProjectDataModel/Flow/RimDataSourceForRftPlt.cpp b/ApplicationLibCode/ProjectDataModel/Flow/RimDataSourceForRftPlt.cpp index 5d52737210..a0de8c6478 100644 --- a/ApplicationLibCode/ProjectDataModel/Flow/RimDataSourceForRftPlt.cpp +++ b/ApplicationLibCode/ProjectDataModel/Flow/RimDataSourceForRftPlt.cpp @@ -80,7 +80,7 @@ RifDataSourceForRftPlt RimDataSourceForRftPlt::address() const case RifDataSourceForRftPlt::SourceType::GRID_MODEL_CELL_DATA: return RifDataSourceForRftPlt( RifDataSourceForRftPlt::SourceType::GRID_MODEL_CELL_DATA, m_eclCase ); case RifDataSourceForRftPlt::SourceType::SUMMARY_RFT: - return RifDataSourceForRftPlt( m_summaryCase, m_ensemble ); + return RifDataSourceForRftPlt( m_summaryCase, m_ensemble, m_eclCase ); case RifDataSourceForRftPlt::SourceType::ENSEMBLE_RFT: return RifDataSourceForRftPlt( m_ensemble ); case RifDataSourceForRftPlt::SourceType::OBSERVED_FMU_RFT: diff --git a/ApplicationLibCode/ProjectDataModel/Flow/RimWellPlotTools.cpp b/ApplicationLibCode/ProjectDataModel/Flow/RimWellPlotTools.cpp index 0dcf32de1d..1d7ed96f1f 100644 --- a/ApplicationLibCode/ProjectDataModel/Flow/RimWellPlotTools.cpp +++ b/ApplicationLibCode/ProjectDataModel/Flow/RimWellPlotTools.cpp @@ -618,17 +618,20 @@ RiaRftPltCurveDefinition RimWellPlotTools::curveDefFromCurve( const RimWellLogCu const QString& wellName = rftAddress.wellName(); const QDateTime& timeStep = rftAddress.timeStep(); - if ( rftCase != nullptr ) + if ( rftSummaryCase != nullptr ) + { + // Presens of rftSummaryCase must be tested before rftCase because a rftSummaryCase can have a rftCase + // The rftCase is used to extract TVD/MD from the grid model + + RimSummaryCaseCollection* parentEnsemble = rftSummaryCase->firstAncestorOrThisOfType(); + return RiaRftPltCurveDefinition( RifDataSourceForRftPlt( rftSummaryCase, parentEnsemble, rftCase ), wellName, timeStep ); + } + else if ( rftCase != nullptr ) { return RiaRftPltCurveDefinition( RifDataSourceForRftPlt( RifDataSourceForRftPlt::SourceType::RFT_SIM_WELL_DATA, rftCase ), wellName, timeStep ); } - else if ( rftSummaryCase != nullptr ) - { - RimSummaryCaseCollection* parentEnsemble = rftSummaryCase->firstAncestorOrThisOfType(); - return RiaRftPltCurveDefinition( RifDataSourceForRftPlt( rftSummaryCase, parentEnsemble ), wellName, timeStep ); - } else if ( rftEnsemble != nullptr ) { return RiaRftPltCurveDefinition( RifDataSourceForRftPlt( rftEnsemble ), wellName, timeStep ); @@ -805,7 +808,7 @@ std::set { if ( summaryCase && summaryCase->rftReader() ) { - RifDataSourceForRftPlt summaryAddr( summaryCase, addr.ensemble() ); + RifDataSourceForRftPlt summaryAddr( summaryCase, addr.ensemble(), addr.eclCase() ); std::set timeSteps = summaryCase->rftReader()->availableTimeSteps( wellPathNameOrSimWellName ); for ( const QDateTime& time : timeSteps ) @@ -835,14 +838,12 @@ std::set auto summaryCase = addr.summaryCase(); if ( summaryCase && summaryCase->rftReader() ) { - RifDataSourceForRftPlt summaryAddr( summaryCase, addr.ensemble() ); - std::set timeSteps = summaryCase->rftReader()->availableTimeSteps( wellPathNameOrSimWellName ); for ( const QDateTime& time : timeSteps ) { if ( selectedTimeStepSet.count( time ) ) { - curveDefs.insert( RiaRftPltCurveDefinition( summaryAddr, wellPathNameOrSimWellName, time ) ); + curveDefs.insert( RiaRftPltCurveDefinition( addr, wellPathNameOrSimWellName, time ) ); } } } diff --git a/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftPlot.cpp b/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftPlot.cpp index fbd2a31abc..744de4f710 100644 --- a/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftPlot.cpp @@ -25,6 +25,8 @@ #include "RiaSimWellBranchTools.h" #include "RiaSummaryTools.h" +#include "RicImportGridModelFromSummaryCaseFeature.h" + #include "RifReaderEclipseRft.h" #include "RigCaseCellResultsData.h" @@ -540,6 +542,10 @@ void RimWellRftPlot::updateCurvesInPlot( const std::setsetRftAddress( address ); + // A summary case address can optionally contain an Eclipse case used to compute the TVD/MD for a well path + // https://github.com/OPM/ResInsight/issues/10501 + curve->setEclipseResultCase( dynamic_cast( curveDefToAdd.address().eclCase() ) ); + double zValue = 1.0; if ( !curveDefToAdd.address().ensemble() ) { @@ -842,8 +848,9 @@ QList RimWellRftPlot::calculateValueOptionsForSources() { if ( summaryCase->rftReader() && summaryCase->rftReader()->wellNames().contains( m_wellPathNameOrSimWellName ) ) { - auto parentEnsemble = summaryCase->firstAncestorOrThisOfType(); - auto addr = RifDataSourceForRftPlt( summaryCase, parentEnsemble ); + auto eclipeGridModel = RicImportGridModelFromSummaryCaseFeature::gridModelFromSummaryCase( summaryCase ); + auto parentEnsemble = summaryCase->firstAncestorOrThisOfType(); + auto addr = RifDataSourceForRftPlt( summaryCase, parentEnsemble, eclipeGridModel ); auto item = caf::PdmOptionItemInfo( summaryCase->displayCaseName(), QVariant::fromValue( addr ) ); item.setLevel( 1 ); diff --git a/ApplicationLibCode/ProjectDataModel/RimProject.cpp b/ApplicationLibCode/ProjectDataModel/RimProject.cpp index 43e5fccfc0..941e4ac86f 100644 --- a/ApplicationLibCode/ProjectDataModel/RimProject.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimProject.cpp @@ -1134,6 +1134,14 @@ RimWellPath* RimProject::wellPathFromSimWellName( const QString& simWellName, in return path; } } + + for ( RimWellPath* const path : allWellPaths() ) + { + if ( QString::compare( path->name(), simWellName ) == 0 ) + { + return path; + } + } return nullptr; }