mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-12 03:35:37 -06:00
Refactor sumWellRates to accept bool argument
This commit is contained in:
parent
725800cec7
commit
8937c9cba9
@ -447,7 +447,7 @@ checkGroupInjectionConstraints(const Group& group,
|
||||
if (currentControl != Group::InjectionCMode::RATE)
|
||||
{
|
||||
double current_rate = 0.0;
|
||||
current_rate += WellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phasePos, /*isInjector*/true);
|
||||
current_rate += WellGroupHelpers::sumWellSurfaceRates(group, schedule(), well_state, reportStepIdx, phasePos, /*isInjector*/true);
|
||||
|
||||
// sum over all nodes
|
||||
current_rate = comm_.sum(current_rate);
|
||||
@ -483,13 +483,13 @@ checkGroupInjectionConstraints(const Group& group,
|
||||
{
|
||||
double production_Rate = 0.0;
|
||||
const Group& groupRein = schedule().getGroup(controls.reinj_group, reportStepIdx);
|
||||
production_Rate += WellGroupHelpers::sumWellRates(groupRein, schedule(), well_state, reportStepIdx, phasePos, /*isInjector*/false);
|
||||
production_Rate += WellGroupHelpers::sumWellSurfaceRates(groupRein, schedule(), well_state, reportStepIdx, phasePos, /*isInjector*/false);
|
||||
|
||||
// sum over all nodes
|
||||
production_Rate = comm_.sum(production_Rate);
|
||||
|
||||
double current_rate = 0.0;
|
||||
current_rate += WellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phasePos, /*isInjector*/true);
|
||||
current_rate += WellGroupHelpers::sumWellSurfaceRates(group, schedule(), well_state, reportStepIdx, phasePos, /*isInjector*/true);
|
||||
|
||||
// sum over all nodes
|
||||
current_rate = comm_.sum(current_rate);
|
||||
@ -550,7 +550,7 @@ checkGroupProductionConstraints(const Group& group,
|
||||
if (currentControl != Group::ProductionCMode::ORAT)
|
||||
{
|
||||
double current_rate = 0.0;
|
||||
current_rate += WellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Liquid], false);
|
||||
current_rate += WellGroupHelpers::sumWellSurfaceRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Liquid], false);
|
||||
|
||||
// sum over all nodes
|
||||
current_rate = comm_.sum(current_rate);
|
||||
@ -570,7 +570,7 @@ checkGroupProductionConstraints(const Group& group,
|
||||
{
|
||||
|
||||
double current_rate = 0.0;
|
||||
current_rate += WellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Aqua], false);
|
||||
current_rate += WellGroupHelpers::sumWellSurfaceRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Aqua], false);
|
||||
|
||||
// sum over all nodes
|
||||
current_rate = comm_.sum(current_rate);
|
||||
@ -588,7 +588,7 @@ checkGroupProductionConstraints(const Group& group,
|
||||
if (currentControl != Group::ProductionCMode::GRAT)
|
||||
{
|
||||
double current_rate = 0.0;
|
||||
current_rate += WellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Vapour], false);
|
||||
current_rate += WellGroupHelpers::sumWellSurfaceRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Vapour], false);
|
||||
|
||||
// sum over all nodes
|
||||
current_rate = comm_.sum(current_rate);
|
||||
@ -605,8 +605,8 @@ checkGroupProductionConstraints(const Group& group,
|
||||
if (currentControl != Group::ProductionCMode::LRAT)
|
||||
{
|
||||
double current_rate = 0.0;
|
||||
current_rate += WellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Liquid], false);
|
||||
current_rate += WellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Aqua], false);
|
||||
current_rate += WellGroupHelpers::sumWellSurfaceRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Liquid], false);
|
||||
current_rate += WellGroupHelpers::sumWellSurfaceRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Aqua], false);
|
||||
|
||||
// sum over all nodes
|
||||
current_rate = comm_.sum(current_rate);
|
||||
@ -678,8 +678,8 @@ 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::sumWellRates(group, schedule(), well_state, reportStepIdx, gasPos, /*isInjector*/false);
|
||||
double injection_rate = WellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, gasPos, /*isInjector*/true);
|
||||
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);
|
||||
|
||||
// sum over all nodes
|
||||
injection_rate = comm_.sum(injection_rate);
|
||||
@ -807,7 +807,7 @@ 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::sumWellRates(group, schedule(), this->wellState(), reportStepIdx, phasePos, /* isInjector */ true);
|
||||
const double local_current_rate = WellGroupHelpers::sumWellSurfaceRates(group, schedule(), this->wellState(), reportStepIdx, phasePos, /* isInjector */ true);
|
||||
// Sum over all processes
|
||||
rates[phasePos] = comm_.sum(local_current_rate);
|
||||
}
|
||||
@ -845,7 +845,7 @@ checkGroupHigherConstraints(const Group& group,
|
||||
if (!skip && group.isProductionGroup()) {
|
||||
// Obtain rates for group.
|
||||
for (int phasePos = 0; phasePos < phase_usage_.num_phases; ++phasePos) {
|
||||
const double local_current_rate = WellGroupHelpers::sumWellRates(group, schedule(), this->wellState(), reportStepIdx, phasePos, /* isInjector */ false);
|
||||
const double local_current_rate = WellGroupHelpers::sumWellSurfaceRates(group, schedule(), this->wellState(), reportStepIdx, phasePos, /* isInjector */ false);
|
||||
// Sum over all processes
|
||||
rates[phasePos] = -comm_.sum(local_current_rate);
|
||||
}
|
||||
@ -1132,7 +1132,7 @@ 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::sumWellRates(groupRein, schedule_, wellState, reportStepIdx, gasPos, /*isInjector*/false);
|
||||
double gasProductionRate = WellGroupHelpers::sumWellSurfaceRates(groupRein, schedule_, wellState, reportStepIdx, gasPos, /*isInjector*/false);
|
||||
double solventProductionRate = WellGroupHelpers::sumSolventRates(groupRein, schedule_, wellState, reportStepIdx, /*isInjector*/false);
|
||||
|
||||
solventProductionRate = comm_.sum(solventProductionRate);
|
||||
|
@ -58,6 +58,61 @@ namespace {
|
||||
|
||||
return {oilRate, gasRate, waterRate};
|
||||
}
|
||||
|
||||
double sumWellPhaseRates(bool res_rates,
|
||||
const Opm::Group& group,
|
||||
const Opm::Schedule& schedule,
|
||||
const Opm::WellState& wellState,
|
||||
const int reportStepIdx,
|
||||
const int phasePos,
|
||||
const bool injector)
|
||||
{
|
||||
|
||||
double rate = 0.0;
|
||||
for (const std::string& groupName : group.groups()) {
|
||||
const auto& groupTmp = schedule.getGroup(groupName, reportStepIdx);
|
||||
const auto& gefac = groupTmp.getGroupEfficiencyFactor();
|
||||
rate += gefac * sumWellPhaseRates(res_rates, groupTmp, schedule, wellState, reportStepIdx, phasePos, injector);
|
||||
}
|
||||
const auto& end = wellState.wellMap().end();
|
||||
|
||||
for (const std::string& wellName : group.wells()) {
|
||||
const auto& it = wellState.wellMap().find(wellName);
|
||||
if (it == end) // the well is not found
|
||||
continue;
|
||||
|
||||
int well_index = it->second[0];
|
||||
|
||||
if (! wellState.wellIsOwned(well_index, wellName) ) // Only sum once
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
const auto& wellEcl = schedule.getWell(wellName, reportStepIdx);
|
||||
// only count producers or injectors
|
||||
if ((wellEcl.isProducer() && injector) || (wellEcl.isInjector() && !injector))
|
||||
continue;
|
||||
|
||||
if (wellEcl.getStatus() == Opm::Well::Status::SHUT)
|
||||
continue;
|
||||
|
||||
double factor = wellEcl.getEfficiencyFactor();
|
||||
if (res_rates) {
|
||||
const auto& well_rates = wellState.wellReservoirRates(well_index);
|
||||
if (injector)
|
||||
rate += factor * well_rates[phasePos];
|
||||
else
|
||||
rate -= factor * well_rates[phasePos];
|
||||
} else {
|
||||
const auto& well_rates = wellState.wellRates(well_index);
|
||||
if (injector)
|
||||
rate += factor * well_rates[phasePos];
|
||||
else
|
||||
rate -= factor * well_rates[phasePos];
|
||||
}
|
||||
}
|
||||
return rate;
|
||||
}
|
||||
} // namespace Anonymous
|
||||
|
||||
namespace Opm
|
||||
@ -126,61 +181,15 @@ namespace WellGroupHelpers
|
||||
schedule.getGroup(group.parent(), reportStepIdx), schedule, reportStepIdx, factor);
|
||||
}
|
||||
|
||||
double sumWellPhaseRates(const WellContainer<std::vector<double>>& rates,
|
||||
const Group& group,
|
||||
const Schedule& schedule,
|
||||
const WellState& wellState,
|
||||
const int reportStepIdx,
|
||||
const int phasePos,
|
||||
const bool injector)
|
||||
|
||||
double sumWellSurfaceRates(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const WellState& wellState,
|
||||
const int reportStepIdx,
|
||||
const int phasePos,
|
||||
const bool injector)
|
||||
{
|
||||
|
||||
double rate = 0.0;
|
||||
for (const std::string& groupName : group.groups()) {
|
||||
const Group& groupTmp = schedule.getGroup(groupName, reportStepIdx);
|
||||
const auto& gefac = groupTmp.getGroupEfficiencyFactor();
|
||||
rate += gefac * sumWellPhaseRates(rates, groupTmp, schedule, wellState, reportStepIdx, phasePos, injector);
|
||||
}
|
||||
const auto& end = wellState.wellMap().end();
|
||||
|
||||
for (const std::string& wellName : group.wells()) {
|
||||
const auto& it = wellState.wellMap().find(wellName);
|
||||
if (it == end) // the well is not found
|
||||
continue;
|
||||
|
||||
int well_index = it->second[0];
|
||||
|
||||
if (! wellState.wellIsOwned(well_index, wellName) ) // Only sum once
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
const auto& wellEcl = schedule.getWell(wellName, reportStepIdx);
|
||||
// only count producers or injectors
|
||||
if ((wellEcl.isProducer() && injector) || (wellEcl.isInjector() && !injector))
|
||||
continue;
|
||||
|
||||
if (wellEcl.getStatus() == Well::Status::SHUT)
|
||||
continue;
|
||||
|
||||
double factor = wellEcl.getEfficiencyFactor();
|
||||
const auto& well_rates = rates[well_index];
|
||||
if (injector)
|
||||
rate += factor * well_rates[phasePos];
|
||||
else
|
||||
rate -= factor * well_rates[phasePos];
|
||||
}
|
||||
return rate;
|
||||
}
|
||||
|
||||
double sumWellRates(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const WellState& wellState,
|
||||
const int reportStepIdx,
|
||||
const int phasePos,
|
||||
const bool injector)
|
||||
{
|
||||
return sumWellPhaseRates(wellState.wellRates(), group, schedule, wellState, reportStepIdx, phasePos, injector);
|
||||
return sumWellPhaseRates(false, group, schedule, wellState, reportStepIdx, phasePos, injector);
|
||||
}
|
||||
|
||||
double sumWellResRates(const Group& group,
|
||||
@ -190,8 +199,7 @@ namespace WellGroupHelpers
|
||||
const int phasePos,
|
||||
const bool injector)
|
||||
{
|
||||
return sumWellPhaseRates(
|
||||
wellState.wellReservoirRates(), group, schedule, wellState, reportStepIdx, phasePos, injector);
|
||||
return sumWellPhaseRates(true, group, schedule, wellState, reportStepIdx, phasePos, injector);
|
||||
}
|
||||
|
||||
double sumSolventRates(const Group& group,
|
||||
@ -341,7 +349,7 @@ namespace WellGroupHelpers
|
||||
if (individual_control || num_group_controlled_wells == 0) {
|
||||
for (int phase = 0; phase < np; phase++) {
|
||||
groupTargetReduction[phase]
|
||||
+= subGroupEfficiency * sumWellRates(subGroup, schedule, wellStateNupcol, reportStepIdx, phase, isInjector);
|
||||
+= subGroupEfficiency * sumWellSurfaceRates(subGroup, schedule, wellStateNupcol, reportStepIdx, phase, isInjector);
|
||||
}
|
||||
} else {
|
||||
// The subgroup may participate in group control.
|
||||
@ -366,7 +374,7 @@ namespace WellGroupHelpers
|
||||
if (individual_control || num_group_controlled_wells == 0) {
|
||||
for (int phase = 0; phase < np; phase++) {
|
||||
groupTargetReduction[phase]
|
||||
+= subGroupEfficiency * sumWellRates(subGroup, schedule, wellStateNupcol, reportStepIdx, phase, isInjector);
|
||||
+= subGroupEfficiency * sumWellSurfaceRates(subGroup, schedule, wellStateNupcol, reportStepIdx, phase, isInjector);
|
||||
}
|
||||
} else {
|
||||
// The subgroup may participate in group control.
|
||||
@ -511,10 +519,10 @@ namespace WellGroupHelpers
|
||||
const int np = wellState.numPhases();
|
||||
double resv = 0.0;
|
||||
for (int phase = 0; phase < np; ++phase) {
|
||||
resv += sumWellPhaseRates(wellStateNupcol.wellReservoirRates(),
|
||||
resv += sumWellPhaseRates(true,
|
||||
group,
|
||||
schedule,
|
||||
wellState,
|
||||
wellStateNupcol,
|
||||
reportStepIdx,
|
||||
phase,
|
||||
/*isInjector*/ false);
|
||||
@ -536,10 +544,10 @@ namespace WellGroupHelpers
|
||||
const int np = wellState.numPhases();
|
||||
std::vector<double> resv(np, 0.0);
|
||||
for (int phase = 0; phase < np; ++phase) {
|
||||
resv[phase] = sumWellPhaseRates(wellStateNupcol.wellReservoirRates(),
|
||||
resv[phase] = sumWellPhaseRates(true,
|
||||
group,
|
||||
schedule,
|
||||
wellState,
|
||||
wellStateNupcol,
|
||||
reportStepIdx,
|
||||
phase,
|
||||
/*isInjector*/ true);
|
||||
@ -592,8 +600,7 @@ namespace WellGroupHelpers
|
||||
const int np = wellState.numPhases();
|
||||
std::vector<double> rates(np, 0.0);
|
||||
for (int phase = 0; phase < np; ++phase) {
|
||||
rates[phase] = sumWellPhaseRates(
|
||||
wellStateNupcol.wellRates(), group, schedule, wellState, reportStepIdx, phase, /*isInjector*/ false);
|
||||
rates[phase] = sumWellPhaseRates(false, group, schedule, wellStateNupcol, reportStepIdx, phase, /*isInjector*/ false);
|
||||
}
|
||||
group_state.update_production_rates(group.name(), rates);
|
||||
}
|
||||
@ -616,8 +623,7 @@ namespace WellGroupHelpers
|
||||
|
||||
std::vector<double> rein(np, 0.0);
|
||||
for (int phase = 0; phase < np; ++phase) {
|
||||
rein[phase] = sumWellPhaseRates(
|
||||
wellStateNupcol.wellRates(), group, schedule, wellState, reportStepIdx, phase, /*isInjector*/ false);
|
||||
rein[phase] = sumWellPhaseRates(false, group, schedule, wellStateNupcol, reportStepIdx, phase, /*isInjector*/ false);
|
||||
}
|
||||
|
||||
// add import rate and substract consumption rate for group for gas
|
||||
|
@ -61,20 +61,12 @@ namespace WellGroupHelpers
|
||||
const int reportStepIdx,
|
||||
double& factor);
|
||||
|
||||
double sumWellPhaseRates(const WellContainer<std::vector<double>>& rates,
|
||||
const Group& group,
|
||||
const Schedule& schedule,
|
||||
const WellState& wellState,
|
||||
const int reportStepIdx,
|
||||
const int phasePos,
|
||||
const bool injector);
|
||||
|
||||
double sumWellRates(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const WellState& wellState,
|
||||
const int reportStepIdx,
|
||||
const int phasePos,
|
||||
const bool injector);
|
||||
double sumWellSurfaceRates(const Group& group,
|
||||
const Schedule& schedule,
|
||||
const WellState& wellState,
|
||||
const int reportStepIdx,
|
||||
const int phasePos,
|
||||
const bool injector);
|
||||
|
||||
double sumWellResRates(const Group& group,
|
||||
const Schedule& schedule,
|
||||
|
@ -255,7 +255,6 @@ public:
|
||||
}
|
||||
|
||||
/// One rate per well and phase.
|
||||
const WellContainer<std::vector<double>>& wellRates() const { return wellrates_; }
|
||||
std::vector<double>& wellRates(std::size_t well_index) { return wellrates_[well_index]; }
|
||||
const std::vector<double>& wellRates(std::size_t well_index) const { return wellrates_[well_index]; }
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user