diff --git a/ApplicationCode/ProjectDataModel/Rim3dOverlayInfoConfig.cpp b/ApplicationCode/ProjectDataModel/Rim3dOverlayInfoConfig.cpp index cd99f7713b..5b27e78160 100644 --- a/ApplicationCode/ProjectDataModel/Rim3dOverlayInfoConfig.cpp +++ b/ApplicationCode/ProjectDataModel/Rim3dOverlayInfoConfig.cpp @@ -99,7 +99,7 @@ void Rim3dOverlayInfoConfig::update3DInfo() QString infoText = QString( "

-- %1 --

" - "Cell count: Total: %2 Active: %3
" + "Cell count. Total: %2 Active: %3
" "Main Grid I,J,K: %4, %5, %6
").arg(caseName, totCellCount, activeCellCount, iSize, jSize, kSize); if (m_reservoirView->animationMode() && m_reservoirView->cellResult()->hasResult()) @@ -108,11 +108,14 @@ void Rim3dOverlayInfoConfig::update3DInfo() double min, max; double p10, p90; + double mean; size_t scalarIndex = m_reservoirView->cellResult()->gridScalarIndex(); m_reservoirView->gridCellResults()->minMaxCellScalarValues(scalarIndex, min, max); m_reservoirView->gridCellResults()->p10p90CellScalarValues(scalarIndex, p10, p90); + m_reservoirView->gridCellResults()->meanCellScalarValues(scalarIndex, mean); - infoText += QString("

Min: %1 P10: %2 P90: %3 Max: %4
").arg(min).arg(p10).arg(p90).arg(max); + infoText += QString("
Min: %1 P10: %2 Mean: %3 P90: %4 Max: %5
").arg(min).arg(p10).arg(mean).arg(p90).arg(max); + //infoText += QString("
Min: %1   P10: %2   Mean: %3 \n  P90: %4   Max: %5 
").arg(min).arg(p10).arg(mean).arg(p90).arg(max); } @@ -142,13 +145,16 @@ void Rim3dOverlayInfoConfig::update3DInfo() { double min, max; double p10, p90; + double mean; + size_t scalarIndex = m_reservoirView->cellResult()->gridScalarIndex(); m_reservoirView->gridCellResults()->minMaxCellScalarValues(scalarIndex, min, max); m_reservoirView->gridCellResults()->p10p90CellScalarValues(scalarIndex, p10, p90); + m_reservoirView->gridCellResults()->meanCellScalarValues(scalarIndex, mean); m_reservoirView->viewer()->showHistogram(true); m_reservoirView->viewer()->setHistogram(min, max, m_reservoirView->gridCellResults()->cellScalarValuesHistogram(scalarIndex)); - m_reservoirView->viewer()->setHistogramPercentiles(p10, p90); + m_reservoirView->viewer()->setHistogramPercentiles(p10, p90, mean); } } } diff --git a/ApplicationCode/ReservoirDataModel/RigReservoirCellResults.cpp b/ApplicationCode/ReservoirDataModel/RigReservoirCellResults.cpp index c82a69e5b4..c3bb40f89d 100644 --- a/ApplicationCode/ReservoirDataModel/RigReservoirCellResults.cpp +++ b/ApplicationCode/ReservoirDataModel/RigReservoirCellResults.cpp @@ -172,6 +172,42 @@ void RigReservoirCellResults::p10p90CellScalarValues(size_t scalarResultIndex, d p90 = m_p10p90[scalarResultIndex].second; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigReservoirCellResults::meanCellScalarValues(size_t scalarResultIndex, double& meanValue) +{ + CVF_ASSERT(scalarResultIndex < resultCount()); + + // Extend array and cache vars + + if (scalarResultIndex >= m_meanValues.size() ) + { + m_meanValues.resize(scalarResultIndex+1, HUGE_VAL); + } + + if (m_meanValues[scalarResultIndex] != HUGE_VAL) + { + meanValue = m_meanValues[scalarResultIndex]; + return; + } + + double valueSum = 0.0; + size_t count = 0; + for (size_t tIdx = 0; tIdx < timeStepCount(scalarResultIndex); tIdx++) + { + std::vector& values = m_cellScalarResults[scalarResultIndex][tIdx]; + for (size_t cIdx = 0; cIdx < values.size(); ++cIdx) + { + valueSum += values[cIdx]; + } + count += values.size(); + } + + m_meanValues[scalarResultIndex] = valueSum/count; + meanValue = m_meanValues[scalarResultIndex]; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ReservoirDataModel/RigReservoirCellResults.h b/ApplicationCode/ReservoirDataModel/RigReservoirCellResults.h index 5101f4f417..38e7076d08 100644 --- a/ApplicationCode/ReservoirDataModel/RigReservoirCellResults.h +++ b/ApplicationCode/ReservoirDataModel/RigReservoirCellResults.h @@ -42,6 +42,7 @@ public: void minMaxCellScalarValues(size_t scalarResultIndex, size_t timeStepIndex, double& min, double& max); const std::vector& cellScalarValuesHistogram(size_t scalarResultIndex); void p10p90CellScalarValues(size_t scalarResultIndex, double& p10, double& p90); + void meanCellScalarValues(size_t scalarResultIndex, double& meanValue); // Access meta-information about the results size_t resultCount() const; @@ -76,6 +77,7 @@ private: std::vector< std::pair > m_maxMinValues; ///< Max min values for each Result index std::vector< std::vector > m_histograms; ///< Histogram for each Result Index std::vector< std::pair > m_p10p90; ///< P10 and p90 values for each Result Index + std::vector< double > m_meanValues; ///< Mean value for each Result Index std::vector< std::vector< std::pair > > m_maxMinValuesPrTs; ///< Max min values for each timestep and Result index diff --git a/ApplicationCode/UserInterface/RIViewer.cpp b/ApplicationCode/UserInterface/RIViewer.cpp index b24054efd0..7a69ce87a1 100644 --- a/ApplicationCode/UserInterface/RIViewer.cpp +++ b/ApplicationCode/UserInterface/RIViewer.cpp @@ -481,9 +481,10 @@ void RIViewer::setHistogram(double min, double max, const std::vector& h //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RIViewer::setHistogramPercentiles(double pmin, double pmax) +void RIViewer::setHistogramPercentiles(double pmin, double pmax, double mean) { m_histogramWidget->setPercentiles(pmin, pmax); + m_histogramWidget->setMean(mean); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/UserInterface/RIViewer.h b/ApplicationCode/UserInterface/RIViewer.h index f3551332c1..6b11bbe430 100644 --- a/ApplicationCode/UserInterface/RIViewer.h +++ b/ApplicationCode/UserInterface/RIViewer.h @@ -60,7 +60,7 @@ public: void setInfoText(QString text); void showHistogram(bool enable); void setHistogram(double min, double max, const std::vector& histogram); - void setHistogramPercentiles(double pmin, double pmax); + void setHistogramPercentiles(double pmin, double pmax, double mean); void showAnimationProgress(bool enable); diff --git a/ApplicationCode/UserInterface/RiuSimpleHistogramWidget.cpp b/ApplicationCode/UserInterface/RiuSimpleHistogramWidget.cpp index 2495f94ab4..f5384166de 100644 --- a/ApplicationCode/UserInterface/RiuSimpleHistogramWidget.cpp +++ b/ApplicationCode/UserInterface/RiuSimpleHistogramWidget.cpp @@ -10,6 +10,8 @@ QWidget(parent, f) { m_minPercentile = HUGE_VAL; m_maxPercentile = HUGE_VAL; + m_mean = HUGE_VAL; + } //-------------------------------------------------------------------------------------------------- @@ -78,6 +80,14 @@ void RiuSimpleHistogramWidget::draw(QPainter *painter,int x, int y, int width, i painter->setPen(QColor(255, 0, 0, 200)); painter->drawLine(xpos, y+1, xpos, y + height -1); } + + // Vertical lines for percentiles + if (m_mean != HUGE_VAL) + { + int xpos = xPosFromDomainValue(m_mean); + painter->setPen(QColor(0, 0, 255, 200)); + painter->drawLine(xpos, y+1, xpos, y + height -1); + } } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/UserInterface/RiuSimpleHistogramWidget.h b/ApplicationCode/UserInterface/RiuSimpleHistogramWidget.h index d3b0e1b24b..5ced51fa8e 100644 --- a/ApplicationCode/UserInterface/RiuSimpleHistogramWidget.h +++ b/ApplicationCode/UserInterface/RiuSimpleHistogramWidget.h @@ -11,6 +11,7 @@ public: void setHistogramData(double min, double max, const std::vector& histogram); void setPercentiles(double pmin, double pmax) {m_minPercentile = pmin; m_maxPercentile = pmax;} + void setMean(double mean) {m_mean = mean;} protected: virtual void paintEvent(QPaintEvent* event); @@ -28,6 +29,7 @@ private: double m_min; double m_minPercentile; double m_maxPercentile; + double m_mean; size_t m_maxHistogramCount; double m_width;