125 class GeneralCalculator {
127 using TargetCalculatorType = std::variant<std::monostate, TargetCalculator, InjectionTargetCalculator>;
130 const Group& original_group,
131 std::optional<ReservoirCoupling::Phase> injection_phase = std::nullopt
137 const Group& original_group,
138 Group::ProductionCMode explicit_cmode
140 std::optional<ConstraintInfo> calculateGroupConstraint();
141 ConstraintType constraintType()
const {
return this->constraint_type_; }
142 DeferredLogger& deferredLogger() {
return this->parent_calculator_.deferredLogger(); }
144 DeferredLogger& deferredLogger()
const {
return this->parent_calculator_.deferredLogger(); }
145 int fipnum()
const {
return this->parent_calculator_.fipnum(); }
146 const GConSale& gconsale()
const {
147 return this->schedule()[this->reportStepIdx()].gconsale();
149 const GroupState<Scalar>& groupState()
const {
return this->parent_calculator_.groupState(); }
150 TargetCalculatorType getInjectionTargetCalculator(
const Group& group);
151 TargetCalculatorType getProductionTargetCalculator(
const Group& group)
const;
152 TargetCalculatorType getTargetCalculator(
const Group& group);
153 std::optional<ConstraintInfo> getGroupConstraintNoGuideRate(
const Group& group);
154 std::optional<Group::ProductionCMode> getProdCmode(
const Group& group)
const;
155 Group::ProductionCMode getProdCmode()
const;
156 const GuideRate& guideRate()
const {
return this->parent_calculator_.guideRate(); }
157 bool hasGuideRate(
const Group& group)
const {
return this->hasGuideRate(group.name()); }
158 bool hasGuideRate(
const std::string& name)
const {
159 if (this->isInjectionConstraint()) {
160 return this->guideRate().has(name, this->injectionPhase_());
162 return this->guideRate().has(name);
164 bool hasHigherLevelControlOrNoLimit(
const Group& group);
165 Phase injectionPhase_()
const;
166 bool isInjectionConstraint()
const {
return this->injection_phase_.has_value(); }
167 bool isProductionConstraint()
const {
return !this->injection_phase_.has_value(); }
168 const Group& originalGroup()
const {
return this->original_group_; }
170 int pvtreg()
const {
return this->parent_calculator_.pvtreg(); }
171 int reportStepIdx()
const {
return this->parent_calculator_.reportStepIdx(); }
172 const std::vector<Scalar>& resvCoeffsInj()
const {
return this->parent_calculator_.resvCoeffsInj(); }
173 const std::vector<Scalar>& resvCoeffsProd()
const {
return this->resv_coeffs_prod_; }
174 const Schedule& schedule()
const {
return this->parent_calculator_.schedule(); }
175 const SummaryState& summaryState()
const {
return this->parent_calculator_.summaryState(); }
177 return this->parent_calculator_.wellModel();
180 const GroupStateHelperType& groupStateHelper()
const {
return this->parent_calculator_.groupStateHelper(); }
184 const Group& original_group,
185 std::optional<ReservoirCoupling::Phase> injection_phase,
186 std::optional<Group::ProductionCMode> production_cmode,
189 std::optional<ConstraintInfo> calculateGroupConstraintRecursive_(
190 const Group& group,
const Scalar efficiency_factor);
191 const Group& parentGroup(
const Group& group)
const {
192 return this->schedule().getGroup(group.parent(), this->reportStepIdx());
194 bool parentGroupControlAvailable_(
const Group& group);
195 Phase reservoirCouplingToOpmPhase_(ReservoirCoupling::Phase reservoir_coupling_phase)
const;
198 const Group& original_group_;
199 std::optional<ReservoirCoupling::Phase> injection_phase_;
202 std::vector<Scalar> resv_coeffs_prod_;
214 class TopToBottomCalculator {
216 using TargetCalculatorType = std::variant<std::monostate, TargetCalculator, InjectionTargetCalculator>;
218 constexpr static Scalar TARGET_RATE_TOLERANCE = 1e-12;
220 TopToBottomCalculator(
222 const Group& top_group,
223 const Group& bottom_group,
224 Scalar efficiency_factor
227 std::optional<ConstraintInfo> calculateGroupConstraint();
228 ConstraintType constraintType()
const {
return this->parent_calculator_.constraintType(); }
229 DeferredLogger& deferredLogger() {
return this->parent_calculator_.deferredLogger(); }
231 DeferredLogger& deferredLogger()
const {
return this->parent_calculator_.deferredLogger(); }
232 Group::ProductionCMode getProdCmode()
const {
return this->parent_calculator_.getProdCmode(); }
233 std::optional<Group::ProductionCMode> getProdCmode(
const Group& group)
const {
234 return this->parent_calculator_.getProdCmode(group);
236 const GroupState<Scalar>& groupState()
const {
return this->parent_calculator_.groupState(); }
237 const GuideRate& guideRate()
const {
return this->parent_calculator_.guideRate(); }
238 bool isInjectionConstraint()
const {
return this->parent_calculator_.isInjectionConstraint(); }
239 bool isProductionConstraint()
const {
return this->parent_calculator_.isProductionConstraint(); }
241 int reportStepIdx()
const {
return this->parent_calculator_.reportStepIdx(); }
242 const std::vector<Scalar>& resvCoeffsInj()
const {
return this->parent_calculator_.resvCoeffsInj(); }
243 const std::vector<Scalar>& resvCoeffsProd()
const {
return this->parent_calculator_.resvCoeffsProd(); }
244 const Schedule& schedule()
const {
return this->parent_calculator_.schedule(); }
245 const SummaryState& summaryState()
const {
return this->parent_calculator_.summaryState(); }
247 const GroupStateHelperType& groupStateHelper()
const {
return this->parent_calculator_.groupStateHelper(); }
250 bool bottomGroupHasIndividualControl_();
251 Scalar computeAddbackEfficiency_(
const std::vector<std::string>& chain,
252 const std::size_t local_reduction_level)
const;
253 Scalar getBottomGroupCurrentRateAvailable_()
const;
254 std::vector<std::string> getGroupChainTopBot_()
const;
255 std::size_t getLocalReductionLevel_(
const std::vector<std::string>& chain);
256 TargetCalculatorType getProductionTargetCalculator_(
const Group& group)
const {
257 return this->parent_calculator_.getProductionTargetCalculator(group); }
258 TargetCalculatorType getInjectionTargetCalculator_(
const Group& group)
const {
259 return this->parent_calculator_.getInjectionTargetCalculator(group); }
260 TargetCalculatorType getInjectionTargetCalculator(
const Group& group)
const;
261 TargetCalculatorType getProductionTargetCalculator(
const Group& group)
const;
268 Scalar getSlaveGroupReservoirRate_(
const Group& master_group);
269 std::optional<ConstraintInfo> getGroupConstraintNoGuideRate_(
const Group& group)
const {
270 return this->parent_calculator_.getGroupConstraintNoGuideRate(group);
273 Scalar getTopLevelTargetOrLimit_();
274 bool hasHigherLevelControlOrNoLimit(
const Group& group) {
275 return this->parent_calculator_.hasHigherLevelControlOrNoLimit(group);
277 bool hasFLDControl_(
const Group& group)
const;
278 bool hasGuideRate_(
const std::string& name)
const {
279 return this->parent_calculator_.hasGuideRate(name);
281 void initForInjector_();
282 void initForProducer_();
283 Phase injectionPhase_()
const {
return this->parent_calculator_.injectionPhase_(); }
284 bool isProducerAndRESVControl_(
const Group& group)
const;
285 Scalar localFraction_(
const std::string& group_name);
286 Scalar localReduction_(
const std::string& group_name);
289 const Group& top_group_;
290 const Group& bottom_group_;
292 Scalar chain_efficiency_factor_;
295 std::variant<std::monostate, TargetCalculator, InjectionTargetCalculator> target_calculator_;
298 std::optional<FractionCalculator> fraction_calculator_;