mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
RFT ensemble refactoring
* Compute average MD for intersections with a cell * Create extractor for simulation well * Remove rftReader from RifDataSourceForRftPlt * Add function compute measured depth for RFT cells based on well path geometry * Move statistics reader to well ensemble curve set * Make sure both TVD and MD are cached if possible * Add selection of grid case to use for estimation of measured depth (MD) Add "Grid Model For MD" where the user can select a grid model. This grid model is propagated to a hidden field in EnsembleCurveSet. The grid model is then applied to RifReaderEnsembleStatisticsRft owned by EnsembleCurveSet
This commit is contained in:
@@ -59,6 +59,7 @@
|
||||
#include "RimWellPathCollection.h"
|
||||
#include "RimWellPlotTools.h"
|
||||
#include "RimWellPltPlot.h"
|
||||
#include "RimWellRftEnsembleCurveSet.h"
|
||||
|
||||
#include "RiuAbstractLegendFrame.h"
|
||||
#include "RiuAbstractOverlayContentFrame.h"
|
||||
@@ -123,6 +124,10 @@ RimWellRftPlot::RimWellRftPlot()
|
||||
m_selectedTimeSteps.uiCapability()->setAutoAddingOptionFromValue( false );
|
||||
|
||||
CAF_PDM_InitFieldNoDefault( &m_ensembleCurveSets, "EnsembleCurveSets", "Ensemble Curve Sets" );
|
||||
CAF_PDM_InitFieldNoDefault( &m_ensembleCurveSetEclipseCase,
|
||||
"EclipseResultCase",
|
||||
"Grid Model For MD",
|
||||
"Grid model used to compute measured depth using well path geometry" );
|
||||
|
||||
// TODO: may want to support TRUE_VERTICAL_DEPTH_RKB in the future
|
||||
// It was developed for regular well log plots and requires some more work for RFT plots.
|
||||
@@ -496,7 +501,7 @@ void RimWellRftPlot::updateCurvesInPlot( const std::set<RiaRftPltCurveDefinition
|
||||
plotTrack->addCurve( curve );
|
||||
|
||||
auto rftCase = curveDefToAdd.address().eclCase();
|
||||
curve->setEclipseResultCase( dynamic_cast<RimEclipseResultCase*>( rftCase ) );
|
||||
curve->setEclipseCase( rftCase );
|
||||
|
||||
RifEclipseRftAddress address = RifEclipseRftAddress::createAddress( simWellName,
|
||||
curveDefToAdd.timeStep(),
|
||||
@@ -534,8 +539,8 @@ void RimWellRftPlot::updateCurvesInPlot( const std::set<RiaRftPltCurveDefinition
|
||||
{
|
||||
auto curve = new RimWellLogRftCurve();
|
||||
plotTrack->addCurve( curve );
|
||||
auto rftCase = curveDefToAdd.address().summaryCase();
|
||||
curve->setSummaryCase( rftCase );
|
||||
auto summaryCase = curveDefToAdd.address().summaryCase();
|
||||
curve->setSummaryCase( summaryCase );
|
||||
curve->setEnsemble( curveDefToAdd.address().ensemble() );
|
||||
curve->setObservedFmuRftData( findObservedFmuData( m_wellPathNameOrSimWellName, curveDefToAdd.timeStep() ) );
|
||||
RifEclipseRftAddress address = RifEclipseRftAddress::createAddress( m_wellPathNameOrSimWellName,
|
||||
@@ -545,7 +550,13 @@ void RimWellRftPlot::updateCurvesInPlot( const std::set<RiaRftPltCurveDefinition
|
||||
|
||||
// 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<RimEclipseResultCase*>( curveDefToAdd.address().eclCase() ) );
|
||||
auto eclipeCase = curveDefToAdd.address().eclCase();
|
||||
if ( curveDefToAdd.address().ensemble() )
|
||||
{
|
||||
auto curveSet = findEnsembleCurveSet( curveDefToAdd.address().ensemble() );
|
||||
if ( curveSet ) eclipeCase = curveSet->eclipseCase();
|
||||
}
|
||||
curve->setEclipseCase( eclipeCase );
|
||||
|
||||
double zValue = 1.0;
|
||||
if ( !curveDefToAdd.address().ensemble() )
|
||||
@@ -565,9 +576,11 @@ void RimWellRftPlot::updateCurvesInPlot( const std::set<RiaRftPltCurveDefinition
|
||||
}
|
||||
else if ( m_showStatisticsCurves && curveDefToAdd.address().sourceType() == RifDataSourceForRftPlt::SourceType::ENSEMBLE_RFT )
|
||||
{
|
||||
RimSummaryCaseCollection* ensemble = curveDefToAdd.address().ensemble();
|
||||
RimSummaryCaseCollection* ensemble = curveDefToAdd.address().ensemble();
|
||||
auto curveSet = findEnsembleCurveSet( ensemble );
|
||||
|
||||
std::set<RifEclipseRftAddress> rftAddresses =
|
||||
ensemble->rftStatisticsReader()->eclipseRftAddresses( m_wellPathNameOrSimWellName, curveDefToAdd.timeStep() );
|
||||
curveSet->statisticsEclipseRftReader()->eclipseRftAddresses( m_wellPathNameOrSimWellName, curveDefToAdd.timeStep() );
|
||||
for ( const auto& rftAddress : rftAddresses )
|
||||
{
|
||||
if ( rftAddress.wellLogChannel() == RifEclipseRftAddress::RftWellLogChannelType::PRESSURE_P50 )
|
||||
@@ -584,6 +597,7 @@ void RimWellRftPlot::updateCurvesInPlot( const std::set<RiaRftPltCurveDefinition
|
||||
auto curve = new RimWellLogRftCurve();
|
||||
plotTrack->addCurve( curve );
|
||||
curve->setEnsemble( ensemble );
|
||||
curve->setEclipseCase( curveSet->eclipseCase() );
|
||||
curve->setRftAddress( rftAddress );
|
||||
curve->setObservedFmuRftData( findObservedFmuData( m_wellPathNameOrSimWellName, curveDefToAdd.timeStep() ) );
|
||||
curve->setZOrder( RiuQwtPlotCurveDefines::zDepthForIndex( RiuQwtPlotCurveDefines::ZIndex::Z_ENSEMBLE_STAT_CURVE ) );
|
||||
@@ -795,6 +809,13 @@ QList<caf::PdmOptionItemInfo> RimWellRftPlot::calculateValueOptions( const caf::
|
||||
|
||||
options = RiaSimWellBranchTools::valueOptionsForBranchIndexField( simulationWellBranches );
|
||||
}
|
||||
else if ( fieldNeedingOptions == &m_ensembleCurveSetEclipseCase )
|
||||
{
|
||||
RimTools::caseOptionItems( &options );
|
||||
|
||||
options.push_front( caf::PdmOptionItemInfo( "None", nullptr ) );
|
||||
}
|
||||
|
||||
return options;
|
||||
}
|
||||
|
||||
@@ -968,6 +989,17 @@ void RimWellRftPlot::fieldChangedByUi( const caf::PdmFieldHandle* changedField,
|
||||
updateFormationsOnPlot();
|
||||
syncCurvesFromUiSelection();
|
||||
}
|
||||
else if ( changedField == &m_ensembleCurveSetEclipseCase )
|
||||
{
|
||||
for ( RimWellRftEnsembleCurveSet* curveSet : m_ensembleCurveSets() )
|
||||
{
|
||||
curveSet->setEclipseCase( m_ensembleCurveSetEclipseCase );
|
||||
}
|
||||
|
||||
createEnsembleCurveSets();
|
||||
updateFormationsOnPlot();
|
||||
syncCurvesFromUiSelection();
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@@ -1016,6 +1048,11 @@ void RimWellRftPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering&
|
||||
caf::PdmUiGroup* sourcesGroup = uiOrdering.addNewGroupWithKeyword( "Sources", "Sources" );
|
||||
sourcesGroup->add( &m_selectedSources );
|
||||
|
||||
if ( !m_ensembleCurveSets.empty() )
|
||||
{
|
||||
uiOrdering.add( &m_ensembleCurveSetEclipseCase );
|
||||
}
|
||||
|
||||
caf::PdmUiGroup* timeStepsGroup = uiOrdering.addNewGroupWithKeyword( "Time Steps", "TimeSteps" );
|
||||
timeStepsGroup->add( &m_selectedTimeSteps );
|
||||
|
||||
|
||||
Reference in New Issue
Block a user