From 0d7da9788a5053be111e9e9ce1f260a70e667b9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Fri, 20 Jan 2017 17:20:09 +0100 Subject: [PATCH] #1112 Made conveninece methods to calculate well pipe centerline, and added possibility to do it pr timestep. --- .../RivSimWellPipesPartMgr.cpp | 2 +- .../ProjectDataModel/RimEclipseWell.cpp | 20 +++++++++ .../ProjectDataModel/RimEclipseWell.h | 14 +++++-- .../ProjectDataModel/RimIntersection.cpp | 2 +- .../RigSimulationWellCenterLineCalculator.cpp | 41 ++++++++++++++++++- .../RigSimulationWellCenterLineCalculator.h | 15 ++++--- 6 files changed, 83 insertions(+), 11 deletions(-) diff --git a/ApplicationCode/ModelVisualization/RivSimWellPipesPartMgr.cpp b/ApplicationCode/ModelVisualization/RivSimWellPipesPartMgr.cpp index ea85d02f43..901bb953f5 100644 --- a/ApplicationCode/ModelVisualization/RivSimWellPipesPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivSimWellPipesPartMgr.cpp @@ -82,7 +82,7 @@ void RivSimWellPipesPartMgr::buildWellPipeParts() m_pipeBranchesCLCoords.clear(); std::vector< std::vector > pipeBranchesCellIds; - RigSimulationWellCenterLineCalculator::calculateWellPipeCenterline(m_rimWell.p(), m_pipeBranchesCLCoords, pipeBranchesCellIds); + m_rimWell->calculateWellPipeStaticCenterLine(m_pipeBranchesCLCoords, pipeBranchesCellIds); double characteristicCellSize = m_rimReservoirView->mainGrid()->characteristicIJCellSize(); double pipeRadius = m_rimReservoirView->wellCollection()->pipeRadiusScaleFactor() *m_rimWell->pipeRadiusScaleFactor() * characteristicCellSize; diff --git a/ApplicationCode/ProjectDataModel/RimEclipseWell.cpp b/ApplicationCode/ProjectDataModel/RimEclipseWell.cpp index 447df1cc56..454cf674a2 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseWell.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseWell.cpp @@ -27,6 +27,7 @@ #include "RimIntersectionCollection.h" #include "cvfMath.h" +#include "RigSimulationWellCenterLineCalculator.h" CAF_PDM_SOURCE_INIT(RimEclipseWell, "Well"); @@ -114,6 +115,25 @@ caf::PdmFieldHandle* RimEclipseWell::objectToggleField() return &showWell; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEclipseWell::calculateWellPipeStaticCenterLine(std::vector< std::vector >& pipeBranchesCLCoords, + std::vector< std::vector >& pipeBranchesCellIds) +{ + RigSimulationWellCenterLineCalculator::calculateWellPipeStaticCenterline(this, pipeBranchesCLCoords, pipeBranchesCellIds); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEclipseWell::calculateWellPipeDynamicCenterLine(size_t timeStepIdx, + std::vector< std::vector >& pipeBranchesCLCoords, + std::vector< std::vector >& pipeBranchesCellIds) +{ + RigSimulationWellCenterLineCalculator::calculateWellPipeDynamicCenterline(this, timeStepIdx, pipeBranchesCLCoords, pipeBranchesCellIds); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimEclipseWell.h b/ApplicationCode/ProjectDataModel/RimEclipseWell.h index ff4e68fb55..d8a90e269d 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseWell.h +++ b/ApplicationCode/ProjectDataModel/RimEclipseWell.h @@ -30,7 +30,7 @@ // Include to make Pdm work for cvf::Color #include "cafPdmFieldCvfColor.h" -class RigSingleWellResultsData; +#include "RigSingleWellResultsData.h" //================================================================================================== /// @@ -57,8 +57,12 @@ public: virtual caf::PdmFieldHandle* userDescriptionField(); virtual caf::PdmFieldHandle* objectToggleField(); - virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue); - virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering); + void calculateWellPipeStaticCenterLine( std::vector< std::vector >& pipeBranchesCLCoords, + std::vector< std::vector >& pipeBranchesCellIds); + + void calculateWellPipeDynamicCenterLine(size_t timeStepIdx, + std::vector< std::vector >& pipeBranchesCLCoords, + std::vector< std::vector >& pipeBranchesCellIds); caf::PdmField showWell; @@ -73,6 +77,10 @@ public: caf::PdmField wellPipeColor; caf::PdmField pipeRadiusScaleFactor; +protected: + virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue); + virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering); + private: cvf::ref m_wellResults; size_t m_resultWellIndex; diff --git a/ApplicationCode/ProjectDataModel/RimIntersection.cpp b/ApplicationCode/ProjectDataModel/RimIntersection.cpp index c2ddb03f3f..1c7f37d076 100644 --- a/ApplicationCode/ProjectDataModel/RimIntersection.cpp +++ b/ApplicationCode/ProjectDataModel/RimIntersection.cpp @@ -393,7 +393,7 @@ void RimIntersection::updateWellCenterline() const { std::vector< std::vector > pipeBranchesCellIds; - RigSimulationWellCenterLineCalculator::calculateWellPipeCenterline(simulationWell(), m_wellBranchCenterlines, pipeBranchesCellIds); + simulationWell->calculateWellPipeStaticCenterLine(m_wellBranchCenterlines, pipeBranchesCellIds); } } else diff --git a/ApplicationCode/ReservoirDataModel/RigSimulationWellCenterLineCalculator.cpp b/ApplicationCode/ReservoirDataModel/RigSimulationWellCenterLineCalculator.cpp index 30ce79549b..2282d97846 100644 --- a/ApplicationCode/ReservoirDataModel/RigSimulationWellCenterLineCalculator.cpp +++ b/ApplicationCode/ReservoirDataModel/RigSimulationWellCenterLineCalculator.cpp @@ -34,7 +34,7 @@ /// The returned CellIds is one less than the number of centerline points, /// and are describing the lines between the points, starting with the first line //-------------------------------------------------------------------------------------------------- -void RigSimulationWellCenterLineCalculator::calculateWellPipeCenterline(RimEclipseWell* rimWell, +void RigSimulationWellCenterLineCalculator::calculateWellPipeStaticCenterline(RimEclipseWell* rimWell, std::vector< std::vector >& pipeBranchesCLCoords, std::vector< std::vector >& pipeBranchesCellIds) { @@ -74,6 +74,45 @@ void RigSimulationWellCenterLineCalculator::calculateWellPipeCenterline(RimEclip } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigSimulationWellCenterLineCalculator::calculateWellPipeDynamicCenterline(RimEclipseWell* rimWell, + size_t timeStepIndex, + std::vector< std::vector >& pipeBranchesCLCoords, + std::vector< std::vector >& pipeBranchesCellIds) +{ + bool isAutoDetectBranches = false; + RigEclipseCaseData* eclipseCaseData = NULL; + RigSingleWellResultsData* wellResults = NULL; + + { + CVF_ASSERT(rimWell); + RimEclipseView* eclipseView; + rimWell->firstAncestorOrThisOfType(eclipseView); + CVF_ASSERT(eclipseView); + + isAutoDetectBranches = eclipseView->wellCollection()->isAutoDetectingBranches(); + eclipseCaseData = eclipseView->eclipseCase()->reservoirData(); + wellResults = rimWell->wellResults(); + + if ( !wellResults || !wellResults->hasWellResult(timeStepIndex) ) return; + } + + + const RigWellResultFrame& wellFrame = wellResults->wellResultFrame(timeStepIndex); + bool isMultiSegmentWell = wellResults->isMultiSegmentWell(); + bool useAllCellCenters = rimWell->isUsingCellCenterForPipe(); + + calculateWellPipeCenterlineFromWellFrame(wellFrame, + eclipseCaseData, + isMultiSegmentWell, + isAutoDetectBranches, + useAllCellCenters, + pipeBranchesCLCoords, + pipeBranchesCellIds); +} + //-------------------------------------------------------------------------------------------------- /// Based on the points and cells, calculate a pipe centerline /// The returned CellIds is one less than the number of centerline points, diff --git a/ApplicationCode/ReservoirDataModel/RigSimulationWellCenterLineCalculator.h b/ApplicationCode/ReservoirDataModel/RigSimulationWellCenterLineCalculator.h index ac3fac8fa6..fe0b00b177 100644 --- a/ApplicationCode/ReservoirDataModel/RigSimulationWellCenterLineCalculator.h +++ b/ApplicationCode/ReservoirDataModel/RigSimulationWellCenterLineCalculator.h @@ -28,10 +28,17 @@ class RigEclipseCaseData; class RigSimulationWellCenterLineCalculator { public: - static void calculateWellPipeCenterline(RimEclipseWell* m_rimWell, - std::vector< std::vector >& pipeBranchesCLCoords, - std::vector< std::vector >& pipeBranchesCellIds) ; + static void calculateWellPipeStaticCenterline(RimEclipseWell* rimWell, + std::vector< std::vector >& pipeBranchesCLCoords, + std::vector< std::vector >& pipeBranchesCellIds) ; + static void calculateWellPipeDynamicCenterline(RimEclipseWell* rimWell, + size_t timeStepIndex, + std::vector< std::vector >& pipeBranchesCLCoords, + std::vector< std::vector >& pipeBranchesCellIds) ; + + +private: static void calculateWellPipeCenterlineFromWellFrame(const RigWellResultFrame& wellFrame, const RigEclipseCaseData* eclipseCaseData, bool isMultiSegmentWell, @@ -40,8 +47,6 @@ public: std::vector> & pipeBranchesCLCoords, std::vector> & pipeBranchesCellIds); - -private: static bool hasAnyResultCells(const std::vector &resBranches); static bool hasAnyValidDataCells(const RigWellResultBranch& branch); static void finishPipeCenterLine( std::vector< std::vector > &pipeBranchesCLCoords, const cvf::Vec3d& lastCellCenter ) ;