diff --git a/ApplicationCode/ProjectDataModel/RimFracture.cpp b/ApplicationCode/ProjectDataModel/RimFracture.cpp index bdf83d78ad..d45ff58de4 100644 --- a/ApplicationCode/ProjectDataModel/RimFracture.cpp +++ b/ApplicationCode/ProjectDataModel/RimFracture.cpp @@ -24,6 +24,8 @@ #include "RimFractureDefinition.h" #include "RimView.h" +#define _USE_MATH_DEFINES +#include //TODO: Is this OK? What about cmath? #include "cafPdmUiDoubleSliderEditor.h" #include "cvfMatrix4.h" @@ -127,6 +129,38 @@ void RimFracture::computeGeometry() m_recomputeGeometry = false; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimFracture::computeTransmissibility() +{ + std::vector fracDataVec; + + // Finne ijk-er for alle celler... + //For now, only consider center cell: + std::vector> fracCells = getFracturedCells(); + + for (auto fracCell : fracCells) + { +// RigFractureData* fracData = new RigFractureData; + + //TODO: get correct input values... + double area = 2.468; + double fractureLength = 1.2345; + double flowLength = 2.718281828; + double c = 0.008527; // TODO: Get value with units, is defined in RimReservoirCellResultsStorage + + double transmissibility = 8 * c * attachedFractureDefinition()->permeability * area / + ( flowLength + (attachedFractureDefinition()->skinFactor * fractureLength)/M_PI ); + +// fracData.cellindex = 0; +// fracDataVec.push_back(fracData); + + } + + m_rigFracture->setFractureData(fracDataVec); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -168,6 +202,18 @@ void RimFracture::defineEditorAttribute(const caf::PdmFieldHandle* field, QStrin } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector> RimFracture::getFracturedCells() +{ + //TODO: Remove this? For now returning empty vector since function + // is not yet implemented for well path fractures + + std::vector> cells; + return cells; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimFracture.h b/ApplicationCode/ProjectDataModel/RimFracture.h index 07ca437b47..e23f30d8b7 100644 --- a/ApplicationCode/ProjectDataModel/RimFracture.h +++ b/ApplicationCode/ProjectDataModel/RimFracture.h @@ -47,8 +47,12 @@ public: virtual cvf::Vec3d centerPointForFracture() = 0; virtual RimFractureDefinition* attachedFractureDefinition() = 0; + virtual std::vector> getFracturedCells(); + bool hasValidGeometry() const; void computeGeometry(); + + void computeTransmissibility(); void setRecomputeGeometryFlag(); diff --git a/ApplicationCode/ProjectDataModel/RimSimWellFracture.cpp b/ApplicationCode/ProjectDataModel/RimSimWellFracture.cpp index 0dc345ca3a..bf9932b7b5 100644 --- a/ApplicationCode/ProjectDataModel/RimSimWellFracture.cpp +++ b/ApplicationCode/ProjectDataModel/RimSimWellFracture.cpp @@ -41,6 +41,7 @@ #include #include +#include "RigGridBase.h" @@ -159,6 +160,33 @@ void RimSimWellFracture::fieldChangedByUi(const caf::PdmFieldHandle* changedFiel if (proj) proj->createDisplayModelAndRedrawAllViews(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector> RimSimWellFracture::getFracturedCells() +{ + std::vector> cells; + + size_t gridindex = 0; //TODO! For now assuming only one grid + + + caf::PdmObjectHandle* objHandle = dynamic_cast(this); + if (!objHandle) return cells; + + RimEclipseView* mainView = nullptr; + objHandle->firstAncestorOrThisOfType(mainView); + if (!mainView) return cells; + + const RigMainGrid* mainGrid = mainView->mainGrid(); + if (!mainGrid) return cells; + + size_t gridCellIndex = mainGrid->cellIndexFromIJK(m_i - 1, m_j - 1, m_k - 1); // cellIndexFromIJK uses 0-based indexing + + cells.push_back(std::make_pair(gridCellIndex, gridindex)); + + return cells; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimSimWellFracture.h b/ApplicationCode/ProjectDataModel/RimSimWellFracture.h index 427e7bd776..454281af41 100644 --- a/ApplicationCode/ProjectDataModel/RimSimWellFracture.h +++ b/ApplicationCode/ProjectDataModel/RimSimWellFracture.h @@ -60,6 +60,9 @@ public: virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override; + + virtual std::vector> getFracturedCells() override; + protected: virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering); cvf::Vec3d fracturePositionForUi() const; diff --git a/ApplicationCode/ReservoirDataModel/RigFracture.cpp b/ApplicationCode/ReservoirDataModel/RigFracture.cpp index c700c872ea..064fa2cceb 100644 --- a/ApplicationCode/ReservoirDataModel/RigFracture.cpp +++ b/ApplicationCode/ReservoirDataModel/RigFracture.cpp @@ -18,6 +18,14 @@ #include "RigFracture.h" +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RigFractureData::RigFractureData() +{ + +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -50,4 +58,19 @@ const std::vector& RigFracture::nodeCoords() const return m_nodeCoords; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigFracture::setFractureData(const std::vector& data) +{ + m_fractureData = data; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::vector& RigFracture::fractureData() const +{ + return m_fractureData; +} diff --git a/ApplicationCode/ReservoirDataModel/RigFracture.h b/ApplicationCode/ReservoirDataModel/RigFracture.h index 8e83f496b7..7adcc12dc2 100644 --- a/ApplicationCode/ReservoirDataModel/RigFracture.h +++ b/ApplicationCode/ReservoirDataModel/RigFracture.h @@ -26,6 +26,17 @@ #include +class RigFractureData +{ +public: + RigFractureData(); + + size_t gridIndex; + size_t cellindex; + double transmissibility; + +}; + //================================================================================================== /// //================================================================================================== @@ -39,8 +50,12 @@ public: const std::vector& polygonIndices() const; const std::vector& nodeCoords() const; + void setFractureData(const std::vector& data); + const std::vector& fractureData() const; //Access frac data + private: std::vector m_polygonIndices; std::vector m_nodeCoords; + std::vector m_fractureData; };