diff --git a/opm/simulators/wells/BlackoilWellModelGeneric.cpp b/opm/simulators/wells/BlackoilWellModelGeneric.cpp index f76c86f84a..c8939f744e 100644 --- a/opm/simulators/wells/BlackoilWellModelGeneric.cpp +++ b/opm/simulators/wells/BlackoilWellModelGeneric.cpp @@ -1379,18 +1379,18 @@ updateAndCommunicateGroupData(const int reportStepIdx, std::vector is_production_group = {true, false, false, false}; const Phase all[] = { Phase::OIL, Phase::WATER, Phase::OIL, Phase::GAS }; - for (int i = 0; i < 4; i++) { - WellGroupHelpers::updateGroupControlledWells(schedule(), - well_state, - this->groupState(), - summaryState_, - &guideRate_, - reportStepIdx, - "FIELD", - "", - is_production_group[i], - all[i]); - } + for (int i = 0; i < 4; i++) { + WellGroupHelpers::updateGroupControlledWells(schedule(), + well_state, + this->groupState(), + summaryState_, + &guideRate_, + reportStepIdx, + "FIELD", + "", + is_production_group[i], + all[i]); + } // 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. diff --git a/opm/simulators/wells/FractionCalculator.cpp b/opm/simulators/wells/FractionCalculator.cpp index f2747ea158..01895d21bf 100644 --- a/opm/simulators/wells/FractionCalculator.cpp +++ b/opm/simulators/wells/FractionCalculator.cpp @@ -190,8 +190,6 @@ groupControlledWells(const std::string& group_name, return WellGroupHelpers::groupControlledWells(schedule_, well_state_, this->group_state_, - this->summary_state_, - this->guide_rate_, report_step_, group_name, always_included_child, diff --git a/opm/simulators/wells/GroupState.hpp b/opm/simulators/wells/GroupState.hpp index 348b98dcab..477904e2b1 100644 --- a/opm/simulators/wells/GroupState.hpp +++ b/opm/simulators/wells/GroupState.hpp @@ -107,7 +107,6 @@ public: bool has_number_of_wells_under_this_control(const std::string& gname) const; void update_number_of_wells_under_this_control(const std::string& gname, int number); int number_of_wells_under_this_control(const std::string& gname) const; - bool has_number_of_wells_under_this_inj_control(const std::string& gname, Phase phase) const; void update_number_of_wells_under_this_inj_control(const std::string& gname, Phase phase, int number); diff --git a/opm/simulators/wells/WellGroupHelpers.cpp b/opm/simulators/wells/WellGroupHelpers.cpp index 292bf09042..bad154b3de 100644 --- a/opm/simulators/wells/WellGroupHelpers.cpp +++ b/opm/simulators/wells/WellGroupHelpers.cpp @@ -392,7 +392,7 @@ updateGroupTargetReduction(const Group& group, const bool individual_control = (currentGroupControl != Group::InjectionCMode::FLD && currentGroupControl != Group::InjectionCMode::NONE); const int num_group_controlled_wells - = groupControlledWells(schedule, wellState, group_state, summaryState, &guide_rate, reportStepIdx, subGroupName, "", !isInjector, phase); + = groupControlledWells(schedule, wellState, group_state, reportStepIdx, subGroupName, "", !isInjector, phase); if (individual_control || num_group_controlled_wells == 0) { groupTargetReduction[phase_pos] += subGroupEfficiency * sumWellSurfaceRates(subGroup, schedule, wellState, reportStepIdx, phase_pos, isInjector); @@ -408,7 +408,7 @@ updateGroupTargetReduction(const Group& group, const bool individual_control = (currentGroupControl != Group::ProductionCMode::FLD && currentGroupControl != Group::ProductionCMode::NONE); const int num_group_controlled_wells - = groupControlledWells(schedule, wellState, group_state, summaryState, &guide_rate, reportStepIdx, subGroupName, "", !isInjector, /*injectionPhaseNotUsed*/Phase::OIL); + = groupControlledWells(schedule, wellState, group_state, reportStepIdx, subGroupName, "", !isInjector, /*injectionPhaseNotUsed*/Phase::OIL); if (individual_control || num_group_controlled_wells == 0) { for (int phase = 0; phase < np; phase++) { groupTargetReduction[phase] @@ -1235,123 +1235,20 @@ int WellGroupHelpers:: groupControlledWells(const Schedule& schedule, const WellState& well_state, const GroupState& group_state, - const SummaryState& summary_state, - const GuideRate* guideRate, const int report_step, const std::string& group_name, const std::string& always_included_child, const bool is_production_group, const Phase injection_phase) { - auto num_wells2 = is_production_group? group_state.number_of_wells_under_this_control(group_name): group_state.number_of_wells_under_this_inj_control(group_name, injection_phase); + auto num_wells = is_production_group? group_state.number_of_wells_under_this_control(group_name): group_state.number_of_wells_under_this_inj_control(group_name, injection_phase); if (schedule.hasWell(always_included_child, report_step)) { - const bool isInGroup = isInGroupChainTopBot(always_included_child, group_name, schedule, report_step); + const bool isInGroup = isInGroupChainTopBot(always_included_child, group_name, schedule, report_step); bool already_included = is_production_group? well_state.isProductionGrup(always_included_child) : well_state.isInjectionGrup(always_included_child); if (!already_included && isInGroup) { - num_wells2++; + num_wells++; } } - return num_wells2; - - OPM_TIMEFUNCTION(); - const Group& group = schedule.getGroup(group_name, report_step); - int num_wells = 0; - for (const std::string& child_group : group.groups()) { - - bool included = (child_group == always_included_child); - if (is_production_group) { - const auto ctrl = group_state.production_control(child_group); - included = included || (ctrl == Group::ProductionCMode::FLD) || (ctrl == Group::ProductionCMode::NONE); - } else { - const auto ctrl = group_state.injection_control(child_group, injection_phase); - included = included || (ctrl == Group::InjectionCMode::FLD) || (ctrl == Group::InjectionCMode::NONE); - } - - if (included) { - num_wells - += groupControlledWells(schedule, well_state, group_state, summary_state, guideRate, report_step, child_group, always_included_child, is_production_group, injection_phase); - } - } - for (const std::string& child_well : group.wells()) { - bool included = (child_well == always_included_child); - if (is_production_group) { - included = included || well_state.isProductionGrup(child_well) || group.as_choke(); - } else { - included = included || well_state.isInjectionGrup(child_well); - } - const auto ctrl1 = group_state.production_control(group.name()); - if (group.as_choke() && ((ctrl1 == Group::ProductionCMode::FLD) || (ctrl1 == Group::ProductionCMode::NONE))){ - // The auto choke group has not own group control but inherits control from an ancestor group. - // Number of wells should be calculated as zero when wells of auto choke group do not deliver target. - // This behaviour is then similar to no-autochoke group with wells not on GRUP control. - // The rates of these wells are summed up. The parent group target is reduced with this rate. - // This reduced target becomes the target of the other child group of this parent. - const PhaseUsage& pu = well_state.phaseUsage(); - std::vector rates(pu.num_phases, 0.0); - for (int phase_pos = 0; phase_pos < pu.num_phases; ++phase_pos) { - rates[phase_pos] = WellGroupHelpers::sumWellSurfaceRates(group, - schedule, - well_state, - report_step, - phase_pos, - false); - } - - // Get the ancestor of the auto choke group that has group control (cmode != FLD, NONE) - const auto& control_group_name = control_group(group, group_state, report_step, schedule); - const auto& control_group = schedule.getGroup(control_group_name, report_step); - const auto& ctrl = control_group.productionControls(summary_state); - const auto& control_group_cmode = ctrl.cmode; - - const auto& group_guide_rate = group.productionControls(summary_state).guide_rate; - - if (group_guide_rate > 0) { - // Guide rate is not default for the auto choke group - Scalar gratTargetFromSales = 0.0; - if (group_state.has_grat_sales_target(control_group_name)) - gratTargetFromSales = group_state.grat_sales_target(control_group_name); - - std::vector resv_coeff(pu.num_phases, 1.0); - WGHelpers::TargetCalculator tcalc(control_group_cmode, - pu, - resv_coeff, - gratTargetFromSales, - group.name(), - group_state, - group.has_gpmaint_control(control_group_cmode)); - auto deferred_logger = Opm::DeferredLogger(); - const auto& control_group_target = tcalc.groupTarget(ctrl, deferred_logger); - - // Calculates the guide rate of the parent group with control. - // It is allowed that the guide rate of this group is defaulted. The guide rate will be derived from the children groups - const auto& control_group_guide_rate = getGuideRate(control_group_name, - schedule, - well_state, - group_state, - report_step, - guideRate, - tcalc.guideTargetMode(), - pu); - - if (control_group_guide_rate > 0) { - // Target rate for the auto choke group - const Scalar target_rate = control_group_target * group_guide_rate / control_group_guide_rate; - const Scalar current_rate = tcalc.calcModeRateFromRates(rates); - - if (current_rate < target_rate) - included = false; - } - } - } - - if (included) { - ++num_wells; - } - } - if (num_wells != num_wells2) { - //if (!schedule.hasWell(always_included_child, report_step)) - std::cout << "we dont compute the same " << group_name << " " << num_wells << " " << num_wells2 << " " << always_included_child << std::endl; - } return num_wells; } @@ -1594,8 +1491,6 @@ checkGroupConstraintsProd(const std::string& name, const int num_gr_ctrl = groupControlledWells(schedule, wellState, group_state, - summaryState, - guideRate, reportStepIdx, chain[ii], "", @@ -1746,8 +1641,6 @@ getWellGroupTargetProducer(const std::string& name, const int num_gr_ctrl = groupControlledWells(schedule, wellState, group_state, - summaryState, - guideRate, reportStepIdx, chain[ii], "", @@ -1900,8 +1793,6 @@ checkGroupConstraintsInj(const std::string& name, const int num_gr_ctrl = groupControlledWells(schedule, wellState, group_state, - summaryState, - guideRate, reportStepIdx, chain[ii], "", @@ -2096,8 +1987,6 @@ getWellGroupTargetInjector(const std::string& name, const int num_gr_ctrl = groupControlledWells(schedule, wellState, group_state, - summaryState, - guideRate, reportStepIdx, chain[ii], "", diff --git a/opm/simulators/wells/WellGroupHelpers.hpp b/opm/simulators/wells/WellGroupHelpers.hpp index b1297f3c6a..12835a4610 100644 --- a/opm/simulators/wells/WellGroupHelpers.hpp +++ b/opm/simulators/wells/WellGroupHelpers.hpp @@ -273,15 +273,13 @@ public: const bool is_production_group, const Phase injection_phase); static int groupControlledWells(const Schedule& schedule, - const WellState& well_state, - const GroupState& group_state, - const SummaryState& summary_state, - const GuideRate* guideRate, - const int report_step, - const std::string& group_name, - const std::string& always_included_child, - const bool is_production_group, - const Phase injection_phase); + const WellState& well_state, + const GroupState& 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 checkGroupConstraintsInj(const std::string& name, @@ -324,11 +322,11 @@ public: const Schedule& schedule, const int report_step); - static bool - isInGroupChainTopBot(const std::string& bottom, - const std::string& top, - const Schedule& schedule, - const int report_step); + static bool + isInGroupChainTopBot(const std::string& bottom, + const std::string& top, + const Schedule& schedule, + const int report_step); static std::string control_group(const Group& group,