diff --git a/ApplicationCode/ProjectDataModel/Summary/RimDerivedSummaryCase.cpp b/ApplicationCode/ProjectDataModel/Summary/RimDerivedSummaryCase.cpp index 0f15396169..01c07b7e4a 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimDerivedSummaryCase.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimDerivedSummaryCase.cpp @@ -140,29 +140,49 @@ void RimDerivedSummaryCase::calculate( const RifEclipseSummaryAddress& address ) RifSummaryReaderInterface* reader1 = m_summaryCase1 ? m_summaryCase1->summaryReader() : nullptr; RifSummaryReaderInterface* reader2 = m_summaryCase2 ? m_summaryCase2->summaryReader() : nullptr; - if ( !reader1 || !reader2 ) return; + + auto itAndIsInsertedPair = + m_dataCache.insert( std::make_pair( address, calculateDerivedValues( reader1, reader2, m_operator(), address ) ) ); + + // Check if we got any data. If not, erase the map entry to comply with previous behavior + + if ( !itAndIsInsertedPair.first->second.first.size() ) + { + m_dataCache.erase( itAndIsInsertedPair.first ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair, std::vector> + RimDerivedSummaryCase::calculateDerivedValues( RifSummaryReaderInterface* reader1, + RifSummaryReaderInterface* reader2, + DerivedSummaryOperator m_operator, + const RifEclipseSummaryAddress& address ) +{ + using ResultPair = std::pair, std::vector>; + + if ( !reader1 || !reader2 ) return ResultPair(); if ( !reader1->hasAddress( address ) && !reader2->hasAddress( address ) ) { - return; + return ResultPair(); } - else if ( reader1->hasAddress( address ) && !reader2->hasAddress( address ) ) + + if ( reader1->hasAddress( address ) && !reader2->hasAddress( address ) ) { std::vector summaryValues; reader1->values( address, &summaryValues ); - auto& dataItem = m_dataCache[address]; - dataItem.first = reader1->timeSteps( address ); - dataItem.second = summaryValues; - - return; + return ResultPair( reader1->timeSteps( address ), summaryValues ); } else if ( !reader1->hasAddress( address ) && reader2->hasAddress( address ) ) { std::vector summaryValues; reader2->values( address, &summaryValues ); - if ( m_operator() == DerivedSummaryOperator::DERIVED_OPERATOR_SUB ) + if ( m_operator == DerivedSummaryOperator::DERIVED_OPERATOR_SUB ) { for ( auto& v : summaryValues ) { @@ -170,11 +190,7 @@ void RimDerivedSummaryCase::calculate( const RifEclipseSummaryAddress& address ) } } - auto& dataItem = m_dataCache[address]; - dataItem.first = reader2->timeSteps( address ); - dataItem.second = summaryValues; - - return; + return ResultPair( reader2->timeSteps( address ), summaryValues ); } RiaTimeHistoryCurveMerger merger; @@ -191,24 +207,24 @@ void RimDerivedSummaryCase::calculate( const RifEclipseSummaryAddress& address ) const std::vector& allValues1 = merger.interpolatedYValuesForAllXValues( 0 ); const std::vector& allValues2 = merger.interpolatedYValuesForAllXValues( 1 ); - size_t sampleCount = merger.allXValues().size(); + size_t sampleCount = merger.allXValues().size(); + std::vector calculatedValues; calculatedValues.reserve( sampleCount ); + for ( size_t i = 0; i < sampleCount; i++ ) { - if ( m_operator() == DerivedSummaryOperator::DERIVED_OPERATOR_SUB ) + if ( m_operator == DerivedSummaryOperator::DERIVED_OPERATOR_SUB ) { calculatedValues.push_back( allValues1[i] - allValues2[i] ); } - else if ( m_operator() == DerivedSummaryOperator::DERIVED_OPERATOR_ADD ) + else if ( m_operator == DerivedSummaryOperator::DERIVED_OPERATOR_ADD ) { calculatedValues.push_back( allValues1[i] + allValues2[i] ); } } - auto& dataItem = m_dataCache[address]; - dataItem.first = merger.allXValues(); - dataItem.second = calculatedValues; + return ResultPair( merger.allXValues(), calculatedValues ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Summary/RimDerivedSummaryCase.h b/ApplicationCode/ProjectDataModel/Summary/RimDerivedSummaryCase.h index e9372f1853..ee6d91d1d5 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimDerivedSummaryCase.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimDerivedSummaryCase.h @@ -60,6 +60,12 @@ public: void calculate( const RifEclipseSummaryAddress& address ); + static std::pair, std::vector> + calculateDerivedValues( RifSummaryReaderInterface* reader1, + RifSummaryReaderInterface* reader2, + DerivedSummaryOperator m_operator, + const RifEclipseSummaryAddress& address ); + void createSummaryReaderInterface() override; RifSummaryReaderInterface* summaryReader() override; void updateFilePathsFromProjectPath( const QString& newProjectPath, const QString& oldProjectPath ) override;