opm-common
Schedule.hpp
1 /*
2  Copyright 2013 Statoil 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 #ifndef SCHEDULE_HPP
20 #define SCHEDULE_HPP
21 
22 #include <opm/input/eclipse/Schedule/Action/ActionResult.hpp>
23 #include <opm/input/eclipse/Schedule/Action/SimulatorUpdate.hpp>
24 #include <opm/input/eclipse/Schedule/Action/WGNames.hpp>
25 #include <opm/input/eclipse/Schedule/CompletedCells.hpp>
26 #include <opm/input/eclipse/Schedule/Group/Group.hpp>
27 #include <opm/input/eclipse/Schedule/ScheduleDeck.hpp>
28 #include <opm/input/eclipse/Schedule/ScheduleState.hpp>
29 #include <opm/input/eclipse/Schedule/ScheduleStatic.hpp>
30 #include <opm/input/eclipse/Schedule/Well/PAvg.hpp>
31 #include <opm/input/eclipse/Schedule/Well/Well.hpp>
32 #include <opm/input/eclipse/Schedule/Well/Connection.hpp>
33 #include <opm/input/eclipse/Schedule/WriteRestartFileEvents.hpp>
34 
35 #include <opm/input/eclipse/Units/UnitSystem.hpp>
36 
37 #include <cstddef>
38 #include <cstdint>
39 #include <ctime>
40 #include <functional>
41 #include <iosfwd>
42 #include <map>
43 #include <memory>
44 #include <optional>
45 #include <set>
46 #include <string>
47 #include <unordered_map>
48 #include <utility>
49 #include <vector>
50 
51 namespace Opm {
52  class ActiveGridCells;
53  class Deck;
54  class DeckKeyword;
55  class DeckRecord;
56  enum class ConnectionOrder;
57  class EclipseGrid;
58  class EclipseState;
59  class ErrorGuard;
60  class FieldPropsManager;
61  class GasLiftOpt;
62  class GTNode;
63  class GuideRateConfig;
64  class GuideRateModel;
65  class HandlerContext;
66  enum class InputErrorAction;
67  class NumericalAquifers;
68  class ParseContext;
69  class Python;
70  class Runspec;
71  class RPTConfig;
72  class ScheduleGrid;
73  class SCHEDULESection;
74  class SegmentMatcher;
75  class SummaryState;
76  class TracerConfig;
77  class UDQConfig;
78  class Well;
79  enum class WellGasInflowEquation : std::uint8_t;
80  class WellMatcher;
81  enum class WellProducerCMode : std::uint16_t;
82  enum class WellStatus : std::uint8_t;
83  class WelSegsSet;
84  class WellTestConfig;
85 } // namespace Opm
86 
87 namespace Opm::ReservoirCoupling {
88  class CouplingInfo;
89 } // namespace Opm::ReservoirCoupling
90 
91 namespace Opm::Action {
92  class ActionX;
93  class PyAction;
94  class State;
95 } // namespace Opm::Action
96 
97 namespace Opm::RestartIO {
98  struct RstState;
99 } // namespace Opm::RestartIO
100 
101 namespace Opm {
102  class Schedule
103  {
104  public:
105  Schedule() = default;
106 
107  explicit Schedule(std::shared_ptr<const Python> python_handle);
108 
125  Schedule(const Deck& deck,
126  const EclipseGrid& grid,
127  const FieldPropsManager& fp,
128  const NumericalAquifers& numAquifers,
129  const Runspec& runspec,
130  const ParseContext& parseContext,
131  ErrorGuard& errors,
132  std::shared_ptr<const Python> python,
133  const bool lowActionParsingStrictness = false,
134  const bool slave_mode = false,
135  const bool keepKeywords = true,
136  const std::optional<int>& output_interval = {},
137  const RestartIO::RstState* rst = nullptr,
138  const TracerConfig* tracer_config = nullptr);
139 
140  template<typename T>
141  Schedule(const Deck& deck,
142  const EclipseGrid& grid,
143  const FieldPropsManager& fp,
144  const NumericalAquifers& numAquifers,
145  const Runspec &runspec,
146  const ParseContext& parseContext,
147  T&& errors,
148  std::shared_ptr<const Python> python,
149  const bool lowActionParsingStrictness = false,
150  const bool slave_mode = false,
151  const bool keepKeywords = true,
152  const std::optional<int>& output_interval = {},
153  const RestartIO::RstState* rst = nullptr,
154  const TracerConfig* tracer_config = nullptr);
155 
156  Schedule(const Deck& deck,
157  const EclipseGrid& grid,
158  const FieldPropsManager& fp,
159  const NumericalAquifers& numAquifers,
160  const Runspec &runspec,
161  std::shared_ptr<const Python> python,
162  const bool lowActionParsingStrictness = false,
163  const bool slave_mode = false,
164  const bool keepKeywords = true,
165  const std::optional<int>& output_interval = {},
166  const RestartIO::RstState* rst = nullptr,
167  const TracerConfig* tracer_config = nullptr);
168 
169  Schedule(const Deck& deck,
170  const EclipseState& es,
171  const ParseContext& parseContext,
172  ErrorGuard& errors,
173  std::shared_ptr<const Python> python,
174  const bool lowActionParsingStrictness = false,
175  const bool slave_mode = false,
176  const bool keepKeywords = true,
177  const std::optional<int>& output_interval = {},
178  const RestartIO::RstState* rst = nullptr);
179 
180  template <typename T>
181  Schedule(const Deck& deck,
182  const EclipseState& es,
183  const ParseContext& parseContext,
184  T&& errors,
185  std::shared_ptr<const Python> python,
186  const bool lowActionParsingStrictness = false,
187  const bool slave_mode = false,
188  const bool keepKeywords = true,
189  const std::optional<int>& output_interval = {},
190  const RestartIO::RstState* rst = nullptr);
191 
192  Schedule(const Deck& deck,
193  const EclipseState& es,
194  std::shared_ptr<const Python> python,
195  const bool lowActionParsingStrictness = false,
196  const bool slave_mode = false,
197  const bool keepKeywords = true,
198  const std::optional<int>& output_interval = {},
199  const RestartIO::RstState* rst = nullptr);
200 
201  // The constructor *without* the Python arg should really only be used from Python itself
202  Schedule(const Deck& deck,
203  const EclipseState& es,
204  const std::optional<int>& output_interval = {},
205  const RestartIO::RstState* rst = nullptr);
206 
207  ~Schedule() = default;
208 
209  static Schedule serializationTestObject();
210 
211  /*
212  * If the input deck does not specify a start time, Eclipse's 1. Jan
213  * 1983 is defaulted
214  */
215  std::time_t getStartTime() const;
216  std::time_t posixStartTime() const;
217  std::time_t posixEndTime() const;
218  std::time_t simTime(std::size_t timeStep) const;
219  double seconds(std::size_t timeStep) const;
220  double stepLength(std::size_t timeStep) const;
221  std::optional<int> exitStatus() const;
222  const UnitSystem& getUnits() const { return this->m_static.m_unit_system; }
223  const Runspec& runspec() const { return this->m_static.m_runspec; }
224 
225  std::size_t numWells() const;
226  std::size_t numWells(std::size_t timestep) const;
227  bool hasWell(const std::string& wellName) const;
228  bool hasWell(const std::string& wellName, std::size_t timeStep) const;
229 
230  WellMatcher wellMatcher(std::size_t report_step) const;
231  std::function<std::unique_ptr<SegmentMatcher>()> segmentMatcherFactory(std::size_t report_step) const;
232  std::vector<std::string> wellNames(const std::string& pattern, std::size_t timeStep, const std::vector<std::string>& matching_wells = {}) const;
233  std::vector<std::string> wellNames(const std::string& pattern) const;
234  std::vector<std::string> wellNames(std::size_t timeStep) const;
235  std::vector<std::string> wellNames() const;
244  bool hasGroup(const std::string& groupName, std::size_t timeStep) const;
245 
257  std::vector<std::string>
258  groupNames(const std::string& pattern, std::size_t timeStep) const;
259 
266  const std::vector<std::string>& groupNames(std::size_t timeStep) const;
267 
276  std::vector<std::string> groupNames(const std::string& pattern) const;
277 
281  const std::vector<std::string>& groupNames() const;
282 
293  std::vector<const Group*> restart_groups(std::size_t timeStep) const;
294 
311  std::vector<std::string>
312  changed_wells(std::size_t reportStep,
313  std::size_t initialStep = 0) const;
314 
332  bool changedWellLists(std::size_t reportStep,
333  std::size_t initialStep = 0) const;
334 
335  const Well& getWell(std::size_t well_index, std::size_t timeStep) const;
336  const Well& getWell(const std::string& wellName, std::size_t timeStep) const;
337  const Well& getWellatEnd(const std::string& well_name) const;
338  // get the list of the constant flux aquifer specified in the whole schedule
339  std::unordered_set<int> getAquiferFluxSchedule() const;
340  std::vector<Well> getWells(std::size_t timeStep) const;
341  std::vector<Well> getWellsatEnd() const;
342 
343  // Get wells that have been active any time during simulation
344  std::vector<Well> getActiveWellsAtEnd() const;
345 
346  // Get well names of wells that have never been active
347  std::vector<std::string> getInactiveWellNamesAtEnd() const;
348 
349  const std::unordered_map<std::string, std::set<int>>&
350  getPossibleFutureConnections() const;
351 
352  void shut_well(const std::string& well_name, std::size_t report_step);
353  void shut_well(const std::string& well_name);
354  void stop_well(const std::string& well_name, std::size_t report_step);
355  void stop_well(const std::string& well_name);
356  void open_well(const std::string& well_name, std::size_t report_step);
357  void open_well(const std::string& well_name);
358  void clear_event(ScheduleEvents::Events, std::size_t report_step);
359  void add_event(ScheduleEvents::Events, std::size_t report_step);
360  void applyWellProdIndexScaling(const std::string& well_name, const std::size_t reportStep, const double scalingFactor);
361 
363  void clearEvents(const std::size_t report_step);
364 
365  WellProducerCMode getGlobalWhistctlMmode(std::size_t timestep) const;
366 
367  const UDQConfig& getUDQConfig(std::size_t timeStep) const;
368 
369  GTNode groupTree(std::size_t report_step) const;
370  GTNode groupTree(const std::string& root_node, std::size_t report_step) const;
371  const Group& getGroup(const std::string& groupName, std::size_t timeStep) const;
372 
373  std::optional<std::size_t> first_RFT() const;
374  std::size_t size() const;
375 
376  bool write_rst_file(std::size_t report_step) const;
377  const std::map< std::string, int >& rst_keywords( std::size_t timestep ) const;
378 
379  // The applyAction() member function is invoked from the simulator
380  // *after* an ACTIONX has triggered. Its return value is a small
381  // structure with 'information' which the simulator should take into
382  // account when updating internal datastructures after the ACTIONX
383  // keywords have been applied.
384  SimulatorUpdate applyAction(std::size_t reportStep,
385  const Action::ActionX& action,
386  const Action::Result::MatchingEntities& matches,
387  const std::unordered_map<std::string, double>& wellpi,
388  const bool iterateSchedule);
389 
390  SimulatorUpdate applyAction(std::size_t reportStep,
391  const Action::ActionX& action,
392  const Action::Result::MatchingEntities& matches,
393  const std::unordered_map<std::string, float>& wellpi,
394  const bool iterateSchedule);
395  /*
396  The runPyAction() will run the Python script in a PYACTION keyword. In
397  the case of Schedule updates the recommended way of doing that from
398  PYACTION is to invoke a "normal" ACTIONX keyword internally from the
399  Python code. he return value from runPyAction() comes from such a
400  internal ACTIONX.
401  */
402  SimulatorUpdate runPyAction(std::size_t reportStep,
403  const Action::PyAction& pyaction,
404  Action::State& action_state,
405  EclipseState& ecl_state,
406  SummaryState& summary_state);
407 
408  SimulatorUpdate runPyAction(std::size_t reportStep,
409  const Action::PyAction& pyaction,
410  Action::State& action_state,
411  EclipseState& ecl_state,
412  SummaryState& summary_state,
413  const std::unordered_map<std::string, double>& target_wellpi);
414 
415  SimulatorUpdate runPyAction(std::size_t reportStep,
416  const Action::PyAction& pyaction,
417  Action::State& action_state,
418  EclipseState& ecl_state,
419  SummaryState& summary_state,
420  const std::unordered_map<std::string, float>& target_wellpi);
421 
422  SimulatorUpdate modifyCompletions(const std::size_t reportStep,
423  const std::map<std::string, std::vector<Connection>>& extraConns);
424 
425  const GasLiftOpt& glo(std::size_t report_step) const;
426 
427  bool operator==(const Schedule& data) const;
428  std::shared_ptr<const Python> python() const;
429 
436  const std::optional<RPTConfig>& initialReportConfiguration() const;
437 
438  const ScheduleState& back() const;
439  const ScheduleState& operator[](std::size_t index) const;
440  std::vector<ScheduleState>::const_iterator begin() const;
441  std::vector<ScheduleState>::const_iterator end() const;
442  void create_next(const time_point& start_time, const std::optional<time_point>& end_time);
443  void create_next(const ScheduleBlock& block);
444  void create_first(const time_point& start_time, const std::optional<time_point>& end_time);
445 
446  void treat_critical_as_non_critical(bool value) { this->m_treat_critical_as_non_critical = value; }
447 
448  /*
449  The cmp() function compares two schedule instances in a context aware
450  manner. Floating point numbers are compared with a tolerance. The
451  purpose of this comparison function is to implement regression tests
452  for the schedule instances created by loading a restart file.
453  */
454  static bool cmp(const Schedule& sched1, const Schedule& sched2, std::size_t report_step);
455  void applyKeywords(std::vector<std::unique_ptr<DeckKeyword>>& keywords, std::unordered_map<std::string, double>& target_wellpi, bool action_mode, std::size_t report_step);
456  void applyKeywords(std::vector<std::unique_ptr<DeckKeyword>>& keywords, std::unordered_map<std::string, double>& target_wellpi, bool action_mode);
457 
458  template<class Serializer>
459  void serializeOp(Serializer& serializer)
460  {
461  serializer(this->m_static);
462  serializer(this->m_sched_deck);
463  serializer(this->action_wgnames);
464  serializer(this->potential_wellopen_patterns);
465  serializer(this->exit_status);
466  serializer(this->snapshots);
467  serializer(this->restart_output);
468  serializer(this->completed_cells);
469  serializer(this->completed_cells_lgr);
470  serializer(this->completed_cells_lgr_map);
471  serializer(this->m_treat_critical_as_non_critical);
472  serializer(this->current_report_step);
473  serializer(this->m_lowActionParsingStrictness);
474  serializer(this->simUpdateFromPython);
475 
476  // If we are deserializing we need to setup the pointer to the
477  // unit system since this is process specific. This is safe
478  // because we set the same value in all well instances.
479  // We do some redundant assignments as these are shared_ptr's
480  // with multiple pointers to any given instance, but it is not
481  // significant so let's keep it simple.
482  if (!serializer.isSerializing()) {
483  for (auto& snapshot : snapshots) {
484  for (auto& well : snapshot.wells) {
485  well.second->updateUnitSystem(&m_static.m_unit_system);
486  }
487  }
488  }
489  }
490 
491  template <typename T>
492  std::vector<std::pair<std::size_t, T>> unique() const
493  {
494  std::vector<std::pair<std::size_t, T>> values;
495  for (std::size_t index = 0; index < this->snapshots.size(); index++) {
496  const auto& member = this->snapshots[index].get<T>();
497  const auto& value = member.get();
498  if (values.empty() || !(value == values.back().second))
499  values.push_back( std::make_pair(index, value));
500  }
501  return values;
502  }
503 
504  friend std::ostream& operator<<(std::ostream& os, const Schedule& sched);
505  void dump_deck(std::ostream& os) const;
506 
509  void markSlaveProductionGroup(std::size_t report_step, const std::string& group_name);
510 
513  void markSlaveInjectionGroup(std::size_t report_step, const std::string& group_name);
514 
515  private:
516  friend class HandlerContext;
517 
518  // Please update the member functions
519  // - operator==(const Schedule&) const
520  // - serializationTestObject()
521  // - serializeOp(Serializer&)
522  // when you update/change this list of data members.
523  bool m_treat_critical_as_non_critical = false;
524  ScheduleStatic m_static{};
525  ScheduleDeck m_sched_deck{};
526  Action::WGNames action_wgnames{};
527  std::unordered_set<std::string> potential_wellopen_patterns{}; // Set of well name patterns that potentially can open
528  std::optional<int> exit_status{};
529  std::vector<ScheduleState> snapshots{};
530  WriteRestartFileEvents restart_output{};
531  CompletedCells completed_cells{};
532  std::vector<CompletedCells> completed_cells_lgr{};
533  std::unordered_map<std::string, std::size_t> completed_cells_lgr_map;
534  // Boolean indicating the strictness of parsing process for ActionX and PyAction.
535  // If lowActionParsingStrictness is true, the simulator tries to apply unsupported
536  // keywords, if lowActionParsingStrictness is false, the simulator only applies
537  // supported keywords.
538  bool m_lowActionParsingStrictness = false;
539 
540  // This unordered_map contains possible future connections of wells that might get added through an ACTIONX.
541  // For parallel runs, this unordered_map is retrieved by the grid partitioner to ensure these connections
542  // end up on the same partition.
543  std::unordered_map<std::string, std::set<int>> possibleFutureConnections;
544 
545  // The current_report_step is set to the current report step when a PYACTION call is executed.
546  // This is needed since the Schedule object does not know the current report step of the simulator and
547  // we only allow PYACTIONS for the current and future report steps.
548  std::size_t current_report_step = 0;
549  // The simUpdateFromPython points to a SimulatorUpdate collecting all updates from one PYACTION call.
550  // The SimulatorUpdate is reset before a new PYACTION call is executed.
551  // It is a shared_ptr, so a Schedule can be constructed using the copy constructor sharing the simUpdateFromPython.
552  // The copy constructor is needed for creating a mocked simulator (msim).
553  std::shared_ptr<SimulatorUpdate> simUpdateFromPython{};
554 
555  void init_completed_cells_lgr(const EclipseGrid& ecl_grid);
556  void init_completed_cells_lgr_map(const EclipseGrid& ecl_grid);
557 
558  void load_rst(const RestartIO::RstState& rst,
559  const TracerConfig& tracer_config,
560  const ScheduleGrid& grid,
561  const FieldPropsManager& fp);
562  void addWell(Well well);
563  void addWell(const std::string& wellName,
564  const std::string& group,
565  int headI,
566  int headJ,
567  Phase preferredPhase,
568  const std::optional<double>& refDepth,
569  double drainageRadius,
570  bool allowCrossFlow,
571  bool automaticShutIn,
572  int pvt_table,
573  WellGasInflowEquation gas_inflow,
574  std::size_t timeStep,
575  ConnectionOrder wellConnectionOrder);
576  bool updateWPAVE(const std::string& wname, std::size_t report_step, const PAvg& pavg);
577 
578  void updateGuideRateModel(const GuideRateModel& new_model, std::size_t report_step);
579  GTNode groupTree(const std::string& root_node, std::size_t report_step, std::size_t level, const std::optional<std::string>& parent_name) const;
580  bool updateWellStatus( const std::string& well, std::size_t reportStep, WellStatus status, std::optional<KeywordLocation> = {});
581  void addWellToGroup( const std::string& group_name, const std::string& well_name , std::size_t timeStep);
582  void iterateScheduleSection(std::size_t load_start,
583  std::size_t load_end,
584  const ParseContext& parseContext,
585  ErrorGuard& errors,
586  const ScheduleGrid& grid,
587  const std::unordered_map<std::string, double> * target_wellpi,
588  const std::string& prefix,
589  const bool keepKeywords,
590  const bool log_to_debug = false);
591  void addACTIONX(const Action::ActionX& action);
592  void addGroupToGroup( const std::string& parent_group, const std::string& child_group);
593  void addGroup(const std::string& groupName , std::size_t timeStep);
594  void addGroup(Group group);
595  void addGroup(const RestartIO::RstGroup& rst_group, std::size_t timeStep);
596  void addWell(const std::string& wellName, const DeckRecord& record,
597  std::size_t timeStep, ConnectionOrder connection_order);
598  void checkIfAllConnectionsIsShut(std::size_t reportStep);
599  void end_report(std::size_t report_step);
602  void handleKeyword(std::size_t currentStep,
603  const ScheduleBlock& block,
604  const DeckKeyword& keyword,
605  const ParseContext& parseContext,
606  ErrorGuard& errors,
607  const ScheduleGrid& grid,
608  const Action::Result::MatchingEntities& matches,
609  bool action_mode,
610  SimulatorUpdate* sim_update,
611  const std::unordered_map<std::string, double>* target_wellpi,
612  std::unordered_map<std::string, double>& wpimult_global_factor,
613  WelSegsSet* welsegs_wells = nullptr,
614  std::set<std::string>* compsegs_wells = nullptr,
615  std::set<std::string>* comptraj_wells = nullptr);
616 
617  void internalWELLSTATUSACTIONXFromPYACTION(const std::string& well_name, std::size_t report_step, const std::string& wellStatus);
618  void prefetchPossibleFutureConnections(const ScheduleGrid& grid, const DeckKeyword& keyword,
619  const ParseContext& parseContext, ErrorGuard& errors);
620  void store_wgnames(const DeckKeyword& keyword);
621  std::vector<std::string> wellNames(const std::string& pattern,
622  const HandlerContext& context,
623  bool allowEmpty = false);
624  static std::string formatDate(std::time_t t);
625  void applyGlobalWPIMULT( const std::unordered_map<std::string, double>& wpimult_global_factor);
626  void updateICDScalingFactors();
627 
628  bool must_write_rst_file(std::size_t report_step) const;
629 
630  bool isWList(std::size_t report_step, const std::string& pattern) const;
631 
632  SimulatorUpdate applyAction(std::size_t reportStep, const std::string& action_name, const std::vector<std::string>& matching_wells);
633  };
634 }
635 
636 #endif
Definition: state.hpp:56
Collection of all user-defined quantities in the current simulation run.
Definition: UDQConfig.hpp:68
Definition: GuideRateModel.hpp:30
Definition: Python.hpp:35
Container of matching entities.
Definition: ActionResult.hpp:172
Definition: Group.hpp:49
std::vector< std::string > changed_wells(std::size_t reportStep, std::size_t initialStep=0) const
List of wells with structural changes since previous report step.
Definition: Schedule.cpp:1263
void markSlaveProductionGroup(std::size_t report_step, const std::string &group_name)
Mark a slave group as receiving production targets from the master.
Definition: Schedule.cpp:3080
This struct is used to communicate back from the Schedule::applyAction() what needs to be updated in ...
Definition: SimulatorUpdate.hpp:35
Definition: Schedule.hpp:102
Sparse collection of cells, and their properties, intersected by one or more well connections...
Definition: CompletedCells.hpp:35
All SCHEDULE section keywords in a simulation run.
Definition: ScheduleDeck.hpp:55
Definition: FieldPropsManager.hpp:42
const std::vector< std::string > & groupNames() const
Retrieve names of all groups in model.
Definition: Schedule.cpp:1519
Definition: group.hpp:37
Definition: ScheduleBlock.hpp:51
About cell information and dimension: The actual grid information is held in a pointer to an ERT ecl_...
Definition: EclipseGrid.hpp:63
Runspec m_runspec
Run&#39;s descriptive meta information (RUNSPEC section).
Definition: ScheduleStatic.hpp:71
Definition: Well.hpp:78
Management information about the current run&#39;s ACTION system, especially concerning the number of tim...
Definition: State.hpp:50
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition: Exceptions.hpp:30
bool hasGroup(const std::string &groupName, std::size_t timeStep) const
Query for group existence at particular time.
Definition: Schedule.cpp:1255
Collection of intersected cells and associate properties for all simulation grids, i.e., the main grid and all LGRs in the simulation run.
Definition: ScheduleGrid.hpp:49
Definition: Runspec.hpp:608
Definition: GrupSlav.cpp:69
Gas lift optimisation parameters for all wells and groups.
Definition: GasLiftOpt.hpp:355
Definition: EclipseState.hpp:66
Definition: WGNames.hpp:29
Initial state of Schedule object created from information in SOLUTION section.
Definition: ScheduleStatic.hpp:49
bool changedWellLists(std::size_t reportStep, std::size_t initialStep=0) const
Well lists change predicate.
Definition: Schedule.cpp:1293
Definition: PyAction.hpp:39
Definition: TracerConfig.hpp:34
Definition: WriteRestartFileEvents.hpp:30
void markSlaveInjectionGroup(std::size_t report_step, const std::string &group_name)
Mark a slave group as receiving injection targets from the master.
Definition: Schedule.cpp:3090
UnitSystem m_unit_system
Run&#39;s input/output unit system conventions.
Definition: ScheduleStatic.hpp:68
Definition: ActionX.hpp:71
Definition: UnitSystem.hpp:34
Definition: SummaryState.hpp:72
Control parser behaviour in failure conditions.
Definition: ParseContext.hpp:114
Definition: ScheduleState.hpp:108
void clearEvents(const std::size_t report_step)
Clear out all registered events at a given report step.
Definition: Schedule.cpp:1069
Definition: Aquancon.hpp:40
const std::optional< RPTConfig > & initialReportConfiguration() const
Retrieve initial report configuration object.
Definition: Schedule.cpp:2730
Definition: Deck.hpp:46
Definition: PAvg.hpp:29
bool isSerializing() const
Returns true if we are currently doing a serialization operation.
Definition: Serializer.hpp:208
Definition: NumericalAquifers.hpp:36
Definition: DeckRecord.hpp:33
Class for (de-)serializing.
Definition: Serializer.hpp:95
Definition: WelSegsSet.hpp:33
Definition: GTNode.hpp:33
Definition: HandlerContext.hpp:54
Definition: DeckKeyword.hpp:38
Definition: ErrorGuard.hpp:30
std::vector< const Group * > restart_groups(std::size_t timeStep) const
Retrieve collection of group objects suiteable for restart file output.
Definition: Schedule.cpp:1524