From 8f3a7a5867cd72c4d377024f53f4aa40f9235730 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 11 Aug 2017 12:33:10 +0200 Subject: [PATCH] #1691 Map from filtered time step indices to well result indices --- .../FileInterface/RifReaderEclipseOutput.cpp | 57 +++++++++++++------ .../FileInterface/RifReaderEclipseOutput.h | 3 + .../RigSingleWellResultsData.cpp | 28 ++++----- 3 files changed, 53 insertions(+), 35 deletions(-) diff --git a/ApplicationCode/FileInterface/RifReaderEclipseOutput.cpp b/ApplicationCode/FileInterface/RifReaderEclipseOutput.cpp index 7a96bedd75..b4df26d2d3 100644 --- a/ApplicationCode/FileInterface/RifReaderEclipseOutput.cpp +++ b/ApplicationCode/FileInterface/RifReaderEclipseOutput.cpp @@ -657,23 +657,7 @@ void RifReaderEclipseOutput::buildMetaData() progInfo.incrementProgress(); - // Get time steps - { - std::vector timeStepsOnFile; - std::vector daysSinceSimulationStartOnFile; - std::vector reportNumbersOnFile; - - m_dynamicResultsAccess->timeSteps(&timeStepsOnFile, &daysSinceSimulationStartOnFile); - reportNumbersOnFile = m_dynamicResultsAccess->reportNumbers(); - - for (size_t i = 0; i < timeStepsOnFile.size(); i++) - { - if (this->isTimeStepIncludedByFilter(i)) - { - timeStepInfos.push_back(RigTimeStepInfo(timeStepsOnFile[i], reportNumbersOnFile[i], daysSinceSimulationStartOnFile[i])); - } - } - } + timeStepInfos = createFilteredTimeStepInfos(); QStringList resultNames; std::vector resultNamesDataItemCounts; @@ -1653,7 +1637,16 @@ void RifReaderEclipseOutput::readWellCells(const ecl_grid_type* mainEclGrid, boo } - wellResults->computeMappingFromResultTimeIndicesToWellTimeIndices(timeSteps); + std::vector filteredTimeSteps; + { + std::vector filteredTimeStepInfos = createFilteredTimeStepInfos(); + for (auto a : filteredTimeStepInfos) + { + filteredTimeSteps.push_back(a.m_date); + } + } + + wellResults->computeMappingFromResultTimeIndicesToWellTimeIndices(filteredTimeSteps); wells.push_back(wellResults.p()); @@ -1769,6 +1762,34 @@ QStringList RifReaderEclipseOutput::validKeywordsForPorosityModel(const QStringL } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RifReaderEclipseOutput::createFilteredTimeStepInfos() +{ + std::vector timeStepInfos; + + if (m_dynamicResultsAccess.notNull()) + { + std::vector timeStepsOnFile; + std::vector daysSinceSimulationStartOnFile; + std::vector reportNumbersOnFile; + + m_dynamicResultsAccess->timeSteps(&timeStepsOnFile, &daysSinceSimulationStartOnFile); + reportNumbersOnFile = m_dynamicResultsAccess->reportNumbers(); + + for (size_t i = 0; i < timeStepsOnFile.size(); i++) + { + if (this->isTimeStepIncludedByFilter(i)) + { + timeStepInfos.push_back(RigTimeStepInfo(timeStepsOnFile[i], reportNumbersOnFile[i], daysSinceSimulationStartOnFile[i])); + } + } + } + + return timeStepInfos; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/FileInterface/RifReaderEclipseOutput.h b/ApplicationCode/FileInterface/RifReaderEclipseOutput.h index e201c0e5dc..0386eb5309 100644 --- a/ApplicationCode/FileInterface/RifReaderEclipseOutput.h +++ b/ApplicationCode/FileInterface/RifReaderEclipseOutput.h @@ -30,6 +30,7 @@ class RigGridBase; class RigMainGrid; class RigActiveCellInfo; class RigFault; +class RigTimeStepInfo; struct RigWellResultPoint; @@ -79,6 +80,8 @@ private: RifEclipseRestartDataAccess* createDynamicResultsAccess(); QStringList validKeywordsForPorosityModel(const QStringList& keywords, const std::vector& keywordDataItemCounts, const RigActiveCellInfo* activeCellInfo, const RigActiveCellInfo* fractureActiveCellInfo, RiaPorosityModel::PorosityModelType matrixOrFracture, size_t timeStepCount) const; + + std::vector createFilteredTimeStepInfos(); private: QString m_fileName; // Name of file used to start accessing Eclipse output files diff --git a/ApplicationCode/ReservoirDataModel/RigSingleWellResultsData.cpp b/ApplicationCode/ReservoirDataModel/RigSingleWellResultsData.cpp index 3cb3831d9a..116a9d1e3e 100644 --- a/ApplicationCode/ReservoirDataModel/RigSingleWellResultsData.cpp +++ b/ApplicationCode/ReservoirDataModel/RigSingleWellResultsData.cpp @@ -37,12 +37,12 @@ const RigWellResultFrame& RigSingleWellResultsData::wellResultFrame(size_t resul //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RigSingleWellResultsData::computeMappingFromResultTimeIndicesToWellTimeIndices(const std::vector& resultTimes) +void RigSingleWellResultsData::computeMappingFromResultTimeIndicesToWellTimeIndices(const std::vector& simulationTimeSteps) { m_resultTimeStepIndexToWellTimeStepIndex.clear(); if (m_wellCellsTimeSteps.size() == 0) return; - m_resultTimeStepIndexToWellTimeStepIndex.resize(resultTimes.size(), cvf::UNDEFINED_SIZE_T); + m_resultTimeStepIndexToWellTimeStepIndex.resize(simulationTimeSteps.size(), cvf::UNDEFINED_SIZE_T); if (false) { @@ -54,29 +54,23 @@ void RigSingleWellResultsData::computeMappingFromResultTimeIndicesToWellTimeIndi } qDebug() << "Result TimeStamps"; - for (size_t i = 0; i < resultTimes.size(); i++) + for (size_t i = 0; i < simulationTimeSteps.size(); i++) { - qDebug() << resultTimes[i].toString(); + qDebug() << simulationTimeSteps[i].toString(); } - } - int resultIdx = 0; - size_t wellIdx = 0; - size_t activeWellIdx = cvf::UNDEFINED_SIZE_T; - - while (wellIdx <= m_wellCellsTimeSteps.size() && resultIdx < static_cast(resultTimes.size())) + for (size_t resultTimeStepIndex = 0; resultTimeStepIndex< simulationTimeSteps.size(); resultTimeStepIndex++) { - if (wellIdx < m_wellCellsTimeSteps.size() && m_wellCellsTimeSteps[wellIdx].m_timestamp <= resultTimes[resultIdx]) + size_t wellTimeStepIndex = 0; + + while (wellTimeStepIndex < m_wellCellsTimeSteps.size() && + m_wellCellsTimeSteps[wellTimeStepIndex].m_timestamp < simulationTimeSteps[resultTimeStepIndex]) { - activeWellIdx = wellIdx; - wellIdx++; + wellTimeStepIndex++; } - CVF_ASSERT(resultIdx < static_cast(m_resultTimeStepIndexToWellTimeStepIndex.size())); - m_resultTimeStepIndexToWellTimeStepIndex[resultIdx] = activeWellIdx; - - resultIdx++; + m_resultTimeStepIndexToWellTimeStepIndex[resultTimeStepIndex] = wellTimeStepIndex; } }