From ac96824640c7e492467ea0c16b0ae71b4ce09492 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 16 Feb 2018 07:58:07 +0100 Subject: [PATCH] #2455 Non-Darcy Flow : Add fields to fracture template --- .../RicExportFractureCompletionsImpl.cpp | 37 ++++++++++++++- ...ellPathExportCompletionDataFeatureImpl.cpp | 17 +++++-- .../RigCompletionData.cpp | 18 ++++++- .../RigCompletionData.h | 3 ++ .../Completions/RimFractureTemplate.cpp | 47 ++++++++++++------- .../Completions/RimFractureTemplate.h | 5 +- 6 files changed, 104 insertions(+), 23 deletions(-) diff --git a/ApplicationCode/Commands/CompletionExportCommands/RicExportFractureCompletionsImpl.cpp b/ApplicationCode/Commands/CompletionExportCommands/RicExportFractureCompletionsImpl.cpp index 6a75be05f1..10645c68f1 100644 --- a/ApplicationCode/Commands/CompletionExportCommands/RicExportFractureCompletionsImpl.cpp +++ b/ApplicationCode/Commands/CompletionExportCommands/RicExportFractureCompletionsImpl.cpp @@ -339,6 +339,8 @@ std::vector RicExportFractureCompletionsImpl::generateCompdat ///// // Insert total transmissibility from eclipse-cell to well for this fracture into the map + std::vector allCompletionsForOneFracture; + std::set externalCells = transCondenser.externalCells(); for (RigTransmissibilityCondenser::CellAddress externalCell : externalCells) { @@ -354,10 +356,43 @@ std::vector RicExportFractureCompletionsImpl::generateCompdat compDat.setFromFracture(trans, fracture->fractureTemplate()->skinFactor()); compDat.addMetadata(fracture->name(), QString::number(trans)); - fractureCompletions.push_back(compDat); + allCompletionsForOneFracture.push_back(compDat); } } + ///// + // Compute Non-Dracy Flow parameters + + if (fracture->fractureTemplate()->isNonDarcyFlowEnabled()) + { + double dFactorForFracture = fracture->fractureTemplate()->dFactor(); + double khForFracture = fracture->fractureTemplate()->kh(); + + double sumOfTransmissibilitiesInFracture = 0.0; + for (const auto& c : allCompletionsForOneFracture) + { + sumOfTransmissibilitiesInFracture += c.transmissibility(); + } + + if (fabs(sumOfTransmissibilitiesInFracture) > 1e-10) + { + for (auto& c : allCompletionsForOneFracture) + { + if (fabs(c.transmissibility()) > 1e-10) + { + double dFactorForOneConnection = dFactorForFracture * sumOfTransmissibilitiesInFracture / c.transmissibility(); + c.setDFactor(dFactorForOneConnection); + } + + double khForOneConnection = khForFracture * c.transmissibility() / sumOfTransmissibilitiesInFracture; + + c.setKh(khForOneConnection); + } + } + } + + std::copy(allCompletionsForOneFracture.begin(), allCompletionsForOneFracture.end(), std::back_inserter(fractureCompletions)); + if ( outputStreamForIntermediateResultsText ) { (*outputStreamForIntermediateResultsText) << "\n" << "\n" << "\n----------- All Transimissibilities " << fracture->name() << " -------------------- \n\n"; diff --git a/ApplicationCode/Commands/CompletionExportCommands/RicWellPathExportCompletionDataFeatureImpl.cpp b/ApplicationCode/Commands/CompletionExportCommands/RicWellPathExportCompletionDataFeatureImpl.cpp index 7e6cd83b8e..ac4fd05d07 100644 --- a/ApplicationCode/Commands/CompletionExportCommands/RicWellPathExportCompletionDataFeatureImpl.cpp +++ b/ApplicationCode/Commands/CompletionExportCommands/RicWellPathExportCompletionDataFeatureImpl.cpp @@ -325,6 +325,7 @@ RigCompletionData const RicExportCompletionDataSettingsUi& settings) { CVF_ASSERT(!completions.empty()); + QString wellName = completions[0].wellName(); RigCompletionDataGridCell cellIndexIJK = completions[0].completionDataGridCell(); RigCompletionData::CompletionType completionType = completions[0].completionType(); @@ -349,6 +350,10 @@ RigCompletionData RigCompletionData resultCompletion(wellName, cellIndexIJK, completions[0].firstOrderingValue()); resultCompletion.setSecondOrderingValue(completions[0].secondOrderingValue()); + // NOTE : Kh and DFactor is taken from the first completion + resultCompletion.setKh(completions[0].kh()); + resultCompletion.setDFactor(completions[0].dFactor()); + double totalTrans = 0.0; for (const RigCompletionData& completion : completions) @@ -634,13 +639,19 @@ void RicWellPathExportCompletionDataFeatureImpl::generateCompdatTable(RifEclipse case SHUT: formatter.add("SHUT"); break; case AUTO: formatter.add("AUTO"); break; } + if (RigCompletionData::isDefaultValue(data.saturation())) formatter.add("1*"); else formatter.add(data.saturation()); - if (RigCompletionData::isDefaultValue(data.transmissibility())) + + if (!RigCompletionData::isDefaultValue(data.dFactor()) || + RigCompletionData::isDefaultValue(data.transmissibility())) { - formatter.add("1*"); // Transmissibility + if (RigCompletionData::isDefaultValue(data.transmissibility())) + formatter.add("1*"); + else + formatter.add(data.transmissibility()); if (RigCompletionData::isDefaultValue(data.diameter())) formatter.add("1*"); @@ -657,7 +668,7 @@ void RicWellPathExportCompletionDataFeatureImpl::generateCompdatTable(RifEclipse if (RigCompletionData::isDefaultValue(data.dFactor())) formatter.add("1*"); else - formatter.add(data.dFactor()); + formatter.add(-data.dFactor()); switch (data.direction()) { diff --git a/ApplicationCode/Commands/CompletionExportCommands/RigCompletionData.cpp b/ApplicationCode/Commands/CompletionExportCommands/RigCompletionData.cpp index 6a611287d2..94b1ba0c3a 100644 --- a/ApplicationCode/Commands/CompletionExportCommands/RigCompletionData.cpp +++ b/ApplicationCode/Commands/CompletionExportCommands/RigCompletionData.cpp @@ -113,7 +113,7 @@ void RigCompletionData::setFromFracture(double transmissibility, double skinFact } //-------------------------------------------------------------------------------------------------- -/// +/// //-------------------------------------------------------------------------------------------------- void RigCompletionData::setSecondOrderingValue(double orderingValue) { @@ -178,6 +178,22 @@ void RigCompletionData::setCombinedValuesImplicitTransWPImult(double wpi m_diameter = wellDiameter; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigCompletionData::setDFactor(double dFactor) +{ + m_dFactor = dFactor; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigCompletionData::setKh(double kh) +{ + m_kh = kh; +} + //================================================================================================== /// //================================================================================================== diff --git a/ApplicationCode/Commands/CompletionExportCommands/RigCompletionData.h b/ApplicationCode/Commands/CompletionExportCommands/RigCompletionData.h index 86d5d02683..ca5226ca3b 100644 --- a/ApplicationCode/Commands/CompletionExportCommands/RigCompletionData.h +++ b/ApplicationCode/Commands/CompletionExportCommands/RigCompletionData.h @@ -97,6 +97,9 @@ public: double wellDiameter, CompletionType completionType); + void setDFactor(double dFactor); + void setKh(double kh); + void addMetadata(const QString& name, const QString& comment); static bool isDefaultValue(double val); diff --git a/ApplicationCode/ProjectDataModel/Completions/RimFractureTemplate.cpp b/ApplicationCode/ProjectDataModel/Completions/RimFractureTemplate.cpp index 162e783a97..f8c956f05c 100644 --- a/ApplicationCode/ProjectDataModel/Completions/RimFractureTemplate.cpp +++ b/ApplicationCode/ProjectDataModel/Completions/RimFractureTemplate.cpp @@ -76,8 +76,8 @@ namespace caf void caf::AppEnum::setUp() { addItem(RimFractureTemplate::NON_DARCY_NONE, "None", "None"); - addItem(RimFractureTemplate::NON_DARCY_COMPUTED, "Computed", "Computed by Parameters"); - addItem(RimFractureTemplate::NON_DARCY_USER_DEFINED, "UserDefined", "User Defined Value"); + addItem(RimFractureTemplate::NON_DARCY_COMPUTED, "Computed", "Compute D-factor from Parameters"); + addItem(RimFractureTemplate::NON_DARCY_USER_DEFINED, "UserDefined", "By User Defined D-factor"); setDefault(RimFractureTemplate::NON_DARCY_NONE); } @@ -134,7 +134,7 @@ RimFractureTemplate::RimFractureTemplate() CAF_PDM_InitField(&m_gasViscosity, "GasViscosity", 0.02, "Gas Viscosity (μ)", "", "Gas viscosity at bottom hole pressure", ""); CAF_PDM_InitFieldNoDefault(&m_dFactorDisplayField, "dFactorDisplayField", "D Factor", "", "", ""); - m_dFactorDisplayField.registerGetMethod(this, &RimFractureTemplate::computeDFactor); + m_dFactorDisplayField.registerGetMethod(this, &RimFractureTemplate::dFactor); m_dFactorDisplayField.uiCapability()->setUiReadOnly(true); CAF_PDM_InitFieldNoDefault(&m_dFactorSummaryText, "dFactorSummaryText", "D Factor Summary", "", "", ""); @@ -438,18 +438,15 @@ void RimFractureTemplate::prepareFieldsForUiDisplay() m_fractureWidth.uiCapability()->setUiReadOnly(true); } - if (hideNonDarcyFlowParams) + if (m_permeabilityType == RimFractureTemplate::USER_DEFINED_PERMEABILITY) { - if (m_permeabilityType == RimFractureTemplate::USER_DEFINED_PERMEABILITY) - { - m_relativePermeability.uiCapability()->setUiHidden(true); - m_userDefinedEffectivePermeability.uiCapability()->setUiHidden(false); - } - else - { - m_relativePermeability.uiCapability()->setUiHidden(false); - m_userDefinedEffectivePermeability.uiCapability()->setUiHidden(true); - } + m_relativePermeability.uiCapability()->setUiHidden(true); + m_userDefinedEffectivePermeability.uiCapability()->setUiHidden(false); + } + else + { + m_relativePermeability.uiCapability()->setUiHidden(false); + m_userDefinedEffectivePermeability.uiCapability()->setUiHidden(true); } } @@ -460,8 +457,8 @@ QString RimFractureTemplate::dFactorSummary() const { QString text; - auto dFactor = computeDFactor(); - text += QString("D-factor : %1").arg(dFactor); + auto val = dFactor(); + text += QString("D-factor : %1").arg(val); text += "
"; text += "
"; @@ -517,7 +514,7 @@ double RimFractureTemplate::effectivePermeability() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -double RimFractureTemplate::computeDFactor() const +double RimFractureTemplate::dFactor() const { if (m_nonDarcyFlowType == RimFractureTemplate::NON_DARCY_USER_DEFINED) { @@ -541,6 +538,14 @@ double RimFractureTemplate::computeDFactor() const return numerator / denumerator; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimFractureTemplate::kh() const +{ + return effectivePermeability() * fractureWidth(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -648,3 +653,11 @@ void RimFractureTemplate::setDefaultWellDiameterFromUnit() m_wellDiameter = 0.216; } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimFractureTemplate::isNonDarcyFlowEnabled() const +{ + return m_nonDarcyFlowType() != RimFractureTemplate::NON_DARCY_NONE; +} diff --git a/ApplicationCode/ProjectDataModel/Completions/RimFractureTemplate.h b/ApplicationCode/ProjectDataModel/Completions/RimFractureTemplate.h index 8b60fc7de6..aa7fc79b8b 100644 --- a/ApplicationCode/ProjectDataModel/Completions/RimFractureTemplate.h +++ b/ApplicationCode/ProjectDataModel/Completions/RimFractureTemplate.h @@ -125,6 +125,10 @@ public: void setFractureTemplateUnit(RiaEclipseUnitTools::UnitSystemType unitSystem); void setDefaultWellDiameterFromUnit(); + bool isNonDarcyFlowEnabled() const; + double dFactor() const; + double kh() const; + protected: virtual caf::PdmFieldHandle* userDescriptionField() override; virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override; @@ -138,7 +142,6 @@ private: QString dFactorSummary() const; double effectivePermeability() const; - double computeDFactor() const; double fractureWidth() const; protected: