From 7695e5dabf30d0e8517b02391bad41a45adc69d7 Mon Sep 17 00:00:00 2001 From: Rebecca Cox Date: Tue, 31 Oct 2017 15:06:17 +0100 Subject: [PATCH] Correct calculation of MD --- .../ProjectDataModel/RimWellLogRftCurve.cpp | 262 +++++++++++++----- .../ProjectDataModel/RimWellLogRftCurve.h | 17 +- 2 files changed, 206 insertions(+), 73 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.cpp b/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.cpp index 61b681062c..62cb28ab20 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.cpp @@ -197,17 +197,6 @@ void RimWellLogRftCurve::updateWellChannelNameAndTimeStep() RifReaderEclipseRft* reader = rftReader(); if (!reader) return; - std::vector timeSteps = reader->availableTimeSteps(m_wellName, m_wellLogChannelName()); - - if (timeSteps.empty()) - { - m_timeStep = QDateTime(); - } - else if (std::find(timeSteps.begin(), timeSteps.end(), m_timeStep()) == timeSteps.end()) - { - m_timeStep = timeSteps[0]; - } - std::vector channelNames = reader->availableWellLogChannels(m_wellName); if (channelNames.empty()) @@ -218,6 +207,17 @@ void RimWellLogRftCurve::updateWellChannelNameAndTimeStep() { m_wellLogChannelName = RifEclipseRftAddress::PRESSURE; } + + std::vector timeSteps = reader->availableTimeSteps(m_wellName, m_wellLogChannelName()); + + if (timeSteps.empty()) + { + m_timeStep = QDateTime(); + } + else if (std::find(timeSteps.begin(), timeSteps.end(), m_timeStep()) == timeSteps.end()) + { + m_timeStep = timeSteps[0]; + } } //-------------------------------------------------------------------------------------------------- @@ -266,9 +266,9 @@ void RimWellLogRftCurve::onLoadDataAndUpdate(bool updateParentPlot) firstAncestorOrThisOfType(wellLogPlot); CVF_ASSERT(wellLogPlot); - std::vector values = xValues(); - std::vector tvDepthVector = tvDepthValues(); std::vector measuredDepthVector = measuredDepthValues(); + std::vector tvDepthVector = tvDepthValues(); + std::vector values = xValues(); if (values.empty()) return; if (values.size() != tvDepthVector.size()) return; @@ -388,6 +388,8 @@ QList RimWellLogRftCurve::calculateValueOptions(const ca //-------------------------------------------------------------------------------------------------- void RimWellLogRftCurve::fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) { + m_idxInWellPathToIdxInRftFile.clear(); + RimWellLogCurve::fieldChangedByUi(changedField, oldValue, newValue); if (changedField == &m_eclipseResultCase) { @@ -429,51 +431,16 @@ RifReaderEclipseRft* RimWellLogRftCurve::rftReader() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RimWellLogRftCurve::xValues() const +RigEclipseWellLogExtractor* RimWellLogRftCurve::extractor() { RifReaderEclipseRft* reader = rftReader(); - std::vector values; - - if (!reader) return values; - - RifEclipseRftAddress address(m_wellName(), m_timeStep, m_wellLogChannelName()); - - reader->values(address, &values); - - return values; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -std::vector RimWellLogRftCurve::tvDepthValues() const -{ - RifReaderEclipseRft* reader = rftReader(); - std::vector tvDepthValues; - - if (!reader) return tvDepthValues; - - RifEclipseRftAddress depthAddress(m_wellName(), m_timeStep, RifEclipseRftAddress::DEPTH); - - reader->values(depthAddress, &tvDepthValues); - return tvDepthValues; -} -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -std::vector RimWellLogRftCurve::measuredDepthValues() const -{ - std::vector measuredDepthForCells; - - RifReaderEclipseRft* reader = rftReader(); - if (!reader) return measuredDepthForCells; - + if (!reader) return nullptr; RimMainPlotCollection* mainPlotCollection; this->firstAncestorOrThisOfTypeAsserted(mainPlotCollection); RimWellLogPlotCollection* wellLogCollection = mainPlotCollection->wellLogPlotCollection(); - if (!wellLogCollection) return measuredDepthForCells; + if (!wellLogCollection) return nullptr; RigEclipseWellLogExtractor* eclExtractor = nullptr; @@ -484,38 +451,193 @@ std::vector RimWellLogRftCurve::measuredDepthValues() const if (!eclExtractor) { std::vector wellPaths = proj->simulationWellBranches(m_wellName()); - if (wellPaths.size() == 0) return measuredDepthForCells; + if (wellPaths.size() == 0) return nullptr; eclExtractor = wellLogCollection->findOrCreateSimWellExtractor(m_wellName(), QString("Find or create sim well extractor"), wellPaths[0], m_eclipseResultCase->eclipseCaseData()); } - if (!eclExtractor) return measuredDepthForCells; + return eclExtractor; +} - std::vector measuredDepthForIntersections = eclExtractor->measuredDepth(); - - std::vector< size_t> globCellIndices = eclExtractor->intersectedCellsGlobIdx(); - - std::map> globCellIdToIntersectionDepthsMap; - - for (size_t iIdx = 0; iIdx < measuredDepthForIntersections.size(); ++iIdx) +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimWellLogRftCurve::createWellPathIdxToRftFileIdxMapping() +{ + if (!m_idxInWellPathToIdxInRftFile.empty()) { - globCellIdToIntersectionDepthsMap[globCellIndices[iIdx]].push_back(measuredDepthForIntersections[iIdx]); + return true; } + RigEclipseWellLogExtractor* eclExtractor = extractor(); + + if (!eclExtractor) return false; + + std::vector intersections = eclExtractor->intersectionInfo(); + + std::map globCellIndicesToIndexInWell; + + for (size_t i = 0; i < intersections.size(); i++) + { + globCellIndicesToIndexInWell[intersections[i].globCellIndex] = i; + } + + RifEclipseRftAddress depthAddress(m_wellName(), m_timeStep, RifEclipseRftAddress::DEPTH); + std::vector rftIndices; + rftReader()->cellIndices(depthAddress, &rftIndices); + const RigMainGrid* mainGrid = eclExtractor->caseData()->mainGrid(); - RifEclipseRftAddress depthAddress(m_wellName(), m_timeStep, RifEclipseRftAddress::DEPTH); - std::vector indices; - rftReader()->cellIndices(depthAddress, &indices); - - for (const caf::VecIjk& ijkIndex : indices) + for (size_t i = 0; i < rftIndices.size(); i++) { + caf::VecIjk ijkIndex = rftIndices[i]; size_t globalCellIndex = mainGrid->cellIndexFromIJK(ijkIndex.i(), ijkIndex.j(), ijkIndex.k()); - double sum = std::accumulate(globCellIdToIntersectionDepthsMap[globalCellIndex].begin(), globCellIdToIntersectionDepthsMap[globalCellIndex].end(), 0); - - measuredDepthForCells.push_back(sum / (double)globCellIdToIntersectionDepthsMap[globalCellIndex].size()); + m_idxInWellPathToIdxInRftFile[globCellIndicesToIndexInWell[globalCellIndex]] = i; } - return measuredDepthForCells; + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +size_t RimWellLogRftCurve::rftFileIndex(size_t wellPathIndex) +{ + if (m_idxInWellPathToIdxInRftFile.empty()) + { + createWellPathIdxToRftFileIdxMapping(); + } + + if (m_idxInWellPathToIdxInRftFile.find(wellPathIndex) == m_idxInWellPathToIdxInRftFile.end()) + { + return cvf::UNDEFINED_SIZE_T; + } + + return m_idxInWellPathToIdxInRftFile[wellPathIndex]; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimWellLogRftCurve::sortedIndicesInRftFile() +{ + if (m_idxInWellPathToIdxInRftFile.empty()) + { + createWellPathIdxToRftFileIdxMapping(); + } + + std::vector indices; + for (auto it = m_idxInWellPathToIdxInRftFile.begin(); it != m_idxInWellPathToIdxInRftFile.end(); it++) + { + indices.push_back(it->second); + } + + return indices; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimWellLogRftCurve::xValues() +{ + RifReaderEclipseRft* reader = rftReader(); + std::vector values; + + if (!reader) return values; + + RifEclipseRftAddress address(m_wellName(), m_timeStep, m_wellLogChannelName()); + + reader->values(address, &values); + + bool wellPathExists = createWellPathIdxToRftFileIdxMapping(); + + if (wellPathExists) + { + std::vector valuesSorted; + + for (size_t idx : sortedIndicesInRftFile()) + { + if (idx < values.size()) + { + valuesSorted.push_back((values.at(idx))); + } + } + + return valuesSorted; + } + else + { + return values; + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimWellLogRftCurve::tvDepthValues() +{ + RifReaderEclipseRft* reader = rftReader(); + std::vector values; + + if (!reader) return values; + + RifEclipseRftAddress depthAddress(m_wellName(), m_timeStep, RifEclipseRftAddress::DEPTH); + reader->values(depthAddress, &values); + + bool wellPathExists = createWellPathIdxToRftFileIdxMapping(); + + if (wellPathExists) + { + std::vector valuesSorted; + + for (size_t idx : sortedIndicesInRftFile()) + { + if (idx < values.size()) + { + valuesSorted.push_back((values.at(idx))); + } + } + + return valuesSorted; + } + else + { + return values; + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimWellLogRftCurve::measuredDepthValues() +{ + std::vector measuredDepthForCells; + + RigEclipseWellLogExtractor* eclExtractor = extractor(); + + if (!eclExtractor) return measuredDepthForCells; + + std::vector measuredDepthForIntersections = eclExtractor->measuredDepth(); + + std::vector< size_t> globCellIndices = eclExtractor->intersectedCellsGlobIdx(); + + for (size_t i = 0; i < globCellIndices.size() - 1; i = i + 2) + { + double sum = measuredDepthForIntersections[i] + measuredDepthForIntersections[i + 1]; + + measuredDepthForCells.push_back( sum / 2.0 ); + } + + std::vector measuredDepthForCellsWhichHasRftData; + + for (size_t i = 0; i < measuredDepthForCells.size(); i++) + { + if(rftFileIndex(i) != cvf::UNDEFINED_SIZE_T) + { + measuredDepthForCellsWhichHasRftData.push_back(measuredDepthForCells[i]); + } + } + + return measuredDepthForCellsWhichHasRftData; } diff --git a/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.h b/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.h index 59d6f2d615..b1a1383001 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.h +++ b/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.h @@ -29,7 +29,10 @@ #include "cvfObject.h" +#include + class RifReaderEclipseRft; +class RigEclipseWellLogExtractor; class RimEclipseResultCase; class RimWellPath; @@ -70,11 +73,19 @@ protected: private: RifReaderEclipseRft* rftReader() const; - std::vector xValues() const; - std::vector tvDepthValues() const; - std::vector measuredDepthValues() const; + RigEclipseWellLogExtractor* extractor(); + + bool createWellPathIdxToRftFileIdxMapping(); + size_t rftFileIndex(size_t wellPathIndex); + std::vector sortedIndicesInRftFile(); + + std::vector xValues(); + std::vector tvDepthValues(); + std::vector measuredDepthValues(); private: + std::map m_idxInWellPathToIdxInRftFile; + caf::PdmPtrField m_eclipseResultCase; caf::PdmField m_timeStep; caf::PdmField m_wellName;