diff --git a/ApplicationCode/GeoMech/GeoMechDataModel/RigFemNativeStatCalc.cpp b/ApplicationCode/GeoMech/GeoMechDataModel/RigFemNativeStatCalc.cpp index ffca823228..d93b57bf7c 100644 --- a/ApplicationCode/GeoMech/GeoMechDataModel/RigFemNativeStatCalc.cpp +++ b/ApplicationCode/GeoMech/GeoMechDataModel/RigFemNativeStatCalc.cpp @@ -137,6 +137,22 @@ void RigFemNativeStatCalc::addDataToHistogramCalculator(size_t timeStepIndex, Ri } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigFemNativeStatCalc::uniqueValues(size_t timeStepIndex, std::set& values) +{ + for (int pIdx = 0; pIdx < m_resultsData->partCount(); ++pIdx) + { + const std::vector& floatValues = m_resultsData->resultValues(m_resVarAddr, pIdx, (int)timeStepIndex); + + for (size_t i = 0; i < floatValues.size(); i++) + { + values.insert(static_cast(std::floor(floatValues[i]))); + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/GeoMech/GeoMechDataModel/RigFemNativeStatCalc.h b/ApplicationCode/GeoMech/GeoMechDataModel/RigFemNativeStatCalc.h index 9f7b67104b..929b5b5b4e 100644 --- a/ApplicationCode/GeoMech/GeoMechDataModel/RigFemNativeStatCalc.h +++ b/ApplicationCode/GeoMech/GeoMechDataModel/RigFemNativeStatCalc.h @@ -42,6 +42,8 @@ public: virtual void addDataToHistogramCalculator(size_t timeStepIndex, RigHistogramCalculator& histogramCalculator); + virtual void uniqueValues(size_t timeStepIndex, std::set& values); + virtual size_t timeStepCount(); private: diff --git a/ApplicationCode/GeoMech/GeoMechDataModel/RigFemNativeVisibleCellsStatCalc.cpp b/ApplicationCode/GeoMech/GeoMechDataModel/RigFemNativeVisibleCellsStatCalc.cpp index b60a5ba5a2..ac28bf91b3 100644 --- a/ApplicationCode/GeoMech/GeoMechDataModel/RigFemNativeVisibleCellsStatCalc.cpp +++ b/ApplicationCode/GeoMech/GeoMechDataModel/RigFemNativeVisibleCellsStatCalc.cpp @@ -82,6 +82,16 @@ void RigFemNativeVisibleCellsStatCalc::addDataToHistogramCalculator(size_t timeS traverseElementNodes(histogramCalculator, timeStepIndex); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigFemNativeVisibleCellsStatCalc::uniqueValues(size_t timeStepIndex, std::set& values) +{ + UniqueValueAccumulator acc; + traverseElementNodes(acc, timeStepIndex); + values = acc.uniqueValues; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/GeoMech/GeoMechDataModel/RigFemNativeVisibleCellsStatCalc.h b/ApplicationCode/GeoMech/GeoMechDataModel/RigFemNativeVisibleCellsStatCalc.h index 020b5d46e6..bcc7c05df9 100644 --- a/ApplicationCode/GeoMech/GeoMechDataModel/RigFemNativeVisibleCellsStatCalc.h +++ b/ApplicationCode/GeoMech/GeoMechDataModel/RigFemNativeVisibleCellsStatCalc.h @@ -45,6 +45,7 @@ public: virtual void posNegClosestToZero(size_t timeStepIndex, double& pos, double& neg); virtual void valueSumAndSampleCount(size_t timeStepIndex, double& valueSum, size_t& sampleCount); virtual void addDataToHistogramCalculator(size_t timeStepIndex, RigHistogramCalculator& histogramCalculator); + virtual void uniqueValues(size_t timeStepIndex, std::set& values); virtual size_t timeStepCount(); private: diff --git a/ApplicationCode/ReservoirDataModel/RigCaseCellResultsData.cpp b/ApplicationCode/ReservoirDataModel/RigCaseCellResultsData.cpp index 2ff69a597c..a99da4149a 100644 --- a/ApplicationCode/ReservoirDataModel/RigCaseCellResultsData.cpp +++ b/ApplicationCode/ReservoirDataModel/RigCaseCellResultsData.cpp @@ -127,6 +127,22 @@ void RigCaseCellResultsData::meanCellScalarValues(size_t scalarResultIndex, size m_statisticsDataCache[scalarResultIndex]->meanCellScalarValues(timeStepIndex, meanValue); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::set& RigCaseCellResultsData::uniqueCellScalarValues(size_t scalarResultIndex) +{ + return m_statisticsDataCache[scalarResultIndex]->uniqueCellScalarValues(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::set& RigCaseCellResultsData::uniqueCellScalarValues(size_t scalarResultIndex, size_t timeStepIndex) +{ + return m_statisticsDataCache[scalarResultIndex]->uniqueCellScalarValues(timeStepIndex); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ReservoirDataModel/RigCaseCellResultsData.h b/ApplicationCode/ReservoirDataModel/RigCaseCellResultsData.h index 1f8230bfab..0c3b14cc5c 100644 --- a/ApplicationCode/ReservoirDataModel/RigCaseCellResultsData.h +++ b/ApplicationCode/ReservoirDataModel/RigCaseCellResultsData.h @@ -59,6 +59,8 @@ public: void p10p90CellScalarValues(size_t scalarResultIndex, size_t timeStepIndex, double& p10, double& p90); void meanCellScalarValues(size_t scalarResultIndex, double& meanValue); void meanCellScalarValues(size_t scalarResultIndex, size_t timeStepIndex, double& meanValue); + const std::set& uniqueCellScalarValues(size_t scalarResultIndex); + const std::set& uniqueCellScalarValues(size_t scalarResultIndex, size_t timeStepIndex); void sumCellScalarValues(size_t scalarResultIndex, double& sumValue); void sumCellScalarValues(size_t scalarResultIndex, size_t timeStepIndex, double& sumValue); diff --git a/ApplicationCode/ReservoirDataModel/RigEclipseMultiPropertyStatCalc.cpp b/ApplicationCode/ReservoirDataModel/RigEclipseMultiPropertyStatCalc.cpp index 7bceecbf91..5ff4e3cfb4 100644 --- a/ApplicationCode/ReservoirDataModel/RigEclipseMultiPropertyStatCalc.cpp +++ b/ApplicationCode/ReservoirDataModel/RigEclipseMultiPropertyStatCalc.cpp @@ -97,6 +97,20 @@ void RigEclipseMultiPropertyStatCalc::addDataToHistogramCalculator(size_t timeSt } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigEclipseMultiPropertyStatCalc::uniqueValues(size_t timeStepIndex, std::set& values) +{ + for (size_t i = 0; i < m_nativeStatisticsCalculators.size(); i++) + { + if (m_nativeStatisticsCalculators.at(i)) + { + m_nativeStatisticsCalculators.at(i)->uniqueValues(timeStepIndex, values); + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ReservoirDataModel/RigEclipseMultiPropertyStatCalc.h b/ApplicationCode/ReservoirDataModel/RigEclipseMultiPropertyStatCalc.h index 6a85fa2afb..8c664611a7 100644 --- a/ApplicationCode/ReservoirDataModel/RigEclipseMultiPropertyStatCalc.h +++ b/ApplicationCode/ReservoirDataModel/RigEclipseMultiPropertyStatCalc.h @@ -48,6 +48,8 @@ public: virtual void addDataToHistogramCalculator(size_t timeStepIndex, RigHistogramCalculator& histogramCalculator); + virtual void uniqueValues(size_t timeStepIndex, std::set& values); + virtual size_t timeStepCount(); private: diff --git a/ApplicationCode/ReservoirDataModel/RigEclipseNativeStatCalc.cpp b/ApplicationCode/ReservoirDataModel/RigEclipseNativeStatCalc.cpp index 1a0c0a1665..3d3783b0d2 100644 --- a/ApplicationCode/ReservoirDataModel/RigEclipseNativeStatCalc.cpp +++ b/ApplicationCode/ReservoirDataModel/RigEclipseNativeStatCalc.cpp @@ -83,6 +83,19 @@ void RigEclipseNativeStatCalc::addDataToHistogramCalculator(size_t timeStepIndex histogramCalculator.addData(values); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +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])); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ReservoirDataModel/RigEclipseNativeStatCalc.h b/ApplicationCode/ReservoirDataModel/RigEclipseNativeStatCalc.h index 2ad79f4c4d..0012bb6741 100644 --- a/ApplicationCode/ReservoirDataModel/RigEclipseNativeStatCalc.h +++ b/ApplicationCode/ReservoirDataModel/RigEclipseNativeStatCalc.h @@ -43,6 +43,8 @@ public: virtual void addDataToHistogramCalculator(size_t timeStepIndex, RigHistogramCalculator& histogramCalculator); + virtual void uniqueValues(size_t timeStepIndex, std::set& values); + virtual size_t timeStepCount(); private: diff --git a/ApplicationCode/ReservoirDataModel/RigEclipseNativeVisibleCellsStatCalc.cpp b/ApplicationCode/ReservoirDataModel/RigEclipseNativeVisibleCellsStatCalc.cpp index 0281f7b94d..5db1bda0eb 100644 --- a/ApplicationCode/ReservoirDataModel/RigEclipseNativeVisibleCellsStatCalc.cpp +++ b/ApplicationCode/ReservoirDataModel/RigEclipseNativeVisibleCellsStatCalc.cpp @@ -80,6 +80,16 @@ void RigEclipseNativeVisibleCellsStatCalc::addDataToHistogramCalculator(size_t t traverseCells(histogramCalculator, timeStepIndex); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigEclipseNativeVisibleCellsStatCalc::uniqueValues(size_t timeStepIndex, std::set& values) +{ + UniqueValueAccumulator acc; + traverseCells(acc, timeStepIndex); + values = acc.uniqueValues; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ReservoirDataModel/RigEclipseNativeVisibleCellsStatCalc.h b/ApplicationCode/ReservoirDataModel/RigEclipseNativeVisibleCellsStatCalc.h index fb1b077f80..f5a229a04f 100644 --- a/ApplicationCode/ReservoirDataModel/RigEclipseNativeVisibleCellsStatCalc.h +++ b/ApplicationCode/ReservoirDataModel/RigEclipseNativeVisibleCellsStatCalc.h @@ -43,6 +43,7 @@ public: virtual void posNegClosestToZero(size_t timeStepIndex, double& pos, double& neg); virtual void valueSumAndSampleCount(size_t timeStepIndex, double& valueSum, size_t& sampleCount); virtual void addDataToHistogramCalculator(size_t timeStepIndex, RigHistogramCalculator& histogramCalculator); + virtual void uniqueValues(size_t timeStepIndex, std::set& values); virtual size_t timeStepCount(); private: diff --git a/ApplicationCode/ResultStatisticsCache/RigStatisticsCalculator.h b/ApplicationCode/ResultStatisticsCache/RigStatisticsCalculator.h index 2ddfd404eb..dcbb59742d 100644 --- a/ApplicationCode/ResultStatisticsCache/RigStatisticsCalculator.h +++ b/ApplicationCode/ResultStatisticsCache/RigStatisticsCalculator.h @@ -45,6 +45,8 @@ public: void addDataToHistogramCalculator(RigHistogramCalculator& histogramCalculator); virtual void addDataToHistogramCalculator(size_t timeStepIndex, RigHistogramCalculator& histogramCalculator) = 0; + virtual void uniqueValues(size_t timeStepIndex, std::set& values) = 0; + virtual size_t timeStepCount() = 0; static void posNegClosestToZero(const std::vector& values, double& pos, double& neg); diff --git a/ApplicationCode/ResultStatisticsCache/RigStatisticsDataCache.cpp b/ApplicationCode/ResultStatisticsCache/RigStatisticsDataCache.cpp index cec5859502..73e3dc8139 100644 --- a/ApplicationCode/ResultStatisticsCache/RigStatisticsDataCache.cpp +++ b/ApplicationCode/ResultStatisticsCache/RigStatisticsDataCache.cpp @@ -255,6 +255,26 @@ const std::vector& RigStatisticsDataCache::cellScalarValuesHistogram(siz return m_statsPrTs[timeStepIndex].m_histogram; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::set& RigStatisticsDataCache::uniqueCellScalarValues() +{ + computeUniqueValuesIfNeeded(); + + return m_statsAllTimesteps.m_uniqueValues; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::set& RigStatisticsDataCache::uniqueCellScalarValues(size_t timeStepIndex) +{ + computeUniqueValuesIfNeeded(timeStepIndex); + + return m_statsPrTs[timeStepIndex].m_uniqueValues; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -319,3 +339,35 @@ void RigStatisticsDataCache::computeHistogramStatisticsIfNeeded(size_t timeStepI } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigStatisticsDataCache::computeUniqueValuesIfNeeded(size_t timeStepIndex) +{ + if (timeStepIndex >= m_statsPrTs.size()) + { + m_statsPrTs.resize(timeStepIndex + 1); + } + + if (m_statsPrTs[timeStepIndex].m_uniqueValues.size() == 0) + { + m_statisticsCalculator->uniqueValues(timeStepIndex, m_statsPrTs[timeStepIndex].m_uniqueValues); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigStatisticsDataCache::computeUniqueValuesIfNeeded() +{ + if (m_statsAllTimesteps.m_uniqueValues.size() == 0) + { + for (size_t tIdx = 0; tIdx < m_statisticsCalculator->timeStepCount(); tIdx++) + { + computeUniqueValuesIfNeeded(tIdx); + + m_statsAllTimesteps.m_uniqueValues.insert(m_statsPrTs[tIdx].m_uniqueValues.begin(), m_statsPrTs[tIdx].m_uniqueValues.end()); + } + } +} + diff --git a/ApplicationCode/ResultStatisticsCache/RigStatisticsDataCache.h b/ApplicationCode/ResultStatisticsCache/RigStatisticsDataCache.h index 6307ab6be9..7167dfe13b 100644 --- a/ApplicationCode/ResultStatisticsCache/RigStatisticsDataCache.h +++ b/ApplicationCode/ResultStatisticsCache/RigStatisticsDataCache.h @@ -55,10 +55,16 @@ public: const std::vector& cellScalarValuesHistogram(); const std::vector& cellScalarValuesHistogram(size_t timeStepIndex); + const std::set& uniqueCellScalarValues(); + const std::set& uniqueCellScalarValues(size_t timeStepIndex); + private: void computeHistogramStatisticsIfNeeded(); void computeHistogramStatisticsIfNeeded(size_t timeStepIndex); + void computeUniqueValuesIfNeeded(); + void computeUniqueValuesIfNeeded(size_t timeStepIndex); + private: struct StatisticsValues { @@ -96,6 +102,7 @@ private: bool m_isValueSumCalculated; std::vector m_histogram; + std::set m_uniqueValues; }; StatisticsValues m_statsAllTimesteps; diff --git a/ApplicationCode/ResultStatisticsCache/RigStatisticsMath.h b/ApplicationCode/ResultStatisticsCache/RigStatisticsMath.h index 5aac8c258a..62a9cadbcf 100644 --- a/ApplicationCode/ResultStatisticsCache/RigStatisticsMath.h +++ b/ApplicationCode/ResultStatisticsCache/RigStatisticsMath.h @@ -18,6 +18,7 @@ #pragma once #include +#include #include #include @@ -131,3 +132,18 @@ public: double valueSum; size_t sampleCount; }; + + +class UniqueValueAccumulator +{ +public: + UniqueValueAccumulator() + {} + + void addValue(double value) + { + uniqueValues.insert(static_cast(value)); + } + + std::set uniqueValues; +};