RFT improvements

* Avoid accessing nullptr
* remove unused function
* Allow RFT data from single summary case to be used in RFT plots
* #9736 Support horizontal plotting of LAS curves
This commit is contained in:
Magne Sjaastad
2023-01-27 10:29:11 +01:00
committed by GitHub
parent e3a347ccaa
commit 62ce2b18e0
7 changed files with 93 additions and 24 deletions

View File

@@ -52,6 +52,16 @@ RimSummaryMultiPlotCollection* RiaSummaryTools::summaryMultiPlotCollection()
return RimMainPlotCollection::current()->summaryMultiPlotCollection(); return RimMainPlotCollection::current()->summaryMultiPlotCollection();
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RimSummaryCase*> RiaSummaryTools::singleTopLevelSummaryCases()
{
if ( summaryCaseMainCollection() ) return summaryCaseMainCollection()->topLevelSummaryCases();
return {};
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@@ -53,6 +53,8 @@ public:
static RimSummaryCaseMainCollection* summaryCaseMainCollection(); static RimSummaryCaseMainCollection* summaryCaseMainCollection();
static RimSummaryMultiPlotCollection* summaryMultiPlotCollection(); static RimSummaryMultiPlotCollection* summaryMultiPlotCollection();
static std::vector<RimSummaryCase*> singleTopLevelSummaryCases();
static void notifyCalculatedCurveNameHasChanged( int calculationId, const QString& currentCurveName ); static void notifyCalculatedCurveNameHasChanged( int calculationId, const QString& currentCurveName );
static RimSummaryPlot* parentSummaryPlot( caf::PdmObject* object ); static RimSummaryPlot* parentSummaryPlot( caf::PdmObject* object );

View File

@@ -636,10 +636,12 @@ RiaRftPltCurveDefinition RimWellPlotTools::curveDefFromCurve( const RimWellLogCu
} }
else if ( rftSummaryCase != nullptr ) else if ( rftSummaryCase != nullptr )
{ {
rftSummaryCase->firstAncestorOrThisOfTypeAsserted( rftEnsemble ); RimSummaryCaseCollection* parentEnsemble = nullptr;
rftSummaryCase->firstAncestorOrThisOfType( parentEnsemble );
return RiaRftPltCurveDefinition( RifDataSourceForRftPlt( RifDataSourceForRftPlt::SUMMARY_RFT, return RiaRftPltCurveDefinition( RifDataSourceForRftPlt( RifDataSourceForRftPlt::SUMMARY_RFT,
rftSummaryCase, rftSummaryCase,
rftEnsemble ), parentEnsemble ),
wellName, wellName,
timeStep ); timeStep );
} }
@@ -855,6 +857,23 @@ std::set<RiaRftPltCurveDefinition>
} }
} }
} }
else if ( addr.sourceType() == RifDataSourceForRftPlt::SUMMARY_RFT )
{
auto summaryCase = addr.summaryCase();
if ( summaryCase && summaryCase->rftReader() )
{
RifDataSourceForRftPlt summaryAddr( RifDataSourceForRftPlt::SUMMARY_RFT, summaryCase, addr.ensemble() );
std::set<QDateTime> timeSteps = summaryCase->rftReader()->availableTimeSteps( wellPathNameOrSimWellName );
for ( const QDateTime& time : timeSteps )
{
if ( selectedTimeStepSet.count( time ) )
{
curveDefs.insert( RiaRftPltCurveDefinition( summaryAddr, wellPathNameOrSimWellName, time ) );
}
}
}
}
} }
return curveDefs; return curveDefs;
@@ -1280,6 +1299,8 @@ std::map<QDateTime, std::set<RifDataSourceForRftPlt>> RimWellPlotTools::calculat
RimWellPlotTools::findMatchingOrAdjacentTimeSteps( baseTimeSteps, gridTimeSteps ); RimWellPlotTools::findMatchingOrAdjacentTimeSteps( baseTimeSteps, gridTimeSteps );
std::set<QDateTime> filteredEnsembleRftTimeSteps = std::set<QDateTime> filteredEnsembleRftTimeSteps =
RimWellPlotTools::findMatchingOrAdjacentTimeSteps( baseTimeSteps, ensembleRftTimeSteps ); RimWellPlotTools::findMatchingOrAdjacentTimeSteps( baseTimeSteps, ensembleRftTimeSteps );
std::set<QDateTime> filteredSummaryRftTimeSteps =
RimWellPlotTools::findMatchingOrAdjacentTimeSteps( baseTimeSteps, summaryRftTimeSteps );
if ( addFirstTimestep && gridTimeSteps.size() ) if ( addFirstTimestep && gridTimeSteps.size() )
{ {
@@ -1292,6 +1313,7 @@ std::map<QDateTime, std::set<RifDataSourceForRftPlt>> RimWellPlotTools::calculat
std::set<QDateTime>& allFilteredTimesteps = filteredRftTimeSteps; std::set<QDateTime>& allFilteredTimesteps = filteredRftTimeSteps;
allFilteredTimesteps.insert( filteredEnsembleRftTimeSteps.begin(), filteredEnsembleRftTimeSteps.end() ); allFilteredTimesteps.insert( filteredEnsembleRftTimeSteps.begin(), filteredEnsembleRftTimeSteps.end() );
allFilteredTimesteps.insert( filteredGridTimeSteps.begin(), filteredGridTimeSteps.end() ); allFilteredTimesteps.insert( filteredGridTimeSteps.begin(), filteredGridTimeSteps.end() );
allFilteredTimesteps.insert( filteredSummaryRftTimeSteps.begin(), filteredSummaryRftTimeSteps.end() );
for ( const QDateTime& time : allFilteredTimesteps ) for ( const QDateTime& time : allFilteredTimesteps )
{ {
@@ -1381,6 +1403,9 @@ void RimWellPlotTools::calculateValueOptionsForTimeSteps(
case RifDataSourceForRftPlt::ENSEMBLE_RFT: case RifDataSourceForRftPlt::ENSEMBLE_RFT:
hasEnsemble = true; hasEnsemble = true;
break; break;
case RifDataSourceForRftPlt::SUMMARY_RFT:
hasRft = true;
break;
} }
} }

View File

@@ -23,6 +23,7 @@
#include "RiaDateStringParser.h" #include "RiaDateStringParser.h"
#include "RiaPlotDefines.h" #include "RiaPlotDefines.h"
#include "RiaSimWellBranchTools.h" #include "RiaSimWellBranchTools.h"
#include "RiaSummaryTools.h"
#include "RifReaderEclipseRft.h" #include "RifReaderEclipseRft.h"
@@ -41,6 +42,7 @@
#include "RimPressureDepthData.h" #include "RimPressureDepthData.h"
#include "RimProject.h" #include "RimProject.h"
#include "RimRegularLegendConfig.h" #include "RimRegularLegendConfig.h"
#include "RimSummaryCase.h"
#include "RimSummaryCaseCollection.h" #include "RimSummaryCaseCollection.h"
#include "RimTools.h" #include "RimTools.h"
#include "RimWellLogExtractionCurve.h" #include "RimWellLogExtractionCurve.h"
@@ -816,6 +818,28 @@ QList<caf::PdmOptionItemInfo> RimWellRftPlot::calculateValueOptions( const caf::
} }
} }
auto singleCases = RiaSummaryTools::singleTopLevelSummaryCases();
if ( !singleCases.empty() )
{
options.push_back( caf::PdmOptionItemInfo::createHeader( RifDataSourceForRftPlt::sourceTypeUiText(
RifDataSourceForRftPlt::SUMMARY_RFT ),
true ) );
for ( auto summaryCase : singleCases )
{
if ( summaryCase->rftReader() &&
summaryCase->rftReader()->wellNames().contains( m_wellPathNameOrSimWellName ) )
{
RimSummaryCaseCollection* parentEnsemble = nullptr;
summaryCase->firstAncestorOrThisOfType( parentEnsemble );
auto addr = RifDataSourceForRftPlt( RifDataSourceForRftPlt::SUMMARY_RFT, summaryCase, parentEnsemble );
auto item = caf::PdmOptionItemInfo( summaryCase->displayCaseName(), QVariant::fromValue( addr ) );
item.setLevel( 1 );
options.push_back( item );
}
}
}
const std::vector<RimEclipseResultCase*> gridCases = RimWellPlotTools::gridCasesForWell( simWellName ); const std::vector<RimEclipseResultCase*> gridCases = RimWellPlotTools::gridCasesForWell( simWellName );
if ( !gridCases.empty() ) if ( !gridCases.empty() )
{ {
@@ -1046,6 +1070,19 @@ std::map<QString, QStringList> RimWellRftPlot::findWellSources()
wellNames[simWellName].push_back( "Sim.Well" ); wellNames[simWellName].push_back( "Sim.Well" );
} }
} }
auto singleCases = RiaSummaryTools::singleTopLevelSummaryCases();
for ( auto summaryCase : singleCases )
{
if ( auto rftReader = summaryCase->rftReader() )
{
for ( const QString& wellName : rftReader->wellNames() )
{
wellNames[wellName].push_back( "Summary" );
}
}
}
const std::vector<RimSummaryCaseCollection*> rftEnsembles = RimWellPlotTools::rftEnsembles(); const std::vector<RimSummaryCaseCollection*> rftEnsembles = RimWellPlotTools::rftEnsembles();
// Ensemble RFT wells // Ensemble RFT wells
{ {
@@ -1071,6 +1108,15 @@ std::map<QString, QStringList> RimWellRftPlot::findWellSources()
} }
} }
} }
const std::vector<RimPressureDepthData*> pressureDepthData = RimWellPlotTools::pressureDepthData();
for ( const auto& pd : pressureDepthData )
{
for ( const auto& wellName : pd->wellNames() )
{
wellNames[wellName].push_back( "Observed" );
}
}
} }
return wellNames; return wellNames;
} }
@@ -1106,8 +1152,8 @@ void RimWellRftPlot::onLoadDataAndUpdate()
createEnsembleCurveSets(); createEnsembleCurveSets();
updateEditorsFromCurves(); updateEditorsFromCurves();
// Update of curve color must happen here when loading data from project file, as the curve color is blended by the // Update of curve color must happen here when loading data from project file, as the curve color is blended by
// background color. The background color is taken from the viewer. // the background color. The background color is taken from the viewer.
RimWellLogTrack* const plotTrack = dynamic_cast<RimWellLogTrack*>( plotByIndex( 0 ) ); RimWellLogTrack* const plotTrack = dynamic_cast<RimWellLogTrack*>( plotByIndex( 0 ) );
if ( plotTrack && plotTrack->viewer() ) if ( plotTrack && plotTrack->viewer() )

