#2455 Non-Darcy Flow : Add fields to fracture template

This commit is contained in:
Magne Sjaastad 2018-02-16 07:58:07 +01:00
parent 6b246f4671
commit ac96824640
6 changed files with 104 additions and 23 deletions

View File

@ -339,6 +339,8 @@ std::vector<RigCompletionData> RicExportFractureCompletionsImpl::generateCompdat
/////
// Insert total transmissibility from eclipse-cell to well for this fracture into the map
std::vector<RigCompletionData> allCompletionsForOneFracture;
std::set<RigTransmissibilityCondenser::CellAddress> externalCells = transCondenser.externalCells();
for (RigTransmissibilityCondenser::CellAddress externalCell : externalCells)
{
@ -354,10 +356,43 @@ std::vector<RigCompletionData> 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";

View File

@ -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())
{

View File

@ -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;
}
//==================================================================================================
///
//==================================================================================================

View File

@ -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);

View File

@ -76,8 +76,8 @@ namespace caf
void caf::AppEnum<RimFractureTemplate::NonDarcyFlowEnum>::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, "<html>Gas Viscosity (&mu;)</html>", "", "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 += "<br>";
text += "<br>";
@ -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;
}

View File

@ -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: