#3670 Implement new Pressure Depletion behaviour

* Removed choice of different scaling
* Always use current pressure delta
* Use the maximum of an epsilon value and the absolute value of the matrix to well pressure drop as the scaling factor
* Remove file name suffixes and update information table in export file.
This commit is contained in:
Gaute Lindkvist
2018-11-13 16:47:53 +01:00
parent bfee1dfa64
commit 73b79daa09
13 changed files with 167 additions and 246 deletions

View File

@@ -56,9 +56,9 @@ RicfExportWellPathCompletions::RicfExportWellPathCompletions()
RICF_InitField(&m_excludeMainBoreForFishbones, "excludeMainBoreForFishbones", false, "Exclude Main Bore for Fishbones", "", "", ""); RICF_InitField(&m_excludeMainBoreForFishbones, "excludeMainBoreForFishbones", false, "Exclude Main Bore for Fishbones", "", "", "");
RICF_InitField(&m_transScalingType, "transScalingType", RicExportCompletionDataSettingsUi::TransScalingType(), "Transmissibility Scaling Type", "", "", ""); RICF_InitField(&m_performTransScaling, "performTransScaling", false, "Perform Transmissibility Scaling", "", "", "");
RICF_InitField(&m_transScalingTimeStep, "transScalingTimeStep", 0, "Transmissibility Scaling Pressure Time Step", "", "", ""); RICF_InitField(&m_transScalingTimeStep, "transScalingTimeStep", 0, "Transmissibility Scaling Pressure Time Step", "", "", "");
RICF_InitField(&m_transScalingInitialWBHP, "transScalingWBHPFromSummary", RicExportCompletionDataSettingsUi::TransScalingInitialWBHP(), "Transmissibility Scaling WBHP from summary", "", "", ""); RICF_InitField(&m_transScalingInitialWBHP, "transScalingWBHPFromSummary", RicExportCompletionDataSettingsUi::TransScalingWBHPSource(), "Transmissibility Scaling WBHP from summary", "", "", "");
RICF_InitField(&m_transScalingWBHP, "transScalingWBHP", 200.0, "Transmissibility Scaling Constant WBHP Value", "", "", ""); RICF_InitField(&m_transScalingWBHP, "transScalingWBHP", 200.0, "Transmissibility Scaling Constant WBHP Value", "", "", "");
} }
@@ -84,9 +84,9 @@ void RicfExportWellPathCompletions::execute()
exportSettings->fileSplit = m_fileSplit; exportSettings->fileSplit = m_fileSplit;
exportSettings->compdatExport = m_compdatExport; exportSettings->compdatExport = m_compdatExport;
exportSettings->transScalingType = m_transScalingType; exportSettings->performTransScaling = m_performTransScaling;
exportSettings->transScalingTimeStep = m_transScalingTimeStep; exportSettings->transScalingTimeStep = m_transScalingTimeStep;
exportSettings->transScalingInitialWBHP = m_transScalingInitialWBHP; exportSettings->transScalingWBHPSource = m_transScalingInitialWBHP;
exportSettings->transScalingWBHP = m_transScalingWBHP; exportSettings->transScalingWBHP = m_transScalingWBHP;
exportSettings->useLateralNTG = m_useLateralNTG; exportSettings->useLateralNTG = m_useLateralNTG;

View File

@@ -48,10 +48,10 @@ private:
caf::PdmField<RicExportCompletionDataSettingsUi::CompdatExportType> m_compdatExport; caf::PdmField<RicExportCompletionDataSettingsUi::CompdatExportType> m_compdatExport;
caf::PdmField<RicExportCompletionDataSettingsUi::CombinationModeType> m_combinationMode; caf::PdmField<RicExportCompletionDataSettingsUi::CombinationModeType> m_combinationMode;
caf::PdmField<RicExportCompletionDataSettingsUi::TransScalingType> m_transScalingType; caf::PdmField<bool> m_performTransScaling;
caf::PdmField<int> m_transScalingTimeStep; caf::PdmField<int> m_transScalingTimeStep;
caf::PdmField<RicExportCompletionDataSettingsUi::TransScalingInitialWBHP> m_transScalingInitialWBHP; caf::PdmField<RicExportCompletionDataSettingsUi::TransScalingWBHPSource> m_transScalingInitialWBHP;
caf::PdmField<double> m_transScalingWBHP; caf::PdmField<double> m_transScalingWBHP;
caf::PdmField<bool> m_useLateralNTG; caf::PdmField<bool> m_useLateralNTG;
caf::PdmField<bool> m_includePerforations; caf::PdmField<bool> m_includePerforations;

View File

