From 9d1cc2eb194bdd9858707d91817ae1c407a94c6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Mon, 26 Jun 2017 10:28:23 +0200 Subject: [PATCH] #1653 Make fracture mesh visualization independent of active view. Removed use of timestep index in rimfracture (use template timestep) Remove display value from fracture cell --- .../RivWellFracturePartMgr.cpp | 28 +++++++--- .../RivWellFracturePartMgr.h | 6 ++- .../RimStimPlanFractureTemplate.cpp | 18 +++---- .../Completions/RimStimPlanFractureTemplate.h | 6 +-- .../ReservoirDataModel/RigFractureCell.h | 5 -- .../RigStimPlanFractureDefinition.cpp | 54 ++++++++++++------- .../RigStimPlanFractureDefinition.h | 21 ++++---- 7 files changed, 81 insertions(+), 57 deletions(-) diff --git a/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.cpp b/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.cpp index 31d3ebbd4b..9b99f7b67e 100644 --- a/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.cpp @@ -154,13 +154,13 @@ void RivWellFracturePartMgr::applyResultTextureColor(const RimEclipseView* activ cvf::ref textureCoords = new cvf::Vec2fArray; textureCoords->resize(geo->vertexCount()); - int timeStepIndex = m_rimFracture->stimPlanTimeIndexToPlot; + int timeStepIndex = stimPlanFracTemplate->activeTimeStepIndex(); std::vector > dataToPlot = stimPlanFracTemplate->resultValues(activeView->stimPlanColors->resultName(), activeView->stimPlanColors->unit(), timeStepIndex); int i = 0; - for (std::vector depthData : dataToPlot) + for (const std::vector& depthData : dataToPlot) { std::vector mirroredValuesAtDepth = mirrorDataAtSingleDepth(depthData); for (double gridXdata : mirroredValuesAtDepth) @@ -230,7 +230,8 @@ void RivWellFracturePartMgr::generateFractureOutlinePolygonPart(const caf::Displ //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RivWellFracturePartMgr::generateStimPlanMeshPart(const caf::DisplayCoordTransform* displayCoordTransform) +void RivWellFracturePartMgr::generateStimPlanMeshPart(const caf::DisplayCoordTransform* displayCoordTransform, + const RimEclipseView* activeView) { m_stimPlanMeshPart = nullptr; @@ -239,7 +240,9 @@ void RivWellFracturePartMgr::generateStimPlanMeshPart(const caf::DisplayCoordTra RimStimPlanFractureTemplate* stimPlanFracTemplate = dynamic_cast(m_rimFracture->fractureTemplate()); if (!stimPlanFracTemplate) return; - cvf::ref stimPlanMeshGeo = createStimPlanMeshDrawable(stimPlanFracTemplate, displayCoordTransform); + cvf::ref stimPlanMeshGeo = createStimPlanMeshDrawable(stimPlanFracTemplate, + displayCoordTransform, + activeView); if (stimPlanMeshGeo.notNull()) { m_stimPlanMeshPart = new cvf::Part(0, "StimPlanMesh"); @@ -260,7 +263,8 @@ void RivWellFracturePartMgr::generateStimPlanMeshPart(const caf::DisplayCoordTra /// //-------------------------------------------------------------------------------------------------- cvf::ref RivWellFracturePartMgr::createStimPlanMeshDrawable(RimStimPlanFractureTemplate* stimPlanFracTemplate, - const caf::DisplayCoordTransform* displayCoordTransform) + const caf::DisplayCoordTransform* displayCoordTransform, + const RimEclipseView* activeView) { //TODO: This is needed to avoid errors when loading project with stimPlan fractures with multipled timesteps. //Should probably be moved, since it now is called twice in some cases... @@ -269,10 +273,18 @@ cvf::ref RivWellFracturePartMgr::createStimPlanMeshDrawable(Ri std::vector stimPlanCells = stimPlanFracTemplate->fractureGrid()->fractureCells(); std::vector stimPlanMeshVertices; - for (RigFractureCell stimPlanCell : stimPlanCells) + QString resultNameFromColors = activeView->stimPlanColors->resultName(); + QString resultUnitFromColors = activeView->stimPlanColors->unit(); + + std::vector prCellResults = stimPlanFracTemplate->fractureGridResults(resultNameFromColors, + resultUnitFromColors, + stimPlanFracTemplate->activeTimeStepIndex()); + + for ( size_t cIdx = 0; cIdx < stimPlanCells.size() ; ++cIdx) { - if (stimPlanCell.getDisplayValue() > 1e-7) + if (prCellResults[cIdx] > 1e-7) { + const RigFractureCell& stimPlanCell = stimPlanCells[cIdx]; std::vector stimPlanCellPolygon = stimPlanCell.getPolygon(); for (cvf::Vec3d cellCorner : stimPlanCellPolygon) { @@ -435,7 +447,7 @@ void RivWellFracturePartMgr::appendGeometryPartsToModel(cvf::ModelBasicList* mod if (stimPlanFracTemplate->showStimPlanMesh()) { - generateStimPlanMeshPart(displayCoordTransform.p()); + generateStimPlanMeshPart(displayCoordTransform.p(), eclView); } } else // Ellipse diff --git a/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.h b/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.h index 6b1c2012d6..8d6ab9f866 100644 --- a/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.h +++ b/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.h @@ -66,11 +66,13 @@ private: void applyResultTextureColor(const RimEclipseView* activeView); void generateFractureOutlinePolygonPart(const caf::DisplayCoordTransform* displayCoordTransform); - void generateStimPlanMeshPart(const caf::DisplayCoordTransform* displayCoordTransform); + void generateStimPlanMeshPart(const caf::DisplayCoordTransform* displayCoordTransform, + const RimEclipseView* activeView); cvf::ref createPolygonDrawable(const caf::DisplayCoordTransform* displayCoordTransform); cvf::ref createStimPlanMeshDrawable(RimStimPlanFractureTemplate* stimPlanFracTemplate, - const caf::DisplayCoordTransform* displayCoordTransform); + const caf::DisplayCoordTransform* displayCoordTransform, + const RimEclipseView* activeView); void getPolygonBB(float &polygonXmin, float &polygonXmax, diff --git a/ApplicationCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.cpp b/ApplicationCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.cpp index 7851e91f9e..98ba00ebd3 100644 --- a/ApplicationCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.cpp +++ b/ApplicationCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.cpp @@ -356,6 +356,14 @@ std::vector> RimStimPlanFractureTemplate::resultValues(const return m_stimPlanFractureDefinitionData->getDataAtTimeIndex(resultName, unitName, timeStepIndex); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimStimPlanFractureTemplate::fractureGridResults(const QString& resultName, const QString& unitName, size_t timeStepIndex) const +{ + return m_stimPlanFractureDefinitionData->fractureGridResults(resultName, unitName, timeStepIndex); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -369,17 +377,9 @@ const RigFractureGrid* RimStimPlanFractureTemplate::fractureGrid() const //-------------------------------------------------------------------------------------------------- void RimStimPlanFractureTemplate::updateFractureGrid() { - RimEclipseView* activeView = dynamic_cast(RiaApplication::instance()->activeReservoirView()); - if (!activeView) return; - QString resultNameFromColors = activeView->stimPlanColors->resultName(); - QString resultUnitFromColors = activeView->stimPlanColors->unit(); - - m_fractureGrid = m_stimPlanFractureDefinitionData->createFractureGrid(resultNameFromColors, - resultUnitFromColors, - m_activeTimeStepIndex, + m_fractureGrid = m_stimPlanFractureDefinitionData->createFractureGrid(m_activeTimeStepIndex, fractureTemplateUnit, m_wellPathDepthAtFracture); - } diff --git a/ApplicationCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.h b/ApplicationCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.h index 40d9e7f300..d94f29b0a5 100644 --- a/ApplicationCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.h +++ b/ApplicationCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.h @@ -77,9 +77,7 @@ public: std::vector > resultNamesWithUnit() const; void computeMinMax(const QString& resultName, const QString& unitName, double* minValue, double* maxValue) const; std::vector> resultValues(const QString& resultName, const QString& unitName, size_t timeStepIndex) const; - - // OBSOLETE : Function used by upscaling only - void getStimPlanDataAsPolygonsAndValues(std::vector > &cellsAsPolygons, std::vector ¶meterValue, const QString& resultName, const QString& unitName, size_t timeStepIndex); + std::vector fractureGridResults(const QString& resultName, const QString& unitName, size_t timeStepIndex) const; protected: virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override; @@ -94,8 +92,6 @@ private: void setDepthOfWellPathAtFracture(); QString getUnitForStimPlanParameter(QString parameterName); - void sortPolygon(std::vector &polygon); - caf::PdmField m_activeTimeStepIndex; caf::PdmField m_showStimPlanMesh; diff --git a/ApplicationCode/ReservoirDataModel/RigFractureCell.h b/ApplicationCode/ReservoirDataModel/RigFractureCell.h index b25aae8367..e8466f45cb 100644 --- a/ApplicationCode/ReservoirDataModel/RigFractureCell.h +++ b/ApplicationCode/ReservoirDataModel/RigFractureCell.h @@ -39,21 +39,16 @@ public: const std::vector& getPolygon() const { return m_polygon; } double getConductivtyValue() const { return m_concutivityValue; } - double getDisplayValue() { return m_displayValue; } size_t getI() const { return m_i; } size_t getJ() const { return m_j; } bool hasNonZeroConductivity() const { return m_concutivityValue > 1e-7; } - - void setConductivityValue(double cond) { m_concutivityValue = cond; } - void setDisplayValue(double value) { m_displayValue = value; }; double cellSizeX() const; double cellSizeZ() const; private: std::vector m_polygon; - double m_displayValue; double m_concutivityValue; size_t m_i; size_t m_j; diff --git a/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.cpp b/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.cpp index b3bb422307..ed70923d14 100644 --- a/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.cpp +++ b/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.cpp @@ -143,9 +143,7 @@ std::vector> RigStimPlanFractureDefinition::getMirroredDataA //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -cvf::ref RigStimPlanFractureDefinition::createFractureGrid(const QString& resultNameFromColors, - const QString& resultUnitFromColors, - int m_activeTimeStepIndex, +cvf::ref RigStimPlanFractureDefinition::createFractureGrid(int m_activeTimeStepIndex, RiaEclipseUnitTools::UnitSystemType fractureTemplateUnit, double m_wellPathDepthAtFracture) { @@ -154,10 +152,6 @@ cvf::ref RigStimPlanFractureDefinition::createFractureGrid(cons bool wellCenterStimPlanCellFound = false; - std::vector> displayPropertyValuesAtTimeStep = this->getMirroredDataAtTimeIndex(resultNameFromColors, - resultUnitFromColors, - m_activeTimeStepIndex); - QString condUnit; if ( fractureTemplateUnit == RiaEclipseUnitTools::UNITS_METRIC ) condUnit = "md-m"; if ( fractureTemplateUnit == RiaEclipseUnitTools::UNITS_FIELD ) condUnit = "md-ft"; @@ -178,10 +172,10 @@ cvf::ref RigStimPlanFractureDefinition::createFractureGrid(cons for ( int j = 0; j < depthCoords.size() - 1; j++ ) { std::vector cellPolygon; - cellPolygon.push_back(cvf::Vec3d(static_cast(xCoords[i]), static_cast(depthCoords[j]), 0.0)); - cellPolygon.push_back(cvf::Vec3d(static_cast(xCoords[i + 1]), static_cast(depthCoords[j]), 0.0)); - cellPolygon.push_back(cvf::Vec3d(static_cast(xCoords[i + 1]), static_cast(depthCoords[j + 1]), 0.0)); - cellPolygon.push_back(cvf::Vec3d(static_cast(xCoords[i]), static_cast(depthCoords[j + 1]), 0.0)); + cellPolygon.push_back(cvf::Vec3d(xCoords[i], depthCoords[j], 0.0)); + cellPolygon.push_back(cvf::Vec3d(xCoords[i + 1], depthCoords[j], 0.0)); + cellPolygon.push_back(cvf::Vec3d(xCoords[i + 1], depthCoords[j + 1], 0.0)); + cellPolygon.push_back(cvf::Vec3d(xCoords[i], depthCoords[j + 1], 0.0)); RigFractureCell stimPlanCell(cellPolygon, i, j); if ( conductivityValuesAtTimeStep.size() > 0 ) //Assuming vector to be of correct length, or no values @@ -193,14 +187,6 @@ cvf::ref RigStimPlanFractureDefinition::createFractureGrid(cons stimPlanCell.setConductivityValue(cvf::UNDEFINED_DOUBLE); } - if ( displayPropertyValuesAtTimeStep.size() > 0 ) - { - stimPlanCell.setDisplayValue(displayPropertyValuesAtTimeStep[j + 1][i + 1]); - } - else - { - stimPlanCell.setDisplayValue(cvf::UNDEFINED_DOUBLE); - } if ( cellPolygon[0].x() < 0.0 && cellPolygon[1].x() > 0.0 ) { @@ -232,6 +218,36 @@ cvf::ref RigStimPlanFractureDefinition::createFractureGrid(cons return m_fractureGrid; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RigStimPlanFractureDefinition::fractureGridResults(const QString& resultName, + const QString& unitName, + size_t timeStepIndex) const +{ + std::vector fractureGridResults; + std::vector> resultValuesAtTimeStep = this->getMirroredDataAtTimeIndex(resultName, + unitName, + timeStepIndex); + + for ( int i = 0; i < mirroredGridXCount() - 2; i++ ) + { + for ( int j = 0; j < depthCount() - 2; j++ ) + { + if ( j+1 < resultValuesAtTimeStep.size() && i+1 < resultValuesAtTimeStep[j + 1].size() ) + { + fractureGridResults.push_back(resultValuesAtTimeStep[j + 1][i + 1]); + } + else + { + fractureGridResults.push_back(HUGE_VAL); + } + } + } + + return fractureGridResults; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.h b/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.h index 2d49b93dc8..87cc5cdde2 100644 --- a/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.h +++ b/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.h @@ -47,10 +47,10 @@ public: RigStimPlanFractureDefinition(); ~RigStimPlanFractureDefinition(); - RiaEclipseUnitTools::UnitSystem unitSet() { return m_unitSet; } + RiaEclipseUnitTools::UnitSystem unitSet() const { return m_unitSet; } void setUnitSet(RiaEclipseUnitTools::UnitSystem unitset) { m_unitSet = unitset;} - size_t gridXCount() { return m_gridXs.size();} + size_t gridXCount() const { return m_gridXs.size();} void setGridXs(const std::vector& gridXs) { m_gridXs = gridXs; } @@ -59,9 +59,9 @@ public: void setGridYs(const std::vector& gridYs) { m_gridYs = gridYs; } - double minDepth() { return depths[0]; } - double maxDepth() { return depths.back(); } - size_t depthCount() { return depths.size(); } + double minDepth() const { return depths[0]; } + double maxDepth() const { return depths.back(); } + size_t depthCount() const { return depths.size(); } // Grid Geometry @@ -72,12 +72,11 @@ public: size_t timeStepIndex) const; - cvf::ref createFractureGrid(const QString& resultNameFromColors, - const QString& resultUnitFromColors, - int m_activeTimeStepIndex, + cvf::ref createFractureGrid(int m_activeTimeStepIndex, RiaEclipseUnitTools::UnitSystemType fractureTemplateUnit, double m_wellPathDepthAtFracture); + void createFractureTriangleGeometry(double m_wellPathDepthAtFracture, RiaEclipseUnitTools::UnitSystem neededUnit, const QString& fractureUserName, @@ -100,6 +99,9 @@ public: size_t totalNumberTimeSteps(); void setDataAtTimeValue(QString resultName, QString unit, std::vector> data, double timeStepValue); const std::vector>& getDataAtTimeIndex(const QString& resultName, const QString& unit, size_t timeStepIndex) const; + std::vector fractureGridResults(const QString& resultName, + const QString& unitName, + size_t timeStepIndex) const; void computeMinMax(const QString& resultName, const QString& unit, double* minValue, double* maxValue) const; // Setup @@ -108,7 +110,8 @@ private: bool timeStepExisist(double timeStepValue); size_t getTimeStepIndex(double timeStepValue); size_t resultIndex(const QString& resultName, const QString& unit) const; - + size_t mirroredGridXCount() const { return m_gridXs.size() ? m_gridXs.size() + m_gridXs.size() - 1 : 0 ;} + RiaEclipseUnitTools::UnitSystem m_unitSet; std::vector m_gridXs; std::vector m_gridYs;