mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#1415 - pre-proto - Adding function for calculating transmissibility from fracture to well, radial flow
This commit is contained in:
parent
d532adcec0
commit
87ff498609
@ -40,6 +40,7 @@
|
|||||||
#include "cvfMath.h"
|
#include "cvfMath.h"
|
||||||
#include "RimDefines.h"
|
#include "RimDefines.h"
|
||||||
#include "RigStimPlanCell.h"
|
#include "RigStimPlanCell.h"
|
||||||
|
#include <cmath> //Used for log
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
@ -729,11 +730,9 @@ void RigFractureTransCalc::computeUpscaledPropertyFromStimPlan( QString resultNa
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RigFractureTransCalc::computeStimPlanCellTransmissibilityInFracture(RigStimPlanCell* stimPlanCell)
|
void RigFractureTransCalc::computeStimPlanCellTransmissibilityInFracture(RigStimPlanCell* stimPlanCell)
|
||||||
{
|
{
|
||||||
std::vector<cvf::Vec3d> polygon = stimPlanCell->getPolygon();
|
|
||||||
|
|
||||||
//The polygon corners are always stored in the same order
|
double verticalSideLength = stimPlanCell->cellSizeX();
|
||||||
double verticalSideLength = (polygon[1] - polygon[0]).length();
|
double horisontalSideLength = stimPlanCell->cellSizeZ();
|
||||||
double horisontalSideLength = (polygon[2] - polygon[1]).length();
|
|
||||||
|
|
||||||
double verticalTrans = stimPlanCell->getConductivtyValue() * verticalSideLength / (horisontalSideLength / 2);
|
double verticalTrans = stimPlanCell->getConductivtyValue() * verticalSideLength / (horisontalSideLength / 2);
|
||||||
double horizontalTrans = stimPlanCell->getConductivtyValue() * horisontalSideLength / (verticalSideLength / 2);
|
double horizontalTrans = stimPlanCell->getConductivtyValue() * horisontalSideLength / (verticalSideLength / 2);
|
||||||
@ -744,12 +743,9 @@ void RigFractureTransCalc::computeStimPlanCellTransmissibilityInFracture(RigStim
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RigFractureTransCalc::computeFlowIntoTransverseWell()
|
double RigFractureTransCalc::computeRadialTransmissibilityToWell(RigStimPlanCell* stimPlanCell)
|
||||||
{
|
{
|
||||||
|
if (m_fracture->attachedFractureDefinition()->orientation == RimFractureTemplate::ALONG_WELL_PATH) return cvf::UNDEFINED_DOUBLE;
|
||||||
//TODO: A lot of common code with function for calculating transmissibility...
|
|
||||||
|
|
||||||
if (m_fracture->attachedFractureDefinition()->orientation == RimFractureTemplate::ALONG_WELL_PATH) return;
|
|
||||||
|
|
||||||
double areaScalingFactor = 1.0;
|
double areaScalingFactor = 1.0;
|
||||||
if (m_fracture->attachedFractureDefinition()->orientation == RimFractureTemplate::AZIMUTH)
|
if (m_fracture->attachedFractureDefinition()->orientation == RimFractureTemplate::AZIMUTH)
|
||||||
@ -757,6 +753,29 @@ void RigFractureTransCalc::computeFlowIntoTransverseWell()
|
|||||||
areaScalingFactor = 1 / cvf::Math::cos((m_fracture->azimuth() - (m_fracture->wellAzimuthAtFracturePosition()-90) ));
|
areaScalingFactor = 1 / cvf::Math::cos((m_fracture->azimuth() - (m_fracture->wellAzimuthAtFracturePosition()-90) ));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double ro = 0.14 * cvf::Math::sqrt(
|
||||||
|
pow(stimPlanCell->cellSizeX(), 2.0) + pow(stimPlanCell->cellSizeZ(), 2));
|
||||||
|
|
||||||
|
double Tc = 2 * cvf::PI_D * cDarcy() * stimPlanCell->getConductivtyValue() /
|
||||||
|
(log(ro / m_fracture->wellRadius()) + m_fracture->attachedFractureDefinition()->skinFactor() );
|
||||||
|
|
||||||
|
Tc = Tc * areaScalingFactor;
|
||||||
|
|
||||||
|
return Tc;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
double RigFractureTransCalc::cDarcy()
|
||||||
|
{
|
||||||
|
double c = cvf::UNDEFINED_DOUBLE;
|
||||||
|
if (m_unitForCalculation == RimDefines::UNITS_METRIC) c = 0.00852702;
|
||||||
|
if (m_unitForCalculation == RimDefines::UNITS_FIELD) c = 0.00112712;
|
||||||
|
|
||||||
|
// TODO: Use value from RimReservoirCellResultsStorage?
|
||||||
|
|
||||||
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -822,14 +841,8 @@ double RigFractureTransCalc::calculateMatrixTransmissibility(double perm, double
|
|||||||
{
|
{
|
||||||
double transmissibility;
|
double transmissibility;
|
||||||
|
|
||||||
double c = cvf::UNDEFINED_DOUBLE;
|
|
||||||
if (m_unitForCalculation == RimDefines::UNITS_METRIC) c = 0.00852702;
|
|
||||||
if (m_unitForCalculation == RimDefines::UNITS_FIELD) c = 0.00112712;
|
|
||||||
// TODO: Use value from RimReservoirCellResultsStorage?
|
|
||||||
|
|
||||||
|
|
||||||
double slDivPi = (skinfactor * fractureAreaWeightedlength) / cvf::PI_D;
|
double slDivPi = (skinfactor * fractureAreaWeightedlength) / cvf::PI_D;
|
||||||
transmissibility = 8 * c * (perm * NTG) * A / (cellSizeLength + slDivPi);
|
transmissibility = 8 * cDarcy() * (perm * NTG) * A / (cellSizeLength + slDivPi);
|
||||||
|
|
||||||
return transmissibility;
|
return transmissibility;
|
||||||
}
|
}
|
||||||
|
@ -56,11 +56,13 @@ public:
|
|||||||
double computeAHupscale(RimStimPlanFractureTemplate* fracTemplateStimPlan, std::vector<RigStimPlanCell> stimPlanCells, std::vector<cvf::Vec3d> planeCellPolygon, cvf::Vec3d directionAlongLayers, cvf::Vec3d directionAcrossLayers);
|
double computeAHupscale(RimStimPlanFractureTemplate* fracTemplateStimPlan, std::vector<RigStimPlanCell> stimPlanCells, std::vector<cvf::Vec3d> planeCellPolygon, cvf::Vec3d directionAlongLayers, cvf::Vec3d directionAcrossLayers);
|
||||||
|
|
||||||
static double arithmeticAverage(std::vector<double> values);
|
static double arithmeticAverage(std::vector<double> values);
|
||||||
|
double cDarcy();
|
||||||
|
|
||||||
void calculateStimPlanCellsMatrixTransmissibility(RigStimPlanCell* stimPlanCell, RigFractureStimPlanCellData* fracStimPlanCellData);
|
void calculateStimPlanCellsMatrixTransmissibility(RigStimPlanCell* stimPlanCell, RigFractureStimPlanCellData* fracStimPlanCellData);
|
||||||
|
|
||||||
static void computeStimPlanCellTransmissibilityInFracture(RigStimPlanCell* stimPlanCell);
|
static void computeStimPlanCellTransmissibilityInFracture(RigStimPlanCell* stimPlanCell);
|
||||||
void computeFlowIntoTransverseWell();
|
double computeRadialTransmissibilityToWell(RigStimPlanCell* stimPlanCell);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static std::vector<RigStimPlanCell*> getRowOfStimPlanCells(std::vector<RigStimPlanCell> allStimPlanCells, size_t i);
|
static std::vector<RigStimPlanCell*> getRowOfStimPlanCells(std::vector<RigStimPlanCell> allStimPlanCells, size_t i);
|
||||||
|
@ -53,4 +53,20 @@ void RigStimPlanCell::setTransmissibilityInFracture(double valueHorizontal, doub
|
|||||||
m_transmissibilityInFractureVertical = valueVertical;
|
m_transmissibilityInFractureVertical = valueVertical;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
double RigStimPlanCell::cellSizeX()
|
||||||
|
{
|
||||||
|
//The polygon corners are always stored in the same order
|
||||||
|
return (m_polygon[1] - m_polygon[0]).length();
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
double RigStimPlanCell::cellSizeZ()
|
||||||
|
{
|
||||||
|
return (m_polygon[2] - m_polygon[1]).length();
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -50,6 +50,8 @@ public:
|
|||||||
void setDisplayValue(double value) { m_displayValue = value; };
|
void setDisplayValue(double value) { m_displayValue = value; };
|
||||||
void setTransmissibilityInFracture(double valueHorizontal, double valueVertical);
|
void setTransmissibilityInFracture(double valueHorizontal, double valueVertical);
|
||||||
|
|
||||||
|
double cellSizeX();
|
||||||
|
double cellSizeZ();
|
||||||
private:
|
private:
|
||||||
std::vector<cvf::Vec3d> m_polygon;
|
std::vector<cvf::Vec3d> m_polygon;
|
||||||
double m_displayValue;
|
double m_displayValue;
|
||||||
|
Loading…
Reference in New Issue
Block a user