#7634 Summary Reader : Handle overlapping time steps in restart data

This commit is contained in:
Magne Sjaastad 2021-04-28 13:43:36 +02:00
parent c48274d69b
commit e36420163a
3 changed files with 72 additions and 7 deletions

View File

@ -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();
}

View File

@ -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<int>( m_summaryReaders.size() - 2 ); i >= 0; i-- )
{
auto currentReader = m_summaryReaders.at( static_cast<size_t>( 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() );
}
}

View File

@ -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<std::string> m_fileNames;
std::vector<std::unique_ptr<RifSummaryReaderInterface>> m_summaryReaders;
std::vector<time_t> m_aggregatedTimeSteps;
std::map<RifSummaryReaderInterface*, size_t> m_valueCountForReader;
std::vector<time_t> m_aggregatedTimeSteps;
};