opm-simulators
BlackoilWellModelGeneric.hpp
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 
34 #include <opm/simulators/flow/NewtonIterationContext.hpp>
35 #include <opm/simulators/utils/DeferredLoggingErrorHelpers.hpp>
36 #include <opm/simulators/wells/BlackoilWellModelGenericParameters.hpp>
37 #include <opm/simulators/wells/BlackoilWellModelWBP.hpp>
38 #include <opm/simulators/wells/ConnectionIndexMap.hpp>
39 #include <opm/simulators/wells/ParallelPAvgDynamicSourceData.hpp>
40 #include <opm/simulators/wells/ParallelWBPCalculation.hpp>
41 #include <opm/simulators/wells/ParallelWellInfo.hpp>
42 #include <opm/simulators/wells/PerforationData.hpp>
43 #include <opm/simulators/wells/WellFilterCake.hpp>
44 #include <opm/simulators/wells/GroupStateHelper.hpp>
45 #include <opm/simulators/wells/WellProdIndexCalculator.hpp>
46 #include <opm/simulators/wells/WellTracerRate.hpp>
47 #include <opm/simulators/wells/WGState.hpp>
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 
61 namespace 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 
80 namespace Opm { namespace data {
81  struct GroupData;
82  struct GroupGuideRates;
83  class GroupAndNetworkValues;
84  struct NodeData;
85 }} // namespace Opm::data
86 
87 namespace Opm::Parameters {
88 
89 struct EnableTerminalOutput { static constexpr bool value = true; };
90 
91 } // namespace Opm::Parameters
92 
93 namespace Opm {
94 
96 template<typename ScalarT, typename IndexTraitsT>
98 {
99  using GroupStateHelperType = GroupStateHelper<ScalarT, IndexTraitsT>;
100 public:
101  using Scalar = ScalarT;
102  using IndexTraits = IndexTraitsT;
103 
104  BlackoilWellModelGeneric(Schedule& schedule,
107  const SummaryState& summaryState,
108  const EclipseState& eclState,
109  const PhaseUsageInfo<IndexTraits>& phase_usage,
110  const Parallel::Communication& comm,
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;
122  int numLocalNonshutWells() 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_; }
146  const PhaseUsageInfo<IndexTraits>& phaseUsage() const { return phase_usage_info_; }
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  */
157  const WellState<Scalar, IndexTraits>& wellState() const
158  {
159  return this->active_wgstate_.well_state;
160  }
161 
162  /*
163  Mutable version of the currently active wellstate.
164  */
165  WellState<Scalar, IndexTraits>& wellState()
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  */
178  const WellState<Scalar, IndexTraits>& nupcolWellState() const
179  {
180  return this->nupcol_wgstate_.well_state;
181  }
182  WellState<Scalar, IndexTraits>& nupcolWellState()
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  */
214  void commitWGState();
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 
274  const ParallelWellInfo<Scalar>&
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 
293  GroupStateHelperType& groupStateHelper() { return group_state_helper_; }
294  const GroupStateHelperType& groupStateHelper() const { return group_state_helper_; }
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 
305  const VFPProperties<Scalar,IndexTraits>& getVFPProperties() const
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 
315  const NewtonIterationContext& iterationContext() const
316  { return iter_ctx_; }
317 
318  const EclipseState& eclState() const
319  { return eclState_; }
320 
321 protected:
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  */
349  const WellState<Scalar, IndexTraits>& prevWellState() const
350  {
351  return this->last_valid_wgstate_.well_state;
352  }
353 
354  const WGState<Scalar, IndexTraits>& prevWGState() const
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  */
364  void commitWGState(WGState<Scalar, IndexTraits> wgstate)
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  */
374  void resetWGState()
375  {
376  this->active_wgstate_ = this->last_valid_wgstate_;
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  */
387  void updateNupcolWGState()
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 
399  void initializeWellProdIndCalculators();
400  void initializeWellPerfData();
401 
402  bool wasDynamicallyShutThisTimeStep(const std::size_t well_index) const;
403 
404  void updateWsolvent(const Group& group,
405  const int reportStepIdx,
406  const WellState<Scalar, IndexTraits>& wellState);
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,
443  WellState<Scalar, IndexTraits>& well_state,
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 
457  void inferLocalShutWells();
458 
459  void setRepRadiusPerfLength();
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 
472  void initInjMult();
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 
481  void updateFiltrationModelsPreStep(DeferredLogger& deferred_logger);
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_;
519  const Parallel::Communication& comm_;
520  const BlackoilWellModelGenericParameters<Scalar> param_;
521  const NewtonIterationContext& iter_ctx_;
522  BlackoilWellModelGasLiftGeneric<Scalar, IndexTraits>& gen_gaslift_;
523  BlackoilWellModelWBP<Scalar, IndexTraits> wbp_;
524 
525  const PhaseUsageInfo<IndexTraits>& phase_usage_info_;
526  bool terminal_output_{false};
527  bool wells_active_{false};
528  bool initial_step_{};
529  bool report_step_starts_{};
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  */
574  WGState<Scalar, IndexTraits> active_wgstate_;
575  WGState<Scalar, IndexTraits> last_valid_wgstate_;
576  WGState<Scalar, IndexTraits> nupcol_wgstate_;
577  GroupStateHelperType group_state_helper_;
578  WellGroupEvents report_step_start_events_;
579 
580  bool wellStructureChangedDynamically_{false};
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 
592 private:
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
Class for handling the blackoil well model.
Definition: ActionHandler.hpp:39
Context for iteration-dependent decisions in the Newton solver.
Definition: NewtonIterationContext.hpp:43
A thin wrapper class that holds one VFPProdProperties and one VFPInjProperties object.
Definition: BlackoilWellModelGeneric.hpp:75
WellGroupEvents report_step_start_events_
Well group events at start of report step.
Definition: BlackoilWellModelGeneric.hpp:578
bool hasOpenLocalWell(const std::string &well_name) const
Returns true if well is defined, open and has connections on current rank.
Definition: BlackoilWellModelGeneric.cpp:170
Definition: BlackoilWellModelGeneric.hpp:89
Definition: BlackoilWellModelGeneric.hpp:67
Structs needed for tpfalinearizer and its gpuparams struct extracted to be defined in one place that ...
Definition: blackoilbioeffectsmodules.hh:45
Definition: blackoilnewtonmethodparams.hpp:31
Class for handling the blackoil well network model.
Definition: BlackoilWellModelGeneric.hpp:65
Definition: BlackoilWellModelGeneric.hpp:66
bool wellsActive() const
return true if wells are available in the reservoir
Definition: BlackoilWellModelGeneric.cpp:179
Definition: BlackoilWellModelGasLift.hpp:41
void assignShutConnections(data::Wells &wsrpt, const int reportStepIndex) const
Assign basic result quantities for shut connections of wells owned by current rank.
Definition: BlackoilWellModelGeneric.cpp:1121
Definition: GasLiftGroupInfo.hpp:38
Definition: BlackoilWellModelGeneric.hpp:68
bool forceShutWellByName(const std::string &wellname, const double simulation_time, const bool dont_shut_grup_wells)
Shut down any single well Returns true if the well was actually found and shut.
Definition: BlackoilWellModelGeneric.cpp:1434
void assignDynamicWellStatus(data::Wells &wsrpt) const
Assign dynamic well status for each well owned by current rank.
Definition: BlackoilWellModelGeneric.cpp:1102
virtual int compressedIndexForInterior(int cartesian_cell_idx) const =0
get compressed index for interior cells (-1, otherwise
std::vector< std::reference_wrapper< ParallelWellInfo< Scalar > > > createLocalParallelWellInfo(const std::vector< Well > &wells)
Create the parallel well information.
Definition: BlackoilWellModelGeneric.cpp:311
bool hasLocalWell(const std::string &wname) const
Returns true if well is defined and has connections on current rank.
Definition: BlackoilWellModelGeneric.cpp:160
Definition: BlackoilWellModelGeneric.hpp:76
The state of a set of wells, tailored for use by the fully implicit blackoil simulator.
Definition: TemperatureModel.hpp:65