GroupTargetCalculator.hpp
Go to the documentation of this file.
1/*
2 Copyright 2025 Equinor ASA
3
4 This file is part of the Open Porous Media project (OPM).
5
6 OPM is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 OPM is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with OPM. If not, see <http://www.gnu.org/licenses/>.
18*/
19
20#ifndef OPM_GROUP_TARGET_CALCULATOR_HPP
21#define OPM_GROUP_TARGET_CALCULATOR_HPP
22#include <opm/common/ErrorMacros.hpp>
23#include <opm/input/eclipse/EclipseState/Phase.hpp>
24#include <opm/input/eclipse/Schedule/Schedule.hpp>
25#include <opm/input/eclipse/Schedule/Group/GConSale.hpp>
26#include <opm/input/eclipse/Schedule/Group/Group.hpp>
37
38#include <variant>
39#include <optional>
40#include <vector>
41#include <string>
42
43namespace Opm {
44
54template<class Scalar, class IndexTraits>
56public:
62 using ControlMode = std::variant<
63 std::monostate,
64 Group::InjectionCMode,
65 Group::ProductionCMode
66 >;
71
72 enum class TargetType {
73 Injection,
74 Production
75 };
76
78 struct TargetInfo {
79 Scalar target;
81 };
84 Scalar target;
85 Group::ProductionCMode cmode;
86 };
89 Scalar target;
90 Group::InjectionCMode cmode;
91 };
92
104 public:
105 using TargetCalculatorType = std::variant<std::monostate, TargetCalculator, InjectionTargetCalculator>;
107 GroupTargetCalculator& calculator,
108 const Group& original_group, // the bottom group we want to calculate the target for
109 std::optional<ReservoirCoupling::Phase> injection_phase = std::nullopt
110 );
111 std::optional<TargetInfo> calculateGroupTarget();
112 DeferredLogger& deferredLogger() { return this->parent_calculator_.deferredLogger(); }
113 // Const overload: allows logging from const methods.
114 DeferredLogger& deferredLogger() const { return this->parent_calculator_.deferredLogger(); }
115 int fipnum() const { return this->parent_calculator_.fipnum(); }
116 const GConSale& gconsale() const {
117 return this->schedule()[this->reportStepIdx()].gconsale();
118 }
119 const GroupState<Scalar>& groupState() const { return this->parent_calculator_.groupState(); }
124 const GuideRate& guideRate() const { return this->parent_calculator_.guideRate(); }
125 bool hasGuideRate(const Group& group) const { return this->hasGuideRate(group.name()); }
126 bool hasGuideRate(const std::string& name) const {
127 if (this->targetType() == TargetType::Injection) {
128 return this->guideRate().has(name, this->injectionPhase_());
129 }
130 return this->guideRate().has(name);
131 }
132 bool hasFldOrNoneControl(const Group& group);
134 const Group& originalGroup() const { return this->original_group_; }
135 const PhaseUsageInfo<IndexTraits>& phaseUsage() const { return this->parent_calculator_.phaseUsage(); }
136 int pvtreg() const { return this->parent_calculator_.pvtreg(); }
137 int reportStepIdx() const { return this->parent_calculator_.reportStepIdx(); }
138 const std::vector<Scalar>& resvCoeffsInj() const { return this->parent_calculator_.resvCoeffsInj(); }
139 const std::vector<Scalar>& resvCoeffsProd() const { return this->resv_coeffs_prod_; }
140 const Schedule& schedule() const { return this->parent_calculator_.schedule(); }
141 const SummaryState& summaryState() const { return this->parent_calculator_.summaryState(); }
143 return this->parent_calculator_.wellModel();
144 }
146 return this->injection_phase_.has_value() ? TargetType::Injection : TargetType::Production;
147 }
148 const WellState<Scalar, IndexTraits>& wellState() const { return this->parent_calculator_.wellState(); }
149 const GroupStateHelperType& groupStateHelper() const { return this->parent_calculator_.groupStateHelper(); }
150 private:
151 std::optional<TargetInfo> calculateGroupTargetRecursive_(const Group& group, const Scalar efficiency_factor);
152 const Group& parentGroup(const Group& group) const {
153 return this->schedule().getGroup(group.parent(), this->reportStepIdx());
154 }
155 bool parentGroupControlAvailable_(const Group& group);
156 Phase reservoirCouplingToOpmPhase_(ReservoirCoupling::Phase reservoir_coupling_phase) const;
157
158 GroupTargetCalculator& parent_calculator_;
159 const Group& original_group_; // The bottom group we want to calculate the target for
160 std::optional<ReservoirCoupling::Phase> injection_phase_;
161 std::vector<Scalar> resv_coeffs_prod_;
162 };
163
174 public:
175 using TargetCalculatorType = std::variant<std::monostate, TargetCalculator, InjectionTargetCalculator>;
176
177 constexpr static Scalar TARGET_RATE_TOLERANCE = 1e-12;
178
180 GeneralCalculator& parent_calculator,
181 const Group& top_group,
182 const Group& bottom_group,
183 Scalar efficiency_factor
184 );
185
186 std::optional<TargetInfo> calculateGroupTarget();
187 DeferredLogger& deferredLogger() { return this->parent_calculator_.deferredLogger(); }
188 // Const overload: allows logging from const methods (logical constness for external logger).
189 DeferredLogger& deferredLogger() const { return this->parent_calculator_.deferredLogger(); }
190 const GroupState<Scalar>& groupState() const { return this->parent_calculator_.groupState(); }
191 const GuideRate& guideRate() const { return this->parent_calculator_.guideRate(); }
192 TargetType targetType() const { return this->parent_calculator_.targetType(); }
193 const PhaseUsageInfo<IndexTraits>& phaseUsage() const { return this->parent_calculator_.phaseUsage(); }
194 int reportStepIdx() const { return this->parent_calculator_.reportStepIdx(); }
195 const std::vector<Scalar>& resvCoeffsInj() const { return this->parent_calculator_.resvCoeffsInj(); }
196 const std::vector<Scalar>& resvCoeffsProd() const { return this->parent_calculator_.resvCoeffsProd(); }
197 const Schedule& schedule() const { return this->parent_calculator_.schedule(); }
198 const SummaryState& summaryState() const { return this->parent_calculator_.summaryState(); }
199 const WellState<Scalar, IndexTraits>& wellState() const { return this->parent_calculator_.wellState(); }
200 const GroupStateHelperType& groupStateHelper() const { return this->parent_calculator_.groupStateHelper(); }
201
202 private:
203 bool bottomGroupHasIndividualControl_();
204 Scalar computeAddbackEfficiency_(const std::vector<std::string>& chain,
205 const std::size_t local_reduction_level) const;
206 Scalar getBottomGroupCurrentRateAvailable_() const;
207 std::vector<std::string> getGroupChainTopBot_() const;
208 std::size_t getLocalReductionLevel_(const std::vector<std::string>& chain);
209 TargetCalculatorType getProductionTargetCalculator_(const Group& group) const {
210 return this->parent_calculator_.getProductionTargetCalculator(group); }
211 TargetCalculatorType getInjectionTargetCalculator_(const Group& group) const {
212 return this->parent_calculator_.getInjectionTargetCalculator(group); }
213 TargetCalculatorType getInjectionTargetCalculator(const Group& group) const;
214 TargetCalculatorType getProductionTargetCalculator(const Group& group) const;
221 Scalar getSlaveGroupReservoirRate_(const Group& master_group);
222 TargetInfo getGroupTargetNoGuideRate_(const Group& group) const {
223 return this->parent_calculator_.getGroupTargetNoGuideRate(group);
224 }
225 ControlMode getToplevelControlMode_() const;
226 Scalar getTopLevelTarget_();
227 bool hasFldOrNoneControl_(const Group& group) {
228 return this->parent_calculator_.hasFldOrNoneControl(group);
229 }
230 bool hasFLDControl_(const Group& group) const;
231 bool hasGuideRate_(const std::string& name) const {
232 return this->parent_calculator_.hasGuideRate(name);
233 }
234 void initForInjector_();
235 void initForProducer_();
236 Phase injectionPhase_() const { return this->parent_calculator_.injectionPhase_(); }
237 bool isProducerAndRESVControl_(const Group& group) const;
238 Scalar localFraction_(const std::string& group_name);
239 Scalar localReduction_(const std::string& group_name);
240
241 GeneralCalculator& parent_calculator_;
242 const Group& top_group_;
243 const Group& bottom_group_;
244 // Accumulated efficiency factor along the chain from top to bottom, excluding the top group.
245 Scalar chain_efficiency_factor_;
246 // Active calculator used for distributing the target along the chain:
247 // either production TargetCalculator or InjectionTargetCalculator.
248 std::variant<std::monostate, TargetCalculator, InjectionTargetCalculator> target_calculator_;
249 // Since FractionCalculator does not have a default constructor, we use std::optional
250 // to conditionally initialize it based on whether we are dealing with an injector or producer.
251 std::optional<FractionCalculator> fraction_calculator_;
252 };
253
259 const GroupStateHelperType& group_state_helper
260 );
261 DeferredLogger& deferredLogger() { return this->group_state_helper_.deferredLogger(); }
262 // Const overload: allows logging from const methods.
263 DeferredLogger& deferredLogger() const { return this->group_state_helper_.deferredLogger(); }
264 int fipnum() const { return this->fipnum_; }
266 std::optional<InjectionTargetInfo> groupInjectionTarget(
267 const Group& group, ReservoirCoupling::Phase injection_phase
268 );
270 std::optional<ProductionTargetInfo> groupProductionTarget(const Group& group);
271 const GroupState<Scalar>& groupState() const { return this->group_state_; }
272 const GuideRate& guideRate() const { return this->guide_rate_; }
273 const PhaseUsageInfo<IndexTraits>& phaseUsage() const { return this->phase_usage_; }
274 int pvtreg() const { return this->pvtreg_; }
275 int reportStepIdx() const { return this->report_step_idx_; }
276 const std::vector<Scalar>& resvCoeffsInj() const { return this->resv_coeffs_inj_; }
277 const Schedule& schedule() const { return this->schedule_; }
278 const SummaryState& summaryState() const { return this->summary_state_; }
279 const BlackoilWellModelGeneric<Scalar, IndexTraits>& wellModel() const { return this->well_model_; }
280 const WellState<Scalar, IndexTraits>& wellState() const { return this->well_state_; }
281 const GroupStateHelperType& groupStateHelper() const { return this->group_state_helper_; }
282private:
284 const GroupStateHelperType& group_state_helper_;
285 const WellState<Scalar, IndexTraits >& well_state_;
286 const GroupState<Scalar>& group_state_;
287 const Schedule& schedule_;
288 const SummaryState& summary_state_;
289 const PhaseUsageInfo<IndexTraits>& phase_usage_;
290 const GuideRate& guide_rate_;
291 int report_step_idx_;
292 std::vector<Scalar> resv_coeff_;
293 int fipnum_; // FIP region for the groups
294 int pvtreg_; // PVT region for the groups
295 std::vector<Scalar> resv_coeffs_inj_;
296};
297
298} // namespace Opm
299
300#endif // OPM_GROUP_TARGET_CALCULATOR_HPP
Class for handling the blackoil well model.
Definition: BlackoilWellModelGeneric.hpp:96
Definition: DeferredLogger.hpp:57
Definition: GroupStateHelper.hpp:55
DeferredLogger & deferredLogger() const
Get the deferred logger.
Definition: GroupStateHelper.hpp:227
Definition: FractionCalculator.hpp:40
Definition: TargetCalculator.hpp:82
Definition: TargetCalculator.hpp:45
Definition: GroupState.hpp:41
Definition: GroupTargetCalculator.hpp:103
const BlackoilWellModelGeneric< Scalar, IndexTraits > & wellModel() const
Definition: GroupTargetCalculator.hpp:142
const GroupState< Scalar > & groupState() const
Definition: GroupTargetCalculator.hpp:119
TargetCalculatorType getProductionTargetCalculator(const Group &group) const
std::variant< std::monostate, TargetCalculator, InjectionTargetCalculator > TargetCalculatorType
Definition: GroupTargetCalculator.hpp:105
std::optional< TargetInfo > calculateGroupTarget()
TargetCalculatorType getTargetCalculator(const Group &group)
const std::vector< Scalar > & resvCoeffsProd() const
Definition: GroupTargetCalculator.hpp:139
DeferredLogger & deferredLogger()
Definition: GroupTargetCalculator.hpp:112
const std::vector< Scalar > & resvCoeffsInj() const
Definition: GroupTargetCalculator.hpp:138
TargetCalculatorType getInjectionTargetCalculator(const Group &group)
const Schedule & schedule() const
Definition: GroupTargetCalculator.hpp:140
bool hasGuideRate(const std::string &name) const
Definition: GroupTargetCalculator.hpp:126
const PhaseUsageInfo< IndexTraits > & phaseUsage() const
Definition: GroupTargetCalculator.hpp:135
const GuideRate & guideRate() const
Definition: GroupTargetCalculator.hpp:124
const Group & originalGroup() const
Definition: GroupTargetCalculator.hpp:134
TargetType targetType() const
Definition: GroupTargetCalculator.hpp:145
GeneralCalculator(GroupTargetCalculator &calculator, const Group &original_group, std::optional< ReservoirCoupling::Phase > injection_phase=std::nullopt)
const WellState< Scalar, IndexTraits > & wellState() const
Definition: GroupTargetCalculator.hpp:148
const GConSale & gconsale() const
Definition: GroupTargetCalculator.hpp:116
bool hasFldOrNoneControl(const Group &group)
int fipnum() const
Definition: GroupTargetCalculator.hpp:115
int pvtreg() const
Definition: GroupTargetCalculator.hpp:136
bool hasGuideRate(const Group &group) const
Definition: GroupTargetCalculator.hpp:125
int reportStepIdx() const
Definition: GroupTargetCalculator.hpp:137
TargetInfo getGroupTargetNoGuideRate(const Group &group)
DeferredLogger & deferredLogger() const
Definition: GroupTargetCalculator.hpp:114
const SummaryState & summaryState() const
Definition: GroupTargetCalculator.hpp:141
const GroupStateHelperType & groupStateHelper() const
Definition: GroupTargetCalculator.hpp:149
Definition: GroupTargetCalculator.hpp:173
const WellState< Scalar, IndexTraits > & wellState() const
Definition: GroupTargetCalculator.hpp:199
TopToBottomCalculator(GeneralCalculator &parent_calculator, const Group &top_group, const Group &bottom_group, Scalar efficiency_factor)
const GuideRate & guideRate() const
Definition: GroupTargetCalculator.hpp:191
std::optional< TargetInfo > calculateGroupTarget()
const std::vector< Scalar > & resvCoeffsInj() const
Definition: GroupTargetCalculator.hpp:195
static constexpr Scalar TARGET_RATE_TOLERANCE
Definition: GroupTargetCalculator.hpp:177
const Schedule & schedule() const
Definition: GroupTargetCalculator.hpp:197
const std::vector< Scalar > & resvCoeffsProd() const
Definition: GroupTargetCalculator.hpp:196
DeferredLogger & deferredLogger() const
Definition: GroupTargetCalculator.hpp:189
std::variant< std::monostate, TargetCalculator, InjectionTargetCalculator > TargetCalculatorType
Definition: GroupTargetCalculator.hpp:175
const PhaseUsageInfo< IndexTraits > & phaseUsage() const
Definition: GroupTargetCalculator.hpp:193
const GroupStateHelperType & groupStateHelper() const
Definition: GroupTargetCalculator.hpp:200
TargetType targetType() const
Definition: GroupTargetCalculator.hpp:192
const GroupState< Scalar > & groupState() const
Definition: GroupTargetCalculator.hpp:190
const SummaryState & summaryState() const
Definition: GroupTargetCalculator.hpp:198
int reportStepIdx() const
Definition: GroupTargetCalculator.hpp:194
DeferredLogger & deferredLogger()
Definition: GroupTargetCalculator.hpp:187
Definition: GroupTargetCalculator.hpp:55
DeferredLogger & deferredLogger()
Definition: GroupTargetCalculator.hpp:261
int pvtreg() const
Definition: GroupTargetCalculator.hpp:274
TargetType
Definition: GroupTargetCalculator.hpp:72
GroupStateHelper< Scalar, IndexTraits > GroupStateHelperType
Definition: GroupTargetCalculator.hpp:70
int fipnum() const
Definition: GroupTargetCalculator.hpp:264
const PhaseUsageInfo< IndexTraits > & phaseUsage() const
Definition: GroupTargetCalculator.hpp:273
GroupTargetCalculator(const BlackoilWellModelGeneric< Scalar, IndexTraits > &well_model, const GroupStateHelperType &group_state_helper)
const BlackoilWellModelGeneric< Scalar, IndexTraits > & wellModel() const
Definition: GroupTargetCalculator.hpp:279
const WellState< Scalar, IndexTraits > & wellState() const
Definition: GroupTargetCalculator.hpp:280
const SummaryState & summaryState() const
Definition: GroupTargetCalculator.hpp:278
DeferredLogger & deferredLogger() const
Definition: GroupTargetCalculator.hpp:263
std::variant< std::monostate, Group::InjectionCMode, Group::ProductionCMode > ControlMode
Definition: GroupTargetCalculator.hpp:66
const std::vector< Scalar > & resvCoeffsInj() const
Definition: GroupTargetCalculator.hpp:276
const Schedule & schedule() const
Definition: GroupTargetCalculator.hpp:277
std::optional< InjectionTargetInfo > groupInjectionTarget(const Group &group, ReservoirCoupling::Phase injection_phase)
std::optional< ProductionTargetInfo > groupProductionTarget(const Group &group)
int reportStepIdx() const
Definition: GroupTargetCalculator.hpp:275
const GroupState< Scalar > & groupState() const
Definition: GroupTargetCalculator.hpp:271
const GuideRate & guideRate() const
Definition: GroupTargetCalculator.hpp:272
const GroupStateHelperType & groupStateHelper() const
Definition: GroupTargetCalculator.hpp:281
Definition: GasLiftGroupInfo.hpp:37
Definition: WellState.hpp:66
Phase
Phase indices for reservoir coupling, we currently only support black-oil phases (oil,...
Definition: ReservoirCoupling.hpp:156
Definition: blackoilbioeffectsmodules.hh:43
Definition: GroupTargetCalculator.hpp:88
Scalar target
Definition: GroupTargetCalculator.hpp:89
Group::InjectionCMode cmode
Definition: GroupTargetCalculator.hpp:90
Definition: GroupTargetCalculator.hpp:83
Group::ProductionCMode cmode
Definition: GroupTargetCalculator.hpp:85
Scalar target
Definition: GroupTargetCalculator.hpp:84
Definition: GroupTargetCalculator.hpp:78
ControlMode cmode
Definition: GroupTargetCalculator.hpp:80
Scalar target
Definition: GroupTargetCalculator.hpp:79