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 int fipnum() const { return this->parent_calculator_.fipnum(); }
114 const GConSale& gconsale() const {
115 return this->schedule()[this->reportStepIdx()].gconsale();
116 }
117 const GroupState<Scalar>& groupState() const { return this->parent_calculator_.groupState(); }
122 const TargetCalculatorType& target_calculator, const Group& group);
123 TargetInfo getTargetNoGuideRate(const Group& group);
124 const GuideRate& guideRate() const { return this->parent_calculator_.guideRate(); }
126 const Group& originalGroup() const { return this->original_group_; }
127 const PhaseUsageInfo<IndexTraits>& phaseUsage() const { return this->parent_calculator_.phaseUsage(); }
128 int pvtreg() const { return this->parent_calculator_.pvtreg(); }
129 int reportStepIdx() const { return this->parent_calculator_.reportStepIdx(); }
130 const std::vector<Scalar>& resvCoeffsInj() const { return this->parent_calculator_.resvCoeffsInj(); }
131 const std::vector<Scalar>& resvCoeffsProd() const { return this->resv_coeffs_prod_; }
132 const Schedule& schedule() const { return this->parent_calculator_.schedule(); }
133 const SummaryState& summaryState() const { return this->parent_calculator_.summaryState(); }
135 return this->parent_calculator_.wellModel();
136 }
138 return this->injection_phase_.has_value() ? TargetType::Injection : TargetType::Production;
139 }
140 const WellState<Scalar, IndexTraits>& wellState() const { return this->parent_calculator_.wellState(); }
141 const GroupStateHelperType& groupStateHelper() const { return this->parent_calculator_.groupStateHelper(); }
142 private:
143 std::optional<TargetInfo> calculateGroupTargetRecursive_(const Group& group, const Scalar efficiency_factor);
144 bool hasFldOrNoneControl_(const Group& group);
145 bool hasGuideRate_(const Group& group) const { return this->guideRate().has(group.name()); }
146 bool hasGuideRate_(const std::string& name) const { return this->guideRate().has(name); }
147 const Group& parentGroup(const Group& group) const {
148 return this->schedule().getGroup(group.parent(), this->reportStepIdx());
149 }
150 bool parentGroupControlAvailable_(const Group& group);
151 Phase reservoirCouplingToOpmPhase_(ReservoirCoupling::Phase reservoir_coupling_phase) const;
152
153 GroupTargetCalculator& parent_calculator_;
154 const Group& original_group_; // The bottom group we want to calculate the target for
155 std::optional<ReservoirCoupling::Phase> injection_phase_;
156 std::vector<Scalar> resv_coeffs_prod_;
157 };
158
169 public:
170 using TargetCalculatorType = std::variant<std::monostate, TargetCalculator, InjectionTargetCalculator>;
171
172 constexpr static Scalar TARGET_RATE_TOLERANCE = 1e-12;
173
175 GeneralCalculator& parent_calculator,
176 const Group& top_group,
177 const Group& bottom_group,
178 Scalar efficiency_factor
179 );
180
181 std::optional<TargetInfo> calculateGroupTarget();
182 DeferredLogger& deferredLogger() { return this->parent_calculator_.deferredLogger(); }
183 const GroupState<Scalar>& groupState() const { return this->parent_calculator_.groupState(); }
184 const GuideRate& guideRate() const { return this->parent_calculator_.guideRate(); }
185 TargetType targetType() const { return this->parent_calculator_.targetType(); }
186 const PhaseUsageInfo<IndexTraits>& phaseUsage() const { return this->parent_calculator_.phaseUsage(); }
187 int reportStepIdx() const { return this->parent_calculator_.reportStepIdx(); }
188 const std::vector<Scalar>& resvCoeffsInj() const { return this->parent_calculator_.resvCoeffsInj(); }
189 const std::vector<Scalar>& resvCoeffsProd() const { return this->parent_calculator_.resvCoeffsProd(); }
190 const Schedule& schedule() const { return this->parent_calculator_.schedule(); }
191 const SummaryState& summaryState() const { return this->parent_calculator_.summaryState(); }
192 const WellState<Scalar, IndexTraits>& wellState() const { return this->parent_calculator_.wellState(); }
193 const GroupStateHelperType& groupStateHelper() const { return this->parent_calculator_.groupStateHelper(); }
194
195 private:
196 Scalar computeAddbackEfficiency_(const std::vector<std::string>& chain,
197 const std::size_t local_reduction_level) const;
198 Scalar getBottomGroupCurrentRateAvailable_() const;
199 std::vector<std::string> getGroupChainTopBot_() const;
200 std::size_t getLocalReductionLevel_(const std::vector<std::string>& chain);
201 TargetCalculatorType getProductionTargetCalculator_(const Group& group) const {
202 return this->parent_calculator_.getProductionTargetCalculator(group); }
203 TargetCalculatorType getInjectionTargetCalculator_(const Group& group) const {
204 return this->parent_calculator_.getInjectionTargetCalculator(group); }
205 TargetCalculatorType getInjectionTargetCalculator(const Group& group) const;
206 TargetCalculatorType getProductionTargetCalculator(const Group& group) const;
213 Scalar getSlaveGroupReservoirRate_(const Group& master_group);
214 TargetInfo getTargetNoGuideRate_(const Group& group) const {
215 return this->parent_calculator_.getTargetNoGuideRate(group);
216 }
217 Scalar getTopLevelTarget_();
218 bool hasFLDControl_(const Group& group) const;
219 bool hasGuideRate_(const std::string& name) const { return this->guideRate().has(name); }
220 void initForInjector_();
221 void initForProducer_();
222 Phase injectionPhase_() const { return this->parent_calculator_.injectionPhase_(); }
223 bool isProducerAndRESVControl_(const Group& group) const;
224 Scalar localFraction_(const std::string& group_name);
225 Scalar localReduction_(const std::string& group_name);
226
227 GeneralCalculator& parent_calculator_;
228 const Group& top_group_;
229 const Group& bottom_group_;
230 // Accumulated efficiency factor along the chain from top to bottom, excluding the top group.
231 Scalar chain_efficiency_factor_;
232 // Active calculator used for distributing the target along the chain:
233 // either production TargetCalculator or InjectionTargetCalculator.
234 std::variant<std::monostate, TargetCalculator, InjectionTargetCalculator> target_calculator_;
235 // Since FractionCalculator does not have a default constructor, we use std::optional
236 // to conditionally initialize it based on whether we are dealing with an injector or producer.
237 std::optional<FractionCalculator> fraction_calculator_;
238 ControlMode toplevel_control_mode_;
239 };
240
246 const GroupStateHelperType& group_state_helper,
247 DeferredLogger& deferred_logger
248 );
249 DeferredLogger& deferredLogger() { return this->deferred_logger_; }
250 int fipnum() const { return this->fipnum_; }
252 std::optional<InjectionTargetInfo> groupInjectionTarget(
253 const Group& group, ReservoirCoupling::Phase injection_phase
254 );
256 std::optional<ProductionTargetInfo> groupProductionTarget(const Group& group);
257 const GroupState<Scalar>& groupState() const { return this->group_state_; }
258 const GuideRate& guideRate() const { return this->guide_rate_; }
259 const PhaseUsageInfo<IndexTraits>& phaseUsage() const { return this->phase_usage_; }
260 int pvtreg() const { return this->pvtreg_; }
261 int reportStepIdx() const { return this->report_step_idx_; }
262 const std::vector<Scalar>& resvCoeffsInj() const { return this->resv_coeffs_inj_; }
263 const Schedule& schedule() const { return this->schedule_; }
264 const SummaryState& summaryState() const { return this->summary_state_; }
265 const BlackoilWellModelGeneric<Scalar, IndexTraits>& wellModel() const { return this->well_model_; }
266 const WellState<Scalar, IndexTraits>& wellState() const { return this->well_state_; }
267 const GroupStateHelperType& groupStateHelper() const { return this->group_state_helper_; }
268private:
270 const GroupStateHelperType& group_state_helper_;
271 const WellState<Scalar, IndexTraits >& well_state_;
272 const GroupState<Scalar>& group_state_;
273 const Schedule& schedule_;
274 const SummaryState& summary_state_;
275 const PhaseUsageInfo<IndexTraits>& phase_usage_;
276 const GuideRate& guide_rate_;
277 int report_step_idx_;
278 std::vector<Scalar> resv_coeff_;
279 DeferredLogger& deferred_logger_;
280 int fipnum_; // FIP region for the groups
281 int pvtreg_; // PVT region for the groups
282 std::vector<Scalar> resv_coeffs_inj_;
283};
284
285} // namespace Opm
286
287#endif // OPM_GROUP_TARGET_CALCULATOR_HPP
Class for handling the blackoil well model.
Definition: BlackoilWellModelGeneric.hpp:96
Definition: DeferredLogger.hpp:57
Definition: GroupStateHelper.hpp:53
Definition: FractionCalculator.hpp:40
Definition: TargetCalculator.hpp:77
Definition: TargetCalculator.hpp:45
Definition: GroupState.hpp:41
Definition: GroupTargetCalculator.hpp:103
const BlackoilWellModelGeneric< Scalar, IndexTraits > & wellModel() const
Definition: GroupTargetCalculator.hpp:134
const GroupState< Scalar > & groupState() const
Definition: GroupTargetCalculator.hpp:117
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:131
DeferredLogger & deferredLogger()
Definition: GroupTargetCalculator.hpp:112
const std::vector< Scalar > & resvCoeffsInj() const
Definition: GroupTargetCalculator.hpp:130
TargetCalculatorType getInjectionTargetCalculator(const Group &group)
const Schedule & schedule() const
Definition: GroupTargetCalculator.hpp:132
const PhaseUsageInfo< IndexTraits > & phaseUsage() const
Definition: GroupTargetCalculator.hpp:127
const GuideRate & guideRate() const
Definition: GroupTargetCalculator.hpp:124
const Group & originalGroup() const
Definition: GroupTargetCalculator.hpp:126
TargetType targetType() const
Definition: GroupTargetCalculator.hpp:137
GeneralCalculator(GroupTargetCalculator &calculator, const Group &original_group, std::optional< ReservoirCoupling::Phase > injection_phase=std::nullopt)
const WellState< Scalar, IndexTraits > & wellState() const
Definition: GroupTargetCalculator.hpp:140
const GConSale & gconsale() const
Definition: GroupTargetCalculator.hpp:114
int fipnum() const
Definition: GroupTargetCalculator.hpp:113
int pvtreg() const
Definition: GroupTargetCalculator.hpp:128
int reportStepIdx() const
Definition: GroupTargetCalculator.hpp:129
TargetInfo getTargetNoGuideRate(const Group &group)
TargetInfo getTargetFromCalculator(const TargetCalculatorType &target_calculator, const Group &group)
const SummaryState & summaryState() const
Definition: GroupTargetCalculator.hpp:133
const GroupStateHelperType & groupStateHelper() const
Definition: GroupTargetCalculator.hpp:141
Definition: GroupTargetCalculator.hpp:168
const WellState< Scalar, IndexTraits > & wellState() const
Definition: GroupTargetCalculator.hpp:192
TopToBottomCalculator(GeneralCalculator &parent_calculator, const Group &top_group, const Group &bottom_group, Scalar efficiency_factor)
const GuideRate & guideRate() const
Definition: GroupTargetCalculator.hpp:184
std::optional< TargetInfo > calculateGroupTarget()
const std::vector< Scalar > & resvCoeffsInj() const
Definition: GroupTargetCalculator.hpp:188
static constexpr Scalar TARGET_RATE_TOLERANCE
Definition: GroupTargetCalculator.hpp:172
const Schedule & schedule() const
Definition: GroupTargetCalculator.hpp:190
const std::vector< Scalar > & resvCoeffsProd() const
Definition: GroupTargetCalculator.hpp:189
std::variant< std::monostate, TargetCalculator, InjectionTargetCalculator > TargetCalculatorType
Definition: GroupTargetCalculator.hpp:170
const PhaseUsageInfo< IndexTraits > & phaseUsage() const
Definition: GroupTargetCalculator.hpp:186
const GroupStateHelperType & groupStateHelper() const
Definition: GroupTargetCalculator.hpp:193
TargetType targetType() const
Definition: GroupTargetCalculator.hpp:185
const GroupState< Scalar > & groupState() const
Definition: GroupTargetCalculator.hpp:183
const SummaryState & summaryState() const
Definition: GroupTargetCalculator.hpp:191
int reportStepIdx() const
Definition: GroupTargetCalculator.hpp:187
DeferredLogger & deferredLogger()
Definition: GroupTargetCalculator.hpp:182
Definition: GroupTargetCalculator.hpp:55
DeferredLogger & deferredLogger()
Definition: GroupTargetCalculator.hpp:249
int pvtreg() const
Definition: GroupTargetCalculator.hpp:260
TargetType
Definition: GroupTargetCalculator.hpp:72
GroupStateHelper< Scalar, IndexTraits > GroupStateHelperType
Definition: GroupTargetCalculator.hpp:70
int fipnum() const
Definition: GroupTargetCalculator.hpp:250
const PhaseUsageInfo< IndexTraits > & phaseUsage() const
Definition: GroupTargetCalculator.hpp:259
const BlackoilWellModelGeneric< Scalar, IndexTraits > & wellModel() const
Definition: GroupTargetCalculator.hpp:265
const WellState< Scalar, IndexTraits > & wellState() const
Definition: GroupTargetCalculator.hpp:266
const SummaryState & summaryState() const
Definition: GroupTargetCalculator.hpp:264
std::variant< std::monostate, Group::InjectionCMode, Group::ProductionCMode > ControlMode
Definition: GroupTargetCalculator.hpp:66
const std::vector< Scalar > & resvCoeffsInj() const
Definition: GroupTargetCalculator.hpp:262
GroupTargetCalculator(const BlackoilWellModelGeneric< Scalar, IndexTraits > &well_model, const GroupStateHelperType &group_state_helper, DeferredLogger &deferred_logger)
const Schedule & schedule() const
Definition: GroupTargetCalculator.hpp:263
std::optional< InjectionTargetInfo > groupInjectionTarget(const Group &group, ReservoirCoupling::Phase injection_phase)
std::optional< ProductionTargetInfo > groupProductionTarget(const Group &group)
int reportStepIdx() const
Definition: GroupTargetCalculator.hpp:261
const GroupState< Scalar > & groupState() const
Definition: GroupTargetCalculator.hpp:257
const GuideRate & guideRate() const
Definition: GroupTargetCalculator.hpp:258
const GroupStateHelperType & groupStateHelper() const
Definition: GroupTargetCalculator.hpp:267
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:147
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