My Project
EclipseState.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
20#ifndef OPM_ECLIPSE_STATE_HPP
21#define OPM_ECLIPSE_STATE_HPP
22
23#include <cstddef>
24#include <memory>
25#include <vector>
26
27#include <opm/input/eclipse/EclipseState/Aquifer/AquiferConfig.hpp>
28#include <opm/input/eclipse/EclipseState/EclipseConfig.hpp>
29#include <opm/input/eclipse/EclipseState/TracerConfig.hpp>
30#include <opm/input/eclipse/EclipseState/MICPpara.hpp>
31#include <opm/input/eclipse/EclipseState/Grid/FieldPropsManager.hpp>
32#include <opm/input/eclipse/EclipseState/Grid/EclipseGrid.hpp>
33#include <opm/input/eclipse/EclipseState/Grid/FaultCollection.hpp>
34#include <opm/input/eclipse/EclipseState/Grid/NNC.hpp>
35#include <opm/input/eclipse/EclipseState/Grid/TransMult.hpp>
36#include <opm/input/eclipse/EclipseState/Runspec.hpp>
37#include <opm/input/eclipse/EclipseState/Tables/TableManager.hpp>
38#include <opm/input/eclipse/EclipseState/SimulationConfig/SimulationConfig.hpp>
39#include <opm/input/eclipse/Units/UnitSystem.hpp>
40
41namespace Opm {
42 class Deck;
43 class DeckKeyword;
44 class InitConfig;
45 class IOConfig;
46 class DeckSection;
47} // namespace Opm
48
49namespace Opm { namespace RestartIO {
50 class RstAquifer;
51}} // namespace Opm::RestartIO
52
53namespace Opm {
54
56 public:
57 enum EnabledTypes {
58 IntProperties = 0x01,
59 DoubleProperties = 0x02,
60
61 AllProperties = IntProperties | DoubleProperties
62 };
63
64 EclipseState() = default;
65 explicit EclipseState(const Deck& deck);
66 virtual ~EclipseState() = default;
67
68 const IOConfig& getIOConfig() const;
69 IOConfig& getIOConfig();
70
71 const InitConfig& getInitConfig() const;
72 InitConfig& getInitConfig();
73
74 const SimulationConfig& getSimulationConfig() const;
75 virtual const EclipseGrid& getInputGrid() const;
76
77 const FaultCollection& getFaults() const;
78 const TransMult& getTransMult() const;
79 TransMult& getTransMult();
80
83 const NNC& getInputNNC() const;
84 void appendInputNNC(const std::vector<NNCdata>& nnc);
85 void setInputNNC(const NNC& nnc);
86 bool hasInputNNC() const;
87
88 // The potentially parallelized field properties
89 virtual const FieldPropsManager& fieldProps() const;
90 // Always the non-parallel field properties
91 virtual const FieldPropsManager& globalFieldProps() const;
92 const TableManager& getTableManager() const;
93 const EclipseConfig& getEclipseConfig() const;
94 const EclipseConfig& cfg() const;
95 const GridDims& gridDims() const;
96
97 // the unit system used by the deck. note that it is rarely needed
98 // to convert units because internally to opm-parser everything is
99 // represented by SI units.
100 const UnitSystem& getDeckUnitSystem() const;
101 const UnitSystem& getUnits() const;
102
103 std::string getTitle() const;
104
105 void apply_schedule_keywords(const std::vector<DeckKeyword>& keywords);
106
107 const Runspec& runspec() const;
108 const AquiferConfig& aquifer() const;
109 const TracerConfig& tracer() const;
110 const MICPpara& getMICPpara() const;
111
112 void reset_actnum(const std::vector<int>& new_actnum);
113 void pruneDeactivatedAquiferConnections(const std::vector<std::size_t>& deactivated_cells);
114 void loadRestartAquifers(const RestartIO::RstAquifer& aquifers);
115 // TODO: it is possible that the aquifer are opened through SCHEDULE and not specified in the SOLUTION section
116 // For the ease of the implementation, we create inactive aquifer in the AquiferConfig.
117 // At the moment, it only works for Constant Flux Aquifers(AQUFLUX) as indicated by the function name
118 // When we know and decide to handle the same for AQUFETP and AQUCT, this part will be refactored
119 void appendAqufluxSchedule(const std::unordered_set<int>& ids);
120
121 template<class Serializer>
122 void serializeOp(Serializer& serializer)
123 {
124 // FieldPropsManager is handled through a different mechanism.
125 // Do not add the member (i.e., field_props) to this list.
126 serializer(m_tables);
127 serializer(m_runspec);
128 serializer(m_eclipseConfig);
129 serializer(m_deckUnitSystem);
130 serializer(m_inputNnc);
131 serializer(m_gridDims);
132 serializer(m_simulationConfig);
133 serializer(aquifer_config);
134 serializer(m_transMult);
135 serializer(m_faults);
136 serializer(m_title);
137 serializer(tracer_config);
138 serializer(m_micppara);
139 }
140
141 static bool rst_cmp(const EclipseState& full_state, const EclipseState& rst_state);
142
143
144 private:
145 void initIOConfigPostSchedule(const Deck& deck);
146 void assignRunTitle(const Deck& deck);
147 void reportNumberOfActivePhases() const;
148 void conveyNumericalAquiferEffects();
149 void applyMULTXYZ();
150 void initFaults(const Deck& deck);
151 void initPara(const Deck& deck);
152
153 void setMULTFLT(const Opm::DeckSection& section);
154
155 void complainAboutAmbiguousKeyword(const Deck& deck,
156 const std::string& keywordName);
157
158 protected:
159 TableManager m_tables;
160 Runspec m_runspec;
161 EclipseConfig m_eclipseConfig;
162 UnitSystem m_deckUnitSystem;
163 EclipseGrid m_inputGrid;
164 NNC m_inputNnc;
165 GridDims m_gridDims;
166 FieldPropsManager field_props;
167 SimulationConfig m_simulationConfig;
168 AquiferConfig aquifer_config;
169 TransMult m_transMult;
170 TracerConfig tracer_config;
171 MICPpara m_micppara;
172
173 std::string m_title{};
174 FaultCollection m_faults{};
175 };
176} // namespace Opm
177
178#endif // OPM_ECLIPSE_STATE_HPP
Definition: AquiferConfig.hpp:46
Definition: DeckSection.hpp:46
Definition: Deck.hpp:49
Definition: EclipseConfig.hpp:31
About cell information and dimension: The actual grid information is held in a pointer to an ERT ecl_...
Definition: EclipseGrid.hpp:54
Definition: EclipseState.hpp:55
const NNC & getInputNNC() const
non-neighboring connections the non-standard adjacencies as specified in input deck
Definition: FaultCollection.hpp:35
Definition: FieldPropsManager.hpp:41
Definition: GridDims.hpp:31
Definition: IOConfig.hpp:147
Definition: InitConfig.hpp:32
Definition: MICPpara.hpp:26
Definition: NNC.hpp:103
Definition: aquifer.hpp:45
Definition: Runspec.hpp:434
Class for (de-)serializing.
Definition: Serializer.hpp:84
Definition: SimulationConfig.hpp:32
Definition: TableManager.hpp:65
Definition: TracerConfig.hpp:33
Definition: TransMult.hpp:48
Definition: UnitSystem.hpp:33
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition: Exceptions.hpp:30