From 03c7df7b3bb741ee7c174c571e38fef9fdc6b17b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Fri, 19 May 2017 10:16:30 +0200 Subject: [PATCH] #1487 Collect all fracture transmissibility equations into one class --- .../ReservoirDataModel/CMakeLists_files.cmake | 2 + .../RigFractureTransmissibilityEquations.cpp | 110 ++++++++++++++++++ .../RigFractureTransmissibilityEquations.h | 55 +++++++++ 3 files changed, 167 insertions(+) create mode 100644 ApplicationCode/ReservoirDataModel/RigFractureTransmissibilityEquations.cpp create mode 100644 ApplicationCode/ReservoirDataModel/RigFractureTransmissibilityEquations.h diff --git a/ApplicationCode/ReservoirDataModel/CMakeLists_files.cmake b/ApplicationCode/ReservoirDataModel/CMakeLists_files.cmake index d988d4039c..88e4a005ed 100644 --- a/ApplicationCode/ReservoirDataModel/CMakeLists_files.cmake +++ b/ApplicationCode/ReservoirDataModel/CMakeLists_files.cmake @@ -55,6 +55,7 @@ ${CEE_CURRENT_LIST_DIR}RigLasFileExporter.h ${CEE_CURRENT_LIST_DIR}RigSimulationWellCoordsAndMD.h ${CEE_CURRENT_LIST_DIR}RigFracture.h ${CEE_CURRENT_LIST_DIR}RigFractureTransCalc.h +${CEE_CURRENT_LIST_DIR}RigFractureTransmissibilityEquations.h ${CEE_CURRENT_LIST_DIR}RigTesselatorTools.h ${CEE_CURRENT_LIST_DIR}RigCellGeometryTools.h ${CEE_CURRENT_LIST_DIR}RigStimPlanFractureDefinition.h @@ -110,6 +111,7 @@ ${CEE_CURRENT_LIST_DIR}RigLasFileExporter.cpp ${CEE_CURRENT_LIST_DIR}RigSimulationWellCoordsAndMD.cpp ${CEE_CURRENT_LIST_DIR}RigFracture.cpp ${CEE_CURRENT_LIST_DIR}RigFractureTransCalc.cpp +${CEE_CURRENT_LIST_DIR}RigFractureTransmissibilityEquations.cpp ${CEE_CURRENT_LIST_DIR}RigTesselatorTools.cpp ${CEE_CURRENT_LIST_DIR}RigCellGeometryTools.cpp ${CEE_CURRENT_LIST_DIR}RigStimPlanFractureDefinition.cpp diff --git a/ApplicationCode/ReservoirDataModel/RigFractureTransmissibilityEquations.cpp b/ApplicationCode/ReservoirDataModel/RigFractureTransmissibilityEquations.cpp new file mode 100644 index 0000000000..b798535715 --- /dev/null +++ b/ApplicationCode/ReservoirDataModel/RigFractureTransmissibilityEquations.cpp @@ -0,0 +1,110 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2017- Statoil ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RigFractureTransmissibilityEquations.h" +#include "cvfBase.h" +#include "cvfMath.h" +#include + + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigFractureTransmissibilityEquations::computeStimPlanCellTransmissibilityInFracture(double conductivity, double sideLengthParallellTrans, double sideLengthNormalTrans) +{ + double transmissibility = conductivity * sideLengthNormalTrans / (sideLengthParallellTrans / 2); + return transmissibility; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigFractureTransmissibilityEquations::computeRadialTransmissibilityToWellinStimPlanCell(double stimPlanCellConductivity, + double stimPlanCellSizeX, + double stimPlanCellSizeZ, + double wellRadius, + double skinFactor, + double fractureAzimuth, + double wellAzimuthAtFracturePosition, + double cDarcyForRelevantUnit) +{ + double areaScalingFactor = 1.0; + + double angleinRad = cvf::Math::toRadians(fractureAzimuth - (wellAzimuthAtFracturePosition - 90)); + if ((angleinRad-90.0) > 0.01) + { + areaScalingFactor = 1 / cvf::Math::cos(angleinRad); + } + + double ro = 0.14 * cvf::Math::sqrt( + pow(stimPlanCellSizeX, 2.0) + pow(stimPlanCellSizeZ, 2)); + + double Tc = 2 * cvf::PI_D * cDarcyForRelevantUnit * stimPlanCellConductivity / + (log(ro / wellRadius) + skinFactor ); + + Tc = Tc * areaScalingFactor; + + return Tc; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigFractureTransmissibilityEquations::computeLinearTransmissibilityToWellinStimPlanCell(double stimPlanConductivity, + double stimPlanCellSizeX, + double stimPlanCellSizeZ, + double perforationLengthVertical, + double perforationLengthHorizontal, + double perforationEfficiency, + double skinfactor, + double cDarcyForRelevantUnit) +{ + double TcPrefix = 8 * cDarcyForRelevantUnit * stimPlanConductivity; + + double DzPerf = perforationLengthVertical * perforationEfficiency; + double DxPerf = perforationLengthHorizontal * perforationEfficiency; + + double TcZ = TcPrefix * DzPerf / + (stimPlanCellSizeX + skinfactor * DzPerf / cvf::PI_D); + + double TcX = TcPrefix * DxPerf / + (stimPlanCellSizeZ + skinfactor* DxPerf / cvf::PI_D); + + double Tc = cvf::Math::sqrt(pow(TcX, 2) + pow(TcZ, 2)); + return Tc; +} + + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigFractureTransmissibilityEquations::calculateMatrixTransmissibility(double perm, + double NTG, + double A, + double cellSizeLength, + double skinfactor, + double fractureAreaWeightedlength, + double cDarcy) +{ + double transmissibility; + + double slDivPi = (skinfactor * fractureAreaWeightedlength) / cvf::PI_D; + transmissibility = 8 * cDarcy * (perm * NTG) * A / (cellSizeLength + slDivPi); + + return transmissibility; +} diff --git a/ApplicationCode/ReservoirDataModel/RigFractureTransmissibilityEquations.h b/ApplicationCode/ReservoirDataModel/RigFractureTransmissibilityEquations.h new file mode 100644 index 0000000000..7e94f8804f --- /dev/null +++ b/ApplicationCode/ReservoirDataModel/RigFractureTransmissibilityEquations.h @@ -0,0 +1,55 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2017- Statoil ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + + +class RigFractureTransmissibilityEquations +{ +public: + static double computeStimPlanCellTransmissibilityInFracture(double conductivity, + double sideLengthParallellTrans, + double sideLengthNormalTrans); + + static double computeRadialTransmissibilityToWellinStimPlanCell(double stimPlanCellConductivity, + double stimPlanCellSizeX, + double stimPlanCellSizeZ, + double wellRadius, + double skinFactor, + double fractureAzimuth, + double wellAzimuthAtFracturePosition, + double cDarcyForRelevantUnit); + + static double computeLinearTransmissibilityToWellinStimPlanCell(double stimPlanConductivity, + double stimPlanCellSizeX, + double stimPlanCellSizeZ, + double perforationLengthVertical, + double perforationLengthHorizontal, + double perforationEfficiency, + double skinfactor, + double cDarcyForRelevantUnit); + static double calculateMatrixTransmissibility(double permX, + double NTG, + double Ay, + double dx, + double skinfactor, + double fractureAreaWeightedlength, + double cDarcy); + +}; +