From f0ad02bc3722ade60bf3924750d91244a228ae13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Thu, 7 Dec 2017 16:24:28 +0100 Subject: [PATCH] #2233, #2236 Fix some timestep related issues in RFT/PLT plot Missing first grid timestep in RFT, and missing previous closest timestep if all available are before observed timesteps. --- .../Flow/RimWellPlotTools.cpp | 29 +++++++++++++++---- .../ProjectDataModel/Flow/RimWellPlotTools.h | 4 +-- .../ProjectDataModel/Flow/RimWellPltPlot.cpp | 4 +-- .../ProjectDataModel/Flow/RimWellRftPlot.cpp | 2 +- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Flow/RimWellPlotTools.cpp b/ApplicationCode/ProjectDataModel/Flow/RimWellPlotTools.cpp index bc1c3cfa37..38db75127f 100644 --- a/ApplicationCode/ProjectDataModel/Flow/RimWellPlotTools.cpp +++ b/ApplicationCode/ProjectDataModel/Flow/RimWellPlotTools.cpp @@ -485,6 +485,14 @@ std::set RimWellPlotTools::findMatchingOrAdjacentTimeSteps(const std: } } + // The above will only work if there are at least one available timestep equal or after any of the basetimeline times. + // If no timesteps matched but we have some, add the last available because the above code missed it. + + if (!resultTimeSteps.size() && baseTimeLine.size() && availableTimeSteps.size()) + { + resultTimeSteps.insert(*availableTimeSteps.rbegin()); + } + return resultTimeSteps; } @@ -492,7 +500,8 @@ std::set RimWellPlotTools::findMatchingOrAdjacentTimeSteps(const std: /// //-------------------------------------------------------------------------------------------------- std::set RimWellPlotTools::availableSimWellTimesteps(RimEclipseCase * eclCase, - const QString& simWellName) + const QString& simWellName, + bool addFirstReportTimestep) { std::set availebleTimeSteps; @@ -501,7 +510,7 @@ std::set RimWellPlotTools::availableSimWellTimesteps(RimEclipseCase * for ( size_t tsIdx = 0; tsIdx < allTimeSteps.size(); ++tsIdx ) { - if ( simWell->hasWellResult(tsIdx) ) + if ( simWell->hasWellResult(tsIdx) || (addFirstReportTimestep && tsIdx == 0) ) { availebleTimeSteps.insert(allTimeSteps[tsIdx]); } @@ -609,7 +618,7 @@ bool RimWellPlotTools::tryMatchChannelName(const std::set& channelNames //-------------------------------------------------------------------------------------------------- std::set < RiaRftPltCurveDefinition > RimWellPlotTools::curveDefsFromTimesteps(const QString& simWellName, const std::vector& selectedTimeSteps, - const std::set& interestingRFTResults, + bool firstSimWellTimeStepIsValid, const std::vector& selectedSourcesExpanded) { std::set curveDefs; @@ -633,7 +642,7 @@ std::set < RiaRftPltCurveDefinition > RimWellPlotTools::curveDefsFromTimesteps(c } else if ( addr.sourceType() == RifDataSourceForRftPlt::GRID && addr.eclCase() ) { - std::set timeSteps = RimWellPlotTools::availableSimWellTimesteps(addr.eclCase(), simWellName); + std::set timeSteps = RimWellPlotTools::availableSimWellTimesteps(addr.eclCase(), simWellName, firstSimWellTimeStepIsValid); for ( const QDateTime& time : timeSteps ) { @@ -778,6 +787,9 @@ void RimWellPlotTools::calculateValueOptionsForTimeSteps(const QString& simWellN QList& options) { //std::vector selSources = selectedSourcesExpanded(); + + bool addFirstTimestep = (interestingRFTResults.count(RifEclipseRftAddress::PRESSURE) == 1); + bool hasObservedData = false; bool hasRftData = false; bool hasGridData = false; @@ -836,7 +848,7 @@ void RimWellPlotTools::calculateValueOptionsForTimeSteps(const QString& simWellN { if ( source.sourceType() == RifDataSourceForRftPlt::GRID && source.eclCase() ) { - std::set wellTimeSteps = RimWellPlotTools::availableSimWellTimesteps(source.eclCase(), simWellName); + std::set wellTimeSteps = RimWellPlotTools::availableSimWellTimesteps(source.eclCase(), simWellName, addFirstTimestep); for ( const QDateTime& date: wellTimeSteps) { @@ -864,14 +876,21 @@ void RimWellPlotTools::calculateValueOptionsForTimeSteps(const QString& simWellN { std::set baseTimeSteps; for (const auto& dateSourceSetPair: *timeBaseline) baseTimeSteps.insert(dateSourceSetPair.first); + std::set rftTimeSteps; for (const auto& dateSourceSetPair: rftTimeStepsWithSources) rftTimeSteps.insert(dateSourceSetPair.first); + std::set gridTimeSteps; for (const auto& dateSourceSetPair: gridTimestepsWithSources) gridTimeSteps.insert(dateSourceSetPair.first); std::set filteredRftTimeSteps = RimWellPlotTools::findMatchingOrAdjacentTimeSteps(baseTimeSteps, rftTimeSteps); std::set filteredGridTimeSteps = RimWellPlotTools::findMatchingOrAdjacentTimeSteps(baseTimeSteps, gridTimeSteps); + if (addFirstTimestep && gridTimeSteps.size()) + { + filteredGridTimeSteps.insert(*gridTimeSteps.begin()); + } + // Fill final map timestepsToShowWithSources = observedTimeStepsWithSources; diff --git a/ApplicationCode/ProjectDataModel/Flow/RimWellPlotTools.h b/ApplicationCode/ProjectDataModel/Flow/RimWellPlotTools.h index 70701b44d2..1f6a54efc5 100644 --- a/ApplicationCode/ProjectDataModel/Flow/RimWellPlotTools.h +++ b/ApplicationCode/ProjectDataModel/Flow/RimWellPlotTools.h @@ -91,7 +91,7 @@ public: QList& options); static std::set < RiaRftPltCurveDefinition > curveDefsFromTimesteps(const QString& simWellName, const std::vector& selectedTimeStepVector, - const std::set& interestingRFTResults, + bool firstReportTimeStepIsValid, const std::vector& selectedSourcesExpanded); static QString flowPlotAxisTitle(RimWellLogFile::WellFlowCondition condition, @@ -123,7 +123,7 @@ private: static bool isFlowChannel(RimWellLogFileChannel* channel); static bool tryMatchChannelName(const std::set& channelNames, const QString& channelNameToMatch); static std::set findMatchingOrAdjacentTimeSteps(const std::set& baseTimeLine, const std::set& availableTimeSteps); - static std::set availableSimWellTimesteps(RimEclipseCase * eclCase, const QString& simWellName); + static std::set availableSimWellTimesteps(RimEclipseCase * eclCase, const QString& simWellName, bool addFirstReportTimeStep); }; diff --git a/ApplicationCode/ProjectDataModel/Flow/RimWellPltPlot.cpp b/ApplicationCode/ProjectDataModel/Flow/RimWellPltPlot.cpp index 5f401e1b5b..c34fce662c 100644 --- a/ApplicationCode/ProjectDataModel/Flow/RimWellPltPlot.cpp +++ b/ApplicationCode/ProjectDataModel/Flow/RimWellPltPlot.cpp @@ -281,9 +281,7 @@ std::set < RiaRftPltCurveDefinition > RimWellPltPlot::selectedCurveDefs() const { return RimWellPlotTools::curveDefsFromTimesteps(RimWellPlotTools::simWellName(m_wellPathName), m_selectedTimeSteps.v(), - { RifEclipseRftAddress::ORAT, - RifEclipseRftAddress::WRAT, - RifEclipseRftAddress::GRAT }, + false, selectedSourcesExpanded()); } diff --git a/ApplicationCode/ProjectDataModel/Flow/RimWellRftPlot.cpp b/ApplicationCode/ProjectDataModel/Flow/RimWellRftPlot.cpp index 337a111f6e..0146888290 100644 --- a/ApplicationCode/ProjectDataModel/Flow/RimWellRftPlot.cpp +++ b/ApplicationCode/ProjectDataModel/Flow/RimWellRftPlot.cpp @@ -431,7 +431,7 @@ std::set < RiaRftPltCurveDefinition > RimWellRftPlot::selectedCurveDefs() const { return RimWellPlotTools::curveDefsFromTimesteps(associatedSimWellName(), m_selectedTimeSteps.v(), - { RifEclipseRftAddress::PRESSURE }, + true, selectedSourcesExpanded()); }