adding the group name to the SingleWellState:;group_target

so we might be able to use it to identifiy the NONE control group
This commit is contained in:
Kai Bao committed 2026-01-27 10:34:03 +01:00
1 parent 976315e223
commit 5e5a57dfd3
5 files changed
+17 -17

No files matched your search

@@ -1338,7 +1338,7 @@ updateAndCommunicateGroupData(const int reportStepIdx,
const Scalar efficiencyFactor = well->wellEcl().getEfficiencyFactor() *
ws.efficiency_scaling_factor;
// Translate injector type from control to Phase.
std::optional<Scalar> group_target;
std::optional<std::pair<std::string, Scalar>> group_target;
if (well->isProducer()) {
group_target = group_state_helper.getWellGroupTargetProducer(
well->name(),
+4 -4
View File
@@ -177,7 +177,7 @@ GroupStateHelper<Scalar, IndexTraits>::checkGroupConstraintsInj(const std::strin
if (this->schedule_.hasWell(name)
&& this->wellState().well(name).group_target) { // for wells we already have computed the target
Scalar scale = 1.0;
const Scalar group_target_rate_available = *this->wellState().well(name).group_target;
const Scalar group_target_rate_available = (*this->wellState().well(name).group_target).second;
const Scalar current_well_rate_available
= tcalc.calcModeRateFromRates(rates); // Switch sign since 'rates' are negative for producers.
if (current_well_rate_available > 1e-12) {
@@ -319,7 +319,7 @@ GroupStateHelper<Scalar, IndexTraits>::checkGroupConstraintsProd(const std::stri
// Switch sign since 'rates' are negative for producers.
const Scalar current_well_rate_available = -tcalc.calcModeRateFromRates(rates);
const Scalar group_target_rate_available = *this->wellState().well(name).group_target;
const Scalar group_target_rate_available = (*this->wellState().well(name).group_target).second;
Scalar scale = 1.0;
if (current_well_rate_available > 1e-12) {
scale = group_target_rate_available / current_well_rate_available;
@@ -648,7 +648,7 @@ GroupStateHelper<Scalar, IndexTraits>::getWellGroupTargetInjector(const std::str
}
template <typename Scalar, typename IndexTraits>
std::optional<Scalar>
std::optional<std::pair<std::string, Scalar>>
GroupStateHelper<Scalar, IndexTraits>::getWellGroupTargetProducer(const std::string& name,
const std::string& parent,
const Group& group,
@@ -740,7 +740,7 @@ GroupStateHelper<Scalar, IndexTraits>::getWellGroupTargetProducer(const std::str
do_addback);
// Avoid negative target rates coming from too large local reductions.
return std::max(Scalar(0.0), target / efficiency_factor);
return {group.name(), std::max(Scalar(0.0), target / efficiency_factor)};
}
template <typename Scalar, typename IndexTraits>
+6 -6
View File
@@ -251,12 +251,12 @@ public:
const Scalar efficiency_factor,
const std::vector<Scalar>& resv_coeff) const;
std::optional<Scalar> getWellGroupTargetProducer(const std::string& name,
const std::string& parent,
const Group& group,
const Scalar* rates,
const Scalar efficiency_factor,
const std::vector<Scalar>& resv_coeff) const;
std::optional<std::pair<std::string, Scalar>> getWellGroupTargetProducer(const std::string& name,
const std::string& parent,
const Group& group,
const Scalar* rates,
const Scalar efficiency_factor,
const std::vector<Scalar>& resv_coeff) const;
GuideRate::RateVector getWellRateVector(const std::string& name) const;
+1 -1
View File
@@ -127,7 +127,7 @@ public:
std::vector<Scalar> prev_surface_rates;
PerfData<Scalar> perf_data;
bool trivial_group_target;
std::optional<Scalar> group_target;
std::optional<std::pair<std::string, Scalar>> group_target;
SegmentState<Scalar> segments;
Events events;
WellInjectorCMode injection_cmode{WellInjectorCMode::CMODE_UNDEFINED};
+5 -5
View File
@@ -124,7 +124,7 @@ getGroupInjectionControl(const Group& group,
const auto target_rate = well_state.well(well_.indexOfWell()).group_target;
if (target_rate) {
control_eq = injection_rate - *target_rate;
control_eq = injection_rate - target_rate->second;
} else {
const auto& controls = well.injectionControls(summaryState);
control_eq = bhp - controls.bhp_limit;
@@ -190,7 +190,7 @@ getGroupInjectionTargetRate(const Group& group,
return std::nullopt;
}
return groupStateHelper.wellState().well(well_.indexOfWell()).group_target;
return groupStateHelper.wellState().well(well_.indexOfWell()).group_target->second;
}
template<typename Scalar, typename IndexTraits>
@@ -258,7 +258,7 @@ getGroupProductionControl(const Group& group,
const auto target_rate = well_state.well(well_.indexOfWell()).group_target;
if (target_rate) {
const auto current_rate = -tcalc.calcModeRateFromRates(rates); // Switch sign since 'rates' are negative for producers.
control_eq = current_rate - *target_rate;
control_eq = current_rate - target_rate->second;
} else {
const auto& controls = well.productionControls(summaryState);
control_eq = bhp - controls.bhp_limit;
@@ -310,7 +310,7 @@ getGroupProductionTargetRate(const Group& group,
if (!target_rate) {
return 1.0;
}
if (*target_rate == 0.0) {
if (target_rate->second == 0.0) {
return 0.0;
}
const auto& ws = well_state.well(well_.indexOfWell());
@@ -318,7 +318,7 @@ getGroupProductionTargetRate(const Group& group,
const auto current_rate = -tcalc.calcModeRateFromRates(rates); // Switch sign since 'rates' are negative for producers.
Scalar scale = 1.0;
if (current_rate > 1e-14)
scale = *target_rate / current_rate;
scale = target_rate->second / current_rate;
return scale;
}