@@ -57,23 +57,12 @@ namespace caf
} }
template<> template<>
void RicExportCompletionDataSettingsUi::TransScalingType::setUp() void RicExportCompletionDataSettingsUi::TransScalingWBHPSource::setUp()
{ {
addItem(RicExportFractureCompletionsImpl::NO_SCALING, "NO_SCALING", "No scaling"); addItem(RicExportFractureCompletionsImpl::WBHP_FROM_SUMMARY, "WBHP_SUMMARY", "WBHP From Summary Case");
addItem(RicExportFractureCompletionsImpl::MATRIX_TO_WELL_DP_OVER_INITIAL_DP, "MATWELL_DP_OVER_INITIALDP", "Matrix to Well dP over initial dP"); addItem(RicExportFractureCompletionsImpl::WBHP_FROM_USER_DEF, "WBHP_USER_DEFINED", "Fixed User Defined WBHP");
addItem(RicExportFractureCompletionsImpl::MATRIX_TO_WELL_DP_OVER_MAX_INITIAL_DP, "MATWELL_DP_OVER_MAX_INITIALDP", "Matrix to Well dP over max initial dP");
setDefault(RicExportFractureCompletionsImpl::NO_SCALING); setDefault(RicExportFractureCompletionsImpl::WBHP_FROM_SUMMARY);
}
template<>
void RicExportCompletionDataSettingsUi::TransScalingInitialWBHP::setUp()
{
addItem(RicExportFractureCompletionsImpl::FROM_PRODUCTION_START, "PROD_START", "Initial WBHP From Production Start");
addItem(RicExportFractureCompletionsImpl::FROM_PRODUCTION_START_W_MIN, "PROD_START_MIN", "Initial WBHP From Production Start With Minimum WBHP");
addItem(RicExportFractureCompletionsImpl::FIXED_INITIAL_WBHP, "FIXED_INITIAL_WBHP", "Fixed Initial WBHP");
setDefault(RicExportFractureCompletionsImpl::FROM_PRODUCTION_START);
} }
} }
// clang-format on // clang-format on
@@ -101,10 +90,10 @@ RicExportCompletionDataSettingsUi::RicExportCompletionDataSettingsUi()
CAF_PDM_InitField(&includeFishbones, "IncludeFishbones", true, "Fishbones", "", "", ""); CAF_PDM_InitField(&includeFishbones, "IncludeFishbones", true, "Fishbones", "", "", "");
CAF_PDM_InitField(&includeFractures, "IncludeFractures", true, "Fractures", "", "", ""); CAF_PDM_InitField(&includeFractures, "IncludeFractures", true, "Fractures", "", "", "");
CAF_PDM_InitFieldNoDefault(&transScalingType, "TransScalingType", " Pressure Diff. Depletion Transmissibility Scaling", "", "", ""); CAF_PDM_InitField(&performTransScaling, "TransScalingType", false, "Perform Transmissibility Scaling", "", "", "");
CAF_PDM_InitField(&transScalingTimeStep, "TransScalingTimeStep", 0, " PDD Current WBHP Time Step", "", "", ""); CAF_PDM_InitField(&transScalingTimeStep, "TransScalingTimeStep", 0, "Current Time Step", "", "", "");
CAF_PDM_InitFieldNoDefault(&transScalingInitialWBHP, "TransScalingInitialWBHP", " PDD Initial WBHP Selection", "", "", ""); CAF_PDM_InitFieldNoDefault(&transScalingWBHPSource, "TransScalingWBHPSource", "WBHP Selection", "", "", "");
CAF_PDM_InitField(&transScalingWBHP, "TransScalingWBHP", 200.0, " PDD Initial WBHP Value", "", "", ""); CAF_PDM_InitField(&transScalingWBHP, "TransScalingWBHP", 200.0, "WBHP Before Production Start", "", "", "");
CAF_PDM_InitField(&excludeMainBoreForFishbones, CAF_PDM_InitField(&excludeMainBoreForFishbones,
"ExcludeMainBoreForFishbones", "ExcludeMainBoreForFishbones",
@@ -325,39 +314,42 @@ void RicExportCompletionDataSettingsUi::defineUiOrdering(QString uiConfigName, c
{ {
group->add(&includeFractures); group->add(&includeFractures);
if (RiaApplication::enableDevelopmentFeatures()) caf::PdmUiGroup* pddGroup = group->addNewGroup("Pressure Differential Depletion Scaling");
{ pddGroup->setUiReadOnly(!includeFractures());
group->add(&transScalingType);
group->add(&transScalingTimeStep);
group->add(&transScalingInitialWBHP);
group->add(&transScalingWBHP);
if (transScalingType() == RicExportFractureCompletionsImpl::NO_SCALING) pddGroup->add(&performTransScaling);
pddGroup->add(&transScalingTimeStep);
pddGroup->add(&transScalingWBHPSource);
pddGroup->add(&transScalingWBHP);
if (!includeFractures())
{
performTransScaling = false;
performTransScaling.uiCapability()->setUiReadOnly(true);
}
else
{
performTransScaling.uiCapability()->setUiReadOnly(false);
}
if (!performTransScaling())
{
transScalingTimeStep.uiCapability()->setUiReadOnly(true);
transScalingWBHPSource.uiCapability()->setUiReadOnly(true);
transScalingWBHP.uiCapability()->setUiReadOnly(true);
}
else
{
transScalingTimeStep.uiCapability()->setUiReadOnly(false);
transScalingWBHPSource.uiCapability()->setUiReadOnly(false);
transScalingWBHP.uiCapability()->setUiReadOnly(false);
if (transScalingWBHPSource == RicExportFractureCompletionsImpl::WBHP_FROM_SUMMARY)
{ {
transScalingTimeStep.uiCapability()->setUiReadOnly(true); transScalingWBHP.uiCapability()->setUiName("WBHP Before Production Start");
transScalingInitialWBHP.uiCapability()->setUiReadOnly(true);
transScalingWBHP.uiCapability()->setUiReadOnly(true);
} }
else else
{ {
transScalingTimeStep.uiCapability()->setUiReadOnly(false); transScalingWBHP.uiCapability()->setUiName("User Defined WBHP");
transScalingInitialWBHP.uiCapability()->setUiReadOnly(false);
if (transScalingInitialWBHP == RicExportFractureCompletionsImpl::FROM_PRODUCTION_START)
{
transScalingWBHP.uiCapability()->setUiReadOnly(true);
}
else
{
transScalingWBHP.uiCapability()->setUiReadOnly(false);
if (transScalingInitialWBHP == RicExportFractureCompletionsImpl::FROM_PRODUCTION_START_W_MIN)
{
transScalingWBHP.uiCapability()->setUiName(" PDD Minimum Initial WBHP");
}
else
{
transScalingWBHP.uiCapability()->setUiName(" PDD Fixed Initial WBHP");
}
}
} }
} }

View File

@@ -56,8 +56,7 @@ public:
}; };
typedef caf::AppEnum<CombinationMode> CombinationModeType; typedef caf::AppEnum<CombinationMode> CombinationModeType;
typedef caf::AppEnum<RicExportFractureCompletionsImpl::PressureDepletionTransScaling> TransScalingType; typedef caf::AppEnum<RicExportFractureCompletionsImpl::PressureDepletionWBHPSource> TransScalingWBHPSource;
typedef caf::AppEnum<RicExportFractureCompletionsImpl::PressureDepletionInitialWBHP> TransScalingInitialWBHP;
RicExportCompletionDataSettingsUi(); RicExportCompletionDataSettingsUi();
@@ -66,9 +65,9 @@ public:
caf::PdmField<ExportSplitType> fileSplit; caf::PdmField<ExportSplitType> fileSplit;
caf::PdmField<CompdatExportType> compdatExport; caf::PdmField<CompdatExportType> compdatExport;
caf::PdmField<TransScalingType> transScalingType; caf::PdmField<bool> performTransScaling;
caf::PdmField<int> transScalingTimeStep; caf::PdmField<int> transScalingTimeStep;
caf::PdmField<TransScalingInitialWBHP> transScalingInitialWBHP; caf::PdmField<TransScalingWBHPSource> transScalingWBHPSource;
caf::PdmField<double> transScalingWBHP; caf::PdmField<double> transScalingWBHP;
caf::PdmField<bool> includeMsw; caf::PdmField<bool> includeMsw;

View File

@@ -184,7 +184,7 @@ std::vector<RigCompletionData>
caseToApply->loadStaticResultsByName(resultNames); caseToApply->loadStaticResultsByName(resultNames);
} }
if (pdParams.pressureDropScaling != NO_SCALING) if (pdParams.performScaling)
{ {
RigCaseCellResultsData* results = caseToApply->results(RiaDefines::MATRIX_MODEL); RigCaseCellResultsData* results = caseToApply->results(RiaDefines::MATRIX_MODEL);
results->findOrLoadScalarResult(RiaDefines::DYNAMIC_NATIVE, "PRESSURE"); results->findOrLoadScalarResult(RiaDefines::DYNAMIC_NATIVE, "PRESSURE");
@@ -225,15 +225,14 @@ std::vector<RigCompletionData> RicExportFractureCompletionsImpl::generateCompdat
size_t pressureResultIndex = results->findScalarResultIndex(RiaDefines::DYNAMIC_NATIVE, "PRESSURE"); size_t pressureResultIndex = results->findScalarResultIndex(RiaDefines::DYNAMIC_NATIVE, "PRESSURE");
const RigActiveCellInfo* actCellInfo = caseToApply->eclipseCaseData()->activeCellInfo(RiaDefines::MATRIX_MODEL); const RigActiveCellInfo* actCellInfo = caseToApply->eclipseCaseData()->activeCellInfo(RiaDefines::MATRIX_MODEL);
PressureDepletionTransScaling currentPressureDropScaling = pdParams.pressureDropScaling; bool performPressureDepletionScaling = pdParams.performScaling;
int initialWellProductionTimeStep = 0; int initialWellProductionTimeStep = 0;
double initialWellPressure = 0;
double currentWellPressure = 0; double currentWellPressure = 0;
if (currentPressureDropScaling != NO_SCALING) if (performPressureDepletionScaling)
{ {
double minimumWBHP = pdParams.pressureScalingWBHP; double userWBHP = pdParams.userWBHP;
double initialWBHPFromSummary = 0.0; double initialWBHPFromSummary = 0.0;
double currentWBHPFromSummary = 0.0; double currentWBHPFromSummary = 0.0;
@@ -245,49 +244,27 @@ std::vector<RigCompletionData> RicExportFractureCompletionsImpl::generateCompdat
&initialWBHPFromSummary, &initialWBHPFromSummary,
&currentWBHPFromSummary); &currentWBHPFromSummary);
currentWellPressure = currentWBHPFromSummary; if (pdParams.wbhpSource == WBHP_FROM_SUMMARY)
if (pdParams.initialWbhpSource == FROM_PRODUCTION_START)
{ {
initialWellPressure = initialWBHPFromSummary; currentWellPressure = currentWBHPFromSummary;
}
else if (pdParams.initialWbhpSource == FROM_PRODUCTION_START_W_MIN)
{
initialWellPressure = initialWBHPFromSummary;
if (pdParams.pressureScalingTimeStep <= initialWellProductionTimeStep) if (pdParams.pressureScalingTimeStep <= initialWellProductionTimeStep)
{ {
initialWellPressure = minimumWBHP; currentWellPressure = userWBHP;
} }
} }
else else
{ {
initialWellPressure = minimumWBHP; currentWellPressure = userWBHP;
}
// Final check for initial vs current pressure to see if scaling is valid
if (std::fabs(initialWellPressure - currentWellPressure) < 1.0e-6)
{
// Don't perform scaling if current pressure is equal to initial.
currentPressureDropScaling = NO_SCALING;
} }
} }
const std::vector<std::vector<double>>* pressureResultVector = nullptr; const std::vector<std::vector<double>>* pressureResultVector = nullptr;
const std::vector<double>* initialMatrixPressures = nullptr;
const std::vector<double>* currentMatrixPressures = nullptr; const std::vector<double>* currentMatrixPressures = nullptr;
if (currentPressureDropScaling != NO_SCALING) if (performPressureDepletionScaling)
{ {
pressureResultVector = &results->cellScalarResults(pressureResultIndex); pressureResultVector = &results->cellScalarResults(pressureResultIndex);
CVF_ASSERT(!pressureResultVector->empty()); CVF_ASSERT(!pressureResultVector->empty());
if (initialWellProductionTimeStep < static_cast<int>(pressureResultVector->size()))
{
initialMatrixPressures = &pressureResultVector->at(initialWellProductionTimeStep);
}
else
{
// Don't perform scaling if the initial well production time step is beyond the case range.
currentPressureDropScaling = NO_SCALING;
}
if (pdParams.pressureScalingTimeStep < static_cast<int>(pressureResultVector->size())) if (pdParams.pressureScalingTimeStep < static_cast<int>(pressureResultVector->size()))
{ {
currentMatrixPressures = &pressureResultVector->at(pdParams.pressureScalingTimeStep); currentMatrixPressures = &pressureResultVector->at(pdParams.pressureScalingTimeStep);
@@ -295,7 +272,7 @@ std::vector<RigCompletionData> RicExportFractureCompletionsImpl::generateCompdat
else else
{ {
// Don't perform scaling if the current pressure time step is beyond the case range. // Don't perform scaling if the current pressure time step is beyond the case range.
currentPressureDropScaling = NO_SCALING; performPressureDepletionScaling = false;
} }
} }
@@ -349,25 +326,15 @@ 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::map<size_t, double> matrixToWellTrans = calculateMatrixToWellTransmissibilities(transCondenser); std::map<size_t, double> matrixToWellTrans = calculateMatrixToWellTransmissibilities(transCondenser);
//////////////////////////////////////////////////////// double maxPressureDrop = 0.0, minPressureDrop = 0.0;
// clang-format off if (performPressureDepletionScaling)
// WARNING!!! //
// PROTOTYPE-CODE for Pressure Differential Depletion //
// MAY CHANGE A LOT //
////////////////////////////////////////////////////////
if (currentPressureDropScaling == MATRIX_TO_WELL_DP_OVER_INITIAL_DP ||
currentPressureDropScaling == MATRIX_TO_WELL_DP_OVER_MAX_INITIAL_DP)
{ {
RigTransmissibilityCondenser scaledCondenser = transCondenser; RigTransmissibilityCondenser scaledCondenser = transCondenser;
// 1. Scale matrix to fracture transmissibilities by matrix to fracture pressure // 1. Scale matrix to fracture transmissibilities by matrix to fracture pressure
std::map<size_t, double> originalLumpedMatrixToFractureTrans = scaledCondenser.scaleMatrixToFracTransByMatrixWellDP( std::map<size_t, double> originalLumpedMatrixToFractureTrans = scaledCondenser.scaleMatrixToFracTransByMatrixWellDP(
actCellInfo, actCellInfo,
initialWellPressure,
currentWellPressure, currentWellPressure,
*initialMatrixPressures, *currentMatrixPressures, &minPressureDrop, &maxPressureDrop);
*currentMatrixPressures,
currentPressureDropScaling == MATRIX_TO_WELL_DP_OVER_MAX_INITIAL_DP);
// 2: Calculate new external transmissibilities // 2: Calculate new external transmissibilities
scaledCondenser.calculateCondensedTransmissibilities(); scaledCondenser.calculateCondensedTransmissibilities();
@@ -384,11 +351,6 @@ std::vector<RigCompletionData> RicExportFractureCompletionsImpl::generateCompdat
} }
} }
////////////////////////////////////////////////////////////
// clang-format on
// END PROTOTYPE CODE FOR PRESSURE DIFFERENTIAL DEPLETION //
////////////////////////////////////////////////////////////
std::vector<RigCompletionData> allCompletionsForOneFracture = std::vector<RigCompletionData> allCompletionsForOneFracture =
generateCompdatValuesForFracture(matrixToWellTrans, wellPathName, caseToApply, fracture, fracTemplate); generateCompdatValuesForFracture(matrixToWellTrans, wellPathName, caseToApply, fracture, fracTemplate);
@@ -397,7 +359,9 @@ std::vector<RigCompletionData> RicExportFractureCompletionsImpl::generateCompdat
RicWellPathFractureReportItem reportItem( RicWellPathFractureReportItem reportItem(
wellPathName, fracture->name(), fracTemplate->name(), fracture->fractureMD()); wellPathName, fracture->name(), fracTemplate->name(), fracture->fractureMD());
reportItem.setUnitSystem(fracTemplate->fractureTemplateUnit()); reportItem.setUnitSystem(fracTemplate->fractureTemplateUnit());
reportItem.setPressureDepletionParameters(caf::AppEnum<PressureDepletionTransScaling>::uiTextFromIndex(currentPressureDropScaling), initialWellPressure, currentWellPressure); reportItem.setPressureDepletionParameters(performPressureDepletionScaling ? "True" : "False",
caf::AppEnum<PressureDepletionWBHPSource>::uiTextFromIndex(pdParams.wbhpSource),
pdParams.userWBHP, minPressureDrop, maxPressureDrop);
RicExportFractureCompletionsImpl::calculateAndSetReportItemData( RicExportFractureCompletionsImpl::calculateAndSetReportItemData(
allCompletionsForOneFracture, eclToFractureCalc, reportItem); allCompletionsForOneFracture, eclToFractureCalc, reportItem);

View File

@@ -44,18 +44,11 @@ class QString;
class RicExportFractureCompletionsImpl class RicExportFractureCompletionsImpl
{ {
public: public:
enum PressureDepletionTransScaling
{
NO_SCALING = 0,
MATRIX_TO_WELL_DP_OVER_INITIAL_DP,
MATRIX_TO_WELL_DP_OVER_MAX_INITIAL_DP
};
enum PressureDepletionInitialWBHP enum PressureDepletionWBHPSource
{ {
FROM_PRODUCTION_START, WBHP_FROM_SUMMARY,
FROM_PRODUCTION_START_W_MIN, WBHP_FROM_USER_DEF
FIXED_INITIAL_WBHP
}; };
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -63,20 +56,20 @@ public:
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
struct PressureDepletionParameters struct PressureDepletionParameters
{ {
PressureDepletionParameters(PressureDepletionTransScaling pressureDropScaling = NO_SCALING, PressureDepletionParameters(bool performScaling = false,
int pressureScalingTimeStep = 0, int pressureScalingTimeStep = 0,
PressureDepletionInitialWBHP initialWbhpSource = FROM_PRODUCTION_START, PressureDepletionWBHPSource wbhpSource = WBHP_FROM_SUMMARY,
double pressureScalingWBHP = 200.0) double userWBHP = 200.0)
: pressureDropScaling(pressureDropScaling) : performScaling(performScaling)
, pressureScalingTimeStep(pressureScalingTimeStep) , pressureScalingTimeStep(pressureScalingTimeStep)
, initialWbhpSource(initialWbhpSource) , wbhpSource(wbhpSource)
, pressureScalingWBHP(pressureScalingWBHP) , userWBHP(userWBHP)
{} {}
PressureDepletionTransScaling pressureDropScaling; bool performScaling;
int pressureScalingTimeStep; int pressureScalingTimeStep;
PressureDepletionInitialWBHP initialWbhpSource; PressureDepletionWBHPSource wbhpSource;
double pressureScalingWBHP; double userWBHP;
}; };
static std::vector<RigCompletionData> generateCompdatValuesForWellPath(RimWellPath* wellPath, static std::vector<RigCompletionData> generateCompdatValuesForWellPath(RimWellPath* wellPath,

View File

@@ -245,9 +245,9 @@ void RicWellPathExportCompletionDataFeatureImpl::exportCompletions(const std::ve
exportSettings.caseToApply(), exportSettings.caseToApply(),
reportItems, reportItems,
fractureTransmissibilityExportInformationStream.get(), fractureTransmissibilityExportInformationStream.get(),
RicExportFractureCompletionsImpl::PressureDepletionParameters(exportSettings.transScalingType(), RicExportFractureCompletionsImpl::PressureDepletionParameters(exportSettings.performTransScaling(),
exportSettings.transScalingTimeStep(), exportSettings.transScalingTimeStep(),
exportSettings.transScalingInitialWBHP(), exportSettings.transScalingWBHPSource(),
exportSettings.transScalingWBHP())); exportSettings.transScalingWBHP()));
appendCompletionData(&completionsPerEclipseCellAllCompletionTypes, fractureCompletionData); appendCompletionData(&completionsPerEclipseCellAllCompletionTypes, fractureCompletionData);
@@ -291,9 +291,9 @@ void RicWellPathExportCompletionDataFeatureImpl::exportCompletions(const std::ve
exportSettings.caseToApply(), exportSettings.caseToApply(),
simWell, simWell,
fractureTransmissibilityExportInformationStream.get(), fractureTransmissibilityExportInformationStream.get(),
RicExportFractureCompletionsImpl::PressureDepletionParameters(exportSettings.transScalingType(), RicExportFractureCompletionsImpl::PressureDepletionParameters(exportSettings.performTransScaling(),
exportSettings.transScalingTimeStep(), exportSettings.transScalingTimeStep(),
exportSettings.transScalingInitialWBHP(), exportSettings.transScalingWBHPSource(),
exportSettings.transScalingWBHP())); exportSettings.transScalingWBHP()));
appendCompletionData(&completionsPerEclipseCell, fractureCompletionData); appendCompletionData(&completionsPerEclipseCell, fractureCompletionData);
@@ -312,7 +312,6 @@ void RicWellPathExportCompletionDataFeatureImpl::exportCompletions(const std::ve
if (exportSettings.fileSplit == RicExportCompletionDataSettingsUi::UNIFIED_FILE) if (exportSettings.fileSplit == RicExportCompletionDataSettingsUi::UNIFIED_FILE)
{ {
QString fileName = QString("UnifiedCompletions_%1").arg(eclipseCaseName); QString fileName = QString("UnifiedCompletions_%1").arg(eclipseCaseName);
fileName += createPressureDepletionFileNameSuffix(exportSettings);
sortAndExportCompletionsToFile(exportSettings.caseToApply, sortAndExportCompletionsToFile(exportSettings.caseToApply,
exportSettings.folder, exportSettings.folder,
fileName, fileName,
@@ -337,7 +336,6 @@ void RicWellPathExportCompletionDataFeatureImpl::exportCompletions(const std::ve
if (wellCompletions.empty()) continue; if (wellCompletions.empty()) continue;
QString fileName = QString("%1_unifiedCompletions_%2").arg(wellPath->name()).arg(eclipseCaseName); QString fileName = QString("%1_unifiedCompletions_%2").arg(wellPath->name()).arg(eclipseCaseName);
fileName += createPressureDepletionFileNameSuffix(exportSettings);
sortAndExportCompletionsToFile(exportSettings.caseToApply, sortAndExportCompletionsToFile(exportSettings.caseToApply,
exportSettings.folder, exportSettings.folder,
fileName, fileName,
@@ -379,7 +377,6 @@ void RicWellPathExportCompletionDataFeatureImpl::exportCompletions(const std::ve
QString fileName = QString("%1_%2_%3").arg(wellPath->name()).arg(completionTypeText).arg(eclipseCaseName); QString fileName = QString("%1_%2_%3").arg(wellPath->name()).arg(completionTypeText).arg(eclipseCaseName);
if (completionType == RigCompletionData::FRACTURE) if (completionType == RigCompletionData::FRACTURE)
{ {
fileName += createPressureDepletionFileNameSuffix(exportSettings);
sortAndExportCompletionsToFile(exportSettings.caseToApply, sortAndExportCompletionsToFile(exportSettings.caseToApply,
exportSettings.folder, exportSettings.folder,
fileName, fileName,
@@ -422,7 +419,6 @@ void RicWellPathExportCompletionDataFeatureImpl::exportCompletions(const std::ve
if (wellCompletions.empty()) continue; if (wellCompletions.empty()) continue;
QString fileName = QString("%1_Fractures_%2").arg(simWell->name()).arg(eclipseCaseName); QString fileName = QString("%1_Fractures_%2").arg(simWell->name()).arg(eclipseCaseName);
fileName += createPressureDepletionFileNameSuffix(exportSettings);
sortAndExportCompletionsToFile(exportSettings.caseToApply, sortAndExportCompletionsToFile(exportSettings.caseToApply,
exportSettings.folder, exportSettings.folder,
fileName, fileName,
@@ -2618,50 +2614,6 @@ void RicWellPathExportCompletionDataFeatureImpl::exportWellSegments(
RicWellPathExportCompletionDataFeatureImpl::generateCompsegTables(formatter, exportInfo); RicWellPathExportCompletionDataFeatureImpl::generateCompsegTables(formatter, exportInfo);
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RicWellPathExportCompletionDataFeatureImpl::createPressureDepletionFileNameSuffix(
const RicExportCompletionDataSettingsUi& exportSettings)
{
QString suffix;
if (exportSettings.transScalingType() != RicExportFractureCompletionsImpl::NO_SCALING)
{
if (exportSettings.transScalingType() == RicExportFractureCompletionsImpl::MATRIX_TO_WELL_DP_OVER_INITIAL_DP)
{
suffix += QString("_3");
}
else if (exportSettings.transScalingType() == RicExportFractureCompletionsImpl::MATRIX_TO_WELL_DP_OVER_MAX_INITIAL_DP)
{
suffix += QString("_4");
}
suffix += QString("B_");
if (exportSettings.transScalingInitialWBHP() == RicExportFractureCompletionsImpl::FROM_PRODUCTION_START)
{
suffix += QString("_WBHPROD_");
}
else if (exportSettings.transScalingInitialWBHP() == RicExportFractureCompletionsImpl::FROM_PRODUCTION_START_W_MIN)
{
suffix += QString("_WBHPMIN_");
}
else
{
suffix += QString("_WBHPFIX_");
}
RimEclipseCase* eclipseCase = exportSettings.caseToApply();
if (eclipseCase)
{
QString date = eclipseCase->timeStepStrings()[exportSettings.transScalingTimeStep()];
date.replace(QRegExp("[\\.\\s]"), "_");
suffix += QString("%1").arg(date);
}
}
return suffix;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@@ -231,7 +231,6 @@ private:
QFilePtr exportFile, QFilePtr exportFile,
const RimWellPath* wellPath, const RimWellPath* wellPath,
const std::vector<const RimPerforationInterval*>& perforationIntervals); const std::vector<const RimPerforationInterval*>& perforationIntervals);
static QString createPressureDepletionFileNameSuffix(const RicExportCompletionDataSettingsUi& exportSettings);
static void exportCarfinForTemporaryLgrs(const RimEclipseCase* sourceCase, const QString& folder); static void exportCarfinForTemporaryLgrs(const RimEclipseCase* sourceCase, const QString& folder);

View File

@@ -43,8 +43,8 @@ RicWellPathFractureReportItem::RicWellPathFractureReportItem(const QString& well
, m_xf(0.0) , m_xf(0.0)
, m_h(0.0) , m_h(0.0)
, m_km(0.0) , m_km(0.0)
, m_pressureDepletionInitialWBHP(-1.0) , m_pressureDepletionMinPressureDrop(-1.0)
, m_pressureDepletionCurrentWBHP(-1.0) , m_pressureDepletionMaxPressureDrop(-1.0)
{ {
} }
@@ -120,6 +120,14 @@ QString RicWellPathFractureReportItem::pressureDepletionScaling() const
return m_pressureDepletionScalingString; return m_pressureDepletionScalingString;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RicWellPathFractureReportItem::pressureDepletionWBHPString() const
{
return m_pressureDepletionWBHPString;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -131,11 +139,13 @@ void RicWellPathFractureReportItem::setUnitSystem(RiaEclipseUnitTools::UnitSyste
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicWellPathFractureReportItem::setPressureDepletionParameters(QString scalingString, double initialWBHP, double currentWBHP) void RicWellPathFractureReportItem::setPressureDepletionParameters(QString scalingString, QString wbhpString, double userWBHP, double minPressureDrop, double maxPressureDrop)
{ {
m_pressureDepletionScalingString = scalingString; m_pressureDepletionScalingString = scalingString;
m_pressureDepletionInitialWBHP = initialWBHP; m_pressureDepletionWBHPString = wbhpString;
m_pressureDepletionCurrentWBHP = currentWBHP; m_pressureDepletionUserWBHP = userWBHP;
m_pressureDepletionMinPressureDrop = minPressureDrop;
m_pressureDepletionMaxPressureDrop = maxPressureDrop;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -245,17 +255,25 @@ double RicWellPathFractureReportItem::kmxf() const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
double RicWellPathFractureReportItem::pressureDepletionInitialWBHP() const double RicWellPathFractureReportItem::pressureDepletionUserWBHP() const
{ {
return m_pressureDepletionInitialWBHP; return m_pressureDepletionUserWBHP;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
double RicWellPathFractureReportItem::pressureDepletionCurrentWBHP() const double RicWellPathFractureReportItem::pressureDepletionMinPressureDrop() const
{ {
return m_pressureDepletionCurrentWBHP; return m_pressureDepletionMinPressureDrop;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
double RicWellPathFractureReportItem::pressureDepletionMaxPressureDrop() const
{
return m_pressureDepletionMaxPressureDrop;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@@ -35,12 +35,13 @@ public:
void setHeightAndHalfLength(double height, double halfLength); void setHeightAndHalfLength(double height, double halfLength);
void setAreaWeightedTransmissibility(double transmissibility); void setAreaWeightedTransmissibility(double transmissibility);
void setUnitSystem(RiaEclipseUnitTools::UnitSystem unitSystem); void setUnitSystem(RiaEclipseUnitTools::UnitSystem unitSystem);
void setPressureDepletionParameters(QString scalingString, double initialWBHP, double currentWBHP); void setPressureDepletionParameters(QString scalingString, QString wbhpString, double userWBHP, double minPressureDrop, double maxPressureDrop);
QString wellPathNameForExport() const; QString wellPathNameForExport() const;
QString fractureName() const; QString fractureName() const;
QString fractureTemplateName() const; QString fractureTemplateName() const;
QString pressureDepletionScaling() const; QString pressureDepletionScaling() const;
QString pressureDepletionWBHPString() const;
RiaEclipseUnitTools::UnitSystem unitSystem() const; RiaEclipseUnitTools::UnitSystem unitSystem() const;
@@ -58,8 +59,9 @@ public:
double km() const; double km() const;
double kmxf() const; double kmxf() const;
double pressureDepletionInitialWBHP() const; double pressureDepletionUserWBHP() const;
double pressureDepletionCurrentWBHP() const; double pressureDepletionMinPressureDrop() const;
double pressureDepletionMaxPressureDrop() const;
bool operator < (const RicWellPathFractureReportItem& other) const; bool operator < (const RicWellPathFractureReportItem& other) const;
@@ -69,6 +71,7 @@ private:
QString m_wellPathFracture; QString m_wellPathFracture;
QString m_wellPathFractureTemplate; QString m_wellPathFractureTemplate;
QString m_pressureDepletionScalingString; QString m_pressureDepletionScalingString;
QString m_pressureDepletionWBHPString;
double m_mesuredDepth; double m_mesuredDepth;
double m_transmissibility; double m_transmissibility;
@@ -82,6 +85,7 @@ private:
double m_h; double m_h;
double m_km; double m_km;
double m_pressureDepletionInitialWBHP; double m_pressureDepletionUserWBHP;
double m_pressureDepletionCurrentWBHP; double m_pressureDepletionMinPressureDrop;
double m_pressureDepletionMaxPressureDrop;
}; };

View File

@@ -710,8 +710,10 @@ QString RicWellPathFractureTextReportFeatureImpl::createFracturePressureDepletio
RifEclipseOutputTableColumn("Well"), RifEclipseOutputTableColumn("Well"),
RifEclipseOutputTableColumn("Fracture"), RifEclipseOutputTableColumn("Fracture"),
RifEclipseOutputTableColumn("PDD Scaling"), RifEclipseOutputTableColumn("PDD Scaling"),
RifEclipseOutputTableColumn("Initial WBHP"), RifEclipseOutputTableColumn("WBHP Source"),
RifEclipseOutputTableColumn("Current WBHP") RifEclipseOutputTableColumn("User WBHP"),
RifEclipseOutputTableColumn("Min Pressure Drop"),
RifEclipseOutputTableColumn("Max Pressure Drop")
}; };
formatter.header(header); formatter.header(header);
@@ -722,8 +724,10 @@ QString RicWellPathFractureTextReportFeatureImpl::createFracturePressureDepletio
formatter.add(reportItem.wellPathNameForExport()); formatter.add(reportItem.wellPathNameForExport());
formatter.add(reportItem.fractureName()); formatter.add(reportItem.fractureName());
formatter.add(reportItem.pressureDepletionScaling()); formatter.add(reportItem.pressureDepletionScaling());
formatter.add(reportItem.pressureDepletionInitialWBHP()); formatter.add(reportItem.pressureDepletionWBHPString());
formatter.add(reportItem.pressureDepletionCurrentWBHP()); formatter.add(reportItem.pressureDepletionUserWBHP());
formatter.add(reportItem.pressureDepletionMinPressureDrop());
formatter.add(reportItem.pressureDepletionMaxPressureDrop());
formatter.rowCompleted(); formatter.rowCompleted();
} }

View File

@@ -123,40 +123,37 @@ double RigTransmissibilityCondenser::condensedTransmissibility(CellAddress exter
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
std::map<size_t, double> std::map<size_t, double> RigTransmissibilityCondenser::scaleMatrixToFracTransByMatrixWellDP(
RigTransmissibilityCondenser::scaleMatrixToFracTransByMatrixWellDP(const RigActiveCellInfo* actCellInfo, const RigActiveCellInfo* actCellInfo, double currentWellPressure, const std::vector<double>& currentMatrixPressures,
double initialWellPressure, double* minPressureDrop, double* maxPressureDrop)
double currentWellPressure,
const std::vector<double>& initialMatrixPressures,
const std::vector<double>& currentMatrixPressures,
bool normalizeByMax)
{ {
CVF_ASSERT(initialMatrixPressures.size() == currentMatrixPressures.size());
std::map<size_t, double> originalLumpedMatrixToFractureTrans; // Sum(T_mf) std::map<size_t, double> originalLumpedMatrixToFractureTrans; // Sum(T_mf)
double maxInitialDeltaPressure = 0.0; double epsilonDeltaPressure = 1.0e-6;
if (normalizeByMax)
{
for (auto it = m_neighborTransmissibilities.begin(); it != m_neighborTransmissibilities.end(); ++it)
{
if (it->first.m_cellIndexSpace == CellAddress::STIMPLAN)
{
for (auto jt = it->second.begin(); jt != it->second.end(); ++jt)
{
if (jt->first.m_cellIndexSpace == CellAddress::ECLIPSE)
{
size_t globalMatrixCellIdx = jt->first.m_globalCellIdx;
size_t eclipseResultIndex = actCellInfo->cellResultIndex(globalMatrixCellIdx);
CVF_ASSERT(eclipseResultIndex < currentMatrixPressures.size());
double initialDeltaPressure = initialMatrixPressures[eclipseResultIndex] - initialWellPressure; double minNonZeroDeltaPressure = std::numeric_limits<double>::infinity();
maxInitialDeltaPressure = std::max(maxInitialDeltaPressure, initialDeltaPressure); double maxNonZeroDeltaPressure = -std::numeric_limits<double>::infinity();
}
for (auto it = m_neighborTransmissibilities.begin(); it != m_neighborTransmissibilities.end(); ++it)
{
if (it->first.m_cellIndexSpace == CellAddress::STIMPLAN)
{
for (auto jt = it->second.begin(); jt != it->second.end(); ++jt)
{
if (jt->first.m_cellIndexSpace == CellAddress::ECLIPSE)
{
size_t globalMatrixCellIdx = jt->first.m_globalCellIdx;
size_t eclipseResultIndex = actCellInfo->cellResultIndex(globalMatrixCellIdx);
CVF_ASSERT(eclipseResultIndex < currentMatrixPressures.size());
double unsignedDeltaPressure = std::abs(currentMatrixPressures[eclipseResultIndex] - currentWellPressure);
double nonZeroDeltaPressure = std::max(epsilonDeltaPressure, unsignedDeltaPressure);
maxNonZeroDeltaPressure = std::max(maxNonZeroDeltaPressure, nonZeroDeltaPressure);
minNonZeroDeltaPressure = std::min(minNonZeroDeltaPressure, nonZeroDeltaPressure);
} }
} }
} }
} }
for (auto it = m_neighborTransmissibilities.begin(); it != m_neighborTransmissibilities.end(); ++it) for (auto it = m_neighborTransmissibilities.begin(); it != m_neighborTransmissibilities.end(); ++it)
{ {
if (it->first.m_cellIndexSpace == CellAddress::STIMPLAN) if (it->first.m_cellIndexSpace == CellAddress::STIMPLAN)
@@ -171,20 +168,24 @@ std::map<size_t, double>
originalLumpedMatrixToFractureTrans[globalMatrixCellIdx] += jt->second; originalLumpedMatrixToFractureTrans[globalMatrixCellIdx] += jt->second;
double initialDeltaPressure = initialMatrixPressures[eclipseResultIndex] - initialWellPressure; double unsignedDeltaPressure = std::abs(currentMatrixPressures[eclipseResultIndex] - currentWellPressure);
double currentDeltaPressure = currentMatrixPressures[eclipseResultIndex] - currentWellPressure; double nonZeroDeltaPressure = std::max(epsilonDeltaPressure, unsignedDeltaPressure);
if (normalizeByMax)
{ jt->second *= nonZeroDeltaPressure / maxNonZeroDeltaPressure;
jt->second *= currentDeltaPressure / maxInitialDeltaPressure;
}
else
{
jt->second *= currentDeltaPressure / initialDeltaPressure;
}
} }
} }
} }
} }
if (minPressureDrop && minNonZeroDeltaPressure != std::numeric_limits<double>::infinity())
{
*minPressureDrop = minNonZeroDeltaPressure;
}
if (maxPressureDrop && maxNonZeroDeltaPressure != std::numeric_limits<double>::infinity())
{
*maxPressureDrop = maxNonZeroDeltaPressure;
}
return originalLumpedMatrixToFractureTrans; return originalLumpedMatrixToFractureTrans;
} }

View File

@@ -95,12 +95,7 @@ public:
std::string neighborTransDebugOutput(const RigMainGrid* mainGrid, const RigFractureGrid* fractureGrid); std::string neighborTransDebugOutput(const RigMainGrid* mainGrid, const RigFractureGrid* fractureGrid);
std::string condensedTransDebugOutput(const RigMainGrid* mainGrid, const RigFractureGrid* fractureGrid); std::string condensedTransDebugOutput(const RigMainGrid* mainGrid, const RigFractureGrid* fractureGrid);
std::map<size_t, double> scaleMatrixToFracTransByMatrixWellDP(const RigActiveCellInfo* actCellInfo, std::map<size_t, double> scaleMatrixToFracTransByMatrixWellDP(const RigActiveCellInfo* actCellInfo, double currentWellPressure, const std::vector<double>& currentMatrixPressures, double* minPressureDrop, double* maxPressureDrop);
double initialWellPressure,
double currentWellPressure,
const std::vector<double>& initialMatrixPressures,
const std::vector<double>& currentMatrixPressures,
bool normalizeByMax);
std::map<size_t, double> calculateFicticiousFractureToWellTransmissibilities(); std::map<size_t, double> calculateFicticiousFractureToWellTransmissibilities();
std::map<size_t, double> std::map<size_t, double>