diff --git a/ApplicationCode/Commands/CompletionExportCommands/RicFishbonesTransmissibilityCalculationFeatureImp.cpp b/ApplicationCode/Commands/CompletionExportCommands/RicFishbonesTransmissibilityCalculationFeatureImp.cpp index 80a49e9def..378d19cc8b 100644 --- a/ApplicationCode/Commands/CompletionExportCommands/RicFishbonesTransmissibilityCalculationFeatureImp.cpp +++ b/ApplicationCode/Commands/CompletionExportCommands/RicFishbonesTransmissibilityCalculationFeatureImp.cpp @@ -131,7 +131,7 @@ std::vector { // No change in transmissibility for main bore auto transmissibilityAndPermeability = - RicWellPathExportCompletionDataFeatureImpl::calculateTransmissibilityAndKh( + RicWellPathExportCompletionDataFeatureImpl::calculateTransmissibilityData( settings.caseToApply, wellPath, wellBorePart.lengthsInCell, @@ -140,13 +140,13 @@ std::vector globalCellIndex, settings.useLateralNTG); - transmissibility = transmissibilityAndPermeability.first; + transmissibility = transmissibilityAndPermeability.connectionFactor(); } else { // Adjust transmissibility for fishbone laterals auto transmissibilityAndPermeability = - RicWellPathExportCompletionDataFeatureImpl::calculateTransmissibilityAndKh( + RicWellPathExportCompletionDataFeatureImpl::calculateTransmissibilityData( settings.caseToApply, wellPath, wellBorePart.lengthsInCell, @@ -157,7 +157,7 @@ std::vector numberOfLaterals, mainBoreDirection); - transmissibility = transmissibilityAndPermeability.first; + transmissibility = transmissibilityAndPermeability.connectionFactor(); } CellDirection direction = RicWellPathExportCompletionDataFeatureImpl::calculateCellMainDirection( diff --git a/ApplicationCode/Commands/CompletionExportCommands/RicWellPathExportCompletionDataFeatureImpl.cpp b/ApplicationCode/Commands/CompletionExportCommands/RicWellPathExportCompletionDataFeatureImpl.cpp index c0eb5cba36..d487e3bfb2 100644 --- a/ApplicationCode/Commands/CompletionExportCommands/RicWellPathExportCompletionDataFeatureImpl.cpp +++ b/ApplicationCode/Commands/CompletionExportCommands/RicWellPathExportCompletionDataFeatureImpl.cpp @@ -1682,30 +1682,32 @@ std::vector RicWellPathExportCompletionDataFeatureImpl::gener double dFactor = RigCompletionData::defaultValue(); { - auto transmissibilityAndKh = calculateTransmissibilityAndKh(settings.caseToApply, - wellPath, - cell.intersectionLengthsInCellCS, - interval->skinFactor(), - interval->diameter(unitSystem) / 2, - cell.globCellIndex, - settings.useLateralNTG); + auto transmissibilityData = calculateTransmissibilityData(settings.caseToApply, + wellPath, + cell.intersectionLengthsInCellCS, + interval->skinFactor(), + interval->diameter(unitSystem) / 2, + cell.globCellIndex, + settings.useLateralNTG); - transmissibility = transmissibilityAndKh.first; + transmissibility = transmissibilityData.connectionFactor(); if (nonDarcyParameters->nonDarcyFlowType() == RimNonDarcyPerforationParameters::NON_DARCY_USER_DEFINED) { - kh = transmissibilityAndKh.second; + kh = transmissibilityData.kh(); dFactor = nonDarcyParameters->userDefinedDFactor(); } else if (nonDarcyParameters->nonDarcyFlowType() == RimNonDarcyPerforationParameters::NON_DARCY_COMPUTED) { - kh = transmissibilityAndKh.second; + kh = transmissibilityData.kh(); + + const double effectiveH = transmissibilityData.effectiveH(); const double effectivePermeability = - kh * nonDarcyParameters->gridPermeabilityScalingFactor() / cell.intersectionLengthsInCellCS.length(); + nonDarcyParameters->gridPermeabilityScalingFactor() * transmissibilityData.effectiveK(); dFactor = calculateDFactor(settings.caseToApply, - cell.intersectionLengthsInCellCS, + effectiveH, cell.globCellIndex, wellPath->perforationIntervalCollection()->nonDarcyParameters(), effectivePermeability); @@ -2318,16 +2320,16 @@ CellDirection RicWellPathExportCompletionDataFeatureImpl::calculateCellMainDirec //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::pair - RicWellPathExportCompletionDataFeatureImpl::calculateTransmissibilityAndKh(RimEclipseCase* eclipseCase, - const RimWellPath* wellPath, - const cvf::Vec3d& internalCellLengths, - double skinFactor, - double wellRadius, - size_t globalCellIndex, - bool useLateralNTG, - size_t volumeScaleConstant, - CellDirection directionForVolumeScaling) +TransmissibilityData + RicWellPathExportCompletionDataFeatureImpl::calculateTransmissibilityData(RimEclipseCase* eclipseCase, + const RimWellPath* wellPath, + const cvf::Vec3d& internalCellLengths, + double skinFactor, + double wellRadius, + size_t globalCellIndex, + bool useLateralNTG, + size_t volumeScaleConstant, + CellDirection directionForVolumeScaling) { RigEclipseCaseData* eclipseCaseData = eclipseCase->eclipseCaseData(); @@ -2354,7 +2356,7 @@ std::pair if (dxAccessObject.isNull() || dyAccessObject.isNull() || dzAccessObject.isNull() || permxAccessObject.isNull() || permyAccessObject.isNull() || permzAccessObject.isNull()) { - return std::make_pair(std::numeric_limits::infinity(), std::numeric_limits::infinity()); + return TransmissibilityData(); } double ntg = 1.0; @@ -2379,7 +2381,10 @@ std::pair double permy = permyAccessObject->cellScalarGlobIdx(globalCellIndex); double permz = permzAccessObject->cellScalarGlobIdx(globalCellIndex); - const double totalKh = RigTransmissibilityEquations::totalPermeability(permx, permy, permz, internalCellLengths, latNtg, ntg); + const double totalKh = RigTransmissibilityEquations::totalKh(permx, permy, permz, internalCellLengths, latNtg, ntg); + + const double effectiveK = RigTransmissibilityEquations::effectiveK(permx, permy, permz, internalCellLengths, latNtg, ntg); + const double effectiveH = RigTransmissibilityEquations::effectiveH(internalCellLengths, latNtg, ntg); double darcy = RiaEclipseUnitTools::darcysConstant(wellPath->unitSystem()); @@ -2399,14 +2404,16 @@ std::pair const double totalConnectionFactor = RigTransmissibilityEquations::totalConnectionFactor(transx, transy, transz); - return std::make_pair(totalConnectionFactor, totalKh); + TransmissibilityData trData; + trData.setData(effectiveH, effectiveK, totalConnectionFactor, totalKh); + return trData; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- double RicWellPathExportCompletionDataFeatureImpl::calculateDFactor(RimEclipseCase* eclipseCase, - const cvf::Vec3d& internalCellLengths, + double effectiveH, size_t globalCellIndex, const RimNonDarcyPerforationParameters* nonDarcyParameters, const double effectivePermeability) @@ -2443,7 +2450,7 @@ double RicWellPathExportCompletionDataFeatureImpl::calculateDFactor(RimEclipseCa return EQ::dFactor(alpha, betaFactor, effectivePermeability, - internalCellLengths.length(), + effectiveH, nonDarcyParameters->wellRadius(), nonDarcyParameters->relativeGasDensity(), nonDarcyParameters->gasViscosity()); diff --git a/ApplicationCode/Commands/CompletionExportCommands/RicWellPathExportCompletionDataFeatureImpl.h b/ApplicationCode/Commands/CompletionExportCommands/RicWellPathExportCompletionDataFeatureImpl.h index 08dd321294..16e8d96df6 100644 --- a/ApplicationCode/Commands/CompletionExportCommands/RicWellPathExportCompletionDataFeatureImpl.h +++ b/ApplicationCode/Commands/CompletionExportCommands/RicWellPathExportCompletionDataFeatureImpl.h @@ -51,6 +51,59 @@ class SubSegmentIntersectionInfo; //================================================================================================== typedef std::shared_ptr QFilePtr; +class TransmissibilityData +{ +public: + TransmissibilityData() + : m_isValid(false) + , m_effectiveH(0.0) + , m_effectiveK(0.0) + , m_connectionFactor(0.0) + , m_kh(0.0) + { + } + + bool isValid() const + { + return m_isValid; + } + + void setData(double effectiveH, double effectiveK, double connectionFactor, double kh) + { + m_isValid = true; + + m_effectiveH = effectiveH; + m_effectiveK = effectiveK; + m_connectionFactor = connectionFactor; + m_kh = kh; + } + + double effectiveH() const + { + return m_effectiveH; + } + + double effectiveK() const + { + return m_effectiveK; + } + double connectionFactor() const + { + return m_connectionFactor; + } + double kh() const + { + return m_kh; + } + +private: + bool m_isValid; + double m_effectiveH; + double m_effectiveK; + double m_connectionFactor; + double m_kh; +}; + //================================================================================================== /// //================================================================================================== @@ -82,8 +135,8 @@ public: size_t globalCellIndex, const cvf::Vec3d& lengthsInCell); - static std::pair - calculateTransmissibilityAndKh(RimEclipseCase* eclipseCase, + static TransmissibilityData + calculateTransmissibilityData(RimEclipseCase* eclipseCase, const RimWellPath* wellPath, const cvf::Vec3d& internalCellLengths, double skinFactor, @@ -94,7 +147,7 @@ public: CellDirection directionForVolumeScaling = CellDirection::DIR_I); static double calculateDFactor(RimEclipseCase* eclipseCase, - const cvf::Vec3d& internalCellLengths, + double effectiveH, size_t globalCellIndex, const RimNonDarcyPerforationParameters* nonDarcyParameters, const double effectivePermeability);