diff --git a/ApplicationLibCode/Application/RiaPreferencesSummary.cpp b/ApplicationLibCode/Application/RiaPreferencesSummary.cpp index 4f1db5903f..81a09adf7a 100644 --- a/ApplicationLibCode/Application/RiaPreferencesSummary.cpp +++ b/ApplicationLibCode/Application/RiaPreferencesSummary.cpp @@ -352,6 +352,7 @@ void RiaPreferencesSummary::defineEditorAttribute( const caf::PdmFieldHandle* fi //-------------------------------------------------------------------------------------------------- void RiaPreferencesSummary::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { + uiOrdering.add( &m_useMultipleThreadsWhenLoadingSummaryCases ); uiOrdering.add( &m_summaryReader ); if ( m_summaryReader == SummaryReaderMode::OPM_COMMON ) @@ -370,8 +371,6 @@ void RiaPreferencesSummary::defineUiOrdering( QString uiConfigName, caf::PdmUiOr } } - uiOrdering.add( &m_useMultipleThreadsWhenLoadingSummaryCases ); - uiOrdering.skipRemainingFields(); } diff --git a/ApplicationLibCode/FileInterface/RifSummaryReaderMultipleFiles.cpp b/ApplicationLibCode/FileInterface/RifSummaryReaderMultipleFiles.cpp index 2461d3d069..e8c173f9d9 100644 --- a/ApplicationLibCode/FileInterface/RifSummaryReaderMultipleFiles.cpp +++ b/ApplicationLibCode/FileInterface/RifSummaryReaderMultipleFiles.cpp @@ -64,6 +64,9 @@ bool RifSummaryReaderMultipleFiles::values( const RifEclipseSummaryAddress& resu readerValues = zeros; } + auto valueCount = timeStepCount( reader.get() ); + readerValues.resize( valueCount ); + values->insert( values->end(), readerValues.begin(), readerValues.end() ); } @@ -92,6 +95,20 @@ RiaDefines::EclipseUnitSystem RifSummaryReaderMultipleFiles::unitSystem() const return RiaDefines::EclipseUnitSystem::UNITS_UNKNOWN; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +size_t RifSummaryReaderMultipleFiles::timeStepCount( RifSummaryReaderInterface* reader ) const +{ + auto it = m_valueCountForReader.find( reader ); + if ( it != m_valueCountForReader.end() ) + { + return it->second; + } + + return 0; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -107,12 +124,11 @@ bool RifSummaryReaderMultipleFiles::createReadersAndImportMetaData( RiaThreadSaf } } + calculateOverlappingTimeSteps(); + + // Aggregate result addresses for ( const auto& reader : m_summaryReaders ) { - auto readerTimeSteps = reader->timeSteps( {} ); - - m_aggregatedTimeSteps.insert( m_aggregatedTimeSteps.end(), readerTimeSteps.begin(), readerTimeSteps.end() ); - { auto resultAddresses = reader->allResultAddresses(); m_allResultAddresses.insert( resultAddresses.begin(), resultAddresses.end() ); @@ -126,3 +142,48 @@ bool RifSummaryReaderMultipleFiles::createReadersAndImportMetaData( RiaThreadSaf return true; } + +//-------------------------------------------------------------------------------------------------- +/// +// Detect any overlapping time steps. Always use data from summary reader with the newest data, so do processing +// from the last reader to the first +// +//-------------------------------------------------------------------------------------------------- +void RifSummaryReaderMultipleFiles::calculateOverlappingTimeSteps() +{ + if ( m_summaryReaders.empty() ) return; + + auto lastRestartCase = m_summaryReaders.back().get(); + auto lastRestartCaseTimeSteps = lastRestartCase->timeSteps( {} ); + m_valueCountForReader[lastRestartCase] = lastRestartCaseTimeSteps.size(); + + time_t cutOffTime = lastRestartCaseTimeSteps.front(); + for ( int i = static_cast( m_summaryReaders.size() - 2 ); i >= 0; i-- ) + { + auto currentReader = m_summaryReaders.at( static_cast( i ) ).get(); + auto currentTimeSteps = currentReader->timeSteps( {} ); + + size_t timeStepIndex = 0; + for ( auto t : currentTimeSteps ) + { + if ( t < cutOffTime ) timeStepIndex++; + } + + m_valueCountForReader[currentReader] = timeStepIndex; + + if ( currentTimeSteps.front() < cutOffTime ) + { + cutOffTime = currentTimeSteps.front(); + } + } + + // Create a vector of increasing time steps with no overlapping time steps + for ( const auto& reader : m_summaryReaders ) + { + auto currentTimeSteps = reader->timeSteps( {} ); + auto valueCount = m_valueCountForReader[reader.get()]; + currentTimeSteps.resize( valueCount ); + + m_aggregatedTimeSteps.insert( m_aggregatedTimeSteps.end(), currentTimeSteps.begin(), currentTimeSteps.end() ); + } +} diff --git a/ApplicationLibCode/FileInterface/RifSummaryReaderMultipleFiles.h b/ApplicationLibCode/FileInterface/RifSummaryReaderMultipleFiles.h index 17739594a3..b8e6d4b2d1 100644 --- a/ApplicationLibCode/FileInterface/RifSummaryReaderMultipleFiles.h +++ b/ApplicationLibCode/FileInterface/RifSummaryReaderMultipleFiles.h @@ -44,9 +44,14 @@ public: std::string unitName( const RifEclipseSummaryAddress& resultAddress ) const override; RiaDefines::EclipseUnitSystem unitSystem() const override; +private: + size_t timeStepCount( RifSummaryReaderInterface* reader ) const; + void calculateOverlappingTimeSteps(); + private: std::vector m_fileNames; std::vector> m_summaryReaders; - std::vector m_aggregatedTimeSteps; + std::map m_valueCountForReader; + std::vector m_aggregatedTimeSteps; };