View File

@@ -37,7 +37,7 @@ RimPressureDepthData::RimPressureDepthData()
CAF_PDM_InitFieldNoDefault( &m_wells, "Wells", "Wells" ); CAF_PDM_InitFieldNoDefault( &m_wells, "Wells", "Wells" );
m_wells.xmlCapability()->disableIO(); m_wells.xmlCapability()->disableIO();
m_wells.uiCapability()->setUiReadOnly( true ); m_wells.uiCapability()->setUiReadOnly( true );
m_wells.registerGetMethod( this, &RimPressureDepthData::wells ); m_wells.registerGetMethod( this, &RimPressureDepthData::wellNames );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -75,7 +75,7 @@ RifReaderRftInterface* RimPressureDepthData::rftReader()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool RimPressureDepthData::hasWell( const QString& wellPathName ) const bool RimPressureDepthData::hasWell( const QString& wellPathName ) const
{ {
std::vector<QString> allWells = wells(); std::vector<QString> allWells = wellNames();
for ( const QString& well : allWells ) for ( const QString& well : allWells )
{ {
if ( well == wellPathName ) if ( well == wellPathName )
@@ -89,24 +89,12 @@ bool RimPressureDepthData::hasWell( const QString& wellPathName ) const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
std::vector<QString> RimPressureDepthData::wells() const std::vector<QString> RimPressureDepthData::wellNames() const
{ {
if ( m_fmuRftReader.p() ) if ( m_fmuRftReader.p() )
{ {
std::set<QString> wellNames = const_cast<RifReaderPressureDepthData*>( m_fmuRftReader.p() )->wellNames(); std::set<QString> wellNames = const_cast<RifReaderPressureDepthData*>( m_fmuRftReader.p() )->wellNames();
return std::vector<QString>( wellNames.begin(), wellNames.end() ); return std::vector<QString>( wellNames.begin(), wellNames.end() );
} }
return std::vector<QString>();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<QString> RimPressureDepthData::labels( const RifEclipseRftAddress& rftAddress )
{
if ( m_fmuRftReader.p() )
{
return const_cast<RifReaderPressureDepthData*>( m_fmuRftReader.p() )->labels( rftAddress );
}
return {}; return {};
} }

View File

@@ -40,8 +40,7 @@ public:
RifReaderRftInterface* rftReader(); RifReaderRftInterface* rftReader();
bool hasWell( const QString& wellPathName ) const; bool hasWell( const QString& wellPathName ) const;
std::vector<QString> wells() const; std::vector<QString> wellNames() const;
std::vector<QString> labels( const RifEclipseRftAddress& rftAddress );
private: private:
cvf::ref<RifReaderPressureDepthData> m_fmuRftReader; cvf::ref<RifReaderPressureDepthData> m_fmuRftReader;

View File

@@ -196,9 +196,8 @@ void RimWellLogFileCurve::onLoadDataAndUpdate( bool updateParentPlot )
depthType = wellLogPlot->depthType(); depthType = wellLogPlot->depthType();
} }
m_plotCurve->setSamplesValues( this->curveData()->propertyValuesByIntervals(), setPropertyAndDepthValuesToPlotCurve( this->curveData()->propertyValuesByIntervals(),
this->curveData()->depthValuesByIntervals( depthType, displayUnit ) ); this->curveData()->depthValuesByIntervals( depthType, displayUnit ) );
m_plotCurve->setLineSegmentStartStopIndices( this->curveData()->polylineStartStopIndices() );
if ( updateParentPlot ) if ( updateParentPlot )
{ {