mirror of
https://github.com/OPM/opm-simulators.git
synced 2024-11-24 10:10:18 -06:00
Merge pull request #5295 from akva2/wellgrouphelpers_template_scalar
WellGroupHelpers: template Scalar type
This commit is contained in:
commit
a2b660d705
@ -74,7 +74,12 @@ checkGroupInjectionConstraints(const Group& group,
|
||||
if (currentControl != Group::InjectionCMode::RATE)
|
||||
{
|
||||
double current_rate = 0.0;
|
||||
current_rate += WellGroupHelpers::sumWellSurfaceRates(group, wellModel_.schedule(), well_state, reportStepIdx, phasePos, /*isInjector*/true);
|
||||
current_rate += WellGroupHelpers<double>::sumWellSurfaceRates(group,
|
||||
wellModel_.schedule(),
|
||||
well_state,
|
||||
reportStepIdx,
|
||||
phasePos,
|
||||
/*isInjector*/true);
|
||||
|
||||
// sum over all nodes
|
||||
current_rate = wellModel_.comm().sum(current_rate);
|
||||
@ -98,7 +103,12 @@ checkGroupInjectionConstraints(const Group& group,
|
||||
if (currentControl != Group::InjectionCMode::RESV)
|
||||
{
|
||||
double current_rate = 0.0;
|
||||
current_rate += WellGroupHelpers::sumWellResRates(group, wellModel_.schedule(), well_state, reportStepIdx, phasePos, /*isInjector*/true);
|
||||
current_rate += WellGroupHelpers<double>::sumWellResRates(group,
|
||||
wellModel_.schedule(),
|
||||
well_state,
|
||||
reportStepIdx,
|
||||
phasePos,
|
||||
/*isInjector*/true);
|
||||
// sum over all nodes
|
||||
current_rate = wellModel_.comm().sum(current_rate);
|
||||
|
||||
@ -123,17 +133,23 @@ checkGroupInjectionConstraints(const Group& group,
|
||||
double production_Rate = 0.0;
|
||||
const auto& controls = group.injectionControls(phase, wellModel_.summaryState());
|
||||
const Group& groupRein = wellModel_.schedule().getGroup(controls.reinj_group, reportStepIdx);
|
||||
production_Rate += WellGroupHelpers::sumWellSurfaceRates(groupRein, wellModel_.schedule(),
|
||||
well_state, reportStepIdx,
|
||||
phasePos, /*isInjector*/false);
|
||||
production_Rate += WellGroupHelpers<double>::sumWellSurfaceRates(groupRein,
|
||||
wellModel_.schedule(),
|
||||
well_state,
|
||||
reportStepIdx,
|
||||
phasePos,
|
||||
/*isInjector*/false);
|
||||
|
||||
// sum over all nodes
|
||||
production_Rate = wellModel_.comm().sum(production_Rate);
|
||||
|
||||
double current_rate = 0.0;
|
||||
current_rate += WellGroupHelpers::sumWellSurfaceRates(group, wellModel_.schedule(),
|
||||
well_state, reportStepIdx,
|
||||
phasePos, /*isInjector*/true);
|
||||
current_rate += WellGroupHelpers<double>::sumWellSurfaceRates(group,
|
||||
wellModel_.schedule(),
|
||||
well_state,
|
||||
reportStepIdx,
|
||||
phasePos,
|
||||
/*isInjector*/true);
|
||||
|
||||
// sum over all nodes
|
||||
current_rate = wellModel_.comm().sum(current_rate);
|
||||
@ -153,29 +169,46 @@ checkGroupInjectionConstraints(const Group& group,
|
||||
double voidage_rate = 0.0;
|
||||
const auto& controls = group.injectionControls(phase, wellModel_.summaryState());
|
||||
const Group& groupVoidage = wellModel_.schedule().getGroup(controls.voidage_group, reportStepIdx);
|
||||
voidage_rate += WellGroupHelpers::sumWellResRates(groupVoidage, wellModel_.schedule(),
|
||||
well_state, reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Aqua], false);
|
||||
voidage_rate += WellGroupHelpers::sumWellResRates(groupVoidage, wellModel_.schedule(),
|
||||
well_state, reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Liquid], false);
|
||||
voidage_rate += WellGroupHelpers::sumWellResRates(groupVoidage, wellModel_.schedule(),
|
||||
well_state, reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Vapour], false);
|
||||
voidage_rate += WellGroupHelpers<double>::sumWellResRates(groupVoidage,
|
||||
wellModel_.schedule(),
|
||||
well_state,
|
||||
reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Aqua],
|
||||
false);
|
||||
voidage_rate += WellGroupHelpers<double>::sumWellResRates(groupVoidage,
|
||||
wellModel_.schedule(),
|
||||
well_state,
|
||||
reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Liquid],
|
||||
false);
|
||||
voidage_rate += WellGroupHelpers<double>::sumWellResRates(groupVoidage,
|
||||
wellModel_.schedule(),
|
||||
well_state, reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Vapour],
|
||||
false);
|
||||
|
||||
// sum over all nodes
|
||||
voidage_rate = wellModel_.comm().sum(voidage_rate);
|
||||
|
||||
double total_rate = 0.0;
|
||||
total_rate += WellGroupHelpers::sumWellResRates(group, wellModel_.schedule(),
|
||||
well_state, reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Aqua], true);
|
||||
total_rate += WellGroupHelpers::sumWellResRates(group, wellModel_.schedule(),
|
||||
well_state, reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Liquid], true);
|
||||
total_rate += WellGroupHelpers::sumWellResRates(group, wellModel_.schedule(),
|
||||
well_state, reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Vapour], true);
|
||||
total_rate += WellGroupHelpers<double>::sumWellResRates(group,
|
||||
wellModel_.schedule(),
|
||||
well_state,
|
||||
reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Aqua],
|
||||
true);
|
||||
total_rate += WellGroupHelpers<double>::sumWellResRates(group,
|
||||
wellModel_.schedule(),
|
||||
well_state,
|
||||
reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Liquid],
|
||||
true);
|
||||
total_rate += WellGroupHelpers<double>::sumWellResRates(group,
|
||||
wellModel_.schedule(),
|
||||
well_state,
|
||||
reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Vapour],
|
||||
true);
|
||||
|
||||
// sum over all nodes
|
||||
total_rate = wellModel_.comm().sum(total_rate);
|
||||
@ -208,9 +241,12 @@ checkGroupProductionConstraints(const Group& group,
|
||||
if (currentControl != Group::ProductionCMode::ORAT)
|
||||
{
|
||||
double current_rate = 0.0;
|
||||
current_rate += WellGroupHelpers::sumWellSurfaceRates(group, wellModel_.schedule(),
|
||||
well_state, reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Liquid], false);
|
||||
current_rate += WellGroupHelpers<double>::sumWellSurfaceRates(group,
|
||||
wellModel_.schedule(),
|
||||
well_state,
|
||||
reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Liquid],
|
||||
false);
|
||||
|
||||
// sum over all nodes
|
||||
current_rate = wellModel_.comm().sum(current_rate);
|
||||
@ -228,11 +264,13 @@ checkGroupProductionConstraints(const Group& group,
|
||||
{
|
||||
if (currentControl != Group::ProductionCMode::WRAT)
|
||||
{
|
||||
|
||||
double current_rate = 0.0;
|
||||
current_rate += WellGroupHelpers::sumWellSurfaceRates(group, wellModel_.schedule(),
|
||||
well_state, reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Aqua], false);
|
||||
current_rate += WellGroupHelpers<double>::sumWellSurfaceRates(group,
|
||||
wellModel_.schedule(),
|
||||
well_state,
|
||||
reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Aqua],
|
||||
false);
|
||||
|
||||
// sum over all nodes
|
||||
current_rate = wellModel_.comm().sum(current_rate);
|
||||
@ -250,9 +288,12 @@ checkGroupProductionConstraints(const Group& group,
|
||||
if (currentControl != Group::ProductionCMode::GRAT)
|
||||
{
|
||||
double current_rate = 0.0;
|
||||
current_rate += WellGroupHelpers::sumWellSurfaceRates(group, wellModel_.schedule(),
|
||||
well_state, reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Vapour], false);
|
||||
current_rate += WellGroupHelpers<double>::sumWellSurfaceRates(group,
|
||||
wellModel_.schedule(),
|
||||
well_state,
|
||||
reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Vapour],
|
||||
false);
|
||||
|
||||
// sum over all nodes
|
||||
current_rate = wellModel_.comm().sum(current_rate);
|
||||
@ -269,21 +310,30 @@ checkGroupProductionConstraints(const Group& group,
|
||||
if (currentControl != Group::ProductionCMode::LRAT)
|
||||
{
|
||||
double current_rate = 0.0;
|
||||
current_rate += WellGroupHelpers::sumWellSurfaceRates(group, wellModel_.schedule(),
|
||||
well_state, reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Liquid], false);
|
||||
current_rate += WellGroupHelpers::sumWellSurfaceRates(group, wellModel_.schedule(),
|
||||
well_state, reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Aqua], false);
|
||||
current_rate += WellGroupHelpers<double>::sumWellSurfaceRates(group,
|
||||
wellModel_.schedule(),
|
||||
well_state,
|
||||
reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Liquid],
|
||||
false);
|
||||
current_rate += WellGroupHelpers<double>::sumWellSurfaceRates(group,
|
||||
wellModel_.schedule(),
|
||||
well_state,
|
||||
reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Aqua],
|
||||
false);
|
||||
|
||||
// sum over all nodes
|
||||
current_rate = wellModel_.comm().sum(current_rate);
|
||||
|
||||
bool skip = false;
|
||||
if (controls.liquid_target == controls.oil_target) {
|
||||
double current_water_rate = WellGroupHelpers::sumWellSurfaceRates(group, wellModel_.schedule(),
|
||||
well_state, reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Aqua], false);
|
||||
double current_water_rate = WellGroupHelpers<double>::sumWellSurfaceRates(group,
|
||||
wellModel_.schedule(),
|
||||
well_state,
|
||||
reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Aqua],
|
||||
false);
|
||||
current_water_rate = wellModel_.comm().sum(current_water_rate);
|
||||
if (std::abs(current_water_rate) < 1e-12) {
|
||||
skip = true;
|
||||
@ -309,15 +359,24 @@ checkGroupProductionConstraints(const Group& group,
|
||||
if (currentControl != Group::ProductionCMode::RESV)
|
||||
{
|
||||
double current_rate = 0.0;
|
||||
current_rate += WellGroupHelpers::sumWellResRates(group, wellModel_.schedule(),
|
||||
well_state, reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Aqua], false);
|
||||
current_rate += WellGroupHelpers::sumWellResRates(group, wellModel_.schedule(),
|
||||
well_state, reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Liquid], false);
|
||||
current_rate += WellGroupHelpers::sumWellResRates(group, wellModel_.schedule(),
|
||||
well_state, reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Vapour], false);
|
||||
current_rate += WellGroupHelpers<double>::sumWellResRates(group,
|
||||
wellModel_.schedule(),
|
||||
well_state,
|
||||
reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Aqua],
|
||||
false);
|
||||
current_rate += WellGroupHelpers<double>::sumWellResRates(group,
|
||||
wellModel_.schedule(),
|
||||
well_state,
|
||||
reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Liquid],
|
||||
false);
|
||||
current_rate += WellGroupHelpers<double>::sumWellResRates(group,
|
||||
wellModel_.schedule(),
|
||||
well_state,
|
||||
reportStepIdx,
|
||||
pu.phase_pos[BlackoilPhases::Vapour],
|
||||
false);
|
||||
|
||||
// sum over all nodes
|
||||
current_rate = wellModel_.comm().sum(current_rate);
|
||||
@ -457,11 +516,10 @@ actionOnBrokenConstraints(const Group& group,
|
||||
break;
|
||||
}
|
||||
case Group::ExceedAction::WELL: {
|
||||
|
||||
std::tie(worst_offending_well, std::ignore) =
|
||||
WellGroupHelpers::worstOffendingWell(group, wellModel_.schedule(), reportStepIdx,
|
||||
newControl, wellModel_.phaseUsage(),
|
||||
wellModel_.comm(), well_state, deferred_logger);
|
||||
WellGroupHelpers<double>::worstOffendingWell(group, wellModel_.schedule(), reportStepIdx,
|
||||
newControl, wellModel_.phaseUsage(),
|
||||
wellModel_.comm(), well_state, deferred_logger);
|
||||
break;
|
||||
}
|
||||
case Group::ExceedAction::PLUG: {
|
||||
@ -520,13 +578,13 @@ updateGroupIndividualControl(const Group& group,
|
||||
Group::InjectionCMode2String(changed_this.first));
|
||||
this->actionOnBrokenConstraints(group, changed_this.first, phase,
|
||||
group_state, deferred_logger);
|
||||
WellGroupHelpers::updateWellRatesFromGroupTargetScale(changed_this.second,
|
||||
group,
|
||||
wellModel_.schedule(),
|
||||
reportStepIdx,
|
||||
/* isInjector */ false,
|
||||
wellModel_.groupState(),
|
||||
well_state);
|
||||
WellGroupHelpers<double>::updateWellRatesFromGroupTargetScale(changed_this.second,
|
||||
group,
|
||||
wellModel_.schedule(),
|
||||
reportStepIdx,
|
||||
/* isInjector */ false,
|
||||
wellModel_.groupState(),
|
||||
well_state);
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
@ -549,13 +607,13 @@ updateGroupIndividualControl(const Group& group,
|
||||
if(changed) {
|
||||
switched_prod.insert_or_assign(group.name(),
|
||||
Group::ProductionCMode2String(changed_this.first));
|
||||
WellGroupHelpers::updateWellRatesFromGroupTargetScale(changed_this.second,
|
||||
group,
|
||||
wellModel_.schedule(),
|
||||
reportStepIdx,
|
||||
/* isInjector */ false,
|
||||
wellModel_.groupState(),
|
||||
well_state);
|
||||
WellGroupHelpers<double>::updateWellRatesFromGroupTargetScale(changed_this.second,
|
||||
group,
|
||||
wellModel_.schedule(),
|
||||
reportStepIdx,
|
||||
/* isInjector */ false,
|
||||
wellModel_.groupState(),
|
||||
well_state);
|
||||
} else if (worst_offending_well) {
|
||||
closed_offending_wells.insert_or_assign(group.name(),
|
||||
std::make_pair(Group::ProductionCMode2String(changed_this.first), *worst_offending_well));
|
||||
|
@ -450,8 +450,18 @@ checkGconsaleLimits(const Group& group,
|
||||
const Group::ProductionCMode& oldProductionControl = this->groupState().production_control(group.name());
|
||||
|
||||
int gasPos = phase_usage_.phase_pos[BlackoilPhases::Vapour];
|
||||
double production_rate = WellGroupHelpers::sumWellSurfaceRates(group, schedule(), well_state, reportStepIdx, gasPos, /*isInjector*/false);
|
||||
double injection_rate = WellGroupHelpers::sumWellSurfaceRates(group, schedule(), well_state, reportStepIdx, gasPos, /*isInjector*/true);
|
||||
double production_rate = WellGroupHelpers<double>::sumWellSurfaceRates(group,
|
||||
schedule(),
|
||||
well_state,
|
||||
reportStepIdx,
|
||||
gasPos,
|
||||
/*isInjector*/false);
|
||||
double injection_rate = WellGroupHelpers<double>::sumWellSurfaceRates(group,
|
||||
schedule(),
|
||||
well_state,
|
||||
reportStepIdx,
|
||||
gasPos,
|
||||
/*isInjector*/true);
|
||||
|
||||
// sum over all nodes
|
||||
injection_rate = comm_.sum(injection_rate);
|
||||
@ -585,7 +595,12 @@ checkGroupHigherConstraints(const Group& group,
|
||||
calcInjRates(fipnum, pvtreg, resv_coeff_inj);
|
||||
|
||||
for (int phasePos = 0; phasePos < phase_usage_.num_phases; ++phasePos) {
|
||||
const double local_current_rate = WellGroupHelpers::sumWellSurfaceRates(group, schedule(), this->wellState(), reportStepIdx, phasePos, /* isInjector */ true);
|
||||
const double local_current_rate = WellGroupHelpers<double>::sumWellSurfaceRates(group,
|
||||
schedule(),
|
||||
this->wellState(),
|
||||
reportStepIdx,
|
||||
phasePos,
|
||||
/* isInjector */ true);
|
||||
// Sum over all processes
|
||||
rates[phasePos] = comm_.sum(local_current_rate);
|
||||
}
|
||||
@ -595,29 +610,35 @@ checkGroupHigherConstraints(const Group& group,
|
||||
auto currentControl = this->groupState().injection_control(group.name(), phase);
|
||||
if (currentControl != Group::InjectionCMode::FLD && group.injectionGroupControlAvailable(phase)) {
|
||||
const Group& parentGroup = schedule().getGroup(group.parent(), reportStepIdx);
|
||||
const auto [is_changed, scaling_factor] = WellGroupHelpers::checkGroupConstraintsInj(
|
||||
group.name(),
|
||||
group.parent(),
|
||||
parentGroup,
|
||||
this->wellState(),
|
||||
this->groupState(),
|
||||
reportStepIdx,
|
||||
&guideRate_,
|
||||
rates.data(),
|
||||
phase,
|
||||
phase_usage_,
|
||||
group.getGroupEfficiencyFactor(),
|
||||
schedule(),
|
||||
summaryState_,
|
||||
resv_coeff_inj,
|
||||
deferred_logger);
|
||||
const auto [is_changed, scaling_factor] =
|
||||
WellGroupHelpers<double>::checkGroupConstraintsInj(group.name(),
|
||||
group.parent(),
|
||||
parentGroup,
|
||||
this->wellState(),
|
||||
this->groupState(),
|
||||
reportStepIdx,
|
||||
&guideRate_,
|
||||
rates.data(),
|
||||
phase,
|
||||
phase_usage_,
|
||||
group.getGroupEfficiencyFactor(),
|
||||
schedule(),
|
||||
summaryState_,
|
||||
resv_coeff_inj,
|
||||
deferred_logger);
|
||||
if (is_changed) {
|
||||
switched_inj_groups_.insert_or_assign({group.name(), phase}, Group::InjectionCMode2String(Group::InjectionCMode::FLD));
|
||||
BlackoilWellModelConstraints(*this).
|
||||
actionOnBrokenConstraints(group, Group::InjectionCMode::FLD,
|
||||
phase, this->groupState(),
|
||||
deferred_logger);
|
||||
WellGroupHelpers::updateWellRatesFromGroupTargetScale(scaling_factor, group, schedule(), reportStepIdx, /* isInjector */ true, this->groupState(), this->wellState());
|
||||
WellGroupHelpers<double>::updateWellRatesFromGroupTargetScale(scaling_factor,
|
||||
group,
|
||||
schedule(),
|
||||
reportStepIdx,
|
||||
/* isInjector */ true,
|
||||
this->groupState(),
|
||||
this->wellState());
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
@ -627,7 +648,12 @@ checkGroupHigherConstraints(const Group& group,
|
||||
if (!isField && group.isProductionGroup()) {
|
||||
// Obtain rates for group.
|
||||
for (int phasePos = 0; phasePos < phase_usage_.num_phases; ++phasePos) {
|
||||
const double local_current_rate = WellGroupHelpers::sumWellSurfaceRates(group, schedule(), this->wellState(), reportStepIdx, phasePos, /* isInjector */ false);
|
||||
const double local_current_rate = WellGroupHelpers<double>::sumWellSurfaceRates(group,
|
||||
schedule(),
|
||||
this->wellState(),
|
||||
reportStepIdx,
|
||||
phasePos,
|
||||
/* isInjector */ false);
|
||||
// Sum over all processes
|
||||
rates[phasePos] = -comm_.sum(local_current_rate);
|
||||
}
|
||||
@ -637,21 +663,21 @@ checkGroupHigherConstraints(const Group& group,
|
||||
const Group::ProductionCMode& currentControl = this->groupState().production_control(group.name());
|
||||
if (currentControl != Group::ProductionCMode::FLD && group.productionGroupControlAvailable()) {
|
||||
const Group& parentGroup = schedule().getGroup(group.parent(), reportStepIdx);
|
||||
const auto [is_changed, scaling_factor] = WellGroupHelpers::checkGroupConstraintsProd(
|
||||
group.name(),
|
||||
group.parent(),
|
||||
parentGroup,
|
||||
this->wellState(),
|
||||
this->groupState(),
|
||||
reportStepIdx,
|
||||
&guideRate_,
|
||||
rates.data(),
|
||||
phase_usage_,
|
||||
group.getGroupEfficiencyFactor(),
|
||||
schedule(),
|
||||
summaryState_,
|
||||
resv_coeff,
|
||||
deferred_logger);
|
||||
const auto [is_changed, scaling_factor] =
|
||||
WellGroupHelpers<double>::checkGroupConstraintsProd(group.name(),
|
||||
group.parent(),
|
||||
parentGroup,
|
||||
this->wellState(),
|
||||
this->groupState(),
|
||||
reportStepIdx,
|
||||
&guideRate_,
|
||||
rates.data(),
|
||||
phase_usage_,
|
||||
group.getGroupEfficiencyFactor(),
|
||||
schedule(),
|
||||
summaryState_,
|
||||
resv_coeff,
|
||||
deferred_logger);
|
||||
if (is_changed) {
|
||||
const auto group_limit_action = group.productionControls(summaryState_).group_limit_action;
|
||||
std::optional<std::string> worst_offending_well = std::nullopt;
|
||||
@ -664,8 +690,15 @@ checkGroupHigherConstraints(const Group& group,
|
||||
deferred_logger);
|
||||
|
||||
if (changed) {
|
||||
switched_prod_groups_.insert_or_assign(group.name(), Group::ProductionCMode2String(Group::ProductionCMode::FLD));
|
||||
WellGroupHelpers::updateWellRatesFromGroupTargetScale(scaling_factor, group, schedule(), reportStepIdx, /* isInjector */ false, this->groupState(), this->wellState());
|
||||
switched_prod_groups_.insert_or_assign(group.name(),
|
||||
Group::ProductionCMode2String(Group::ProductionCMode::FLD));
|
||||
WellGroupHelpers<double>::updateWellRatesFromGroupTargetScale(scaling_factor,
|
||||
group,
|
||||
schedule(),
|
||||
reportStepIdx,
|
||||
/* isInjector */ false,
|
||||
this->groupState(),
|
||||
this->wellState());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -808,8 +841,17 @@ updateWsolvent(const Group& group,
|
||||
int gasPos = phase_usage_.phase_pos[BlackoilPhases::Vapour];
|
||||
const auto& controls = group.injectionControls(Phase::GAS, summaryState_);
|
||||
const Group& groupRein = schedule_.getGroup(controls.reinj_group, reportStepIdx);
|
||||
double gasProductionRate = WellGroupHelpers::sumWellSurfaceRates(groupRein, schedule_, wellState, reportStepIdx, gasPos, /*isInjector*/false);
|
||||
double solventProductionRate = WellGroupHelpers::sumSolventRates(groupRein, schedule_, wellState, reportStepIdx, /*isInjector*/false);
|
||||
double gasProductionRate = WellGroupHelpers<double>::sumWellSurfaceRates(groupRein,
|
||||
schedule_,
|
||||
wellState,
|
||||
reportStepIdx,
|
||||
gasPos,
|
||||
/*isInjector*/false);
|
||||
double solventProductionRate = WellGroupHelpers<double>::sumSolventRates(groupRein,
|
||||
schedule_,
|
||||
wellState,
|
||||
reportStepIdx,
|
||||
/*isInjector*/false);
|
||||
|
||||
solventProductionRate = comm_.sum(solventProductionRate);
|
||||
gasProductionRate = comm_.sum(gasProductionRate);
|
||||
@ -956,12 +998,12 @@ assignNodeValues(std::map<std::string, data::NodeData>& nodevalues, const int re
|
||||
const auto& network = schedule()[reportStepIdx].network();
|
||||
if (!network.active()) return;
|
||||
|
||||
auto converged_pressures = WellGroupHelpers::computeNetworkPressures(network,
|
||||
this->wellState(),
|
||||
this->groupState(),
|
||||
*(vfp_properties_->getProd()),
|
||||
schedule(),
|
||||
reportStepIdx);
|
||||
auto converged_pressures = WellGroupHelpers<double>::computeNetworkPressures(network,
|
||||
this->wellState(),
|
||||
this->groupState(),
|
||||
*(vfp_properties_->getProd()),
|
||||
schedule(),
|
||||
reportStepIdx);
|
||||
for (const auto& [node, converged_pressure] : converged_pressures) {
|
||||
auto it = nodevalues.find(node);
|
||||
assert(it != nodevalues.end() );
|
||||
@ -1011,20 +1053,63 @@ updateAndCommunicateGroupData(const int reportStepIdx,
|
||||
// the group target reduction rates needs to be update since wells may have switched to/from GRUP control
|
||||
// The group target reduction does not honor NUPCOL.
|
||||
std::vector<double> groupTargetReduction(numPhases(), 0.0);
|
||||
WellGroupHelpers::updateGroupTargetReduction(fieldGroup, schedule(), reportStepIdx, /*isInjector*/ false, phase_usage_, guideRate_, well_state, this->groupState(), groupTargetReduction);
|
||||
WellGroupHelpers<double>::updateGroupTargetReduction(fieldGroup,
|
||||
schedule(),
|
||||
reportStepIdx,
|
||||
/*isInjector*/ false,
|
||||
phase_usage_,
|
||||
guideRate_,
|
||||
well_state,
|
||||
this->groupState(),
|
||||
groupTargetReduction);
|
||||
std::vector<double> groupTargetReductionInj(numPhases(), 0.0);
|
||||
WellGroupHelpers::updateGroupTargetReduction(fieldGroup, schedule(), reportStepIdx, /*isInjector*/ true, phase_usage_, guideRate_, well_state, this->groupState(), groupTargetReductionInj);
|
||||
WellGroupHelpers<double>::updateGroupTargetReduction(fieldGroup,
|
||||
schedule(),
|
||||
reportStepIdx,
|
||||
/*isInjector*/ true,
|
||||
phase_usage_,
|
||||
guideRate_,
|
||||
well_state,
|
||||
this->groupState(),
|
||||
groupTargetReductionInj);
|
||||
|
||||
WellGroupHelpers::updateREINForGroups(fieldGroup, schedule(), reportStepIdx, phase_usage_, summaryState_, well_state_nupcol, this->groupState(), comm_.rank()==0);
|
||||
WellGroupHelpers::updateVREPForGroups(fieldGroup, schedule(), reportStepIdx, well_state_nupcol, this->groupState());
|
||||
WellGroupHelpers<double>::updateREINForGroups(fieldGroup,
|
||||
schedule(),
|
||||
reportStepIdx,
|
||||
phase_usage_,
|
||||
summaryState_,
|
||||
well_state_nupcol,
|
||||
this->groupState(),
|
||||
comm_.rank() == 0);
|
||||
WellGroupHelpers<double>::updateVREPForGroups(fieldGroup,
|
||||
schedule(),
|
||||
reportStepIdx,
|
||||
well_state_nupcol,
|
||||
this->groupState());
|
||||
|
||||
WellGroupHelpers::updateReservoirRatesInjectionGroups(fieldGroup, schedule(), reportStepIdx, well_state_nupcol, this->groupState());
|
||||
WellGroupHelpers::updateSurfaceRatesInjectionGroups(fieldGroup, schedule(), reportStepIdx, well_state_nupcol, this->groupState());
|
||||
WellGroupHelpers<double>::updateReservoirRatesInjectionGroups(fieldGroup,
|
||||
schedule(),
|
||||
reportStepIdx,
|
||||
well_state_nupcol,
|
||||
this->groupState());
|
||||
WellGroupHelpers<double>::updateSurfaceRatesInjectionGroups(fieldGroup,
|
||||
schedule(),
|
||||
reportStepIdx,
|
||||
well_state_nupcol,
|
||||
this->groupState());
|
||||
|
||||
WellGroupHelpers::updateGroupProductionRates(fieldGroup, schedule(), reportStepIdx, well_state_nupcol, this->groupState());
|
||||
WellGroupHelpers<double>::updateGroupProductionRates(fieldGroup,
|
||||
schedule(),
|
||||
reportStepIdx,
|
||||
well_state_nupcol,
|
||||
this->groupState());
|
||||
|
||||
// We use the rates from the previous time-step to reduce oscillations
|
||||
WellGroupHelpers::updateWellRates(fieldGroup, schedule(), reportStepIdx, this->prevWellState(), well_state);
|
||||
WellGroupHelpers<double>::updateWellRates(fieldGroup,
|
||||
schedule(),
|
||||
reportStepIdx,
|
||||
this->prevWellState(),
|
||||
well_state);
|
||||
|
||||
// Set ALQ for off-process wells to zero
|
||||
for (const auto& wname : schedule().wellNames(reportStepIdx)) {
|
||||
@ -1151,12 +1236,12 @@ updateNetworkPressures(const int reportStepIdx)
|
||||
|
||||
const auto previous_node_pressures = node_pressures_;
|
||||
|
||||
node_pressures_ = WellGroupHelpers::computeNetworkPressures(network,
|
||||
this->wellState(),
|
||||
this->groupState(),
|
||||
*(vfp_properties_->getProd()),
|
||||
schedule(),
|
||||
reportStepIdx);
|
||||
node_pressures_ = WellGroupHelpers<double>::computeNetworkPressures(network,
|
||||
this->wellState(),
|
||||
this->groupState(),
|
||||
*(vfp_properties_->getProd()),
|
||||
schedule(),
|
||||
reportStepIdx);
|
||||
|
||||
// here, the network imbalance is the difference between the previous nodal pressure and the new nodal pressure
|
||||
double network_imbalance = 0.;
|
||||
@ -1225,7 +1310,11 @@ calculateEfficiencyFactors(const int reportStepIdx)
|
||||
for (auto& well : well_container_generic_) {
|
||||
const Well& wellEcl = well->wellEcl();
|
||||
double well_efficiency_factor = wellEcl.getEfficiencyFactor();
|
||||
WellGroupHelpers::accumulateGroupEfficiencyFactor(schedule().getGroup(wellEcl.groupName(), reportStepIdx), schedule(), reportStepIdx, well_efficiency_factor);
|
||||
WellGroupHelpers<double>::accumulateGroupEfficiencyFactor(schedule().getGroup(wellEcl.groupName(),
|
||||
reportStepIdx),
|
||||
schedule(),
|
||||
reportStepIdx,
|
||||
well_efficiency_factor);
|
||||
well->setWellEfficiencyFactor(well_efficiency_factor);
|
||||
}
|
||||
}
|
||||
|
@ -328,7 +328,7 @@ getGuideRateValues(const Well& well) const
|
||||
return grval;
|
||||
}
|
||||
|
||||
const auto qs = WellGroupHelpers::
|
||||
const auto qs = WellGroupHelpers<double>::
|
||||
getWellRateVector(wellModel_.wellState(), wellModel_.phaseUsage(), wname);
|
||||
|
||||
this->getGuideRateValues(qs, well.isInjector(), wname, grval);
|
||||
@ -355,7 +355,7 @@ getGuideRateValues(const Group& group) const
|
||||
return grval;
|
||||
}
|
||||
|
||||
const auto qs = WellGroupHelpers::
|
||||
const auto qs = WellGroupHelpers<double>::
|
||||
getProductionGroupRateVector(wellModel_.groupState(), wellModel_.phaseUsage(), gname);
|
||||
|
||||
const auto is_inj = false; // This procedure only applies to G*PGR.
|
||||
@ -433,7 +433,7 @@ assignWellGuideRates(data::Wells& wsrpt,
|
||||
const auto get_gr = parent
|
||||
|| RetrieveWellGuideRate{wellModel_.guideRate(), wname};
|
||||
|
||||
const auto qs = WellGroupHelpers::
|
||||
const auto qs = WellGroupHelpers<double>::
|
||||
getWellRateVector(wellModel_.wellState(), wellModel_.phaseUsage(), wname);
|
||||
|
||||
auto getGR = [this, &wname, &qs](const GuideRateModel::Target t)
|
||||
|
@ -343,16 +343,16 @@ namespace Opm {
|
||||
const auto& fieldGroup =
|
||||
this->schedule().getGroup("FIELD", reportStepIdx);
|
||||
|
||||
WellGroupHelpers::setCmodeGroup(fieldGroup,
|
||||
this->schedule(),
|
||||
this->summaryState(),
|
||||
reportStepIdx,
|
||||
this->groupState());
|
||||
WellGroupHelpers<Scalar>::setCmodeGroup(fieldGroup,
|
||||
this->schedule(),
|
||||
this->summaryState(),
|
||||
reportStepIdx,
|
||||
this->groupState());
|
||||
|
||||
// Define per region average pressure calculators for use by
|
||||
// pressure maintenance groups (GPMAINT keyword).
|
||||
if (this->schedule()[reportStepIdx].has_gpmaint()) {
|
||||
WellGroupHelpers::setRegionAveragePressureCalculator
|
||||
WellGroupHelpers<Scalar>::setRegionAveragePressureCalculator
|
||||
(fieldGroup,
|
||||
this->schedule(),
|
||||
reportStepIdx,
|
||||
@ -505,10 +505,20 @@ namespace Opm {
|
||||
|
||||
//update guide rates
|
||||
const auto& comm = simulator_.vanguard().grid().comm();
|
||||
std::vector<double> pot(numPhases(), 0.0);
|
||||
const Group& fieldGroup = schedule().getGroup("FIELD", reportStepIdx);
|
||||
WellGroupHelpers::updateGuideRates(fieldGroup, schedule(), summaryState, this->phase_usage_, reportStepIdx, simulationTime,
|
||||
this->wellState(), this->groupState(), comm, &this->guideRate_, pot, local_deferredLogger);
|
||||
std::vector<double> pot(this->numPhases(), 0.0);
|
||||
const Group& fieldGroup = this->schedule().getGroup("FIELD", reportStepIdx);
|
||||
WellGroupHelpers<double>::updateGuideRates(fieldGroup,
|
||||
this->schedule(),
|
||||
summaryState,
|
||||
this->phase_usage_,
|
||||
reportStepIdx,
|
||||
simulationTime,
|
||||
this->wellState(),
|
||||
this->groupState(),
|
||||
comm,
|
||||
&this->guideRate_,
|
||||
pot,
|
||||
local_deferredLogger);
|
||||
std::string exc_msg;
|
||||
auto exc_type = ExceptionType::NONE;
|
||||
// update gpmaint targets
|
||||
@ -517,8 +527,13 @@ namespace Opm {
|
||||
calculator.second->template defineState<ElementContext>(simulator_);
|
||||
}
|
||||
const double dt = simulator_.timeStepSize();
|
||||
WellGroupHelpers::updateGpMaintTargetForGroups(fieldGroup,
|
||||
schedule_, regionalAveragePressureCalculator_, reportStepIdx, dt, this->wellState(), this->groupState());
|
||||
WellGroupHelpers<double>::updateGpMaintTargetForGroups(fieldGroup,
|
||||
this->schedule_,
|
||||
regionalAveragePressureCalculator_,
|
||||
reportStepIdx,
|
||||
dt,
|
||||
this->wellState(),
|
||||
this->groupState());
|
||||
}
|
||||
try {
|
||||
// Compute initial well solution for new wells and injectors that change injection type i.e. WAG.
|
||||
@ -574,8 +589,11 @@ namespace Opm {
|
||||
well->init(&phase_usage_, depth_, gravity_, local_num_cells_, B_avg_, true);
|
||||
|
||||
double well_efficiency_factor = wellEcl.getEfficiencyFactor();
|
||||
WellGroupHelpers::accumulateGroupEfficiencyFactor(schedule().getGroup(wellEcl.groupName(), timeStepIdx),
|
||||
schedule(), timeStepIdx, well_efficiency_factor);
|
||||
WellGroupHelpers<double>::accumulateGroupEfficiencyFactor(this->schedule().getGroup(wellEcl.groupName(),
|
||||
timeStepIdx),
|
||||
this->schedule(),
|
||||
timeStepIdx,
|
||||
well_efficiency_factor);
|
||||
|
||||
well->setWellEfficiencyFactor(well_efficiency_factor);
|
||||
well->setVFPProperties(vfp_properties_.get());
|
||||
@ -1191,13 +1209,22 @@ namespace Opm {
|
||||
const double simulationTime = simulator_.time();
|
||||
const auto& comm = simulator_.vanguard().grid().comm();
|
||||
const auto& summaryState = simulator_.vanguard().summaryState();
|
||||
std::vector<double> pot(numPhases(), 0.0);
|
||||
const Group& fieldGroup = schedule().getGroup("FIELD", reportStepIdx);
|
||||
WellGroupHelpers::updateGuideRates(fieldGroup, schedule(), summaryState, this->phase_usage_, reportStepIdx, simulationTime,
|
||||
this->wellState(), this->groupState(), comm, &this->guideRate_, pot, local_deferredLogger);
|
||||
std::vector<double> pot(this->numPhases(), 0.0);
|
||||
const Group& fieldGroup = this->schedule().getGroup("FIELD", reportStepIdx);
|
||||
WellGroupHelpers<double>::updateGuideRates(fieldGroup,
|
||||
this->schedule(),
|
||||
summaryState,
|
||||
this->phase_usage_,
|
||||
reportStepIdx,
|
||||
simulationTime,
|
||||
this->wellState(),
|
||||
this->groupState(),
|
||||
comm,
|
||||
&this->guideRate_,
|
||||
pot,
|
||||
local_deferredLogger);
|
||||
}
|
||||
|
||||
|
||||
return {more_network_update, well_group_control_changed};
|
||||
}
|
||||
|
||||
|
@ -30,17 +30,19 @@
|
||||
|
||||
#include <cassert>
|
||||
|
||||
namespace Opm::WellGroupHelpers {
|
||||
namespace Opm::WGHelpers {
|
||||
|
||||
FractionCalculator::FractionCalculator(const Schedule& schedule,
|
||||
const WellState<double>& well_state,
|
||||
const GroupState<double>& group_state,
|
||||
const int report_step,
|
||||
const GuideRate* guide_rate,
|
||||
const GuideRateModel::Target target,
|
||||
const PhaseUsage& pu,
|
||||
const bool is_producer,
|
||||
const Phase injection_phase)
|
||||
template<class Scalar>
|
||||
FractionCalculator<Scalar>::
|
||||
FractionCalculator(const Schedule& schedule,
|
||||
const WellState<Scalar>& well_state,
|
||||
const GroupState<Scalar>& group_state,
|
||||
const int report_step,
|
||||
const GuideRate* guide_rate,
|
||||
const GuideRateModel::Target target,
|
||||
const PhaseUsage& pu,
|
||||
const bool is_producer,
|
||||
const Phase injection_phase)
|
||||
: schedule_(schedule)
|
||||
, well_state_(well_state)
|
||||
, group_state_(group_state)
|
||||
@ -53,11 +55,13 @@ FractionCalculator::FractionCalculator(const Schedule& schedule,
|
||||
{
|
||||
}
|
||||
|
||||
double FractionCalculator::fraction(const std::string& name,
|
||||
const std::string& control_group_name,
|
||||
const bool always_include_this)
|
||||
template<class Scalar>
|
||||
Scalar FractionCalculator<Scalar>::
|
||||
fraction(const std::string& name,
|
||||
const std::string& control_group_name,
|
||||
const bool always_include_this)
|
||||
{
|
||||
double fraction = 1.0;
|
||||
Scalar fraction = 1.0;
|
||||
std::string current = name;
|
||||
while (current != control_group_name) {
|
||||
fraction *= localFraction(current, always_include_this ? name : "");
|
||||
@ -66,17 +70,19 @@ double FractionCalculator::fraction(const std::string& name,
|
||||
return fraction;
|
||||
}
|
||||
|
||||
double FractionCalculator::localFraction(const std::string& name,
|
||||
const std::string& always_included_child)
|
||||
template<class Scalar>
|
||||
Scalar FractionCalculator<Scalar>::
|
||||
localFraction(const std::string& name,
|
||||
const std::string& always_included_child)
|
||||
{
|
||||
const double my_guide_rate = guideRate(name, always_included_child);
|
||||
const Scalar my_guide_rate = guideRate(name, always_included_child);
|
||||
const Group& parent_group = schedule_.getGroup(parent(name), report_step_);
|
||||
const double total_guide_rate = guideRateSum(parent_group, always_included_child);
|
||||
const Scalar total_guide_rate = guideRateSum(parent_group, always_included_child);
|
||||
|
||||
// the total guide gate is the same as my_guide rate
|
||||
// the well/group is probably on its own, i.e. return 1
|
||||
// even is its guide_rate is zero
|
||||
const double guide_rate_epsilon = 1e-12;
|
||||
const Scalar guide_rate_epsilon = 1e-12;
|
||||
if ( std::abs(my_guide_rate - total_guide_rate) < guide_rate_epsilon )
|
||||
return 1.0;
|
||||
|
||||
@ -84,7 +90,9 @@ double FractionCalculator::localFraction(const std::string& name,
|
||||
return my_guide_rate / total_guide_rate;
|
||||
}
|
||||
|
||||
std::string FractionCalculator::parent(const std::string& name)
|
||||
template<class Scalar>
|
||||
std::string FractionCalculator<Scalar>::
|
||||
parent(const std::string& name)
|
||||
{
|
||||
if (schedule_.hasWell(name)) {
|
||||
return schedule_.getWell(name, report_step_).groupName();
|
||||
@ -93,10 +101,12 @@ std::string FractionCalculator::parent(const std::string& name)
|
||||
}
|
||||
}
|
||||
|
||||
double FractionCalculator::guideRateSum(const Group& group,
|
||||
const std::string& always_included_child)
|
||||
template<class Scalar>
|
||||
Scalar FractionCalculator<Scalar>::
|
||||
guideRateSum(const Group& group,
|
||||
const std::string& always_included_child)
|
||||
{
|
||||
double total_guide_rate = 0.0;
|
||||
Scalar total_guide_rate = 0.0;
|
||||
for (const std::string& child_group : group.groups()) {
|
||||
bool included = (child_group == always_included_child);
|
||||
if (is_producer_) {
|
||||
@ -128,11 +138,14 @@ double FractionCalculator::guideRateSum(const Group& group,
|
||||
return total_guide_rate;
|
||||
}
|
||||
|
||||
double FractionCalculator::guideRate(const std::string& name, const std::string& always_included_child)
|
||||
template<class Scalar>
|
||||
Scalar FractionCalculator<Scalar>::
|
||||
guideRate(const std::string& name,
|
||||
const std::string& always_included_child)
|
||||
{
|
||||
if (schedule_.hasWell(name, report_step_)) {
|
||||
return WellGroupHelpers::getGuideRate(name, schedule_, well_state_, group_state_,
|
||||
report_step_, guide_rate_, target_, pu_);
|
||||
return WellGroupHelpers<Scalar>::getGuideRate(name, schedule_, well_state_, group_state_,
|
||||
report_step_, guide_rate_, target_, pu_);
|
||||
} else {
|
||||
if (groupControlledWells(name, always_included_child) > 0) {
|
||||
if (is_producer_ && guide_rate_->has(name)) {
|
||||
@ -153,25 +166,31 @@ double FractionCalculator::guideRate(const std::string& name, const std::string&
|
||||
}
|
||||
}
|
||||
|
||||
int FractionCalculator::groupControlledWells(const std::string& group_name,
|
||||
const std::string& always_included_child)
|
||||
template<class Scalar>
|
||||
int FractionCalculator<Scalar>::
|
||||
groupControlledWells(const std::string& group_name,
|
||||
const std::string& always_included_child)
|
||||
{
|
||||
return WellGroupHelpers::groupControlledWells(schedule_,
|
||||
well_state_,
|
||||
this->group_state_,
|
||||
report_step_,
|
||||
group_name,
|
||||
always_included_child,
|
||||
is_producer_,
|
||||
injection_phase_);
|
||||
return WellGroupHelpers<Scalar>::groupControlledWells(schedule_,
|
||||
well_state_,
|
||||
this->group_state_,
|
||||
report_step_,
|
||||
group_name,
|
||||
always_included_child,
|
||||
is_producer_,
|
||||
injection_phase_);
|
||||
}
|
||||
|
||||
GuideRate::RateVector FractionCalculator::getGroupRateVector(const std::string& group_name)
|
||||
template<class Scalar>
|
||||
GuideRate::RateVector FractionCalculator<Scalar>::
|
||||
getGroupRateVector(const std::string& group_name)
|
||||
{
|
||||
assert(is_producer_);
|
||||
return WellGroupHelpers::getProductionGroupRateVector(this->group_state_,
|
||||
this->pu_,
|
||||
group_name);
|
||||
return WellGroupHelpers<Scalar>::getProductionGroupRateVector(this->group_state_,
|
||||
this->pu_,
|
||||
group_name);
|
||||
}
|
||||
|
||||
template class FractionCalculator<double>;
|
||||
|
||||
} // namespace Opm::WGHelpers
|
||||
|
@ -32,38 +32,39 @@ class Schedule;
|
||||
template<class Scalar> class WellState;
|
||||
}
|
||||
|
||||
namespace Opm::WellGroupHelpers {
|
||||
namespace Opm::WGHelpers {
|
||||
|
||||
template<class Scalar>
|
||||
class FractionCalculator
|
||||
{
|
||||
public:
|
||||
FractionCalculator(const Schedule& schedule,
|
||||
const WellState<double>& well_state,
|
||||
const GroupState<double>& group_state,
|
||||
const WellState<Scalar>& well_state,
|
||||
const GroupState<Scalar>& group_state,
|
||||
const int report_step,
|
||||
const GuideRate* guide_rate,
|
||||
const GuideRateModel::Target target,
|
||||
const PhaseUsage& pu,
|
||||
const bool is_producer,
|
||||
const Phase injection_phase);
|
||||
double fraction(const std::string& name,
|
||||
Scalar fraction(const std::string& name,
|
||||
const std::string& control_group_name,
|
||||
const bool always_include_this);
|
||||
double localFraction(const std::string& name,
|
||||
Scalar localFraction(const std::string& name,
|
||||
const std::string& always_included_child);
|
||||
|
||||
private:
|
||||
std::string parent(const std::string& name);
|
||||
double guideRateSum(const Group& group,
|
||||
Scalar guideRateSum(const Group& group,
|
||||
const std::string& always_included_child);
|
||||
double guideRate(const std::string& name,
|
||||
Scalar guideRate(const std::string& name,
|
||||
const std::string& always_included_child);
|
||||
int groupControlledWells(const std::string& group_name,
|
||||
const std::string& always_included_child);
|
||||
GuideRate::RateVector getGroupRateVector(const std::string& group_name);
|
||||
const Schedule& schedule_;
|
||||
const WellState<double>& well_state_;
|
||||
const GroupState<double>& group_state_;
|
||||
const WellState<Scalar>& well_state_;
|
||||
const GroupState<Scalar>& group_state_;
|
||||
int report_step_;
|
||||
const GuideRate* guide_rate_;
|
||||
GuideRateModel::Target target_;
|
||||
@ -72,6 +73,6 @@ private:
|
||||
Phase injection_phase_;
|
||||
};
|
||||
|
||||
} // namespace Opm::WellGroupHelpers
|
||||
} // namespace Opm::WGHelpers
|
||||
|
||||
#endif // OPM_FRACTION_CALCULATOR_HEADER_INCLUDED
|
||||
|
@ -77,9 +77,12 @@ GroupEconomicLimitsChecker(const BlackoilWellModelGeneric& well_model,
|
||||
auto phase_idx = this->phase_idx_map_[i];
|
||||
this->phase_idx_reverse_map_[phase_idx] = static_cast<int>(i);
|
||||
auto phase_pos = this->well_model_.phaseUsage().phase_pos[phase_idx];
|
||||
Scalar production_rate = WellGroupHelpers::sumWellSurfaceRates(
|
||||
this->group_, this->schedule_, this->well_state_,
|
||||
this->report_step_idx_, phase_pos, /*isInjector*/false);
|
||||
Scalar production_rate = WellGroupHelpers<Scalar>::sumWellSurfaceRates(this->group_,
|
||||
this->schedule_,
|
||||
this->well_state_,
|
||||
this->report_step_idx_,
|
||||
phase_pos,
|
||||
/*isInjector*/false);
|
||||
this->production_rates_[i] = this->well_model_.comm().sum(production_rate);
|
||||
}
|
||||
}
|
||||
|
@ -26,24 +26,20 @@
|
||||
#include <opm/simulators/utils/DeferredLoggingErrorHelpers.hpp>
|
||||
#include <opm/simulators/wells/GroupState.hpp>
|
||||
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <stdexcept>
|
||||
#include <type_traits>
|
||||
|
||||
namespace Opm
|
||||
{
|
||||
namespace Opm::WGHelpers {
|
||||
|
||||
namespace WellGroupHelpers
|
||||
{
|
||||
|
||||
TargetCalculator::TargetCalculator(const Group::ProductionCMode cmode,
|
||||
const PhaseUsage& pu,
|
||||
const std::vector<double>& resv_coeff,
|
||||
const double group_grat_target_from_sales,
|
||||
const std::string& group_name,
|
||||
const GroupState<double>& group_state,
|
||||
const bool use_gpmaint)
|
||||
template<class Scalar>
|
||||
TargetCalculator<Scalar>::
|
||||
TargetCalculator(const Group::ProductionCMode cmode,
|
||||
const PhaseUsage& pu,
|
||||
const std::vector<Scalar>& resv_coeff,
|
||||
const Scalar group_grat_target_from_sales,
|
||||
const std::string& group_name,
|
||||
const GroupState<Scalar>& group_state,
|
||||
const bool use_gpmaint)
|
||||
: cmode_(cmode)
|
||||
, pu_(pu)
|
||||
, resv_coeff_(resv_coeff)
|
||||
@ -55,8 +51,9 @@ TargetCalculator::TargetCalculator(const Group::ProductionCMode cmode,
|
||||
{
|
||||
}
|
||||
|
||||
template<class Scalar>
|
||||
template <typename RateType>
|
||||
RateType TargetCalculator::calcModeRateFromRates(const RateType* rates) const
|
||||
RateType TargetCalculator<Scalar>::calcModeRateFromRates(const RateType* rates) const
|
||||
{
|
||||
switch (cmode_) {
|
||||
case Group::ProductionCMode::ORAT: {
|
||||
@ -95,7 +92,10 @@ RateType TargetCalculator::calcModeRateFromRates(const RateType* rates) const
|
||||
}
|
||||
}
|
||||
|
||||
double TargetCalculator::groupTarget(const std::optional<Group::ProductionControls>& ctrl, Opm::DeferredLogger& deferred_logger) const
|
||||
template<class Scalar>
|
||||
Scalar TargetCalculator<Scalar>::
|
||||
groupTarget(const std::optional<Group::ProductionControls>& ctrl,
|
||||
DeferredLogger& deferred_logger) const
|
||||
{
|
||||
if (!ctrl && !use_gpmaint_) {
|
||||
OPM_DEFLOG_THROW(std::logic_error,
|
||||
@ -111,7 +111,7 @@ double TargetCalculator::groupTarget(const std::optional<Group::ProductionContro
|
||||
case Group::ProductionCMode::GRAT:
|
||||
{
|
||||
// gas target may have been adjusted by GCONSALE
|
||||
if ( group_grat_target_from_sales_ > 0)
|
||||
if (group_grat_target_from_sales_ > 0)
|
||||
return group_grat_target_from_sales_;
|
||||
|
||||
return ctrl->gas_target;
|
||||
@ -120,7 +120,7 @@ double TargetCalculator::groupTarget(const std::optional<Group::ProductionContro
|
||||
return ctrl->liquid_target;
|
||||
case Group::ProductionCMode::RESV:
|
||||
{
|
||||
if(use_gpmaint_ && this->group_state_.has_gpmaint_target(this->group_name_))
|
||||
if (use_gpmaint_ && this->group_state_.has_gpmaint_target(this->group_name_))
|
||||
return this->group_state_.gpmaint_target(this->group_name_);
|
||||
|
||||
return ctrl->resv_target;
|
||||
@ -132,7 +132,9 @@ double TargetCalculator::groupTarget(const std::optional<Group::ProductionContro
|
||||
}
|
||||
}
|
||||
|
||||
GuideRateModel::Target TargetCalculator::guideTargetMode() const
|
||||
template<class Scalar>
|
||||
GuideRateModel::Target
|
||||
TargetCalculator<Scalar>::guideTargetMode() const
|
||||
{
|
||||
switch (cmode_) {
|
||||
case Group::ProductionCMode::ORAT:
|
||||
@ -152,15 +154,17 @@ GuideRateModel::Target TargetCalculator::guideTargetMode() const
|
||||
}
|
||||
}
|
||||
|
||||
InjectionTargetCalculator::InjectionTargetCalculator(const Group::InjectionCMode& cmode,
|
||||
const PhaseUsage& pu,
|
||||
const std::vector<double>& resv_coeff,
|
||||
const std::string& group_name,
|
||||
const double sales_target,
|
||||
const GroupState<double>& group_state,
|
||||
const Phase& injection_phase,
|
||||
const bool use_gpmaint,
|
||||
DeferredLogger& deferred_logger)
|
||||
template<class Scalar>
|
||||
InjectionTargetCalculator<Scalar>::
|
||||
InjectionTargetCalculator(const Group::InjectionCMode& cmode,
|
||||
const PhaseUsage& pu,
|
||||
const std::vector<Scalar>& resv_coeff,
|
||||
const std::string& group_name,
|
||||
const Scalar sales_target,
|
||||
const GroupState<Scalar>& group_state,
|
||||
const Phase& injection_phase,
|
||||
const bool use_gpmaint,
|
||||
DeferredLogger& deferred_logger)
|
||||
: cmode_(cmode)
|
||||
, pu_(pu)
|
||||
, resv_coeff_(resv_coeff)
|
||||
@ -197,8 +201,10 @@ InjectionTargetCalculator::InjectionTargetCalculator(const Group::InjectionCMode
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
double InjectionTargetCalculator::groupTarget(const std::optional<Group::InjectionControls>& ctrl, Opm::DeferredLogger& deferred_logger) const
|
||||
template<class Scalar>
|
||||
Scalar InjectionTargetCalculator<Scalar>::
|
||||
groupTarget(const std::optional<Group::InjectionControls>& ctrl,
|
||||
DeferredLogger& deferred_logger) const
|
||||
{
|
||||
if (!ctrl && !use_gpmaint_) {
|
||||
OPM_DEFLOG_THROW(std::logic_error,
|
||||
@ -208,32 +214,32 @@ double InjectionTargetCalculator::groupTarget(const std::optional<Group::Injecti
|
||||
}
|
||||
switch (cmode_) {
|
||||
case Group::InjectionCMode::RATE:
|
||||
if(use_gpmaint_ && this->group_state_.has_gpmaint_target(this->group_name_))
|
||||
if (use_gpmaint_ && this->group_state_.has_gpmaint_target(this->group_name_))
|
||||
return this->group_state_.gpmaint_target(this->group_name_);
|
||||
|
||||
return ctrl->surface_max_rate;
|
||||
case Group::InjectionCMode::RESV:
|
||||
if(use_gpmaint_ && this->group_state_.has_gpmaint_target(this->group_name_))
|
||||
if (use_gpmaint_ && this->group_state_.has_gpmaint_target(this->group_name_))
|
||||
return this->group_state_.gpmaint_target(this->group_name_) / resv_coeff_[pos_];
|
||||
|
||||
return ctrl->resv_max_rate / resv_coeff_[pos_];
|
||||
case Group::InjectionCMode::REIN: {
|
||||
double production_rate = this->group_state_.injection_rein_rates(ctrl->reinj_group)[pos_];
|
||||
Scalar production_rate = this->group_state_.injection_rein_rates(ctrl->reinj_group)[pos_];
|
||||
return ctrl->target_reinj_fraction * production_rate;
|
||||
}
|
||||
case Group::InjectionCMode::VREP: {
|
||||
const std::vector<double>& group_injection_reductions = this->group_state_.injection_reduction_rates(this->group_name_);
|
||||
double voidage_rate = group_state_.injection_vrep_rate(ctrl->voidage_group) * ctrl->target_void_fraction;
|
||||
double inj_reduction = 0.0;
|
||||
const std::vector<Scalar>& group_injection_reductions = this->group_state_.injection_reduction_rates(this->group_name_);
|
||||
Scalar voidage_rate = group_state_.injection_vrep_rate(ctrl->voidage_group) * ctrl->target_void_fraction;
|
||||
Scalar inj_reduction = 0.0;
|
||||
if (ctrl->phase != Phase::WATER)
|
||||
inj_reduction += group_injection_reductions[pu_.phase_pos[BlackoilPhases::Aqua]]
|
||||
* resv_coeff_[pu_.phase_pos[BlackoilPhases::Aqua]];
|
||||
* resv_coeff_[pu_.phase_pos[BlackoilPhases::Aqua]];
|
||||
if (ctrl->phase != Phase::OIL)
|
||||
inj_reduction += group_injection_reductions[pu_.phase_pos[BlackoilPhases::Liquid]]
|
||||
* resv_coeff_[pu_.phase_pos[BlackoilPhases::Liquid]];
|
||||
* resv_coeff_[pu_.phase_pos[BlackoilPhases::Liquid]];
|
||||
if (ctrl->phase != Phase::GAS)
|
||||
inj_reduction += group_injection_reductions[pu_.phase_pos[BlackoilPhases::Vapour]]
|
||||
* resv_coeff_[pu_.phase_pos[BlackoilPhases::Vapour]];
|
||||
* resv_coeff_[pu_.phase_pos[BlackoilPhases::Vapour]];
|
||||
voidage_rate -= inj_reduction;
|
||||
return voidage_rate / resv_coeff_[pos_];
|
||||
}
|
||||
@ -241,7 +247,7 @@ double InjectionTargetCalculator::groupTarget(const std::optional<Group::Injecti
|
||||
assert(pos_ == pu_.phase_pos[BlackoilPhases::Vapour]);
|
||||
// Gas injection rate = Total gas production rate + gas import rate - gas consumption rate - sales rate;
|
||||
// Gas import and consumption is already included in the REIN rates
|
||||
double inj_rate = group_state_.injection_rein_rates(this->group_name_)[pos_];
|
||||
Scalar inj_rate = group_state_.injection_rein_rates(this->group_name_)[pos_];
|
||||
inj_rate -= sales_target_;
|
||||
return inj_rate;
|
||||
}
|
||||
@ -253,13 +259,18 @@ double InjectionTargetCalculator::groupTarget(const std::optional<Group::Injecti
|
||||
}
|
||||
}
|
||||
|
||||
GuideRateModel::Target InjectionTargetCalculator::guideTargetMode() const
|
||||
template<class Scalar>
|
||||
GuideRateModel::Target
|
||||
InjectionTargetCalculator<Scalar>::guideTargetMode() const
|
||||
{
|
||||
return target_;
|
||||
}
|
||||
|
||||
#define INSTANCE_TARGET_CALCULATOR(...) \
|
||||
template __VA_ARGS__ TargetCalculator::calcModeRateFromRates<__VA_ARGS__>(const __VA_ARGS__* rates) const;
|
||||
template __VA_ARGS__ TargetCalculator<double>::calcModeRateFromRates<__VA_ARGS__>(const __VA_ARGS__* rates) const;
|
||||
|
||||
template class TargetCalculator<double>;
|
||||
template class InjectionTargetCalculator<double>;
|
||||
|
||||
INSTANCE_TARGET_CALCULATOR(double)
|
||||
INSTANCE_TARGET_CALCULATOR(DenseAd::Evaluation<double,3,0>)
|
||||
@ -279,6 +290,4 @@ INSTANCE_TARGET_CALCULATOR(DenseAd::Evaluation<double,-1,9>)
|
||||
INSTANCE_TARGET_CALCULATOR(DenseAd::Evaluation<double,-1,10>)
|
||||
INSTANCE_TARGET_CALCULATOR(DenseAd::Evaluation<double,-1,11>)
|
||||
|
||||
} // namespace WellGroupHelpers
|
||||
|
||||
} // namespace Opm
|
||||
} // namespace Opm::WGHelpers
|
||||
|
@ -28,89 +28,92 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace Opm
|
||||
{
|
||||
namespace Opm {
|
||||
|
||||
class DeferredLogger;
|
||||
template<class Scalar> class GroupState;
|
||||
struct PhaseUsage;
|
||||
|
||||
namespace WellGroupHelpers
|
||||
namespace WGHelpers {
|
||||
|
||||
/// Based on a group control mode, extract or calculate rates, and
|
||||
/// provide other conveniences.
|
||||
template<class Scalar>
|
||||
class TargetCalculator
|
||||
{
|
||||
public:
|
||||
TargetCalculator(const Group::ProductionCMode cmode,
|
||||
const PhaseUsage& pu,
|
||||
const std::vector<Scalar>& resv_coeff,
|
||||
const Scalar group_grat_target_from_sales,
|
||||
const std::string& group_name,
|
||||
const GroupState<Scalar>& group_state,
|
||||
const bool use_gpmaint);
|
||||
|
||||
/// Based on a group control mode, extract or calculate rates, and
|
||||
/// provide other conveniences.
|
||||
class TargetCalculator
|
||||
template <typename RateType>
|
||||
RateType calcModeRateFromRates(const std::vector<RateType>& rates) const
|
||||
{
|
||||
public:
|
||||
TargetCalculator(const Group::ProductionCMode cmode,
|
||||
const PhaseUsage& pu,
|
||||
const std::vector<double>& resv_coeff,
|
||||
const double group_grat_target_from_sales,
|
||||
const std::string& group_name,
|
||||
const GroupState<double>& group_state,
|
||||
const bool use_gpmaint);
|
||||
return calcModeRateFromRates(rates.data());
|
||||
}
|
||||
|
||||
template <typename RateType>
|
||||
RateType calcModeRateFromRates(const std::vector<RateType>& rates) const
|
||||
{
|
||||
return calcModeRateFromRates(rates.data());
|
||||
}
|
||||
template <typename RateType>
|
||||
RateType calcModeRateFromRates(const RateType* rates) const;
|
||||
|
||||
template <typename RateType>
|
||||
RateType calcModeRateFromRates(const RateType* rates) const;
|
||||
Scalar groupTarget(const std::optional<Group::ProductionControls>& ctrl,
|
||||
DeferredLogger& deferred_logger) const;
|
||||
|
||||
double groupTarget(const std::optional<Group::ProductionControls>& ctrl, Opm::DeferredLogger& deferred_logger) const;
|
||||
GuideRateModel::Target guideTargetMode() const;
|
||||
|
||||
GuideRateModel::Target guideTargetMode() const;
|
||||
private:
|
||||
Group::ProductionCMode cmode_;
|
||||
const PhaseUsage& pu_;
|
||||
const std::vector<Scalar>& resv_coeff_;
|
||||
const Scalar group_grat_target_from_sales_;
|
||||
const std::string& group_name_;
|
||||
const GroupState<Scalar>& group_state_;
|
||||
bool use_gpmaint_;
|
||||
};
|
||||
|
||||
private:
|
||||
Group::ProductionCMode cmode_;
|
||||
const PhaseUsage& pu_;
|
||||
const std::vector<double>& resv_coeff_;
|
||||
const double group_grat_target_from_sales_;
|
||||
const std::string& group_name_;
|
||||
const GroupState<double>& group_state_;
|
||||
bool use_gpmaint_;
|
||||
};
|
||||
/// Based on a group control mode, extract or calculate rates, and
|
||||
/// provide other conveniences.
|
||||
template<class Scalar>
|
||||
class InjectionTargetCalculator
|
||||
{
|
||||
public:
|
||||
InjectionTargetCalculator(const Group::InjectionCMode& cmode,
|
||||
const PhaseUsage& pu,
|
||||
const std::vector<Scalar>& resv_coeff,
|
||||
const std::string& group_name,
|
||||
const Scalar sales_target,
|
||||
const GroupState<Scalar>& group_state,
|
||||
const Phase& injection_phase,
|
||||
const bool use_gpmaint,
|
||||
DeferredLogger& deferred_logger);
|
||||
|
||||
/// Based on a group control mode, extract or calculate rates, and
|
||||
/// provide other conveniences.
|
||||
class InjectionTargetCalculator
|
||||
template <typename RateVec>
|
||||
auto calcModeRateFromRates(const RateVec& rates) const
|
||||
{
|
||||
public:
|
||||
InjectionTargetCalculator(const Group::InjectionCMode& cmode,
|
||||
const PhaseUsage& pu,
|
||||
const std::vector<double>& resv_coeff,
|
||||
const std::string& group_name,
|
||||
const double sales_target,
|
||||
const GroupState<double>& group_state,
|
||||
const Phase& injection_phase,
|
||||
const bool use_gpmaint,
|
||||
DeferredLogger& deferred_logger);
|
||||
return rates[pos_];
|
||||
}
|
||||
|
||||
template <typename RateVec>
|
||||
auto calcModeRateFromRates(const RateVec& rates) const
|
||||
{
|
||||
return rates[pos_];
|
||||
}
|
||||
Scalar groupTarget(const std::optional<Group::InjectionControls>& ctrl,
|
||||
DeferredLogger& deferred_logger) const;
|
||||
|
||||
double groupTarget(const std::optional<Group::InjectionControls>& ctrl, Opm::DeferredLogger& deferred_logger) const;
|
||||
GuideRateModel::Target guideTargetMode() const;
|
||||
|
||||
GuideRateModel::Target guideTargetMode() const;
|
||||
private:
|
||||
Group::InjectionCMode cmode_;
|
||||
const PhaseUsage& pu_;
|
||||
const std::vector<Scalar>& resv_coeff_;
|
||||
const std::string& group_name_;
|
||||
Scalar sales_target_;
|
||||
const GroupState<Scalar>& group_state_;
|
||||
bool use_gpmaint_;
|
||||
int pos_;
|
||||
GuideRateModel::Target target_;
|
||||
};
|
||||
|
||||
private:
|
||||
Group::InjectionCMode cmode_;
|
||||
const PhaseUsage& pu_;
|
||||
const std::vector<double>& resv_coeff_;
|
||||
const std::string& group_name_;
|
||||
double sales_target_;
|
||||
const GroupState<double>& group_state_;
|
||||
bool use_gpmaint_;
|
||||
int pos_;
|
||||
GuideRateModel::Target target_;
|
||||
};
|
||||
} // namespace WellGroupHelpers
|
||||
} // namespace WGHelpers
|
||||
|
||||
} // namespace Opm
|
||||
|
||||
|
@ -74,21 +74,21 @@ checkGroupConstraintsInj(const Group& group,
|
||||
|
||||
const auto& ws = well_state.well(well_.indexOfWell());
|
||||
// Call check for the well's injection phase.
|
||||
return WellGroupHelpers::checkGroupConstraintsInj(well_.name(),
|
||||
well_.wellEcl().groupName(),
|
||||
group,
|
||||
well_state,
|
||||
group_state,
|
||||
well_.currentStep(),
|
||||
well_.guideRate(),
|
||||
ws.surface_rates.data(),
|
||||
injectionPhase,
|
||||
well_.phaseUsage(),
|
||||
efficiencyFactor,
|
||||
schedule,
|
||||
summaryState,
|
||||
resv_coeff,
|
||||
deferred_logger);
|
||||
return WellGroupHelpers<double>::checkGroupConstraintsInj(well_.name(),
|
||||
well_.wellEcl().groupName(),
|
||||
group,
|
||||
well_state,
|
||||
group_state,
|
||||
well_.currentStep(),
|
||||
well_.guideRate(),
|
||||
ws.surface_rates.data(),
|
||||
injectionPhase,
|
||||
well_.phaseUsage(),
|
||||
efficiencyFactor,
|
||||
schedule,
|
||||
summaryState,
|
||||
resv_coeff,
|
||||
deferred_logger);
|
||||
}
|
||||
|
||||
std::pair<bool, double>
|
||||
@ -107,20 +107,20 @@ checkGroupConstraintsProd(const Group& group,
|
||||
rateConverter(0, well_.pvtRegionIdx(), group.name(), resv_coeff); // FIPNUM region 0 here, should use FIPNUM from WELSPECS.
|
||||
|
||||
const auto& ws = well_state.well(well_.indexOfWell());
|
||||
return WellGroupHelpers::checkGroupConstraintsProd(well_.name(),
|
||||
well_.wellEcl().groupName(),
|
||||
group,
|
||||
well_state,
|
||||
group_state,
|
||||
well_.currentStep(),
|
||||
well_.guideRate(),
|
||||
ws.surface_rates.data(),
|
||||
well_.phaseUsage(),
|
||||
efficiencyFactor,
|
||||
schedule,
|
||||
summaryState,
|
||||
resv_coeff,
|
||||
deferred_logger);
|
||||
return WellGroupHelpers<double>::checkGroupConstraintsProd(well_.name(),
|
||||
well_.wellEcl().groupName(),
|
||||
group,
|
||||
well_state,
|
||||
group_state,
|
||||
well_.currentStep(),
|
||||
well_.guideRate(),
|
||||
ws.surface_rates.data(),
|
||||
well_.phaseUsage(),
|
||||
efficiencyFactor,
|
||||
schedule,
|
||||
summaryState,
|
||||
resv_coeff,
|
||||
deferred_logger);
|
||||
}
|
||||
|
||||
bool WellGroupConstraints::
|
||||
|
@ -136,17 +136,27 @@ getGroupInjectionControl(const Group& group,
|
||||
const auto& gconsale = schedule[well_.currentStep()].gconsale().get(group.name(), summaryState);
|
||||
sales_target = gconsale.sales_target;
|
||||
}
|
||||
WellGroupHelpers::InjectionTargetCalculator tcalc(currentGroupControl, pu,
|
||||
resv_coeff, group.name(),
|
||||
sales_target, group_state,
|
||||
injectionPhase,
|
||||
group.has_gpmaint_control(injectionPhase, currentGroupControl),
|
||||
deferred_logger);
|
||||
WellGroupHelpers::FractionCalculator fcalc(schedule, well_state,
|
||||
group_state, well_.currentStep(),
|
||||
well_.guideRate(),
|
||||
tcalc.guideTargetMode(),
|
||||
pu, false, injectionPhase);
|
||||
|
||||
WGHelpers::InjectionTargetCalculator tcalc(currentGroupControl,
|
||||
pu,
|
||||
resv_coeff,
|
||||
group.name(),
|
||||
sales_target,
|
||||
group_state,
|
||||
injectionPhase,
|
||||
group.has_gpmaint_control(injectionPhase,
|
||||
currentGroupControl),
|
||||
deferred_logger);
|
||||
|
||||
WGHelpers::FractionCalculator fcalc(schedule,
|
||||
well_state,
|
||||
group_state,
|
||||
well_.currentStep(),
|
||||
well_.guideRate(),
|
||||
tcalc.guideTargetMode(),
|
||||
pu,
|
||||
false,
|
||||
injectionPhase);
|
||||
|
||||
auto localFraction = [&](const std::string& child) {
|
||||
return fcalc.localFraction(child, child);
|
||||
@ -163,8 +173,8 @@ getGroupInjectionControl(const Group& group,
|
||||
|
||||
const double orig_target = tcalc.groupTarget(ctrl,
|
||||
deferred_logger);
|
||||
const auto chain = WellGroupHelpers::groupChainTopBot(well_.name(), group.name(),
|
||||
schedule, well_.currentStep());
|
||||
const auto chain = WellGroupHelpers<double>::groupChainTopBot(well_.name(), group.name(),
|
||||
schedule, well_.currentStep());
|
||||
// Because 'name' is the last of the elements, and not an ancestor, we subtract one below.
|
||||
const std::size_t num_ancestors = chain.size() - 1;
|
||||
double target = orig_target;
|
||||
@ -260,14 +270,26 @@ getGroupInjectionTargetRate(const Group& group,
|
||||
const auto& gconsale = schedule[well_.currentStep()].gconsale().get(group.name(), summaryState);
|
||||
sales_target = gconsale.sales_target;
|
||||
}
|
||||
WellGroupHelpers::InjectionTargetCalculator tcalc(currentGroupControl, pu, resv_coeff,
|
||||
group.name(), sales_target, group_state,
|
||||
injectionPhase,
|
||||
group.has_gpmaint_control(injectionPhase, currentGroupControl),
|
||||
deferred_logger);
|
||||
WellGroupHelpers::FractionCalculator fcalc(schedule, well_state, group_state,
|
||||
well_.currentStep(), well_.guideRate(),
|
||||
tcalc.guideTargetMode(), pu, false, injectionPhase);
|
||||
WGHelpers::InjectionTargetCalculator tcalc(currentGroupControl,
|
||||
pu,
|
||||
resv_coeff,
|
||||
group.name(),
|
||||
sales_target,
|
||||
group_state,
|
||||
injectionPhase,
|
||||
group.has_gpmaint_control(injectionPhase,
|
||||
currentGroupControl),
|
||||
deferred_logger);
|
||||
|
||||
WGHelpers::FractionCalculator fcalc(schedule,
|
||||
well_state,
|
||||
group_state,
|
||||
well_.currentStep(),
|
||||
well_.guideRate(),
|
||||
tcalc.guideTargetMode(),
|
||||
pu,
|
||||
false,
|
||||
injectionPhase);
|
||||
|
||||
auto localFraction = [&](const std::string& child) {
|
||||
return fcalc.localFraction(child, child); //Note child needs to be passed to always include since the global isGrup map is not updated yet.
|
||||
@ -284,7 +306,10 @@ getGroupInjectionTargetRate(const Group& group,
|
||||
|
||||
const double orig_target = tcalc.groupTarget(ctrl, deferred_logger);
|
||||
|
||||
const auto chain = WellGroupHelpers::groupChainTopBot(well_.name(), group.name(), schedule, well_.currentStep());
|
||||
const auto chain = WellGroupHelpers<double>::groupChainTopBot(well_.name(),
|
||||
group.name(),
|
||||
schedule,
|
||||
well_.currentStep());
|
||||
// Because 'name' is the last of the elements, and not an ancestor, we subtract one below.
|
||||
const std::size_t num_ancestors = chain.size() - 1;
|
||||
double target = orig_target;
|
||||
@ -363,15 +388,23 @@ void WellGroupControls::getGroupProductionControl(const Group& group,
|
||||
if (group_state.has_grat_sales_target(group.name()))
|
||||
gratTargetFromSales = group_state.grat_sales_target(group.name());
|
||||
|
||||
WellGroupHelpers::TargetCalculator tcalc(currentGroupControl, pu, resv_coeff,
|
||||
gratTargetFromSales, group.name(),
|
||||
group_state,
|
||||
group.has_gpmaint_control(currentGroupControl));
|
||||
WellGroupHelpers::FractionCalculator fcalc(schedule, well_state, group_state,
|
||||
well_.currentStep(),
|
||||
well_.guideRate(),
|
||||
tcalc.guideTargetMode(),
|
||||
pu, true, Phase::OIL);
|
||||
WGHelpers::TargetCalculator tcalc(currentGroupControl,
|
||||
pu,
|
||||
resv_coeff,
|
||||
gratTargetFromSales,
|
||||
group.name(),
|
||||
group_state,
|
||||
group.has_gpmaint_control(currentGroupControl));
|
||||
|
||||
WGHelpers::FractionCalculator fcalc(schedule,
|
||||
well_state,
|
||||
group_state,
|
||||
well_.currentStep(),
|
||||
well_.guideRate(),
|
||||
tcalc.guideTargetMode(),
|
||||
pu,
|
||||
true,
|
||||
Phase::OIL);
|
||||
|
||||
auto localFraction = [&](const std::string& child) {
|
||||
return fcalc.localFraction(child, child);
|
||||
@ -387,8 +420,8 @@ void WellGroupControls::getGroupProductionControl(const Group& group,
|
||||
ctrl = group.productionControls(summaryState);
|
||||
|
||||
const double orig_target = tcalc.groupTarget(ctrl, deferred_logger);
|
||||
const auto chain = WellGroupHelpers::groupChainTopBot(well_.name(), group.name(),
|
||||
schedule, well_.currentStep());
|
||||
const auto chain = WellGroupHelpers<double>::groupChainTopBot(well_.name(), group.name(),
|
||||
schedule, well_.currentStep());
|
||||
// Because 'name' is the last of the elements, and not an ancestor, we subtract one below.
|
||||
const std::size_t num_ancestors = chain.size() - 1;
|
||||
double target = orig_target;
|
||||
@ -452,12 +485,23 @@ getGroupProductionTargetRate(const Group& group,
|
||||
if (group_state.has_grat_sales_target(group.name()))
|
||||
gratTargetFromSales = group_state.grat_sales_target(group.name());
|
||||
|
||||
WellGroupHelpers::TargetCalculator tcalc(currentGroupControl, pu, resv_coeff, gratTargetFromSales, group.name(), group_state, group.has_gpmaint_control(currentGroupControl));
|
||||
WellGroupHelpers::FractionCalculator fcalc(schedule, well_state, group_state,
|
||||
well_.currentStep(),
|
||||
well_.guideRate(),
|
||||
tcalc.guideTargetMode(),
|
||||
pu, true, Phase::OIL);
|
||||
WGHelpers::TargetCalculator tcalc(currentGroupControl,
|
||||
pu,
|
||||
resv_coeff,
|
||||
gratTargetFromSales,
|
||||
group.name(),
|
||||
group_state,
|
||||
group.has_gpmaint_control(currentGroupControl));
|
||||
|
||||
WGHelpers::FractionCalculator fcalc(schedule,
|
||||
well_state,
|
||||
group_state,
|
||||
well_.currentStep(),
|
||||
well_.guideRate(),
|
||||
tcalc.guideTargetMode(),
|
||||
pu,
|
||||
true,
|
||||
Phase::OIL);
|
||||
|
||||
auto localFraction = [&](const std::string& child) {
|
||||
return fcalc.localFraction(child, child); //Note child needs to be passed to always include since the global isGrup map is not updated yet.
|
||||
@ -473,8 +517,8 @@ getGroupProductionTargetRate(const Group& group,
|
||||
ctrl = group.productionControls(summaryState);
|
||||
|
||||
const double orig_target = tcalc.groupTarget(ctrl, deferred_logger);
|
||||
const auto chain = WellGroupHelpers::groupChainTopBot(well_.name(), group.name(),
|
||||
schedule, well_.currentStep());
|
||||
const auto chain = WellGroupHelpers<double>::groupChainTopBot(well_.name(), group.name(),
|
||||
schedule, well_.currentStep());
|
||||
// Because 'name' is the last of the elements, and not an ancestor, we subtract one below.
|
||||
const std::size_t num_ancestors = chain.size() - 1;
|
||||
double target = orig_target;
|
||||
@ -545,4 +589,5 @@ INSTANCE(DenseAd::Evaluation<double,-1,8u>)
|
||||
INSTANCE(DenseAd::Evaluation<double,-1,9u>)
|
||||
INSTANCE(DenseAd::Evaluation<double,-1,10u>)
|
||||
INSTANCE(DenseAd::Evaluation<double,-1,11u>)
|
||||
|
||||
} // namespace Opm
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -29,8 +29,7 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace Opm
|
||||
{
|
||||
namespace Opm {
|
||||
|
||||
class DeferredLogger;
|
||||
class Group;
|
||||
@ -44,265 +43,254 @@ class FieldPropsManager;
|
||||
|
||||
namespace Network { class ExtNetwork; }
|
||||
|
||||
namespace WellGroupHelpers
|
||||
template<class Scalar>
|
||||
class WellGroupHelpers
|
||||
{
|
||||
public:
|
||||
static void setCmodeGroup(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const SummaryState& summaryState,
|
||||
const int reportStepIdx,
|
||||
GroupState<Scalar>& group_state);
|
||||
|
||||
static void accumulateGroupEfficiencyFactor(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
Scalar& factor);
|
||||
|
||||
static Scalar sumWellSurfaceRates(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const WellState<Scalar>& wellState,
|
||||
const int reportStepIdx,
|
||||
const int phasePos,
|
||||
const bool injector);
|
||||
|
||||
void setCmodeGroup(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const SummaryState& summaryState,
|
||||
const int reportStepIdx,
|
||||
GroupState<double>& group_state);
|
||||
|
||||
void accumulateGroupEfficiencyFactor(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
double& factor);
|
||||
|
||||
double sumWellSurfaceRates(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const WellState<double>& wellState,
|
||||
const int reportStepIdx,
|
||||
const int phasePos,
|
||||
const bool injector);
|
||||
|
||||
double sumWellResRates(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const WellState<double>& wellState,
|
||||
const int reportStepIdx,
|
||||
const int phasePos,
|
||||
const bool injector);
|
||||
|
||||
double sumSolventRates(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const WellState<double>& wellState,
|
||||
const int reportStepIdx,
|
||||
const bool injector);
|
||||
|
||||
void updateGroupTargetReduction(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
const bool isInjector,
|
||||
const PhaseUsage& pu,
|
||||
const GuideRate& guide_rate,
|
||||
const WellState<double>& wellState,
|
||||
GroupState<double>& group_state,
|
||||
std::vector<double>& groupTargetReduction);
|
||||
|
||||
void updateGuideRates(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const SummaryState& summary_state,
|
||||
const PhaseUsage& pu,
|
||||
int report_step,
|
||||
double sim_time,
|
||||
WellState<double>& well_state,
|
||||
const GroupState<double>& group_state,
|
||||
const Parallel::Communication& comm,
|
||||
GuideRate* guide_rate,
|
||||
std::vector<double>& pot,
|
||||
Opm::DeferredLogger& deferred_logge);
|
||||
|
||||
void updateGuideRateForProductionGroups(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const PhaseUsage& pu,
|
||||
const int reportStepIdx,
|
||||
const double& simTime,
|
||||
WellState<double>& wellState,
|
||||
const GroupState<double>& group_state,
|
||||
const Parallel::Communication& comm,
|
||||
GuideRate* guideRate,
|
||||
std::vector<double>& pot);
|
||||
|
||||
void updateGuideRatesForWells(const Schedule& schedule,
|
||||
const PhaseUsage& pu,
|
||||
const int reportStepIdx,
|
||||
const double& simTime,
|
||||
const WellState<double>& wellState,
|
||||
const Parallel::Communication& comm,
|
||||
GuideRate* guideRate);
|
||||
|
||||
void updateGuideRatesForInjectionGroups(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const SummaryState& summaryState,
|
||||
const Opm::PhaseUsage& pu,
|
||||
const int reportStepIdx,
|
||||
const WellState<double>& wellState,
|
||||
const GroupState<double>& group_state,
|
||||
GuideRate* guideRate,
|
||||
Opm::DeferredLogger& deferred_logger);
|
||||
|
||||
void updateVREPForGroups(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
const WellState<double>& wellState,
|
||||
GroupState<double>& group_state);
|
||||
|
||||
void updateReservoirRatesInjectionGroups(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
const WellState<double>& wellState,
|
||||
GroupState<double>& group_state);
|
||||
|
||||
void updateSurfaceRatesInjectionGroups(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
const WellState<double>& wellState,
|
||||
GroupState<double>& group_state);
|
||||
|
||||
void updateWellRates(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
const WellState<double>& wellStateNupcol,
|
||||
WellState<double>& wellState);
|
||||
|
||||
void updateGroupProductionRates(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
const WellState<double>& wellState,
|
||||
GroupState<double>& group_state);
|
||||
|
||||
void updateWellRatesFromGroupTargetScale(const double scale,
|
||||
const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
bool isInjector,
|
||||
const GroupState<double>& group_state,
|
||||
WellState<double>& wellState);
|
||||
|
||||
void updateREINForGroups(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
const PhaseUsage& pu,
|
||||
const SummaryState& st,
|
||||
const WellState<double>& wellState,
|
||||
GroupState<double>& group_state,
|
||||
bool sum_rank);
|
||||
|
||||
|
||||
/// Returns the name of the worst offending well and its fraction
|
||||
/// (i.e. violated_phase / preferred_phase)
|
||||
std::pair<std::optional<std::string>, double>
|
||||
/// Returns the name of the worst offending well and its fraction (i.e. violated_phase / preferred_phase)
|
||||
static std::pair<std::optional<std::string>, Scalar>
|
||||
worstOffendingWell(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
const Group::ProductionCMode& offendedControl,
|
||||
const PhaseUsage& pu,
|
||||
const Parallel::Communication& comm,
|
||||
const WellState<double>& wellState,
|
||||
const WellState<Scalar>& wellState,
|
||||
DeferredLogger& deferred_logger);
|
||||
|
||||
template <class RegionalValues>
|
||||
void updateGpMaintTargetForGroups(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const RegionalValues& regional_values,
|
||||
const int reportStepIdx,
|
||||
const double dt,
|
||||
const WellState<double>& well_state,
|
||||
GroupState<double>& group_state);
|
||||
static Scalar sumWellResRates(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const WellState<Scalar>& wellState,
|
||||
const int reportStepIdx,
|
||||
const int phasePos,
|
||||
const bool injector);
|
||||
|
||||
std::map<std::string, double>
|
||||
computeNetworkPressures(const Opm::Network::ExtNetwork& network,
|
||||
const WellState<double>& well_state,
|
||||
const GroupState<double>& group_state,
|
||||
static Scalar sumSolventRates(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const WellState<Scalar>& wellState,
|
||||
const int reportStepIdx,
|
||||
const bool injector);
|
||||
|
||||
static void updateGroupTargetReduction(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
const bool isInjector,
|
||||
const PhaseUsage& pu,
|
||||
const GuideRate& guide_rate,
|
||||
const WellState<Scalar>& wellState,
|
||||
GroupState<Scalar>& group_state,
|
||||
std::vector<Scalar>& groupTargetReduction);
|
||||
|
||||
static void updateGuideRates(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const SummaryState& summary_state,
|
||||
const PhaseUsage& pu,
|
||||
int report_step,
|
||||
double sim_time,
|
||||
WellState<Scalar>& well_state,
|
||||
const GroupState<Scalar>& group_state,
|
||||
const Parallel::Communication& comm,
|
||||
GuideRate* guide_rate,
|
||||
std::vector<Scalar>& pot,
|
||||
DeferredLogger& deferred_logger);
|
||||
|
||||
static void updateGuideRateForProductionGroups(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const PhaseUsage& pu,
|
||||
const int reportStepIdx,
|
||||
const double& simTime,
|
||||
WellState<Scalar>& wellState,
|
||||
const GroupState<Scalar>& group_state,
|
||||
const Parallel::Communication& comm,
|
||||
GuideRate* guideRate,
|
||||
std::vector<Scalar>& pot);
|
||||
|
||||
static void updateGuideRatesForWells(const Schedule& schedule,
|
||||
const PhaseUsage& pu,
|
||||
const int reportStepIdx,
|
||||
const double& simTime,
|
||||
const WellState<Scalar>& wellState,
|
||||
const Parallel::Communication& comm,
|
||||
GuideRate* guideRate);
|
||||
|
||||
static void updateGuideRatesForInjectionGroups(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const SummaryState& summaryState,
|
||||
const PhaseUsage& pu,
|
||||
const int reportStepIdx,
|
||||
const WellState<Scalar>& wellState,
|
||||
const GroupState<Scalar>& group_state,
|
||||
GuideRate* guideRate,
|
||||
DeferredLogger& deferred_logger);
|
||||
|
||||
static void updateVREPForGroups(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
const WellState<Scalar>& wellState,
|
||||
GroupState<Scalar>& group_state);
|
||||
|
||||
template <class RegionalValues>
|
||||
static void updateGpMaintTargetForGroups(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const RegionalValues& regional_values,
|
||||
const int reportStepIdx,
|
||||
const double dt,
|
||||
const WellState<Scalar>& well_state,
|
||||
GroupState<Scalar>& group_state);
|
||||
|
||||
static void updateReservoirRatesInjectionGroups(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
const WellState<Scalar>& wellState,
|
||||
GroupState<Scalar>& group_state);
|
||||
|
||||
static void updateSurfaceRatesInjectionGroups(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
const WellState<Scalar>& wellState,
|
||||
GroupState<Scalar>& group_state);
|
||||
|
||||
static void updateWellRates(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
const WellState<Scalar>& wellStateNupcol,
|
||||
WellState<Scalar>& wellState);
|
||||
|
||||
static void updateGroupProductionRates(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
const WellState<Scalar>& wellState,
|
||||
GroupState<Scalar>& group_state);
|
||||
|
||||
static void updateWellRatesFromGroupTargetScale(const Scalar scale,
|
||||
const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
bool isInjector,
|
||||
const GroupState<Scalar>& group_state,
|
||||
WellState<Scalar>& wellState);
|
||||
|
||||
static void updateREINForGroups(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
const PhaseUsage& pu,
|
||||
const SummaryState& st,
|
||||
const WellState<Scalar>& wellState,
|
||||
GroupState<Scalar>& group_state,
|
||||
bool sum_rank);
|
||||
|
||||
|
||||
static std::map<std::string, Scalar>
|
||||
computeNetworkPressures(const Network::ExtNetwork& network,
|
||||
const WellState<Scalar>& well_state,
|
||||
const GroupState<Scalar>& group_state,
|
||||
const VFPProdProperties& vfp_prod_props,
|
||||
const Schedule& schedule,
|
||||
const int report_time_step);
|
||||
|
||||
GuideRate::RateVector
|
||||
getWellRateVector(const WellState<double>& well_state,
|
||||
static GuideRate::RateVector
|
||||
getWellRateVector(const WellState<Scalar>& well_state,
|
||||
const PhaseUsage& pu,
|
||||
const std::string& name);
|
||||
|
||||
GuideRate::RateVector
|
||||
getProductionGroupRateVector(const GroupState<double>& group_state,
|
||||
static GuideRate::RateVector
|
||||
getProductionGroupRateVector(const GroupState<Scalar>& group_state,
|
||||
const PhaseUsage& pu,
|
||||
const std::string& group_name);
|
||||
|
||||
double getGuideRate(const std::string& name,
|
||||
const Schedule& schedule,
|
||||
const WellState<double>& wellState,
|
||||
const GroupState<double>& group_state,
|
||||
const int reportStepIdx,
|
||||
const GuideRate* guideRate,
|
||||
const GuideRateModel::Target target,
|
||||
const PhaseUsage& pu);
|
||||
static Scalar getGuideRate(const std::string& name,
|
||||
const Schedule& schedule,
|
||||
const WellState<Scalar>& wellState,
|
||||
const GroupState<Scalar>& group_state,
|
||||
const int reportStepIdx,
|
||||
const GuideRate* guideRate,
|
||||
const GuideRateModel::Target target,
|
||||
const PhaseUsage& pu);
|
||||
|
||||
static Scalar getGuideRateInj(const std::string& name,
|
||||
const Schedule& schedule,
|
||||
const WellState<Scalar>& wellState,
|
||||
const GroupState<Scalar>& group_state,
|
||||
const int reportStepIdx,
|
||||
const GuideRate* guideRate,
|
||||
const GuideRateModel::Target target,
|
||||
const Phase& injectionPhase,
|
||||
const PhaseUsage& pu);
|
||||
|
||||
double getGuideRateInj(const std::string& name,
|
||||
const Schedule& schedule,
|
||||
const WellState<double>& wellState,
|
||||
const GroupState<double>& group_state,
|
||||
const int reportStepIdx,
|
||||
const GuideRate* guideRate,
|
||||
const GuideRateModel::Target target,
|
||||
const Phase& injectionPhase,
|
||||
const PhaseUsage& pu);
|
||||
static int groupControlledWells(const Schedule& schedule,
|
||||
const WellState<Scalar>& well_state,
|
||||
const GroupState<Scalar>& group_state,
|
||||
const int report_step,
|
||||
const std::string& group_name,
|
||||
const std::string& always_included_child,
|
||||
const bool is_production_group,
|
||||
const Phase injection_phase);
|
||||
|
||||
int groupControlledWells(const Schedule& schedule,
|
||||
const WellState<double>& well_state,
|
||||
const GroupState<double>& group_state,
|
||||
const int report_step,
|
||||
const std::string& group_name,
|
||||
const std::string& always_included_child,
|
||||
const bool is_production_group,
|
||||
const Phase injection_phase);
|
||||
static std::pair<bool, Scalar>
|
||||
checkGroupConstraintsInj(const std::string& name,
|
||||
const std::string& parent,
|
||||
const Group& group,
|
||||
const WellState<Scalar>& wellState,
|
||||
const GroupState<Scalar>& group_state,
|
||||
const int reportStepIdx,
|
||||
const GuideRate* guideRate,
|
||||
const Scalar* rates,
|
||||
Phase injectionPhase,
|
||||
const PhaseUsage& pu,
|
||||
const Scalar efficiencyFactor,
|
||||
const Schedule& schedule,
|
||||
const SummaryState& summaryState,
|
||||
const std::vector<Scalar>& resv_coeff,
|
||||
DeferredLogger& deferred_logger);
|
||||
|
||||
static std::vector<std::string>
|
||||
groupChainTopBot(const std::string& bottom,
|
||||
const std::string& top,
|
||||
const Schedule& schedule,
|
||||
const int report_step);
|
||||
|
||||
std::pair<bool, double> checkGroupConstraintsInj(const std::string& name,
|
||||
const std::string& parent,
|
||||
const Group& group,
|
||||
const WellState<double>& wellState,
|
||||
const GroupState<double>& group_state,
|
||||
const int reportStepIdx,
|
||||
const GuideRate* guideRate,
|
||||
const double* rates,
|
||||
Phase injectionPhase,
|
||||
const PhaseUsage& pu,
|
||||
const double efficiencyFactor,
|
||||
const Schedule& schedule,
|
||||
const SummaryState& summaryState,
|
||||
const std::vector<double>& resv_coeff,
|
||||
DeferredLogger& deferred_logger);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
std::vector<std::string> groupChainTopBot(const std::string& bottom,
|
||||
const std::string& top,
|
||||
const Schedule& schedule,
|
||||
const int report_step);
|
||||
|
||||
|
||||
|
||||
|
||||
std::pair<bool, double> checkGroupConstraintsProd(const std::string& name,
|
||||
const std::string& parent,
|
||||
const Group& group,
|
||||
const WellState<double>& wellState,
|
||||
const GroupState<double>& group_state,
|
||||
const int reportStepIdx,
|
||||
const GuideRate* guideRate,
|
||||
const double* rates,
|
||||
const PhaseUsage& pu,
|
||||
const double efficiencyFactor,
|
||||
const Schedule& schedule,
|
||||
const SummaryState& summaryState,
|
||||
const std::vector<double>& resv_coeff,
|
||||
DeferredLogger& deferred_logger);
|
||||
static std::pair<bool, Scalar>
|
||||
checkGroupConstraintsProd(const std::string& name,
|
||||
const std::string& parent,
|
||||
const Group& group,
|
||||
const WellState<Scalar>& wellState,
|
||||
const GroupState<Scalar>& group_state,
|
||||
const int reportStepIdx,
|
||||
const GuideRate* guideRate,
|
||||
const Scalar* rates,
|
||||
const PhaseUsage& pu,
|
||||
const Scalar efficiencyFactor,
|
||||
const Schedule& schedule,
|
||||
const SummaryState& summaryState,
|
||||
const std::vector<Scalar>& resv_coeff,
|
||||
DeferredLogger& deferred_logger);
|
||||
|
||||
template <class AverageRegionalPressureType>
|
||||
void setRegionAveragePressureCalculator(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
const FieldPropsManager& fp,
|
||||
const PhaseUsage& pu,
|
||||
std::map<std::string, std::unique_ptr<AverageRegionalPressureType>>& regionalAveragePressureCalculator);
|
||||
|
||||
|
||||
} // namespace WellGroupHelpers
|
||||
static void setRegionAveragePressureCalculator(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const int reportStepIdx,
|
||||
const FieldPropsManager& fp,
|
||||
const PhaseUsage& pu,
|
||||
std::map<std::string, std::unique_ptr<AverageRegionalPressureType>>& regionalAveragePressureCalculator);
|
||||
};
|
||||
|
||||
} // namespace Opm
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user