diff --git a/ApplicationCode/ProjectDataModel/RimFracture.cpp b/ApplicationCode/ProjectDataModel/RimFracture.cpp index 2c5d3e5f5a..3eb257da2a 100644 --- a/ApplicationCode/ProjectDataModel/RimFracture.cpp +++ b/ApplicationCode/ProjectDataModel/RimFracture.cpp @@ -281,6 +281,7 @@ cvf::Mat4f RimFracture::transformMatrix() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- +//TODO: Make static and move to another class void RimFracture::computeTransmissibility(RimEclipseCase* caseToApply) { //Get correct unit system: @@ -537,20 +538,15 @@ void RimFracture::computeUpscaledPropertyFromStimPlan(RimEclipseCase* caseToAppl std::vector > stimPlanCellsAsPolygons; std::vector stimPlanParameterValues; fracTemplateStimPlan->getStimPlanDataAsPolygonsAndValues(stimPlanCellsAsPolygons, stimPlanParameterValues, resultName, resultUnit, timeStepIndex); - - - + //TODO: A lot of common code with function above... Can be cleaned up...? std::vector fracCells = getPotentiallyFracturedCells(); - RigEclipseCaseData* eclipseCaseData = caseToApply->eclipseCaseData(); - RifReaderInterface::PorosityModelResultType porosityModel = RifReaderInterface::MATRIX_RESULTS; RimReservoirCellResultsStorage* gridCellResults = caseToApply->results(porosityModel); RigActiveCellInfo* activeCellInfo = eclipseCaseData->activeCellInfo(porosityModel); - std::vector fracDataVec; for (size_t fracCell : fracCells) @@ -689,10 +685,15 @@ void RimFracture::computeFlowInFracture(RimEclipseCase* caseToApply) if (!attachedFractureDefinition()) return; RimStimPlanFractureTemplate* fracTemplateStimPlan; + RimEllipseFractureTemplate* fracTemplateEllipse; if (dynamic_cast(attachedFractureDefinition())) { fracTemplateStimPlan = dynamic_cast(attachedFractureDefinition()); } + else if (dynamic_cast(attachedFractureDefinition())) + { + fracTemplateEllipse = dynamic_cast(attachedFractureDefinition()); + } else return; //Get correct unit system: @@ -731,18 +732,66 @@ void RimFracture::computeFlowInFracture(RimEclipseCase* caseToApply) for (size_t fracCell : fracCells) { + double K; //Conductivity + double w; //Fracture width + if (fracTemplateEllipse) + { + //TODO: UNit handling... + K = fracTemplateEllipse->fractureConductivity(); + w = fracTemplateEllipse->width(); + } + else if (fracTemplateStimPlan) + { + QString resultName = "CONDUCTIVITY"; + QString resultUnit = "md-m"; + size_t timeStepIndex = 0; //TODO... + double upscaledAritmStimPlanValue = cvf::UNDEFINED_DOUBLE; + double upscaledHarmStimPlanValue = cvf::UNDEFINED_DOUBLE; + caf::AppEnum< RimDefines::UnitSystem > unitSystem = RimDefines::UNITS_METRIC; + computeUpscaledPropertyFromStimPlanForEclipseCell(upscaledAritmStimPlanValue, upscaledHarmStimPlanValue, caseToApply, resultName, resultUnit, timeStepIndex, unitSystem, fracCell); + K = (upscaledAritmStimPlanValue + upscaledHarmStimPlanValue) / 2; + resultName = "WIDTH"; + resultUnit = "cm"; //TODO handle mm and cm! + computeUpscaledPropertyFromStimPlanForEclipseCell(upscaledAritmStimPlanValue, upscaledHarmStimPlanValue, caseToApply, resultName, resultUnit, timeStepIndex, unitSystem, fracCell); + w = (upscaledAritmStimPlanValue + upscaledHarmStimPlanValue) / 2; + + } } m_rigFracture->setFractureData(fracDataVec); - - } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimFracture::computeFlowIntoTransverseWell(RimEclipseCase* caseToApply) +{ + + //TODO: A lot of common code with function for calculating transmissibility... + + if (!attachedFractureDefinition()) return; + if (attachedFractureDefinition()->orientation == RimFractureTemplate::ALONG_WELL_PATH) return; + + double wellRadius = cvf::UNDEFINED_DOUBLE; + if (attachedFractureDefinition()->orientation == RimFractureTemplate::TRANSVERSE_WELL_PATH) + { + wellRadius = 0.0;//TODO read this value... + } + if (attachedFractureDefinition()->orientation == RimFractureTemplate::AZIMUTH) + { + + + } + + + +} + //-------------------------------------------------------------------------------------------------- /// diff --git a/ApplicationCode/ProjectDataModel/RimFracture.h b/ApplicationCode/ProjectDataModel/RimFracture.h index 6a3653a360..81ab9dcaed 100644 --- a/ApplicationCode/ProjectDataModel/RimFracture.h +++ b/ApplicationCode/ProjectDataModel/RimFracture.h @@ -88,6 +88,7 @@ public: void computeUpscaledPropertyFromStimPlan(RimEclipseCase* caseToApply, QString resultName, QString resultUnit, size_t timeStepIndex); void computeUpscaledPropertyFromStimPlanForEclipseCell(double &upscaledAritmStimPlanValue, double &upscaledHarmStimPlanValue, RimEclipseCase* caseToApply, QString resultName, QString resultUnit, size_t timeStepIndex, caf::AppEnum< RimDefines::UnitSystem > unitSystem, size_t cellIndex); void computeFlowInFracture(RimEclipseCase* caseToApply); + void computeFlowIntoTransverseWell(RimEclipseCase* caseToApply); double areaWeightedHarmonicAverage(std::vector areaOfFractureParts, std::vector valuesForFractureParts); double areaWeightedArithmeticAverage(std::vector areaOfFractureParts, std::vector valuesForFractureParts); @@ -97,6 +98,8 @@ public: cvf::Vec3d fracturePosition() const; virtual void updateAzimuthFromFractureDefinition() = 0; + virtual double wellAzimuthAtFracturePosition() = 0; + protected: virtual QList calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool * useOptionsOnly) override;