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