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(); }
125 bool hasFldOrNoneControl(const Group& group);
127 const Group& originalGroup() const { return this->original_group_; }
128 const PhaseUsageInfo<IndexTraits>& phaseUsage() const { return this->parent_calculator_.phaseUsage(); }
129 int pvtreg() const { return this->parent_calculator_.pvtreg(); }
130 int reportStepIdx() const { return this->parent_calculator_.reportStepIdx(); }
131 const std::vector<Scalar>& resvCoeffsInj() const { return this->parent_calculator_.resvCoeffsInj(); }
132 const std::vector<Scalar>& resvCoeffsProd() const { return this->resv_coeffs_prod_; }
133 const Schedule& schedule() const { return this->parent_calculator_.schedule(); }
134 const SummaryState& summaryState() const { return this->parent_calculator_.summaryState(); }
136 return this->parent_calculator_.wellModel();
137 }
139 return this->injection_phase_.has_value() ? TargetType::Injection : TargetType::Production;
140 }
141 const WellState<Scalar, IndexTraits>& wellState() const { return this->parent_calculator_.wellState(); }
142 const GroupStateHelperType& groupStateHelper() const { return this->parent_calculator_.groupStateHelper(); }
143 private:
144 std::optional<TargetInfo> calculateGroupTargetRecursive_(const Group& group, const Scalar efficiency_factor);
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 bool bottomGroupHasIndividualControl_();
197 Scalar computeAddbackEfficiency_(const std::vector<std::string>& chain,
198 const std::size_t local_reduction_level) const;
199 Scalar getBottomGroupCurrentRateAvailable_() const;
200 std::vector<std::string> getGroupChainTopBot_() const;
201 std::size_t getLocalReductionLevel_(const std::vector<std::string>& chain);
202 TargetCalculatorType getProductionTargetCalculator_(const Group& group) const {
203 return this->parent_calculator_.getProductionTargetCalculator(group); }
204 TargetCalculatorType getInjectionTargetCalculator_(const Group& group) const {
205 return this->parent_calculator_.getInjectionTargetCalculator(group); }
206 TargetCalculatorType getInjectionTargetCalculator(const Group& group) const;
207 TargetCalculatorType getProductionTargetCalculator(const Group& group) const;
214 Scalar getSlaveGroupReservoirRate_(const Group& master_group);
215 TargetInfo getTargetNoGuideRate_(const Group& group) const {
216 return this->parent_calculator_.getTargetNoGuideRate(group);
217 }
218 Scalar getTopLevelTarget_();
219 bool hasFldOrNoneControl_(const Group& group) {
220 return this->parent_calculator_.hasFldOrNoneControl(group);
221 }
222 bool hasFLDControl_(const Group& group) const;
223 bool hasGuideRate_(const std::string& name) const { return this->guideRate().has(name); }
224 void initForInjector_();
225 void initForProducer_();
226 Phase injectionPhase_() const { return this->parent_calculator_.injectionPhase_(); }
227 bool isProducerAndRESVControl_(const Group& group) const;
228 Scalar localFraction_(const std::string& group_name);
229 Scalar localReduction_(const std::string& group_name);
230
231 GeneralCalculator& parent_calculator_;
232 const Group& top_group_;
233 const Group& bottom_group_;
234 // Accumulated efficiency factor along the chain from top to bottom, excluding the top group.
235 Scalar chain_efficiency_factor_;
236 // Active calculator used for distributing the target along the chain:
237 // either production TargetCalculator or InjectionTargetCalculator.
238 std::variant<std::monostate, TargetCalculator, InjectionTargetCalculator> target_calculator_;
239 // Since FractionCalculator does not have a default constructor, we use std::optional
240 // to conditionally initialize it based on whether we are dealing with an injector or producer.
241 std::optional<FractionCalculator> fraction_calculator_;
242 ControlMode toplevel_control_mode_;
243 };
244
250 const GroupStateHelperType& group_state_helper
251 );
252 DeferredLogger& deferredLogger() { return this->group_state_helper_.deferredLogger(); }
253 int fipnum() const { return this->fipnum_; }
255 std::optional<InjectionTargetInfo> groupInjectionTarget(
256 const Group& group, ReservoirCoupling::Phase injection_phase
257 );
259 std::optional<ProductionTargetInfo> groupProductionTarget(const Group& group);
260 const GroupState<Scalar>& groupState() const { return this->group_state_; }
261 const GuideRate& guideRate() const { return this->guide_rate_; }
262 const PhaseUsageInfo<IndexTraits>& phaseUsage() const { return this->phase_usage_; }
263 int pvtreg() const { return this->pvtreg_; }
264 int reportStepIdx() const { return this->report_step_idx_; }
265 const std::vector<Scalar>& resvCoeffsInj() const { return this->resv_coeffs_inj_; }
266 const Schedule& schedule() const { return this->schedule_; }
267 const SummaryState& summaryState() const { return this->summary_state_; }
268 const BlackoilWellModelGeneric<Scalar, IndexTraits>& wellModel() const { return this->well_model_; }
269 const WellState<Scalar, IndexTraits>& wellState() const { return this->well_state_; }
270 const GroupStateHelperType& groupStateHelper() const { return this->group_state_helper_; }
271private:
273 const GroupStateHelperType& group_state_helper_;
274 const WellState<Scalar, IndexTraits >& well_state_;
275 const GroupState<Scalar>& group_state_;
276 const Schedule& schedule_;
277 const SummaryState& summary_state_;
278 const PhaseUsageInfo<IndexTraits>& phase_usage_;
279 const GuideRate& guide_rate_;
280 int report_step_idx_;
281 std::vector<Scalar> resv_coeff_;
282 int fipnum_; // FIP region for the groups
283 int pvtreg_; // PVT region for the groups
284 std::vector<Scalar> resv_coeffs_inj_;
285};
286
287} // namespace Opm
288
289#endif // OPM_GROUP_TARGET_CALCULATOR_HPP
Class for handling the blackoil well model.
Definition: BlackoilWellModelGeneric.hpp:96
Definition: DeferredLogger.hpp:57
Definition: GroupStateHelper.hpp:54
DeferredLogger & deferredLogger() const
Get the deferred logger.
Definition: GroupStateHelper.hpp:226
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:135
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:132
DeferredLogger & deferredLogger()
Definition: GroupTargetCalculator.hpp:112
const std::vector< Scalar > & resvCoeffsInj() const
Definition: GroupTargetCalculator.hpp:131
TargetCalculatorType getInjectionTargetCalculator(const Group &group)
const Schedule & schedule() const
Definition: GroupTargetCalculator.hpp:133
const PhaseUsageInfo< IndexTraits > & phaseUsage() const
Definition: GroupTargetCalculator.hpp:128
const GuideRate & guideRate() const
Definition: GroupTargetCalculator.hpp:124
const Group & originalGroup() const
Definition: GroupTargetCalculator.hpp:127
TargetType targetType() const
Definition: GroupTargetCalculator.hpp:138
GeneralCalculator(GroupTargetCalculator &calculator, const Group &original_group, std::optional< ReservoirCoupling::Phase > injection_phase=std::nullopt)
const WellState< Scalar, IndexTraits > & wellState() const
Definition: GroupTargetCalculator.hpp:141
const GConSale & gconsale() const
Definition: GroupTargetCalculator.hpp:114
bool hasFldOrNoneControl(const Group &group)
int fipnum() const
Definition: GroupTargetCalculator.hpp:113
int pvtreg() const
Definition: GroupTargetCalculator.hpp:129
int reportStepIdx() const
Definition: GroupTargetCalculator.hpp:130
TargetInfo getTargetNoGuideRate(const Group &group)
TargetInfo getTargetFromCalculator(const TargetCalculatorType &target_calculator, const Group &group)
const SummaryState & summaryState() const
Definition: GroupTargetCalculator.hpp:134
const GroupStateHelperType & groupStateHelper() const
Definition: GroupTargetCalculator.hpp:142
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:252
int pvtreg() const
Definition: GroupTargetCalculator.hpp:263
TargetType
Definition: GroupTargetCalculator.hpp:72
GroupStateHelper< Scalar, IndexTraits > GroupStateHelperType
Definition: GroupTargetCalculator.hpp:70
int fipnum() const
Definition: GroupTargetCalculator.hpp:253
const PhaseUsageInfo< IndexTraits > & phaseUsage() const
Definition: GroupTargetCalculator.hpp:262
GroupTargetCalculator(const BlackoilWellModelGeneric< Scalar, IndexTraits > &well_model, const GroupStateHelperType &group_state_helper)
const BlackoilWellModelGeneric< Scalar, IndexTraits > & wellModel() const
Definition: GroupTargetCalculator.hpp:268
const WellState< Scalar, IndexTraits > & wellState() const
Definition: GroupTargetCalculator.hpp:269
const SummaryState & summaryState() const
Definition: GroupTargetCalculator.hpp:267
std::variant< std::monostate, Group::InjectionCMode, Group::ProductionCMode > ControlMode
Definition: GroupTargetCalculator.hpp:66
const std::vector< Scalar > & resvCoeffsInj() const
Definition: GroupTargetCalculator.hpp:265
const Schedule & schedule() const
Definition: GroupTargetCalculator.hpp:266
std::optional< InjectionTargetInfo > groupInjectionTarget(const Group &group, ReservoirCoupling::Phase injection_phase)
std::optional< ProductionTargetInfo > groupProductionTarget(const Group &group)
int reportStepIdx() const
Definition: GroupTargetCalculator.hpp:264
const GroupState< Scalar > & groupState() const
Definition: GroupTargetCalculator.hpp:260
const GuideRate & guideRate() const
Definition: GroupTargetCalculator.hpp:261
const GroupStateHelperType & groupStateHelper() const
Definition: GroupTargetCalculator.hpp:270
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:148
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