mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
Make sure NaN values are in Y data, too, to keep good plot performance.
This commit is contained in:
parent
e2e239fd07
commit
ae977975c8
@ -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<double> RigDepthResultAccessor::resultValues( RigEclipseCaseData*
|
||||
{
|
||||
std::vector<double> 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<RigResultAccessor> resultAccessor =
|
||||
@ -56,16 +59,25 @@ std::vector<double> 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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -90,44 +90,35 @@ void RiuDepthQwtPlot::addCurve( const RimCase* rimCase,
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<double> 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<double> tmpResultValues;
|
||||
std::vector<double> 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 );
|
||||
}
|
||||
|
@ -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<double> resultValues = RigDepthResultAccessor::resultValues( eclResDef->eclipseCase()->eclipseCaseData(),
|
||||
std::vector<double> resultValues = RigDepthResultAccessor::resultValues( casedata,
|
||||
eclResDef,
|
||||
eclipseSelectionItem->m_gridIndex,
|
||||
eclipseSelectionItem->m_gridLocalCellIndex,
|
||||
currentTimeStep );
|
||||
|
||||
std::vector<int> kValues =
|
||||
RigDepthResultAccessor::kValues( eclResDef->eclipseCase()->eclipseCaseData(), eclipseSelectionItem->m_gridIndex );
|
||||
std::vector<int> kValues = RigDepthResultAccessor::kValues( casedata, eclipseSelectionItem->m_gridIndex );
|
||||
|
||||
std::vector<double> depthValues = RigDepthResultAccessor::depthValues( eclResDef->eclipseCase()->eclipseCaseData(),
|
||||
eclipseSelectionItem->m_gridLocalCellIndex,
|
||||
eclipseSelectionItem->m_gridIndex );
|
||||
std::vector<double> depthValues =
|
||||
RigDepthResultAccessor::depthValues( casedata, eclipseSelectionItem->m_gridLocalCellIndex, eclipseSelectionItem->m_gridIndex );
|
||||
|
||||
CVF_ASSERT( kValues.size() == resultValues.size() );
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user