BlackoilWellModelGeneric.hpp
Go to the documentation of this file.
1/*
2 Copyright 2016 SINTEF ICT, Applied Mathematics.
3 Copyright 2016 - 2017 Statoil ASA.
4 Copyright 2017 Dr. Blatt - HPC-Simulation-Software & Services
5 Copyright 2016 - 2018 IRIS AS
6
7 This file is part of the Open Porous Media project (OPM).
8
9 OPM is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14 OPM is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with OPM. If not, see <http://www.gnu.org/licenses/>.
21*/
22
23#ifndef OPM_BLACKOILWELLMODEL_GENERIC_HEADER_INCLUDED
24#define OPM_BLACKOILWELLMODEL_GENERIC_HEADER_INCLUDED
25
26#include <opm/output/data/GuideRateValue.hpp>
27
28#include <opm/input/eclipse/Schedule/Group/GuideRate.hpp>
29#include <opm/input/eclipse/Schedule/Well/PAvg.hpp>
30#include <opm/input/eclipse/Schedule/Well/PAvgCalculator.hpp>
31#include <opm/input/eclipse/Schedule/Well/PAvgCalculatorCollection.hpp>
32#include <opm/input/eclipse/Schedule/Well/WellTestState.hpp>
33
48
49#include <algorithm>
50#include <cstddef>
51#include <functional>
52#include <map>
53#include <memory>
54#include <optional>
55#include <string>
56#include <unordered_map>
57#include <unordered_set>
58#include <vector>
59
60
61namespace Opm {
62 class DeferredLogger;
63 class EclipseState;
64 template<typename Scalar, typename IndexTraits> class BlackoilWellModelGasLiftGeneric;
65 template<typename Scalar, typename IndexTraits> class BlackoilWellModelNetworkGeneric;
66 template<typename Scalar, typename IndexTraits> class GasLiftGroupInfo;
67 template<typename Scalar, typename IndexTraits> class GasLiftSingleWellGeneric;
68 template<class Scalar> class GasLiftWellState;
69 class Group;
70 class GuideRateConfig;
71 class RestartValue;
72 class Schedule;
73 struct SimulatorUpdate;
74 class SummaryConfig;
75 template<typename Scalar, typename IndexTraits> class VFPProperties;
76 template<typename Scalar, typename IndexTraits> class WellInterfaceGeneric;
77 template<typename Scalar, typename IndexTraits> class WellState;
78} // namespace Opm
79
80namespace Opm { namespace data {
81 struct GroupData;
82 struct GroupGuideRates;
83 class GroupAndNetworkValues;
84 struct NodeData;
85}} // namespace Opm::data
86
87namespace Opm::Parameters {
88
89struct EnableTerminalOutput { static constexpr bool value = true; };
90
91} // namespace Opm::Parameters
92
93namespace Opm {
94
96template<typename ScalarT, typename IndexTraitsT>
98{
100public:
101 using Scalar = ScalarT;
102 using IndexTraits = IndexTraitsT;
103
107 const SummaryState& summaryState,
108 const EclipseState& eclState,
109 const PhaseUsageInfo<IndexTraits>& phase_usage,
111 const NewtonIterationContext& iter_ctx);
112
113 virtual ~BlackoilWellModelGeneric() = default;
114 virtual int compressedIndexForInteriorLGR([[maybe_unused]] const std::string& lgr_tag,
115 [[maybe_unused]] const Connection& conn) const
116 {
117 throw std::runtime_error("compressedIndexForInteriorLGR not implemented");
118 }
119
120 int numLocalWells() const;
121 int numLocalWellsEnd() const;
123 int numPhases() const;
124
126 bool wellsActive() const;
127
129 bool hasLocalWell(const std::string& wname) const;
130
132 bool hasOpenLocalWell(const std::string& well_name) const;
133
134 // whether there exists any multisegment well open on this process
135 bool anyMSWellOpenLocal() const;
136
137 const std::vector<Well>& eclWells() const
138 { return wells_ecl_; }
139
140 bool terminalOutput() const
141 { return terminal_output_; }
142
143 const Well& getWellEcl(const std::string& well_name) const;
144 std::vector<Well> getLocalWells(const int timeStepIdx) const;
145 const Schedule& schedule() const { return schedule_; }
147 const GroupState<Scalar>& groupState() const { return this->active_wgstate_.group_state; }
148 std::vector<const WellInterfaceGeneric<Scalar, IndexTraits>*> genericWells() const
149 { return {well_container_generic_.begin(), well_container_generic_.end()}; }
150
151 std::vector<WellInterfaceGeneric<Scalar, IndexTraits>*> genericWells()
152 { return well_container_generic_; }
153
154 /*
155 Immutable version of the currently active wellstate.
156 */
158 {
159 return this->active_wgstate_.well_state;
160 }
161
162 /*
163 Mutable version of the currently active wellstate.
164 */
166 {
167 return this->active_wgstate_.well_state;
168 }
169
170 /*
171 Will return the currently active nupcolWellState; must update
172 the internal nupcol wellstate with updateNupcolWGState() first.
173
174 Both const and non-const accessors are provided. The non-const
175 accessor is required for the WellStateGuard pattern and pushWellState()
176 in WellGroupHelper, which temporarily switches WellGroupHelper to use this state.
177 */
179 {
180 return this->nupcol_wgstate_.well_state;
181 }
183 {
184 return this->nupcol_wgstate_.well_state;
185 }
186 GroupState<Scalar>& groupState() { return this->active_wgstate_.group_state; }
187
188 WellTestState& wellTestState() { return this->active_wgstate_.well_test_state; }
189
190 const WellTestState& wellTestState() const { return this->active_wgstate_.well_test_state; }
191
192 Scalar wellPI(const int well_index) const;
193 Scalar wellPI(const std::string& well_name) const;
194
195 void updateEclWells(const int timeStepIdx,
196 const SimulatorUpdate& sim_update,
197 const SummaryState& st);
198
199 void initFromRestartFile(const RestartValue& restartValues,
200 std::unique_ptr<WellTestState> wtestState,
201 const std::size_t numCells,
202 bool enable_distributed_wells);
203
204 void prepareDeserialize(int report_step,
205 const std::size_t numCells,
206 bool enable_distributed_wells);
207
208 /*
209 Will assign the internal member last_valid_well_state_ to the
210 current value of the this->active_well_state_. The state stored
211 with storeWellState() can then subsequently be recovered with the
212 resetWellState() method.
213 */
215
216 data::GroupAndNetworkValues groupAndNetworkData(const int reportStepIdx) const;
217
220 bool forceShutWellByName(const std::string& wellname,
221 const double simulation_time,
222 const bool dont_shut_grup_wells);
223
224 const std::vector<PerforationData<Scalar>>& perfData(const int well_idx) const
225 { return well_perf_data_[well_idx]; }
226
227 const Parallel::Communication& comm() const { return comm_; }
228
229 const EclipseState& eclipseState() const { return eclState_; }
230
231 const SummaryState& summaryState() const { return summaryState_; }
232
233 const GuideRate& guideRate() const { return guideRate_; }
234 GuideRate& guideRate() { return guideRate_; }
235
236 const std::map<std::string, double>& wellOpenTimes() const { return well_open_times_; }
237 const std::map<std::string, double>& wellCloseTimes() const { return well_close_times_; }
238 const WellGroupEvents& reportStepStartEvents() const { return report_step_start_events_; }
239
240 std::vector<int> getCellsForConnections(const Well& well) const;
241
242 bool reportStepStarts() const { return report_step_starts_; }
243
244 void updateClosedWellsThisStep(const std::string& well_name) const
245 {
246 this->closed_this_step_.insert(well_name);
247 }
248 bool wasDynamicallyShutThisTimeStep(const std::string& well_name) const;
249
250 void logPrimaryVars() const;
251
252 template<class Serializer>
253 void serializeOp(Serializer& serializer)
254 {
255 serializer(initial_step_);
256 serializer(report_step_starts_);
257 serializer(last_run_wellpi_);
258 serializer(local_shut_wells_);
259 serializer(closed_this_step_);
260 serializer(guideRate_);
261 serializer(genNetwork_);
262 serializer(prev_inj_multipliers_);
263 serializer(active_wgstate_);
264 serializer(last_valid_wgstate_);
265 serializer(nupcol_wgstate_);
266 serializer(switched_prod_groups_);
267 serializer(switched_inj_groups_);
268 serializer(closed_offending_wells_);
269 serializer(gen_gaslift_);
270 }
271
272 bool operator==(const BlackoilWellModelGeneric& rhs) const;
273
275 parallelWellInfo(const std::size_t idx) const
276 { return local_parallel_well_info_[idx].get(); }
277
278 bool isOwner(const std::string& wname) const
279 {
280 return this->parallelWellSatisfies
281 (wname, [](const auto& pwInfo) { return pwInfo.isOwner(); });
282 }
283
284 bool hasLocalCells(const std::string& wname) const
285 {
286 return this->parallelWellSatisfies
287 (wname, [](const auto& pwInfo) { return pwInfo.hasLocalCells(); });
288 }
289
290 const ConnectionIndexMap& connectionIndexMap(const std::size_t idx)
291 { return conn_idx_map_[idx]; }
292
295 std::pair<int, int> getGroupFipnumAndPvtreg() const;
296
297 virtual void calcResvCoeff(const int fipnum,
298 const int pvtreg,
299 const std::vector<Scalar>& production_rates,
300 std::vector<Scalar>& resv_coeff) const = 0;
301 virtual void calcInjResvCoeff(const int fipnum,
302 const int pvtreg,
303 std::vector<Scalar>& resv_coeff) const = 0;
304
306 {
307 return *vfp_properties_;
308 }
309
310 void updateAndCommunicateGroupData(const int reportStepIdx,
311 // we only want to update the wellgroup target
312 // after the groups have found their controls
313 const bool update_wellgrouptarget);
314
316 { return iter_ctx_; }
317
318 const EclipseState& eclState() const
319 { return eclState_; }
320
321protected:
322 /*
323 The dynamic state of the well model is maintained with an instance
324 of the WellState class. Currently we have
325 three different wellstate instances:
326
327 1. The currently active wellstate is in the active_well_state_
328 member. That is the state which is mutated by the simulator.
329
330 2. In the case timestep fails to converge and we must go back and
331 try again with a smaller timestep we need to recover the last
332 valid wellstate. This is maintained with the
333 last_valid_well_state_ member and the functions
334 commitWGState() and resetWellState().
335
336 3. For the NUPCOL functionality we should either use the
337 currently active wellstate or a wellstate frozen at max
338 nupcol iterations. This is handled with the member
339 nupcol_well_state_ and the updateNupcolWGState() function.
340 */
341
342 /*
343 Will return the last good wellstate. This is typcially used when
344 initializing a new report step where the Schedule object might
345 have introduced new wells. The wellstate returned by
346 prevWellState() must have been stored with the commitWGState()
347 function first.
348 */
350 {
351 return this->last_valid_wgstate_.well_state;
352 }
353
355 {
356 return this->last_valid_wgstate_;
357 }
358
359 /*
360 Will store a copy of the input argument well_state in the
361 last_valid_well_state_ member, that state can then be recovered
362 with a subsequent call to resetWellState().
363 */
365 {
366 this->last_valid_wgstate_ = std::move(wgstate);
367 }
368
369 /*
370 Will update the internal variable active_well_state_ to whatever
371 was stored in the last_valid_well_state_ member. This function
372 works in pair with commitWellState() which should be called first.
373 */
375 {
377 this->genNetwork_.resetState();
378 // Update helper pointers to reference the restored active state
379 this->group_state_helper_.updateState(this->wellState(), this->groupState());
380 }
381
382 /*
383 Will store the current active wellstate in the nupcol_well_state_
384 member. This can then be subsequently retrieved with accessor
385 nupcolWellState().
386 */
388 {
389 this->nupcol_wgstate_ = this->active_wgstate_;
390 }
391
392 void reportGroupSwitching(DeferredLogger& local_deferredLogger) const;
393
396 std::vector<std::reference_wrapper<ParallelWellInfo<Scalar>>>
397 createLocalParallelWellInfo(const std::vector<Well>& wells);
398
401
402 bool wasDynamicallyShutThisTimeStep(const std::size_t well_index) const;
403
404 void updateWsolvent(const Group& group,
405 const int reportStepIdx,
407 void setWsolvent(const Group& group,
408 const int reportStepIdx,
409 Scalar wsolvent);
410
415 void assignDynamicWellStatus(data::Wells& wsrpt) const;
416
428 void assignShutConnections(data::Wells& wsrpt,
429 const int reportStepIndex) const;
430
431 void assignWellTargets(data::Wells& wsrpt) const;
432 void assignProductionWellTargets(const Well& well, data::WellControlLimits& limits) const;
433 void assignInjectionWellTargets(const Well& well, data::WellControlLimits& limits) const;
434
435 void assignGroupControl(const Group& group,
436 data::GroupData& gdata) const;
437 void assignGroupValues(const int reportStepIdx,
438 std::map<std::string, data::GroupData>& gvalues) const;
439
440 void calculateEfficiencyFactors(const int reportStepIdx);
441
442 void checkGconsaleLimits(const Group& group,
444 const int reportStepIdx,
445 DeferredLogger& deferred_logger);
446
447 void checkGEconLimits(const Group& group,
448 const double simulation_time,
449 const int report_step_idx,
450 DeferredLogger& deferred_logger);
451
452 bool checkGroupHigherConstraints(const Group& group,
453 DeferredLogger& deferred_logger,
454 const int reportStepIdx,
455 const bool update_group_switching_log);
456
458
460
461 virtual void computePotentials(const std::size_t widx,
462 const WellState<Scalar, IndexTraits>& well_state_copy,
463 std::string& exc_msg,
464 ExceptionType::ExcEnum& exc_type) = 0;
465
466 // Calculating well potentials for each well
467 void updateWellPotentials(const int reportStepIdx,
468 const bool onlyAfterEvent,
469 const SummaryConfig& summaryConfig,
470 DeferredLogger& deferred_logger);
471
473
474 void updateInjMult(DeferredLogger& deferred_logger);
475 void updateInjFCMult(DeferredLogger& deferred_logger);
476
477 void updateFiltrationModelsPostStep(const double dt,
478 const std::size_t water_index,
479 DeferredLogger& deferred_logger);
480
482
483 // create the well container
484 virtual void createWellContainer(const int time_step) = 0;
485 virtual void initWellContainer(const int reportStepIdx) = 0;
486
487 virtual void calculateProductivityIndexValuesShutWells(const int reportStepIdx,
488 DeferredLogger& deferred_logger) = 0;
489 virtual void calculateProductivityIndexValues(DeferredLogger& deferred_logger) = 0;
490
491 void runWellPIScaling(const int reportStepIdx,
492 DeferredLogger& local_deferredLogger);
493
495 virtual int compressedIndexForInterior(int cartesian_cell_idx) const = 0;
496
497 std::vector<std::vector<int>> getMaxWellConnections() const;
498
499 std::vector<std::string> getWellsForTesting(const int timeStepIdx,
500 const double simulationTime);
501
502 using WellTracerRates = std::unordered_map<int, std::vector<WellTracerRate<Scalar>>>;
503 void assignWellTracerRates(data::Wells& wsrpt,
504 const WellTracerRates& wellTracerRates,
505 const unsigned reportStep) const;
506
507 using MswTracerRates = std::unordered_map<int, std::vector<MSWellTracerRate<Scalar>>>;
508 void assignMswTracerRates(data::Wells& wsrpt,
509 const MswTracerRates& mswTracerRates,
510 const unsigned reportStep) const;
511
512 void assignMassGasRate(data::Wells& wsrpt,
513 const Scalar gasDensity) const;
514
515 Schedule& schedule_;
516
517 const SummaryState& summaryState_;
518 const EclipseState& eclState_;
524
526 bool terminal_output_{false};
527 bool wells_active_{false};
530
531 std::optional<int> last_run_wellpi_{};
532
533 std::vector<Well> wells_ecl_;
534 std::vector<std::vector<PerforationData<Scalar>>> well_perf_data_;
535
536 // Times at which wells were opened (for WCYCLE)
537 std::map<std::string, double> well_open_times_;
538
539 // Times at which wells were shut (for WCYCLE)
540 std::map<std::string, double> well_close_times_;
541
542 std::vector<ConnectionIndexMap> conn_idx_map_{};
543 std::function<bool(const std::string&)> not_on_process_{};
544
545 // a vector of all the wells.
546 std::vector<WellInterfaceGeneric<Scalar, IndexTraits>*> well_container_generic_{};
547
548 std::vector<int> local_shut_wells_{};
549
550 std::vector<ParallelWellInfo<Scalar>> parallel_well_info_;
551 std::vector<std::reference_wrapper<ParallelWellInfo<Scalar>>> local_parallel_well_info_;
552
553 std::vector<WellProdIndexCalculator<Scalar>> prod_index_calc_;
554
555 std::vector<int> pvt_region_idx_;
556
557 mutable std::unordered_set<std::string> closed_this_step_;
558
559 GuideRate guideRate_;
560 std::unique_ptr<VFPProperties<Scalar, IndexTraits>> vfp_properties_{};
561
562 // previous injection multiplier, it is used in the injection multiplier calculation for WINJMULT keyword
563 std::unordered_map<std::string, std::vector<Scalar>> prev_inj_multipliers_;
564
565 // Handling for filter cake injection multipliers
566 std::unordered_map<std::string, WellFilterCake<Scalar, IndexTraits>> filter_cake_;
567
568 /*
569 The various wellState members should be accessed and modified
570 through the accessor functions wellState(), prevWellState(),
571 commitWellState(), resetWellState(), nupcolWellState() and
572 updateNupcolWGState().
573 */
579
581
582 // Store maps of group name and new group controls for output
583 std::map<std::string, std::vector<Group::ProductionCMode>> switched_prod_groups_;
584 std::map<std::string, std::array<std::vector<Group::InjectionCMode>, 3>> switched_inj_groups_;
585 // Store map of group name and close offending well for output
586 std::map<std::string, std::pair<std::string, std::string>> closed_offending_wells_;
587
589
590 bool allConnectionsClosed(const Well& well_ecl) const;
591
592private:
593 WellInterfaceGeneric<Scalar, IndexTraits>* getGenWell(const std::string& well_name);
594
595 template <typename Iter, typename Body>
596 void wellUpdateLoop(Iter first, Iter last, const int timeStepIdx, Body&& body);
597
598 void updateEclWellsConstraints(const int timeStepIdx,
599 const SimulatorUpdate& sim_update,
600 const SummaryState& st);
601
602 void updateEclWellsCTFFromAction(const int timeStepIdx,
603 const SimulatorUpdate& sim_update);
604
618 template <typename Predicate>
619 bool parallelWellSatisfies(const std::string& wname, Predicate&& p) const
620 {
621 const auto pwInfoPos =
622 std::ranges::find_if(this->parallel_well_info_,
623 [&wname](const auto& pwInfo)
624 { return pwInfo.name() == wname; });
625
626 return (pwInfoPos != this->parallel_well_info_.end())
627 && p(*pwInfoPos);
628 }
629
645 template <typename LoopBody>
646 void loopOwnedWells(LoopBody&& loopBody) const;
647};
648
649} // namespace Opm
650
651#endif
Definition: BlackoilWellModelGasLift.hpp:42
Class for handling the blackoil well model.
Definition: BlackoilWellModelGeneric.hpp:98
BlackoilWellModelWBP< Scalar, IndexTraits > wbp_
Definition: BlackoilWellModelGeneric.hpp:523
void assignMswTracerRates(data::Wells &wsrpt, const MswTracerRates &mswTracerRates, const unsigned reportStep) const
bool wellStructureChangedDynamically_
Definition: BlackoilWellModelGeneric.hpp:580
void updateNupcolWGState()
Definition: BlackoilWellModelGeneric.hpp:387
const BlackoilWellModelGenericParameters< Scalar > param_
Definition: BlackoilWellModelGeneric.hpp:520
bool isOwner(const std::string &wname) const
Definition: BlackoilWellModelGeneric.hpp:278
std::map< std::string, double > well_open_times_
Definition: BlackoilWellModelGeneric.hpp:537
bool initial_step_
Definition: BlackoilWellModelGeneric.hpp:528
void updateInjFCMult(DeferredLogger &deferred_logger)
GroupStateHelperType & groupStateHelper()
Definition: BlackoilWellModelGeneric.hpp:293
std::vector< ConnectionIndexMap > conn_idx_map_
Definition: BlackoilWellModelGeneric.hpp:542
GroupState< Scalar > & groupState()
Definition: BlackoilWellModelGeneric.hpp:186
std::vector< std::vector< PerforationData< Scalar > > > well_perf_data_
Definition: BlackoilWellModelGeneric.hpp:534
virtual int compressedIndexForInteriorLGR(const std::string &lgr_tag, const Connection &conn) const
Definition: BlackoilWellModelGeneric.hpp:114
GuideRate & guideRate()
Definition: BlackoilWellModelGeneric.hpp:234
bool forceShutWellByName(const std::string &wellname, const double simulation_time, const bool dont_shut_grup_wells)
WellState< Scalar, IndexTraits > & nupcolWellState()
Definition: BlackoilWellModelGeneric.hpp:182
void updateWsolvent(const Group &group, const int reportStepIdx, const WellState< Scalar, IndexTraits > &wellState)
const EclipseState & eclState_
Definition: BlackoilWellModelGeneric.hpp:518
const GroupState< Scalar > & groupState() const
Definition: BlackoilWellModelGeneric.hpp:147
Scalar wellPI(const int well_index) const
const VFPProperties< Scalar, IndexTraits > & getVFPProperties() const
Definition: BlackoilWellModelGeneric.hpp:305
virtual ~BlackoilWellModelGeneric()=default
std::vector< int > pvt_region_idx_
Definition: BlackoilWellModelGeneric.hpp:555
virtual void calcInjResvCoeff(const int fipnum, const int pvtreg, std::vector< Scalar > &resv_coeff) const =0
const WellState< Scalar, IndexTraits > & prevWellState() const
Definition: BlackoilWellModelGeneric.hpp:349
const ConnectionIndexMap & connectionIndexMap(const std::size_t idx)
Definition: BlackoilWellModelGeneric.hpp:290
const WellTestState & wellTestState() const
Definition: BlackoilWellModelGeneric.hpp:190
const WellGroupEvents & reportStepStartEvents() const
Definition: BlackoilWellModelGeneric.hpp:238
const Well & getWellEcl(const std::string &well_name) const
WGState< Scalar, IndexTraits > nupcol_wgstate_
Definition: BlackoilWellModelGeneric.hpp:576
void updateAndCommunicateGroupData(const int reportStepIdx, const bool update_wellgrouptarget)
GuideRate guideRate_
Definition: BlackoilWellModelGeneric.hpp:559
const ParallelWellInfo< Scalar > & parallelWellInfo(const std::size_t idx) const
Definition: BlackoilWellModelGeneric.hpp:275
void updateClosedWellsThisStep(const std::string &well_name) const
Definition: BlackoilWellModelGeneric.hpp:244
const SummaryState & summaryState_
Definition: BlackoilWellModelGeneric.hpp:517
std::function< bool(const std::string &)> not_on_process_
Definition: BlackoilWellModelGeneric.hpp:543
std::map< std::string, double > well_close_times_
Definition: BlackoilWellModelGeneric.hpp:540
std::vector< Well > wells_ecl_
Definition: BlackoilWellModelGeneric.hpp:533
void checkGEconLimits(const Group &group, const double simulation_time, const int report_step_idx, DeferredLogger &deferred_logger)
void calculateEfficiencyFactors(const int reportStepIdx)
void assignWellTargets(data::Wells &wsrpt) const
void assignDynamicWellStatus(data::Wells &wsrpt) const
const std::vector< Well > & eclWells() const
Definition: BlackoilWellModelGeneric.hpp:137
Schedule & schedule_
Definition: BlackoilWellModelGeneric.hpp:515
const std::map< std::string, double > & wellCloseTimes() const
Definition: BlackoilWellModelGeneric.hpp:237
void assignGroupControl(const Group &group, data::GroupData &gdata) const
const std::map< std::string, double > & wellOpenTimes() const
Definition: BlackoilWellModelGeneric.hpp:236
std::vector< int > getCellsForConnections(const Well &well) const
std::unique_ptr< VFPProperties< Scalar, IndexTraits > > vfp_properties_
Definition: BlackoilWellModelGeneric.hpp:560
void updateWellPotentials(const int reportStepIdx, const bool onlyAfterEvent, const SummaryConfig &summaryConfig, DeferredLogger &deferred_logger)
virtual void computePotentials(const std::size_t widx, const WellState< Scalar, IndexTraits > &well_state_copy, std::string &exc_msg, ExceptionType::ExcEnum &exc_type)=0
virtual void createWellContainer(const int time_step)=0
const EclipseState & eclipseState() const
Definition: BlackoilWellModelGeneric.hpp:229
const NewtonIterationContext & iterationContext() const
Definition: BlackoilWellModelGeneric.hpp:315
const WellState< Scalar, IndexTraits > & nupcolWellState() const
Definition: BlackoilWellModelGeneric.hpp:178
void checkGconsaleLimits(const Group &group, WellState< Scalar, IndexTraits > &well_state, const int reportStepIdx, DeferredLogger &deferred_logger)
BlackoilWellModelGeneric(Schedule &schedule, BlackoilWellModelGasLiftGeneric< Scalar, IndexTraits > &gaslift, BlackoilWellModelNetworkGeneric< Scalar, IndexTraits > &network, const SummaryState &summaryState, const EclipseState &eclState, const PhaseUsageInfo< IndexTraits > &phase_usage, const Parallel::Communication &comm, const NewtonIterationContext &iter_ctx)
bool allConnectionsClosed(const Well &well_ecl) const
bool hasLocalWell(const std::string &wname) const
Returns true if well is defined and has connections on current rank.
std::unordered_map< int, std::vector< WellTracerRate< Scalar > > > WellTracerRates
Definition: BlackoilWellModelGeneric.hpp:502
std::unordered_set< std::string > closed_this_step_
Definition: BlackoilWellModelGeneric.hpp:557
bool hasOpenLocalWell(const std::string &well_name) const
Returns true if well is defined, open and has connections on current rank.
std::vector< std::vector< int > > getMaxWellConnections() const
bool reportStepStarts() const
Definition: BlackoilWellModelGeneric.hpp:242
void resetWGState()
Definition: BlackoilWellModelGeneric.hpp:374
void updateFiltrationModelsPostStep(const double dt, const std::size_t water_index, DeferredLogger &deferred_logger)
const GroupStateHelperType & groupStateHelper() const
Definition: BlackoilWellModelGeneric.hpp:294
GroupStateHelperType group_state_helper_
Definition: BlackoilWellModelGeneric.hpp:577
const SummaryState & summaryState() const
Definition: BlackoilWellModelGeneric.hpp:231
WellState< Scalar, IndexTraits > & wellState()
Definition: BlackoilWellModelGeneric.hpp:165
std::map< std::string, std::array< std::vector< Group::InjectionCMode >, 3 > > switched_inj_groups_
Definition: BlackoilWellModelGeneric.hpp:584
bool terminalOutput() const
Definition: BlackoilWellModelGeneric.hpp:140
void runWellPIScaling(const int reportStepIdx, DeferredLogger &local_deferredLogger)
bool wells_active_
Definition: BlackoilWellModelGeneric.hpp:527
const PhaseUsageInfo< IndexTraits > & phaseUsage() const
Definition: BlackoilWellModelGeneric.hpp:146
void updateInjMult(DeferredLogger &deferred_logger)
const Parallel::Communication & comm_
Definition: BlackoilWellModelGeneric.hpp:519
WellTestState & wellTestState()
Definition: BlackoilWellModelGeneric.hpp:188
const std::vector< PerforationData< Scalar > > & perfData(const int well_idx) const
Definition: BlackoilWellModelGeneric.hpp:224
WGState< Scalar, IndexTraits > last_valid_wgstate_
Definition: BlackoilWellModelGeneric.hpp:575
const WGState< Scalar, IndexTraits > & prevWGState() const
Definition: BlackoilWellModelGeneric.hpp:354
void updateEclWells(const int timeStepIdx, const SimulatorUpdate &sim_update, const SummaryState &st)
std::vector< std::reference_wrapper< ParallelWellInfo< Scalar > > > local_parallel_well_info_
Definition: BlackoilWellModelGeneric.hpp:551
bool hasLocalCells(const std::string &wname) const
Definition: BlackoilWellModelGeneric.hpp:284
void commitWGState(WGState< Scalar, IndexTraits > wgstate)
Definition: BlackoilWellModelGeneric.hpp:364
void reportGroupSwitching(DeferredLogger &local_deferredLogger) const
bool wellsActive() const
return true if wells are available in the reservoir
const GuideRate & guideRate() const
Definition: BlackoilWellModelGeneric.hpp:233
std::map< std::string, std::vector< Group::ProductionCMode > > switched_prod_groups_
Definition: BlackoilWellModelGeneric.hpp:583
void assignMassGasRate(data::Wells &wsrpt, const Scalar gasDensity) const
std::vector< const WellInterfaceGeneric< Scalar, IndexTraits > * > genericWells() const
Definition: BlackoilWellModelGeneric.hpp:148
virtual int compressedIndexForInterior(int cartesian_cell_idx) const =0
get compressed index for interior cells (-1, otherwise
virtual void calculateProductivityIndexValuesShutWells(const int reportStepIdx, DeferredLogger &deferred_logger)=0
std::vector< std::string > getWellsForTesting(const int timeStepIdx, const double simulationTime)
std::unordered_map< std::string, std::vector< Scalar > > prev_inj_multipliers_
Definition: BlackoilWellModelGeneric.hpp:563
const WellState< Scalar, IndexTraits > & wellState() const
Definition: BlackoilWellModelGeneric.hpp:157
const Schedule & schedule() const
Definition: BlackoilWellModelGeneric.hpp:145
bool operator==(const BlackoilWellModelGeneric &rhs) const
virtual void calcResvCoeff(const int fipnum, const int pvtreg, const std::vector< Scalar > &production_rates, std::vector< Scalar > &resv_coeff) const =0
std::vector< WellInterfaceGeneric< Scalar, IndexTraits > * > well_container_generic_
Definition: BlackoilWellModelGeneric.hpp:546
void assignInjectionWellTargets(const Well &well, data::WellControlLimits &limits) const
const NewtonIterationContext & iter_ctx_
Definition: BlackoilWellModelGeneric.hpp:521
bool checkGroupHigherConstraints(const Group &group, DeferredLogger &deferred_logger, const int reportStepIdx, const bool update_group_switching_log)
Scalar wellPI(const std::string &well_name) const
const Parallel::Communication & comm() const
Definition: BlackoilWellModelGeneric.hpp:227
std::vector< int > local_shut_wells_
Definition: BlackoilWellModelGeneric.hpp:548
std::unordered_map< int, std::vector< MSWellTracerRate< Scalar > > > MswTracerRates
Definition: BlackoilWellModelGeneric.hpp:507
std::vector< WellProdIndexCalculator< Scalar > > prod_index_calc_
Definition: BlackoilWellModelGeneric.hpp:553
std::unordered_map< std::string, WellFilterCake< Scalar, IndexTraits > > filter_cake_
Definition: BlackoilWellModelGeneric.hpp:566
BlackoilWellModelNetworkGeneric< Scalar, IndexTraits > & genNetwork_
Definition: BlackoilWellModelGeneric.hpp:588
data::GroupAndNetworkValues groupAndNetworkData(const int reportStepIdx) const
std::vector< std::reference_wrapper< ParallelWellInfo< Scalar > > > createLocalParallelWellInfo(const std::vector< Well > &wells)
Create the parallel well information.
void prepareDeserialize(int report_step, const std::size_t numCells, bool enable_distributed_wells)
std::vector< WellInterfaceGeneric< Scalar, IndexTraits > * > genericWells()
Definition: BlackoilWellModelGeneric.hpp:151
std::map< std::string, std::pair< std::string, std::string > > closed_offending_wells_
Definition: BlackoilWellModelGeneric.hpp:586
const PhaseUsageInfo< IndexTraits > & phase_usage_info_
Definition: BlackoilWellModelGeneric.hpp:525
bool wasDynamicallyShutThisTimeStep(const std::size_t well_index) const
void assignProductionWellTargets(const Well &well, data::WellControlLimits &limits) const
std::vector< ParallelWellInfo< Scalar > > parallel_well_info_
Definition: BlackoilWellModelGeneric.hpp:550
bool report_step_starts_
Definition: BlackoilWellModelGeneric.hpp:529
bool wasDynamicallyShutThisTimeStep(const std::string &well_name) const
std::optional< int > last_run_wellpi_
Definition: BlackoilWellModelGeneric.hpp:531
virtual void calculateProductivityIndexValues(DeferredLogger &deferred_logger)=0
const EclipseState & eclState() const
Definition: BlackoilWellModelGeneric.hpp:318
void assignWellTracerRates(data::Wells &wsrpt, const WellTracerRates &wellTracerRates, const unsigned reportStep) const
virtual void initWellContainer(const int reportStepIdx)=0
IndexTraitsT IndexTraits
Definition: BlackoilWellModelGeneric.hpp:102
ScalarT Scalar
Definition: BlackoilWellModelGeneric.hpp:101
bool terminal_output_
Definition: BlackoilWellModelGeneric.hpp:526
void initFromRestartFile(const RestartValue &restartValues, std::unique_ptr< WellTestState > wtestState, const std::size_t numCells, bool enable_distributed_wells)
WGState< Scalar, IndexTraits > active_wgstate_
Definition: BlackoilWellModelGeneric.hpp:574
void serializeOp(Serializer &serializer)
Definition: BlackoilWellModelGeneric.hpp:253
std::pair< int, int > getGroupFipnumAndPvtreg() const
void setWsolvent(const Group &group, const int reportStepIdx, Scalar wsolvent)
void updateFiltrationModelsPreStep(DeferredLogger &deferred_logger)
std::vector< Well > getLocalWells(const int timeStepIdx) const
void assignShutConnections(data::Wells &wsrpt, const int reportStepIndex) const
WellGroupEvents report_step_start_events_
Well group events at start of report step.
Definition: BlackoilWellModelGeneric.hpp:578
void assignGroupValues(const int reportStepIdx, std::map< std::string, data::GroupData > &gvalues) const
BlackoilWellModelGasLiftGeneric< Scalar, IndexTraits > & gen_gaslift_
Definition: BlackoilWellModelGeneric.hpp:522
Class for handling the blackoil well network model.
Definition: BlackoilWellModelNetworkGeneric.hpp:50
Class for handling the blackoil well model.
Definition: BlackoilWellModelWBP.hpp:42
Connection index mappings.
Definition: ConnectionIndexMap.hpp:33
Definition: DeferredLogger.hpp:57
void updateState(WellState< Scalar, IndexTraits > &well_state, GroupState< Scalar > &group_state)
Definition: GroupState.hpp:41
Class encapsulating some information about parallel wells.
Definition: ParallelWellInfo.hpp:198
Definition: GasLiftGroupInfo.hpp:38
Definition: VFPProperties.hpp:40
Definition: WellInterfaceGeneric.hpp:53
Definition: WellState.hpp:66
ExcEnum
Definition: DeferredLogger.hpp:45
Dune::Communication< MPIComm > Communication
Definition: ParallelCommunication.hpp:30
Definition: blackoilnewtonmethodparams.hpp:31
Definition: blackoilbioeffectsmodules.hh:45
Definition: BlackoilWellModelGenericParameters.hpp:37
Context for iteration-dependent decisions in the Newton solver.
Definition: NewtonIterationContext.hpp:43
Definition: BlackoilWellModelGeneric.hpp:89
static constexpr bool value
Definition: BlackoilWellModelGeneric.hpp:89
Definition: WGState.hpp:39