mirror of
https://github.com/OPM/ResInsight.git
synced 2026-10-25 22:50:25 -05:00
Log at debug level, for each case and time step, how many input values contribute to a grid calculation aggregation and how many were replaced with the default value (non-visible cells and undefined values). Also log the sum and number of values used when computing visible cells statistics, to allow comparison with the histogram sum in the 3d view.
179 lines
7.5 KiB
C++
179 lines
7.5 KiB
C++
/////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (C) 2015- Statoil ASA
|
|
// Copyright (C) 2015- Ceetron Solutions AS
|
|
//
|
|
// ResInsight is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
// FITNESS FOR A PARTICULAR PURPOSE.
|
|
//
|
|
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
|
|
// for more details.
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "RigEclipseNativeVisibleCellsStatCalc.h"
|
|
|
|
#include "RiaLogging.h"
|
|
#include "RiaResultNames.h"
|
|
|
|
#include "RigActiveCellInfo.h"
|
|
#include "RigCaseCellResultsData.h"
|
|
#include "RigStatisticsMath.h"
|
|
#include "RigWeightedMeanCalc.h"
|
|
|
|
#include <cmath>
|
|
#include <format>
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
RigEclipseNativeVisibleCellsStatCalc::RigEclipseNativeVisibleCellsStatCalc( RigCaseCellResultsData* cellResultsData,
|
|
const RigEclipseResultAddress& scalarResultIndex,
|
|
const cvf::UByteArray* cellVisibilities )
|
|
: m_caseData( cellResultsData )
|
|
, m_resultAddress( scalarResultIndex )
|
|
, m_cellVisibilities( cellVisibilities )
|
|
{
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RigEclipseNativeVisibleCellsStatCalc::minMaxCellScalarValues( size_t timeStepIndex, double& min, double& max )
|
|
{
|
|
MinMaxAccumulator acc( min, max );
|
|
traverseCells( acc, timeStepIndex );
|
|
min = acc.min;
|
|
max = acc.max;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
bool RigEclipseNativeVisibleCellsStatCalc::hasPreciseP10p90() const
|
|
{
|
|
return true;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RigEclipseNativeVisibleCellsStatCalc::p10p90CellScalarValues( double& p10, double& p90 )
|
|
{
|
|
PercentilAccumulator acc;
|
|
|
|
for ( size_t timeStepIndex = 0; timeStepIndex < timeStepCount(); timeStepIndex++ )
|
|
{
|
|
traverseCells( acc, timeStepIndex );
|
|
}
|
|
|
|
acc.computep10p90( p10, p90 );
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RigEclipseNativeVisibleCellsStatCalc::p10p90CellScalarValues( size_t timeStepIndex, double& p10, double& p90 )
|
|
{
|
|
PercentilAccumulator acc;
|
|
traverseCells( acc, timeStepIndex );
|
|
acc.computep10p90( p10, p90 );
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RigEclipseNativeVisibleCellsStatCalc::posNegClosestToZero( size_t timeStepIndex, double& pos, double& neg )
|
|
{
|
|
PosNegAccumulator acc( pos, neg );
|
|
traverseCells( acc, timeStepIndex );
|
|
pos = acc.pos;
|
|
neg = acc.neg;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RigEclipseNativeVisibleCellsStatCalc::valueSumAndSampleCount( size_t timeStepIndex, double& valueSum, size_t& sampleCount )
|
|
{
|
|
SumCountAccumulator acc( valueSum, sampleCount );
|
|
traverseCells( acc, timeStepIndex );
|
|
valueSum = acc.valueSum;
|
|
sampleCount = acc.sampleCount;
|
|
|
|
RiaLogging::debug( std::format( "Visible cells statistics for '{}', time step {}: sum = {}, number of values used = {}",
|
|
m_resultAddress.resultName().toStdString(),
|
|
timeStepIndex,
|
|
valueSum,
|
|
sampleCount ) );
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RigEclipseNativeVisibleCellsStatCalc::addDataToHistogramCalculator( size_t timeStepIndex, RigHistogramCalculator& histogramCalculator )
|
|
{
|
|
traverseCells( histogramCalculator, timeStepIndex );
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RigEclipseNativeVisibleCellsStatCalc::uniqueValues( size_t timeStepIndex, std::set<int>& values )
|
|
{
|
|
UniqueValueAccumulator acc;
|
|
traverseCells( acc, timeStepIndex );
|
|
values = acc.uniqueValues;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
size_t RigEclipseNativeVisibleCellsStatCalc::timeStepCount()
|
|
{
|
|
if ( !m_caseData ) return 0;
|
|
|
|
return m_caseData->timeStepCount( m_resultAddress );
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RigEclipseNativeVisibleCellsStatCalc::mobileVolumeWeightedMean( size_t timeStepIndex, double& result )
|
|
{
|
|
if ( !m_caseData ) return;
|
|
|
|
RigEclipseResultAddress mobPorvAddress( RiaDefines::ResultCatType::STATIC_NATIVE, RiaResultNames::mobilePoreVolumeName() );
|
|
|
|
// For statistics result cases, the pore volume is not available, as
|
|
// RigCaseCellResultsData::createPlaceholderResultEntries has not been executed
|
|
if ( !m_caseData->ensureKnownResultLoaded( mobPorvAddress ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
m_caseData->ensureKnownResultLoaded( mobPorvAddress );
|
|
|
|
if ( !m_caseData->hasResultEntry( m_resultAddress ) ) return;
|
|
if ( m_caseData->timeStepCount( m_resultAddress ) == 0 ) return;
|
|
|
|
const std::vector<double>& weights = m_caseData->cellScalarResults( mobPorvAddress, 0 );
|
|
const std::vector<double>& values = m_caseData->cellScalarResults( m_resultAddress, timeStepIndex );
|
|
|
|
const RigActiveCellInfo* actCellInfo = m_caseData->activeCellInfo();
|
|
|
|
RigWeightedMeanCalc::weightedMeanOverCells( &weights,
|
|
&values,
|
|
m_cellVisibilities.p(),
|
|
true,
|
|
actCellInfo,
|
|
m_caseData->isUsingGlobalActiveIndex( m_resultAddress ),
|
|
&result );
|
|
}
|