From 63205b4753ac6482f1aab2cddf2bad7bbd89d18d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rnar=20Grip=20Fj=C3=A6r?= Date: Thu, 30 Mar 2017 11:47:38 +0200 Subject: [PATCH] #1354 Only use active cells in statistics for active cells --- .../RigEclipseNativeStatCalc.cpp | 64 +++++-------------- .../RigEclipseNativeStatCalc.h | 32 ++++++++++ 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/ApplicationCode/ReservoirDataModel/RigEclipseNativeStatCalc.cpp b/ApplicationCode/ReservoirDataModel/RigEclipseNativeStatCalc.cpp index 3d3783b0d2..97e86bdfa2 100644 --- a/ApplicationCode/ReservoirDataModel/RigEclipseNativeStatCalc.cpp +++ b/ApplicationCode/ReservoirDataModel/RigEclipseNativeStatCalc.cpp @@ -41,26 +41,10 @@ RigEclipseNativeStatCalc::RigEclipseNativeStatCalc(RigCaseCellResultsData* cellR //-------------------------------------------------------------------------------------------------- void RigEclipseNativeStatCalc::minMaxCellScalarValues(size_t timeStepIndex, double& min, double& max) { - std::vector& values = m_resultsData->cellScalarResults(m_scalarResultIndex, timeStepIndex); - - size_t i; - for (i = 0; i < values.size(); i++) - { - if (values[i] == HUGE_VAL) - { - continue; - } - - if (values[i] < min) - { - min = values[i]; - } - - if (values[i] > max) - { - max = values[i]; - } - } + MinMaxAccumulator acc(min, max); + traverseCells(acc, timeStepIndex); + min = acc.min; + max = acc.max; } //-------------------------------------------------------------------------------------------------- @@ -68,9 +52,10 @@ void RigEclipseNativeStatCalc::minMaxCellScalarValues(size_t timeStepIndex, doub //-------------------------------------------------------------------------------------------------- void RigEclipseNativeStatCalc::posNegClosestToZero(size_t timeStepIndex, double& pos, double& neg) { - std::vector& values = m_resultsData->cellScalarResults(m_scalarResultIndex, timeStepIndex); - - RigStatisticsCalculator::posNegClosestToZero(values, pos, neg); + PosNegAccumulator acc(pos, neg); + traverseCells(acc, timeStepIndex); + pos = acc.pos; + neg = acc.neg; } //-------------------------------------------------------------------------------------------------- @@ -78,9 +63,7 @@ void RigEclipseNativeStatCalc::posNegClosestToZero(size_t timeStepIndex, double& //-------------------------------------------------------------------------------------------------- void RigEclipseNativeStatCalc::addDataToHistogramCalculator(size_t timeStepIndex, RigHistogramCalculator& histogramCalculator) { - std::vector& values = m_resultsData->cellScalarResults(m_scalarResultIndex, timeStepIndex); - - histogramCalculator.addData(values); + traverseCells(histogramCalculator, timeStepIndex); } //-------------------------------------------------------------------------------------------------- @@ -88,12 +71,9 @@ void RigEclipseNativeStatCalc::addDataToHistogramCalculator(size_t timeStepIndex //-------------------------------------------------------------------------------------------------- void RigEclipseNativeStatCalc::uniqueValues(size_t timeStepIndex, std::set& values) { - std::vector& doubleValues = m_resultsData->cellScalarResults(m_scalarResultIndex, timeStepIndex); - - for (size_t cIdx = 0; cIdx < doubleValues.size(); ++cIdx) - { - values.insert(std::floor(doubleValues[cIdx])); - } + UniqueValueAccumulator acc; + traverseCells(acc, timeStepIndex); + values = acc.uniqueValues; } //-------------------------------------------------------------------------------------------------- @@ -101,22 +81,10 @@ void RigEclipseNativeStatCalc::uniqueValues(size_t timeStepIndex, std::set& //-------------------------------------------------------------------------------------------------- void RigEclipseNativeStatCalc::valueSumAndSampleCount(size_t timeStepIndex, double& valueSum, size_t& sampleCount) { - std::vector& values = m_resultsData->cellScalarResults(m_scalarResultIndex, timeStepIndex); - size_t undefValueCount = 0; - for (size_t cIdx = 0; cIdx < values.size(); ++cIdx) - { - double value = values[cIdx]; - if (value == HUGE_VAL || value != value) - { - ++undefValueCount; - continue; - } - - valueSum += value; - } - - sampleCount += values.size(); - sampleCount -= undefValueCount; + SumCountAccumulator acc(valueSum, sampleCount); + traverseCells(acc, timeStepIndex); + valueSum = acc.valueSum; + sampleCount = acc.sampleCount; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ReservoirDataModel/RigEclipseNativeStatCalc.h b/ApplicationCode/ReservoirDataModel/RigEclipseNativeStatCalc.h index a6274adb2b..75a44981ea 100644 --- a/ApplicationCode/ReservoirDataModel/RigEclipseNativeStatCalc.h +++ b/ApplicationCode/ReservoirDataModel/RigEclipseNativeStatCalc.h @@ -20,6 +20,7 @@ #pragma once #include "RigStatisticsCalculator.h" +#include "RigActiveCellInfo.h" class RigHistogramCalculator; class RigCaseCellResultsData; @@ -43,4 +44,35 @@ public: private: RigCaseCellResultsData* m_resultsData; size_t m_scalarResultIndex; + + template + void traverseCells(StatisticsAccumulator& accumulator, size_t timeStepIndex) + { + std::vector& values = m_resultsData->cellScalarResults(m_scalarResultIndex, timeStepIndex); + + if (values.empty()) + { + // Can happen if values do not exist for the current time step index. + return; + } + + const RigActiveCellInfo* actCellInfo = m_resultsData->activeCellInfo(); + + for (size_t cIdx = 0; cIdx < values.size(); ++cIdx) + { + // Filter out inactive cells + if (!actCellInfo->isActive(cIdx)) continue; + + size_t cellResultIndex = cIdx; + if (m_resultsData->isUsingGlobalActiveIndex(m_scalarResultIndex)) + { + cellResultIndex = actCellInfo->cellResultIndex(cIdx); + } + + if (cellResultIndex != cvf::UNDEFINED_SIZE_T && cellResultIndex < values.size()) + { + accumulator.addValue(values[cellResultIndex]); + } + } + } };