diff --git a/ApplicationCode/ReservoirDataModel/RigFractureTransCalc.cpp b/ApplicationCode/ReservoirDataModel/RigFractureTransCalc.cpp index ccb62c4593..6ce3a49c17 100644 --- a/ApplicationCode/ReservoirDataModel/RigFractureTransCalc.cpp +++ b/ApplicationCode/ReservoirDataModel/RigFractureTransCalc.cpp @@ -36,6 +36,8 @@ #include "cafAppEnum.h" #include "RigCell.h" #include "RigMainGrid.h" +#include "cvfMath.h" +#include "RimDefines.h" //-------------------------------------------------------------------------------------------------- /// @@ -79,25 +81,6 @@ RigFractureTransCalc::RigFractureTransCalc(RimEclipseCase* caseToApply, RimFract //TODO: Make static and move to another class void RigFractureTransCalc::computeTransmissibility() { -// //Get correct unit system: -// RigEclipseCaseData::UnitsType caseUnit = m_case->eclipseCaseData()->unitsType(); -// RimDefines::UnitSystem unitForExport; -// -// if (caseUnit == RigEclipseCaseData::UNITS_METRIC) -// { -// RiaLogging::debug(QString("Calculating transmissibilities in metric units")); -// unitForExport = RimDefines::UNITS_METRIC; -// } -// else if (caseUnit == RigEclipseCaseData::UNITS_FIELD) -// { -// RiaLogging::debug(QString("Calculating transmissibilities in field units")); -// unitForExport = RimDefines::UNITS_FIELD; -// } -// else -// { -// RiaLogging::error(QString("Unit system for case not supported for fracture export.")); -// return; -// } if (m_fracture->attachedFractureDefinition()->fractureConductivity == RimFractureTemplate::FINITE_CONDUCTIVITY) { @@ -105,7 +88,6 @@ void RigFractureTransCalc::computeTransmissibility() RiaLogging::warning(QString("Performing calculation for infinite conductivity instead.")); } - RigEclipseCaseData* eclipseCaseData = m_case->eclipseCaseData(); RifReaderInterface::PorosityModelResultType porosityModel = RifReaderInterface::MATRIX_RESULTS; @@ -344,8 +326,6 @@ void RigFractureTransCalc::computeUpscaledPropertyFromStimPlanForEclipseCell(dou } else return; - //TODO: UNITS! - std::vector > stimPlanCellsAsPolygons; std::vector stimPlanParameterValues; fracTemplateStimPlan->getStimPlanDataAsPolygonsAndValues(stimPlanCellsAsPolygons, stimPlanParameterValues, resultName, resultUnit, timeStepIndex); @@ -464,6 +444,7 @@ double RigFractureTransCalc::areaWeightedArithmeticAverage(std::vector a double upscaledValueArithmetic = fractureCellAreaXvalue / fractureCellArea; return upscaledValueArithmetic; + } @@ -474,7 +455,6 @@ double RigFractureTransCalc::areaWeightedArithmeticAverage(std::vector a void RigFractureTransCalc::computeUpscaledPropertyFromStimPlan( QString resultName, QString resultUnit, size_t timeStepIndex) { - //TODO: A lot of common code with function for calculating transmissibility... RimStimPlanFractureTemplate* fracTemplateStimPlan; if (dynamic_cast(m_fracture->attachedFractureDefinition())) @@ -544,27 +524,6 @@ void RigFractureTransCalc::computeFlowInFracture() } else return; - //Get correct unit system: - RigEclipseCaseData::UnitsType caseUnit = m_case->eclipseCaseData()->unitsType(); - RimDefines::UnitSystem unitForExport; - - if (caseUnit == RigEclipseCaseData::UNITS_METRIC) - { - RiaLogging::debug(QString("Calculating flow in fracture in metric units")); - unitForExport = RimDefines::UNITS_METRIC; - } - else if (caseUnit == RigEclipseCaseData::UNITS_FIELD) - { - RiaLogging::debug(QString("Calculating flow in fracture in field units")); - unitForExport = RimDefines::UNITS_FIELD; - } - else - { - RiaLogging::error(QString("Unit system for case not supported for fracture export.")); - return; - } - - //TODO: A lot of common code with function above... Can be cleaned up...? std::vector fracCells = m_fracture->getPotentiallyFracturedCells(); @@ -580,35 +539,42 @@ void RigFractureTransCalc::computeFlowInFracture() for (size_t fracCell : fracCells) { - double K; //Conductivity - double w; //Fracture width + double Kw; // Conductivity (Permeability K times width w) if (fracTemplateEllipse) { + double K = fracTemplateEllipse->fractureConductivity(); // Permeability + double w = fracTemplateEllipse->width(); // Width + //TODO: UNit handling... - K = fracTemplateEllipse->fractureConductivity(); - w = fracTemplateEllipse->width(); + if (fracTemplateEllipse->fractureTemplateUnit() == RimDefines::UNITS_FIELD) + { + w = RimDefines::inchToFeet(w); + } + + Kw = K * w; } else if (fracTemplateStimPlan) { QString resultName = "CONDUCTIVITY"; - QString resultUnit = "md-m"; + QString resultUnit; + if (fracTemplateStimPlan->fractureTemplateUnit() == RimDefines::UNITS_METRIC) resultUnit = "md-m"; + if (fracTemplateStimPlan->fractureTemplateUnit() == RimDefines::UNITS_FIELD) resultUnit = "md-ft"; + 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, resultName, resultUnit, timeStepIndex, unitSystem, fracCell); - K = (upscaledAritmStimPlanValue + upscaledHarmStimPlanValue) / 2; - - resultName = "WIDTH"; - resultUnit = "cm"; //TODO handle mm and cm! - computeUpscaledPropertyFromStimPlanForEclipseCell(upscaledAritmStimPlanValue, upscaledHarmStimPlanValue, resultName, resultUnit, timeStepIndex, unitSystem, fracCell); - w = (upscaledAritmStimPlanValue + upscaledHarmStimPlanValue) / 2; - + Kw = (upscaledAritmStimPlanValue + upscaledHarmStimPlanValue) / 2; } + Kw = convertConductivtyValue(Kw, fracTemplateEllipse->fractureTemplateUnit(), m_unitForCalculation); + + } + m_fracture->setFractureData(fracDataVec); } @@ -624,18 +590,33 @@ void RigFractureTransCalc::computeFlowIntoTransverseWell() if (m_fracture->attachedFractureDefinition()->orientation == RimFractureTemplate::ALONG_WELL_PATH) return; - double wellRadius = cvf::UNDEFINED_DOUBLE; - if (m_fracture->attachedFractureDefinition()->orientation == RimFractureTemplate::TRANSVERSE_WELL_PATH) - { - wellRadius = 0.0;//TODO read this value... - } + double areaScalingFactor = 1.0; if (m_fracture->attachedFractureDefinition()->orientation == RimFractureTemplate::AZIMUTH) { - - + areaScalingFactor = 1 / cvf::Math::cos((m_fracture->azimuth() - (m_fracture->wellAzimuthAtFracturePosition()-90) )); } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigFractureTransCalc::convertConductivtyValue(double Kw, RimDefines::UnitSystem fromUnit, RimDefines::UnitSystem toUnit) +{ + + if (fromUnit == toUnit) return Kw; + + else if (fromUnit == RimDefines::UNITS_METRIC && toUnit == RimDefines::UNITS_FIELD) + { + return RimDefines::meterToFeet(Kw); + } + else if (fromUnit == RimDefines::UNITS_METRIC && toUnit == RimDefines::UNITS_FIELD) + { + return RimDefines::feetToMeter(Kw); + } + + return cvf::UNDEFINED_DOUBLE; +} + diff --git a/ApplicationCode/ReservoirDataModel/RigFractureTransCalc.h b/ApplicationCode/ReservoirDataModel/RigFractureTransCalc.h index 9a57db3c9c..6d841170fe 100644 --- a/ApplicationCode/ReservoirDataModel/RigFractureTransCalc.h +++ b/ApplicationCode/ReservoirDataModel/RigFractureTransCalc.h @@ -64,5 +64,6 @@ private: RimFracture* m_fracture; RimDefines::UnitSystem m_unitForCalculation; + double convertConductivtyValue(double Kw, RimDefines::UnitSystem fromUnit, RimDefines::UnitSystem toUnit); };