mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#2455 Non-Darcy Flow : Add fields to fracture template
This commit is contained in:
parent
6b246f4671
commit
ac96824640
@ -339,6 +339,8 @@ std::vector<RigCompletionData> RicExportFractureCompletionsImpl::generateCompdat
|
|||||||
/////
|
/////
|
||||||
// Insert total transmissibility from eclipse-cell to well for this fracture into the map
|
// 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();
|
std::set<RigTransmissibilityCondenser::CellAddress> externalCells = transCondenser.externalCells();
|
||||||
for (RigTransmissibilityCondenser::CellAddress externalCell : externalCells)
|
for (RigTransmissibilityCondenser::CellAddress externalCell : externalCells)
|
||||||
{
|
{
|
||||||
@ -354,10 +356,43 @@ std::vector<RigCompletionData> RicExportFractureCompletionsImpl::generateCompdat
|
|||||||
|
|
||||||
compDat.setFromFracture(trans, fracture->fractureTemplate()->skinFactor());
|
compDat.setFromFracture(trans, fracture->fractureTemplate()->skinFactor());
|
||||||
compDat.addMetadata(fracture->name(), QString::number(trans));
|
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 )
|
if ( outputStreamForIntermediateResultsText )
|
||||||
{
|
{
|
||||||
(*outputStreamForIntermediateResultsText) << "\n" << "\n" << "\n----------- All Transimissibilities " << fracture->name() << " -------------------- \n\n";
|
(*outputStreamForIntermediateResultsText) << "\n" << "\n" << "\n----------- All Transimissibilities " << fracture->name() << " -------------------- \n\n";
|
||||||
|
@ -325,6 +325,7 @@ RigCompletionData
|
|||||||
const RicExportCompletionDataSettingsUi& settings)
|
const RicExportCompletionDataSettingsUi& settings)
|
||||||
{
|
{
|
||||||
CVF_ASSERT(!completions.empty());
|
CVF_ASSERT(!completions.empty());
|
||||||
|
|
||||||
QString wellName = completions[0].wellName();
|
QString wellName = completions[0].wellName();
|
||||||
RigCompletionDataGridCell cellIndexIJK = completions[0].completionDataGridCell();
|
RigCompletionDataGridCell cellIndexIJK = completions[0].completionDataGridCell();
|
||||||
RigCompletionData::CompletionType completionType = completions[0].completionType();
|
RigCompletionData::CompletionType completionType = completions[0].completionType();
|
||||||
@ -349,6 +350,10 @@ RigCompletionData
|
|||||||
RigCompletionData resultCompletion(wellName, cellIndexIJK, completions[0].firstOrderingValue());
|
RigCompletionData resultCompletion(wellName, cellIndexIJK, completions[0].firstOrderingValue());
|
||||||
resultCompletion.setSecondOrderingValue(completions[0].secondOrderingValue());
|
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;
|
double totalTrans = 0.0;
|
||||||
|
|
||||||
for (const RigCompletionData& completion : completions)
|
for (const RigCompletionData& completion : completions)
|
||||||
@ -634,13 +639,19 @@ void RicWellPathExportCompletionDataFeatureImpl::generateCompdatTable(RifEclipse
|
|||||||
case SHUT: formatter.add("SHUT"); break;
|
case SHUT: formatter.add("SHUT"); break;
|
||||||
case AUTO: formatter.add("AUTO"); break;
|
case AUTO: formatter.add("AUTO"); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RigCompletionData::isDefaultValue(data.saturation()))
|
if (RigCompletionData::isDefaultValue(data.saturation()))
|
||||||
formatter.add("1*");
|
formatter.add("1*");
|
||||||
else
|
else
|
||||||
formatter.add(data.saturation());
|
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()))
|
if (RigCompletionData::isDefaultValue(data.diameter()))
|
||||||
formatter.add("1*");
|
formatter.add("1*");
|
||||||
@ -657,7 +668,7 @@ void RicWellPathExportCompletionDataFeatureImpl::generateCompdatTable(RifEclipse
|
|||||||
if (RigCompletionData::isDefaultValue(data.dFactor()))
|
if (RigCompletionData::isDefaultValue(data.dFactor()))
|
||||||
formatter.add("1*");
|
formatter.add("1*");
|
||||||
else
|
else
|
||||||
formatter.add(data.dFactor());
|
formatter.add(-data.dFactor());
|
||||||
|
|
||||||
switch (data.direction())
|
switch (data.direction())
|
||||||
{
|
{
|
||||||
|
@ -178,6 +178,22 @@ void RigCompletionData::setCombinedValuesImplicitTransWPImult(double wpi
|
|||||||
m_diameter = wellDiameter;
|
m_diameter = wellDiameter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RigCompletionData::setDFactor(double dFactor)
|
||||||
|
{
|
||||||
|
m_dFactor = dFactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RigCompletionData::setKh(double kh)
|
||||||
|
{
|
||||||
|
m_kh = kh;
|
||||||
|
}
|
||||||
|
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
///
|
///
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
|
@ -97,6 +97,9 @@ public:
|
|||||||
double wellDiameter,
|
double wellDiameter,
|
||||||
CompletionType completionType);
|
CompletionType completionType);
|
||||||
|
|
||||||
|
void setDFactor(double dFactor);
|
||||||
|
void setKh(double kh);
|
||||||
|
|
||||||
void addMetadata(const QString& name, const QString& comment);
|
void addMetadata(const QString& name, const QString& comment);
|
||||||
static bool isDefaultValue(double val);
|
static bool isDefaultValue(double val);
|
||||||
|
|
||||||
|
@ -76,8 +76,8 @@ namespace caf
|
|||||||
void caf::AppEnum<RimFractureTemplate::NonDarcyFlowEnum>::setUp()
|
void caf::AppEnum<RimFractureTemplate::NonDarcyFlowEnum>::setUp()
|
||||||
{
|
{
|
||||||
addItem(RimFractureTemplate::NON_DARCY_NONE, "None", "None");
|
addItem(RimFractureTemplate::NON_DARCY_NONE, "None", "None");
|
||||||
addItem(RimFractureTemplate::NON_DARCY_COMPUTED, "Computed", "Computed by Parameters");
|
addItem(RimFractureTemplate::NON_DARCY_COMPUTED, "Computed", "Compute D-factor from Parameters");
|
||||||
addItem(RimFractureTemplate::NON_DARCY_USER_DEFINED, "UserDefined", "User Defined Value");
|
addItem(RimFractureTemplate::NON_DARCY_USER_DEFINED, "UserDefined", "By User Defined D-factor");
|
||||||
|
|
||||||
setDefault(RimFractureTemplate::NON_DARCY_NONE);
|
setDefault(RimFractureTemplate::NON_DARCY_NONE);
|
||||||
}
|
}
|
||||||
@ -134,7 +134,7 @@ RimFractureTemplate::RimFractureTemplate()
|
|||||||
CAF_PDM_InitField(&m_gasViscosity, "GasViscosity", 0.02, "<html>Gas Viscosity (μ)</html>", "", "Gas viscosity at bottom hole pressure", "");
|
CAF_PDM_InitField(&m_gasViscosity, "GasViscosity", 0.02, "<html>Gas Viscosity (μ)</html>", "", "Gas viscosity at bottom hole pressure", "");
|
||||||
|
|
||||||
CAF_PDM_InitFieldNoDefault(&m_dFactorDisplayField, "dFactorDisplayField", "D Factor", "", "", "");
|
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);
|
m_dFactorDisplayField.uiCapability()->setUiReadOnly(true);
|
||||||
|
|
||||||
CAF_PDM_InitFieldNoDefault(&m_dFactorSummaryText, "dFactorSummaryText", "D Factor Summary", "", "", "");
|
CAF_PDM_InitFieldNoDefault(&m_dFactorSummaryText, "dFactorSummaryText", "D Factor Summary", "", "", "");
|
||||||
@ -438,8 +438,6 @@ void RimFractureTemplate::prepareFieldsForUiDisplay()
|
|||||||
m_fractureWidth.uiCapability()->setUiReadOnly(true);
|
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_relativePermeability.uiCapability()->setUiHidden(true);
|
||||||
@ -450,7 +448,6 @@ void RimFractureTemplate::prepareFieldsForUiDisplay()
|
|||||||
m_relativePermeability.uiCapability()->setUiHidden(false);
|
m_relativePermeability.uiCapability()->setUiHidden(false);
|
||||||
m_userDefinedEffectivePermeability.uiCapability()->setUiHidden(true);
|
m_userDefinedEffectivePermeability.uiCapability()->setUiHidden(true);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -460,8 +457,8 @@ QString RimFractureTemplate::dFactorSummary() const
|
|||||||
{
|
{
|
||||||
QString text;
|
QString text;
|
||||||
|
|
||||||
auto dFactor = computeDFactor();
|
auto val = dFactor();
|
||||||
text += QString("D-factor : %1").arg(dFactor);
|
text += QString("D-factor : %1").arg(val);
|
||||||
|
|
||||||
text += "<br>";
|
text += "<br>";
|
||||||
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)
|
if (m_nonDarcyFlowType == RimFractureTemplate::NON_DARCY_USER_DEFINED)
|
||||||
{
|
{
|
||||||
@ -541,6 +538,14 @@ double RimFractureTemplate::computeDFactor() const
|
|||||||
return numerator / denumerator;
|
return numerator / denumerator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
double RimFractureTemplate::kh() const
|
||||||
|
{
|
||||||
|
return effectivePermeability() * fractureWidth();
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -648,3 +653,11 @@ void RimFractureTemplate::setDefaultWellDiameterFromUnit()
|
|||||||
m_wellDiameter = 0.216;
|
m_wellDiameter = 0.216;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
bool RimFractureTemplate::isNonDarcyFlowEnabled() const
|
||||||
|
{
|
||||||
|
return m_nonDarcyFlowType() != RimFractureTemplate::NON_DARCY_NONE;
|
||||||
|
}
|
||||||
|
@ -125,6 +125,10 @@ public:
|
|||||||
void setFractureTemplateUnit(RiaEclipseUnitTools::UnitSystemType unitSystem);
|
void setFractureTemplateUnit(RiaEclipseUnitTools::UnitSystemType unitSystem);
|
||||||
void setDefaultWellDiameterFromUnit();
|
void setDefaultWellDiameterFromUnit();
|
||||||
|
|
||||||
|
bool isNonDarcyFlowEnabled() const;
|
||||||
|
double dFactor() const;
|
||||||
|
double kh() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual caf::PdmFieldHandle* userDescriptionField() override;
|
virtual caf::PdmFieldHandle* userDescriptionField() override;
|
||||||
virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override;
|
virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override;
|
||||||
@ -138,7 +142,6 @@ private:
|
|||||||
QString dFactorSummary() const;
|
QString dFactorSummary() const;
|
||||||
double effectivePermeability() const;
|
double effectivePermeability() const;
|
||||||
|
|
||||||
double computeDFactor() const;
|
|
||||||
double fractureWidth() const;
|
double fractureWidth() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
Loading…
Reference in New Issue
Block a user