diff --git a/ApplicationCode/Commands/CompletionExportCommands/RicExportFractureCompletionsImpl.cpp b/ApplicationCode/Commands/CompletionExportCommands/RicExportFractureCompletionsImpl.cpp index 52627c26b9..9b75b39590 100644 --- a/ApplicationCode/Commands/CompletionExportCommands/RicExportFractureCompletionsImpl.cpp +++ b/ApplicationCode/Commands/CompletionExportCommands/RicExportFractureCompletionsImpl.cpp @@ -685,7 +685,8 @@ void RicExportFractureCompletionsImpl::calculateFractureToWellTransmissibilities intersection.hlength, fracture->perforationEfficiency(), fracTemplate->skinFactor(), - cDarcyInCorrectUnit); + cDarcyInCorrectUnit, + fracture->wellRadius()); } transCondenser.addNeighborTransmissibility( diff --git a/ApplicationCode/ReservoirDataModel/Completions/RigFractureTransmissibilityEquations.cpp b/ApplicationCode/ReservoirDataModel/Completions/RigFractureTransmissibilityEquations.cpp index 6ad05545b0..509f5ab033 100644 --- a/ApplicationCode/ReservoirDataModel/Completions/RigFractureTransmissibilityEquations.cpp +++ b/ApplicationCode/ReservoirDataModel/Completions/RigFractureTransmissibilityEquations.cpp @@ -20,6 +20,7 @@ #include "cvfBase.h" #include "cvfMath.h" +#include "cvfVector2.h" #include @@ -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; diff --git a/ApplicationCode/ReservoirDataModel/Completions/RigFractureTransmissibilityEquations.h b/ApplicationCode/ReservoirDataModel/Completions/RigFractureTransmissibilityEquations.h index 16741f7871..91f180b42c 100644 --- a/ApplicationCode/ReservoirDataModel/Completions/RigFractureTransmissibilityEquations.h +++ b/ApplicationCode/ReservoirDataModel/Completions/RigFractureTransmissibilityEquations.h @@ -46,7 +46,8 @@ public: double perforationLengthHorizontal, double perforationEfficiency, double skinfactor, - double cDarcyForRelevantUnit); + double cDarcyForRelevantUnit, + double wellRadius); static double matrixToFractureTrans(double permX, double NTG,