#3429 Apply well radius correction to linear fracture to well transmissibility.

This commit is contained in:
Gaute Lindkvist 2018-10-01 14:35:12 +02:00
parent fcda0b9755
commit dff3a0536d
3 changed files with 38 additions and 10 deletions

View File

@ -685,7 +685,8 @@ void RicExportFractureCompletionsImpl::calculateFractureToWellTransmissibilities
intersection.hlength,
fracture->perforationEfficiency(),
fracTemplate->skinFactor(),
cDarcyInCorrectUnit);
cDarcyInCorrectUnit,
fracture->wellRadius());
}
transCondenser.addNeighborTransmissibility(

View File

@ -20,6 +20,7 @@
#include "cvfBase.h"
#include "cvfMath.h"
#include "cvfVector2.h"
#include <cmath>
@ -72,25 +73,50 @@ double RigFractureTransmissibilityEquations::fractureCellToWellRadialTrans(doubl
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
double RigFractureTransmissibilityEquations::fractureCellToWellLinearTrans(double fractureCellConductivity,
double RigFractureTransmissibilityEquations::fractureCellToWellLinearTrans(double fractureConductivity,
double fractureCellSizeX,
double fractureCellSizeZ,
double perforationLengthVertical,
double perforationLengthHorizontal,
double perforationEfficiency,
double skinfactor,
double cDarcyForRelevantUnit)
double cDarcyForRelevantUnit,
double wellRadius)
{
double TcPrefix = 8 * cDarcyForRelevantUnit * fractureCellConductivity;
const double invalidTrans = 1.0e9;
const double epsilon = 1.0e-8;
double DzPerf = perforationLengthVertical * perforationEfficiency;
double TcPrefix = 8 * cDarcyForRelevantUnit * fractureConductivity;
cvf::Vec2d wellOrientation = cvf::Vec2d(perforationLengthHorizontal, perforationLengthVertical).getNormalized();
cvf::Vec2d wellRadialVector = wellOrientation.perpendicularVector() * wellRadius;
double DzPerf = perforationLengthVertical * perforationEfficiency;
double DxPerf = perforationLengthHorizontal * perforationEfficiency;
double TcZ = TcPrefix * DzPerf /
(fractureCellSizeX + skinfactor * DzPerf / cvf::PI_D);
double TcZ = 0.0;
if (DzPerf > epsilon)
{
double effectiveFlowLengthHorizontal = fractureCellSizeX - 4.0 * std::abs(wellRadialVector.x());
double denominatorZ = effectiveFlowLengthHorizontal + skinfactor * DzPerf / cvf::PI_D;
if (denominatorZ < epsilon)
{
return invalidTrans;
}
TcZ = TcPrefix * DzPerf / denominatorZ;
}
double TcX = TcPrefix * DxPerf /
(fractureCellSizeZ + skinfactor* DxPerf / cvf::PI_D);
double TcX = 0.0;
if (DxPerf > epsilon)
{
double effectiveFlowLengthVertical = fractureCellSizeZ - 4.0 * std::abs(wellRadialVector.y());
double denominatorX = effectiveFlowLengthVertical + skinfactor * DxPerf / cvf::PI_D;
if (denominatorX < epsilon)
{
return invalidTrans;
}
TcX = TcPrefix * DxPerf / denominatorX;
}
double Tc = cvf::Math::sqrt(pow(TcX, 2) + pow(TcZ, 2));
return Tc;

View File

@ -46,7 +46,8 @@ public:
double perforationLengthHorizontal,
double perforationEfficiency,
double skinfactor,
double cDarcyForRelevantUnit);
double cDarcyForRelevantUnit,
double wellRadius);
static double matrixToFractureTrans(double permX,
double NTG,