diff --git a/ApplicationLibCode/FileInterface/RifMultipleSummaryReaders.cpp b/ApplicationLibCode/FileInterface/RifMultipleSummaryReaders.cpp index 1dd204ef1d..c36d9ce741 100644 --- a/ApplicationLibCode/FileInterface/RifMultipleSummaryReaders.cpp +++ b/ApplicationLibCode/FileInterface/RifMultipleSummaryReaders.cpp @@ -34,18 +34,19 @@ void RifMultipleSummaryReaders::addReader( std::unique_ptr( first.get() ) != nullptr; - bool isSecondCalc = dynamic_cast( second.get() ) != nullptr; - if ( isFirstCalc && !isSecondCalc ) return true; - if ( !isFirstCalc && isSecondCalc ) return false; - return first->serialNumber() < second->serialNumber(); - } ); + // Reorder readers so the calculated reader is at the front of the vector. This ensures that RifMultipleSummaryReaders::values() + // evaluates calculated reader first. + auto calculatedReaderFirst = []( const auto& first, const auto& second ) + { + bool isFirstCalc = dynamic_cast( first.get() ) != nullptr; + bool isSecondCalc = dynamic_cast( second.get() ) != nullptr; + if ( isFirstCalc && !isSecondCalc ) return true; + if ( !isFirstCalc && isSecondCalc ) return false; + return first->serialNumber() < second->serialNumber(); + }; + + std::sort( m_readers.begin(), m_readers.end(), calculatedReaderFirst ); } //-------------------------------------------------------------------------------------------------- @@ -140,7 +141,28 @@ void RifMultipleSummaryReaders::createAndSetAddresses() m_allErrorAddresses.clear(); m_allResultAddresses.clear(); - for ( auto& reader : m_readers ) + // Loop over readers in inverted order to ensure calculated readers are processed after native file readers. Creation of summary + // addresses for calculated readers depend on native readers. + // https://github.com/OPM/ResInsight/issues/13137 + + std::vector readers; + for ( auto& r : m_readers ) + { + readers.push_back( r.get() ); + } + + auto nativeReaderFirst = []( const auto& first, const auto& second ) + { + bool isFirstCalc = dynamic_cast( first ) != nullptr; + bool isSecondCalc = dynamic_cast( second ) != nullptr; + if ( isFirstCalc && !isSecondCalc ) return false; + if ( !isFirstCalc && isSecondCalc ) return true; + return first->serialNumber() < second->serialNumber(); + }; + + std::sort( readers.begin(), readers.end(), nativeReaderFirst ); + + for ( auto reader : readers ) { reader->createAndSetAddresses();