mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
Fix handling of FIELD for injector groups.
This commit is contained in:
parent
66931b9cb7
commit
a8107afc11
@ -2033,27 +2033,12 @@ namespace Opm
|
|||||||
EvalWell& control_eq,
|
EvalWell& control_eq,
|
||||||
double efficiencyFactor)
|
double efficiencyFactor)
|
||||||
{
|
{
|
||||||
if (!group.isAvailableForGroupControl()) {
|
|
||||||
// We cannot go any further up the hierarchy. This could
|
|
||||||
// be the FIELD group, or any group for which this has
|
|
||||||
// been set in GCONINJE or GCONPROD. If we are here
|
|
||||||
// anyway, it is likely that the deck set inconsistent
|
|
||||||
// requirements, such as GRUP control mode on a well with
|
|
||||||
// no appropriate controls defined on any of its
|
|
||||||
// containing groups. We will therefore use the wells' bhp
|
|
||||||
// limit equation as a fallback.
|
|
||||||
const auto& controls = well_ecl_.injectionControls(summaryState);
|
|
||||||
control_eq = bhp - controls.bhp_limit;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto& well = well_ecl_;
|
const auto& well = well_ecl_;
|
||||||
const auto pu = phaseUsage();
|
const auto pu = phaseUsage();
|
||||||
|
|
||||||
int phasePos = -1;
|
int phasePos = -1;
|
||||||
Well::GuideRateTarget wellTarget;
|
Well::GuideRateTarget wellTarget;
|
||||||
Phase injectionPhase;
|
Phase injectionPhase;
|
||||||
|
|
||||||
switch (injectorType) {
|
switch (injectorType) {
|
||||||
case InjectorType::WATER:
|
case InjectorType::WATER:
|
||||||
{
|
{
|
||||||
@ -2080,15 +2065,30 @@ namespace Opm
|
|||||||
// Should not be here.
|
// Should not be here.
|
||||||
assert(false);
|
assert(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
const Group::InjectionCMode& currentGroupControl = well_state.currentInjectionGroupControl(injectionPhase, group.name());
|
const Group::InjectionCMode& currentGroupControl = well_state.currentInjectionGroupControl(injectionPhase, group.name());
|
||||||
|
|
||||||
if (currentGroupControl == Group::InjectionCMode::FLD ||
|
if (currentGroupControl == Group::InjectionCMode::FLD ||
|
||||||
currentGroupControl == Group::InjectionCMode::NONE) {
|
currentGroupControl == Group::InjectionCMode::NONE) {
|
||||||
// Inject share of parents control
|
if (!group.isAvailableForGroupControl()) {
|
||||||
const auto& parent = schedule.getGroup( group.parent(), current_step_ );
|
// We cannot go any further up the hierarchy. This could
|
||||||
efficiencyFactor *= group.getGroupEfficiencyFactor();
|
// be the FIELD group, or any group for which this has
|
||||||
getGroupInjectionControl(parent, well_state, schedule, summaryState, injectorType, bhp, injection_rate, control_eq, efficiencyFactor);
|
// been set in GCONINJE or GCONPROD. If we are here
|
||||||
return;
|
// anyway, it is likely that the deck set inconsistent
|
||||||
|
// requirements, such as GRUP control mode on a well with
|
||||||
|
// no appropriate controls defined on any of its
|
||||||
|
// containing groups. We will therefore use the wells' bhp
|
||||||
|
// limit equation as a fallback.
|
||||||
|
const auto& controls = well_ecl_.injectionControls(summaryState);
|
||||||
|
control_eq = bhp - controls.bhp_limit;
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
// Inject share of parents control
|
||||||
|
const auto& parent = schedule.getGroup( group.parent(), current_step_ );
|
||||||
|
efficiencyFactor *= group.getGroupEfficiencyFactor();
|
||||||
|
getGroupInjectionControl(parent, well_state, schedule, summaryState, injectorType, bhp, injection_rate, control_eq, efficiencyFactor);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(group.hasInjectionControl(injectionPhase));
|
assert(group.hasInjectionControl(injectionPhase));
|
||||||
@ -2206,9 +2206,6 @@ namespace Opm
|
|||||||
EvalWell& control_eq,
|
EvalWell& control_eq,
|
||||||
double efficiencyFactor)
|
double efficiencyFactor)
|
||||||
{
|
{
|
||||||
const auto& well = well_ecl_;
|
|
||||||
const auto pu = phaseUsage();
|
|
||||||
|
|
||||||
const Group::ProductionCMode& currentGroupControl = well_state.currentProductionGroupControl(group.name());
|
const Group::ProductionCMode& currentGroupControl = well_state.currentProductionGroupControl(group.name());
|
||||||
if (currentGroupControl == Group::ProductionCMode::FLD ||
|
if (currentGroupControl == Group::ProductionCMode::FLD ||
|
||||||
currentGroupControl == Group::ProductionCMode::NONE) {
|
currentGroupControl == Group::ProductionCMode::NONE) {
|
||||||
@ -2233,8 +2230,11 @@ namespace Opm
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto& well = well_ecl_;
|
||||||
|
const auto pu = phaseUsage();
|
||||||
|
|
||||||
if (!group.isProductionGroup()) {
|
if (!group.isProductionGroup()) {
|
||||||
// use bhp as control eq and let the updateControl code find a vallied control
|
// use bhp as control eq and let the updateControl code find a valid control
|
||||||
const auto& controls = well.productionControls(summaryState);
|
const auto& controls = well.productionControls(summaryState);
|
||||||
control_eq = bhp - controls.bhp_limit;
|
control_eq = bhp - controls.bhp_limit;
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user