From 41b63f9e14b87a9944ee6cd1366961e57e55546d Mon Sep 17 00:00:00 2001 From: jonjenssen Date: Wed, 8 Mar 2023 17:05:45 +0100 Subject: [PATCH] Make sure NaN values are in Y data, too, to keep good plot performance. --- .../RigDepthResultAccessor.cpp | 24 +++++++--- .../UserInterface/RiuDepthQwtPlot.cpp | 47 +++++++++---------- .../RiuSelectionChangedHandler.cpp | 14 +++--- 3 files changed, 47 insertions(+), 38 deletions(-) diff --git a/ApplicationLibCode/ReservoirDataModel/ResultAccessors/RigDepthResultAccessor.cpp b/ApplicationLibCode/ReservoirDataModel/ResultAccessors/RigDepthResultAccessor.cpp index bf76326875..df48e6a927 100644 --- a/ApplicationLibCode/ReservoirDataModel/ResultAccessors/RigDepthResultAccessor.cpp +++ b/ApplicationLibCode/ReservoirDataModel/ResultAccessors/RigDepthResultAccessor.cpp @@ -18,6 +18,7 @@ #include "RigDepthResultAccessor.h" +#include "RigActiveCellInfo.h" #include "RigCell.h" #include "RigEclipseCaseData.h" #include "RigGridBase.h" @@ -37,18 +38,20 @@ std::vector RigDepthResultAccessor::resultValues( RigEclipseCaseData* { std::vector values; - RigHugeValResultAccessor hugeVal; - if ( cellIndex != cvf::UNDEFINED_SIZE_T ) { size_t i = 0; size_t j = 0; size_t dummy = 0; + const double nan = std::nan( "" ); + auto kvals = kValues( eclipseCaseData, gridIndex ); auto grid = eclipseCaseData->grid( gridIndex ); + const RigActiveCellInfo* activeCellInfo = eclipseCaseData->activeCellInfo( RiaDefines::PorosityModelType::MATRIX_MODEL ); + if ( grid->ijkFromCellIndex( cellIndex, &i, &j, &dummy ) ) { cvf::ref resultAccessor = @@ -56,16 +59,25 @@ std::vector RigDepthResultAccessor::resultValues( RigEclipseCaseData* for ( auto k : kvals ) { - int tmpCellIdx = grid->cellIndexFromIJK( i, j, k ); + int tmpCellIdx = grid->cellIndexFromIJK( i, j, k ); + double tmpVal = 0.0; - if ( resultAccessor.notNull() ) + if ( !activeCellInfo->isActive( tmpCellIdx ) ) { - values.push_back( resultAccessor->cellScalar( tmpCellIdx ) ); + tmpVal = nan; } else { - values.push_back( hugeVal.cellScalar( tmpCellIdx ) ); + if ( resultAccessor.notNull() ) + { + tmpVal = resultAccessor->cellScalar( tmpCellIdx ); + } + else + { + tmpVal = nan; + } } + values.push_back( tmpVal ); } } } diff --git a/ApplicationLibCode/UserInterface/RiuDepthQwtPlot.cpp b/ApplicationLibCode/UserInterface/RiuDepthQwtPlot.cpp index 257bcb6099..ea1575874c 100644 --- a/ApplicationLibCode/UserInterface/RiuDepthQwtPlot.cpp +++ b/ApplicationLibCode/UserInterface/RiuDepthQwtPlot.cpp @@ -90,44 +90,35 @@ void RiuDepthQwtPlot::addCurve( const RimCase* rimCase, return; } - std::vector kValues; - - if ( m_bShowDepth ) - { - kValues = depthValues; - setAxisTitle( QwtAxis::YLeft, "Depth" ); - } - else - { - for ( auto k : kIndexes ) - { - kValues.push_back( 1.0 * k + 1.0 ); // adjust to eclipse index - } - setAxisTitle( QwtAxis::YLeft, "K" ); - } - - double yMax = *std::max_element( kValues.begin(), kValues.end() ); - double yMin = *std::min_element( kValues.begin(), kValues.end() ); + double yMax = *std::max_element( depthValues.begin(), depthValues.end() ); + double yMin = *std::min_element( depthValues.begin(), depthValues.end() ); m_maxY = std::max( yMax, m_maxY ); m_minY = std::min( yMin, m_minY ); - std::vector tmpResultValues; + std::vector tmpDepths; + const double nan = std::nan( "" ); - for ( auto val : resultValues ) + for ( int i = 0; i < (int)kIndexes.size(); i++ ) { - if ( std::isinf( val ) ) - tmpResultValues.push_back( std::nan( "" ) ); + double val = resultValues[i]; + + if ( std::isnan( val ) ) + { + // the plot framework needs nan values in the Y data to detect valid intervals and keep good plot performance + // if we have nan in the X data, set Y to nan, too + tmpDepths.push_back( nan ); + } else { if ( val > m_maxX ) m_maxX = val; if ( val < m_minX ) m_minX = val; - tmpResultValues.push_back( val ); + tmpDepths.push_back( depthValues[i] ); } } RiuQwtPlotCurve* plotCurve = new RiuQwtPlotCurve( nullptr ); - plotCurve->setSamplesFromXValuesAndYValues( tmpResultValues, kValues, false ); + plotCurve->setSamplesFromXValuesAndYValues( resultValues, tmpDepths, false ); plotCurve->setTitle( curveName ); plotCurve->setAxes( QwtAxis::XTop, QwtAxis::YLeft ); @@ -230,6 +221,11 @@ void RiuDepthQwtPlot::setDefaults() setAxisMaxMinor( QwtAxis::XTop, 2 ); setAxisMaxMinor( QwtAxis::YLeft, 6 ); + setAxisTitle( QwtAxis::YLeft, "Depth" ); + + setAxisAutoScale( QwtAxis::YLeft, false ); + setAxisAutoScale( QwtAxis::XTop, false ); + applyFontSizes( false ); QwtLegend* legend = new QwtLegend( this ); @@ -266,7 +262,7 @@ QString RiuDepthQwtPlot::asciiDataForUiSelectedCurves() const } out += "\n"; - QString kString = QString::number( m_kSteps.at( caseId )[i] ); + QString kString = QString::number( m_kSteps.at( caseId )[i] + 1 ); out += kString; @@ -304,6 +300,7 @@ void RiuDepthQwtPlot::slotCurrentPlotDataInTextDialog() void RiuDepthQwtPlot::updateAxisScaling() { double valRangeX = m_maxX - m_minX; + if ( valRangeX == 0.0 ) valRangeX = 1.0; this->setAxisScale( QwtAxis::YLeft, m_maxY + 0.1, m_minY - 0.1 ); this->setAxisScale( QwtAxis::XTop, m_minX - 0.02 * valRangeX, m_maxX + 0.1 * valRangeX ); } diff --git a/ApplicationLibCode/UserInterface/RiuSelectionChangedHandler.cpp b/ApplicationLibCode/UserInterface/RiuSelectionChangedHandler.cpp index f49c4d1513..349d5f7372 100644 --- a/ApplicationLibCode/UserInterface/RiuSelectionChangedHandler.cpp +++ b/ApplicationLibCode/UserInterface/RiuSelectionChangedHandler.cpp @@ -436,24 +436,24 @@ void RiuSelectionChangedHandler::addDepthCurveFromSelectionItem( const RiuSelect else if ( eclResDef->hasResult() && !RiaResultNames::isPerCellFaceResult( eclResDef->resultVariable() ) && eclResDef->eclipseCase() && eclResDef->eclipseCase()->eclipseCaseData() ) { + auto casedata = eclResDef->eclipseCase()->eclipseCaseData(); + QString curveName = eclResDef->resultVariableUiShortName(); curveName += ", "; - curveName += RigDepthResultAccessor::geometrySelectionText( eclResDef->eclipseCase()->eclipseCaseData(), + curveName += RigDepthResultAccessor::geometrySelectionText( casedata, eclipseSelectionItem->m_gridIndex, eclipseSelectionItem->m_gridLocalCellIndex ); - std::vector resultValues = RigDepthResultAccessor::resultValues( eclResDef->eclipseCase()->eclipseCaseData(), + std::vector resultValues = RigDepthResultAccessor::resultValues( casedata, eclResDef, eclipseSelectionItem->m_gridIndex, eclipseSelectionItem->m_gridLocalCellIndex, currentTimeStep ); - std::vector kValues = - RigDepthResultAccessor::kValues( eclResDef->eclipseCase()->eclipseCaseData(), eclipseSelectionItem->m_gridIndex ); + std::vector kValues = RigDepthResultAccessor::kValues( casedata, eclipseSelectionItem->m_gridIndex ); - std::vector depthValues = RigDepthResultAccessor::depthValues( eclResDef->eclipseCase()->eclipseCaseData(), - eclipseSelectionItem->m_gridLocalCellIndex, - eclipseSelectionItem->m_gridIndex ); + std::vector depthValues = + RigDepthResultAccessor::depthValues( casedata, eclipseSelectionItem->m_gridLocalCellIndex, eclipseSelectionItem->m_gridIndex ); CVF_ASSERT( kValues.size() == resultValues.size() );