#10648 Refactor summary reader: return std::vector<double> instead of taking ptr.

This commit is contained in:
Kristian Bendiksen
2023-09-29 17:52:31 +02:00
parent 263e39b97b
commit d177491843
49 changed files with 204 additions and 249 deletions

View File

@@ -52,18 +52,16 @@ std::vector<time_t> RifCalculatedSummaryCurveReader::timeSteps( const RifEclipse
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RifCalculatedSummaryCurveReader::values( const RifEclipseSummaryAddress& resultAddress, std::vector<double>* values ) const
std::pair<bool, std::vector<double>> RifCalculatedSummaryCurveReader::values( const RifEclipseSummaryAddress& resultAddress ) const
{
RimSummaryCalculation* calc = findCalculationByName( resultAddress );
if ( calc && m_summaryCase )
{
RimSummaryCalculationAddress address( resultAddress );
*values = calc->values( m_summaryCase, address );
return true;
return { true, calc->values( m_summaryCase, address ) };
}
return false;
return { false, {} };
}
//--------------------------------------------------------------------------------------------------

View File

@@ -35,9 +35,9 @@ class RifCalculatedSummaryCurveReader : public RifSummaryReaderInterface
public:
explicit RifCalculatedSummaryCurveReader( RimSummaryCalculationCollection* calculationCollection, RimSummaryCase* summaryCase );
std::vector<time_t> timeSteps( const RifEclipseSummaryAddress& resultAddress ) const override;
bool values( const RifEclipseSummaryAddress& resultAddress, std::vector<double>* values ) const override;
std::string unitName( const RifEclipseSummaryAddress& resultAddress ) const override;
std::vector<time_t> timeSteps( const RifEclipseSummaryAddress& resultAddress ) const override;
std::pair<bool, std::vector<double>> values( const RifEclipseSummaryAddress& resultAddress ) const override;
std::string unitName( const RifEclipseSummaryAddress& resultAddress ) const override;
void buildMetaData();

View File

@@ -205,16 +205,12 @@ std::pair<std::vector<time_t>, std::vector<double>> RimDerivedSummaryCase::calcu
if ( reader1->hasAddress( address ) && !reader2->hasAddress( address ) )
{
std::vector<double> summaryValues;
reader1->values( address, &summaryValues );
auto [isOk, summaryValues] = reader1->values( address );
return ResultPair( reader1->timeSteps( address ), summaryValues );
}
else if ( !reader1->hasAddress( address ) && reader2->hasAddress( address ) )
{
std::vector<double> summaryValues;
reader2->values( address, &summaryValues );
auto [isOk, summaryValues] = reader2->values( address );
if ( m_operator == DerivedSummaryOperator::DERIVED_OPERATOR_SUB )
{
for ( auto& v : summaryValues )
@@ -226,18 +222,15 @@ std::pair<std::vector<time_t>, std::vector<double>> RimDerivedSummaryCase::calcu
return ResultPair( reader2->timeSteps( address ), summaryValues );
}
RiaTimeHistoryCurveMerger merger;
std::vector<double> values1;
std::vector<double> values2;
reader1->values( address, &values1 );
reader2->values( address, &values2 );
auto [isOk1, values1] = reader1->values( address );
auto [isOk2, values2] = reader2->values( address );
if ( values1.empty() && values2.empty() )
{
return ResultPair();
}
RiaTimeHistoryCurveMerger merger;
merger.addCurveData( reader1->timeSteps( address ), values1 );
merger.addCurveData( reader2->timeSteps( address ), values2 );
merger.computeInterpolatedValues();

View File

@@ -36,7 +36,7 @@
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimEnsembleCrossPlotStatisticsCase::values( const RifEclipseSummaryAddress& resultAddress, std::vector<double>* values ) const
std::pair<bool, std::vector<double>> RimEnsembleCrossPlotStatisticsCase::values( const RifEclipseSummaryAddress& resultAddress ) const
{
if ( m_adrX.isValid() )
{
@@ -44,23 +44,22 @@ bool RimEnsembleCrossPlotStatisticsCase::values( const RifEclipseSummaryAddress&
auto it = stringToTest.find( m_adrX.vectorName() );
if ( it != std::string::npos )
{
*values = m_binnedXValues;
return true;
return { true, m_binnedXValues };
}
}
auto quantityName = resultAddress.ensembleStatisticsVectorName();
if ( quantityName == RifEclipseSummaryAddressDefines::statisticsNameP10() )
*values = m_p10Data;
return { true, m_p10Data };
else if ( quantityName == RifEclipseSummaryAddressDefines::statisticsNameP50() )
*values = m_p50Data;
return { true, m_p50Data };
else if ( quantityName == RifEclipseSummaryAddressDefines::statisticsNameP90() )
*values = m_p90Data;
return { true, m_p90Data };
else if ( quantityName == RifEclipseSummaryAddressDefines::statisticsNameMean() )
*values = m_meanData;
return { true, m_meanData };
return true;
return { true, {} };
}
//--------------------------------------------------------------------------------------------------
@@ -142,12 +141,10 @@ void RimEnsembleCrossPlotStatisticsCase::calculate( const std::vector<RimSummary
{
const std::vector<time_t>& timeSteps = reader->timeSteps( inputAddressX );
std::vector<double> valuesX;
reader->values( inputAddressX, &valuesX );
auto [isXOk, valuesX] = values( inputAddressX );
if ( valuesX.empty() ) continue;
std::vector<double> valuesY;
reader->values( inputAddressY, &valuesY );
auto [isYOk, valuesY] = reader->values( inputAddressY );
if ( valuesY.empty() ) continue;
if ( !includeIncompleteCurves && timeSteps.size() != valuesX.size() ) continue;

View File

@@ -50,9 +50,9 @@ public:
RifSummaryReaderInterface* summaryReader() override;
RiaDefines::EclipseUnitSystem unitSystem() const override;
std::vector<time_t> timeSteps( const RifEclipseSummaryAddress& resultAddress ) const override;
bool values( const RifEclipseSummaryAddress& resultAddress, std::vector<double>* values ) const override;
std::string unitName( const RifEclipseSummaryAddress& resultAddress ) const override;
std::vector<time_t> timeSteps( const RifEclipseSummaryAddress& resultAddress ) const override;
std::pair<bool, std::vector<double>> values( const RifEclipseSummaryAddress& resultAddress ) const override;
std::string unitName( const RifEclipseSummaryAddress& resultAddress ) const override;
private:
void clearData();

View File

@@ -73,20 +73,20 @@ bool RimEnsembleStatisticsCase::hasMeanData() const
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimEnsembleStatisticsCase::values( const RifEclipseSummaryAddress& resultAddress, std::vector<double>* values ) const
std::pair<bool, std::vector<double>> RimEnsembleStatisticsCase::values( const RifEclipseSummaryAddress& resultAddress ) const
{
auto quantityName = resultAddress.ensembleStatisticsVectorName();
if ( quantityName == RifEclipseSummaryAddressDefines::statisticsNameP10() )
*values = m_p10Data;
return { true, m_p10Data };
else if ( quantityName == RifEclipseSummaryAddressDefines::statisticsNameP50() )
*values = m_p50Data;
return { true, m_p50Data };
else if ( quantityName == RifEclipseSummaryAddressDefines::statisticsNameP90() )
*values = m_p90Data;
return { true, m_p90Data };
else if ( quantityName == RifEclipseSummaryAddressDefines::statisticsNameMean() )
*values = m_meanData;
return { true, m_meanData };
return true;
return { true, {} };
}
//--------------------------------------------------------------------------------------------------
@@ -152,8 +152,7 @@ void RimEnsembleStatisticsCase::calculate( const std::vector<RimSummaryCase*>& s
if ( reader )
{
const std::vector<time_t>& timeSteps = reader->timeSteps( inputAddress );
std::vector<double> values;
reader->values( inputAddress, &values );
auto [isOk, values] = reader->values( inputAddress );
if ( values.empty() ) continue;

View File

@@ -45,9 +45,9 @@ public:
void calculate( const std::vector<RimSummaryCase*>& sumCases, const RifEclipseSummaryAddress& inputAddress, bool includeIncompleteCurves );
std::vector<time_t> timeSteps( const RifEclipseSummaryAddress& resultAddress ) const override;
bool values( const RifEclipseSummaryAddress& resultAddress, std::vector<double>* values ) const override;
std::string unitName( const RifEclipseSummaryAddress& resultAddress ) const override;
std::vector<time_t> timeSteps( const RifEclipseSummaryAddress& resultAddress ) const override;
std::pair<bool, std::vector<double>> values( const RifEclipseSummaryAddress& resultAddress ) const override;
std::string unitName( const RifEclipseSummaryAddress& resultAddress ) const override;
static std::vector<RimSummaryCase*> validSummaryCases( const std::vector<RimSummaryCase*>& allSumCases,
const RifEclipseSummaryAddress& inputAddress,

View File

@@ -123,11 +123,9 @@ double RimObjectiveFunction::value( RimSummaryCase*
const std::vector<time_t>& allTimeSteps = readerInterface->timeSteps( vectorSummaryAddressDiff );
std::vector<size_t> timeStepsForEvaluation = timeStepIndicesForEvaluation( allTimeSteps, timeConfig );
std::vector<double> summaryDiffValues;
std::vector<double> summaryHistoryValues;
if ( readerInterface->values( vectorSummaryAddressDiff, &summaryDiffValues ) &&
readerInterface->values( vectorSummaryAddressHistory, &summaryHistoryValues ) )
auto [summaryDiffOk, summaryDiffValues] = readerInterface->values( vectorSummaryAddressDiff );
auto [summaryHistoryOk, summaryHistoryValues] = readerInterface->values( vectorSummaryAddressHistory );
if ( summaryDiffOk && summaryHistoryOk )
{
const double functionValue = computeFunctionValue( summaryDiffValues, summaryHistoryValues, timeStepsForEvaluation );

View File

@@ -523,11 +523,10 @@ std::vector<std::pair<RigEnsembleParameter, double>>
if ( !summaryCase->caseRealizationParameters() ) continue;
std::vector<double> values;
double closestValue = std::numeric_limits<double>::infinity();
time_t closestTimeStep = 0;
if ( reader->values( address, &values ) )
auto [isOk, values] = reader->values( address );
if ( isOk )
{
const std::vector<time_t>& timeSteps = reader->timeSteps( address );
for ( size_t i = 0; i < timeSteps.size(); ++i )
@@ -967,8 +966,7 @@ void RimSummaryCaseCollection::computeMinMax( const RifEclipseSummaryAddress& ad
{
if ( !s->summaryReader() ) continue;
std::vector<double> values;
s->summaryReader()->values( address, &values );
auto [isOk, values] = s->summaryReader()->values( address );
if ( values.empty() ) continue;
const auto [min, max] = std::minmax_element( values.begin(), values.end() );

View File

@@ -298,15 +298,13 @@ std::string RimSummaryCurve::unitNameX() const
//--------------------------------------------------------------------------------------------------
std::vector<double> RimSummaryCurve::valuesY() const
{
std::vector<double> values;
RifSummaryReaderInterface* reader = valuesSummaryReaderY();
if ( !reader ) return values;
if ( !reader ) return {};
RifEclipseSummaryAddress addr = m_yValuesSummaryAddress()->address();
reader->values( addr, &values );
auto [isOk, values] = reader->values( addr );
if ( values.empty() ) return values;
RimSummaryPlot* plot = firstAncestorOrThisOfTypeAsserted<RimSummaryPlot>();
@@ -342,18 +340,13 @@ RifEclipseSummaryAddress RimSummaryCurve::errorSummaryAddressY() const
//--------------------------------------------------------------------------------------------------
std::vector<double> RimSummaryCurve::errorValuesY() const
{
std::vector<double> values;
RifSummaryReaderInterface* reader = valuesSummaryReaderY();
if ( !reader ) return values;
if ( !reader ) return {};
RifEclipseSummaryAddress addr = errorSummaryAddressY();
if ( reader->hasAddress( addr ) )
{
reader->values( addr, &values );
}
if ( !reader->hasAddress( addr ) ) return {};
auto [isOk, values] = reader->values( addr );
return values;
}
@@ -362,17 +355,17 @@ std::vector<double> RimSummaryCurve::errorValuesY() const
//--------------------------------------------------------------------------------------------------
std::vector<double> RimSummaryCurve::valuesX() const
{
std::vector<double> values;
RifSummaryReaderInterface* reader = m_xValuesSummaryCase()->summaryReader();
if ( !reader ) return {};
if ( m_xValuesSummaryCase() && m_xValuesSummaryCase()->summaryReader() )
RifEclipseSummaryAddress addr = m_xValuesSummaryAddress()->address();
if ( m_xValuesSummaryCase() )
{
RifSummaryReaderInterface* reader = m_xValuesSummaryCase()->summaryReader();
RifEclipseSummaryAddress addr = m_xValuesSummaryAddress()->address();
reader->values( addr, &values );
auto [isOk, values] = reader->values( addr );
return values;
}
return values;
return {};
}
//--------------------------------------------------------------------------------------------------
@@ -641,15 +634,10 @@ void RimSummaryCurve::onLoadDataAndUpdate( bool updateParentPlot )
{
if ( m_xValuesSummaryAddress()->address().category() == SummaryCategory::SUMMARY_ENSEMBLE_STATISTICS )
{
std::vector<double> curveValuesX;
std::vector<double> curveValuesY;
// Read x and y values from ensemble statistics (not time steps are read)
RifSummaryReaderInterface* reader = m_xValuesSummaryCase()->summaryReader();
reader->values( m_xValuesSummaryAddress->address(), &curveValuesX );
reader->values( m_yValuesSummaryAddress->address(), &curveValuesY );
auto [isOkX, curveValuesX] = reader->values( m_xValuesSummaryAddress->address() );
auto [isOkY, curveValuesY] = reader->values( m_yValuesSummaryAddress->address() );
setSamplesFromXYValues( curveValuesX, curveValuesY, useLogarithmicScale );
}
else
@@ -696,7 +684,7 @@ void RimSummaryCurve::onLoadDataAndUpdate( bool updateParentPlot )
{
auto reader = summaryCaseY()->summaryReader();
errAddress = reader->errorAddress( summaryAddressY() );
reader->values( errAddress, &errValues );
errValues = reader->values( errAddress ).second;
}
if ( errAddress.isValid() )

View File

@@ -944,14 +944,14 @@ void RimSummaryMultiPlot::computeAggregatedAxisRange()
{
auto readValues = []( RimSummaryCase* summaryCase, RifEclipseSummaryAddress addr )
{
std::vector<double> values;
if ( summaryCase && summaryCase->summaryReader() )
{
RifSummaryReaderInterface* reader = summaryCase->summaryReader();
reader->values( addr, &values );
auto [isOk, values] = reader->values( addr );
return values;
}
return values;
return std::vector<double>();
};
auto findMinMaxForSummaryCase = [readValues]( RimSummaryCase* summaryCase, RifEclipseSummaryAddress addr, bool onlyPositiveValues )

View File

@@ -695,8 +695,7 @@ void RimSummaryTable::createTableData()
QString unitName;
for ( const auto& adr : summaryAddresses )
{
std::vector<double> values;
summaryReader->values( adr, &values );
auto [isOk, values] = summaryReader->values( adr );
const std::vector<time_t> timeSteps = summaryReader->timeSteps( adr );
const QString vectorName = QString::fromStdString( adr.vectorName() );
const QString categoryName = getCategoryNameFromAddress( adr );