opm-common
Loading...
Searching...
No Matches
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 <opm/input/eclipse/EclipseState/Aquifer/AquiferConfig.hpp>
24#include <opm/input/eclipse/EclipseState/Compositional/CompositionalConfig.hpp>
25#include <opm/input/eclipse/EclipseState/EclipseConfig.hpp>
26#include <opm/input/eclipse/EclipseState/Geochemistry/SpeciesConfig.hpp>
27#include <opm/input/eclipse/EclipseState/Geochemistry/MineralConfig.hpp>
28#include <opm/input/eclipse/EclipseState/Geochemistry/IonExchangeConfig.hpp>
29#include <opm/input/eclipse/EclipseState/Grid/EclipseGrid.hpp>
30#include <opm/input/eclipse/EclipseState/Grid/FIPRegionStatistics.hpp>
31#include <opm/input/eclipse/EclipseState/Grid/FaultCollection.hpp>
32#include <opm/input/eclipse/EclipseState/Grid/FieldPropsManager.hpp>
33#include <opm/input/eclipse/EclipseState/Grid/LgrCollection.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/SimulationConfig/SimulationConfig.hpp>
38#include <opm/input/eclipse/EclipseState/Tables/TableManager.hpp>
39#include <opm/input/eclipse/EclipseState/TracerConfig.hpp>
40#include <opm/input/eclipse/EclipseState/Co2StoreConfig.hpp>
41#include <opm/input/eclipse/EclipseState/WagHysteresisConfig.hpp>
42
43#include <opm/input/eclipse/Units/UnitSystem.hpp>
44
45#include <cstddef>
46#include <memory>
47#include <optional>
48#include <string>
49#include <vector>
50
51namespace Opm {
52 class Deck;
53 class DeckKeyword;
54 class InitConfig;
55 class IOConfig;
56 class DeckSection;
57} // namespace Opm
58
59namespace Opm { namespace RestartIO {
60 class RstAquifer;
61 class RstNetwork;
62}} // namespace Opm::RestartIO
63
64namespace Opm {
65
66 class EclipseState {
67 public:
68 enum EnabledTypes {
69 IntProperties = 0x01,
70 DoubleProperties = 0x02,
71
72 AllProperties = IntProperties | DoubleProperties
73 };
74
75 EclipseState() = default;
76 explicit EclipseState(const Deck& deck);
77 virtual ~EclipseState() = default;
78
79 const IOConfig& getIOConfig() const;
81
82 const InitConfig& getInitConfig() const;
84
85 const SimulationConfig& getSimulationConfig() const;
86 virtual const EclipseGrid& getInputGrid() const;
87 void set_lgr_refinement(const std::string& lgr_label, const std::vector<double>& coord, const std::vector<double>& zcorn);
88
89 const FaultCollection& getFaults() const;
90 const TransMult& getTransMult() const;
91 TransMult& getTransMult();
92
95 const NNC& getInputNNC() const;
97 const std::vector<NNCdata>& getPinchNNC() const;
98 void appendInputNNC(const std::vector<NNCdata>& nnc);
99 void setInputNNC(const NNC& nnc);
101 void setPinchNNC(std::vector<NNCdata>&& nnc);
102 bool hasInputNNC() const;
103 bool hasPinchNNC() const;
104
105 // The potentially parallelized field properties
106 virtual const FieldPropsManager& fieldProps() const;
107 // Always the non-parallel field properties
108 virtual const FieldPropsManager& globalFieldProps() const;
109
110 virtual void computeFipRegionStatistics();
111 const FIPRegionStatistics& fipRegionStatistics() const;
112
113 const TableManager& getTableManager() const;
114 const EclipseConfig& getEclipseConfig() const;
115 const EclipseConfig& cfg() const;
116 const GridDims& gridDims() const;
117
118 const LgrCollection& getLgrs() const;
119 bool hasInputLGR() const;
120
121 // the unit system used by the deck. note that it is rarely needed
122 // to convert units because internally to opm-parser everything is
123 // represented by SI units.
124 const UnitSystem& getDeckUnitSystem() const;
125 const UnitSystem& getUnits() const;
126
127 const std::string& getTitle() const;
128
129 void apply_schedule_keywords(const std::vector<DeckKeyword>& keywords);
130
131 const Runspec& runspec() const;
132 const AquiferConfig& aquifer() const;
133 const CompositionalConfig& compositionalConfig() const;
134 const TracerConfig& tracer() const;
135 const SpeciesConfig& species() const;
136 const MineralConfig& mineral() const;
137 const IonExchangeConfig& ionExchange() const;
138 const WagHysteresisConfig& getWagHysteresis() const;
139 const Co2StoreConfig& getCo2StoreConfig() const;
140
141 void prune_global_for_schedule_run();
142 void reset_actnum(const std::vector<int>& new_actnum);
143 void set_active_indices(const std::vector<int>& indices);
144 void pruneDeactivatedAquiferConnections(const std::vector<std::size_t>& deactivated_cells);
145 void loadRestartAquifers(const RestartIO::RstAquifer& aquifers);
146 // TODO: it is possible that the aquifer are opened through SCHEDULE and not specified in the SOLUTION section
147 // For the ease of the implementation, we create inactive aquifer in the AquiferConfig.
148 // At the moment, it only works for Constant Flux Aquifers(AQUFLUX) as indicated by the function name
149 // When we know and decide to handle the same for AQUFETP and AQUCT, this part will be refactored
150 void appendAqufluxSchedule(const std::unordered_set<int>& ids);
151
152 void loadRestartNetworkPressures(const RestartIO::RstNetwork& network);
153 const std::optional<std::map<std::string, double> >& getRestartNetworkPressures() const { return this->m_restart_network_pressures; }
154
155 template<class Serializer>
156 void serializeOp(Serializer& serializer)
157 {
158 // FieldPropsManager is handled through a different mechanism.
159 // Do not add the member (i.e., field_props) to this list.
160 serializer(m_tables);
161 serializer(m_runspec);
162 serializer(m_eclipseConfig);
163 serializer(m_deckUnitSystem);
164 serializer(m_inputNnc);
165 serializer(m_pinchNnc);
166 serializer(m_gridDims);
167 serializer(m_lgrs);
168 serializer(m_simulationConfig);
169 serializer(aquifer_config);
170 serializer(compositional_config),
171 serializer(m_transMult);
172 serializer(m_faults);
173 serializer(m_title);
174 serializer(species_config);
175 serializer(mineral_config);
176 serializer(ionex_config);
177 serializer(tracer_config);
178 serializer(wag_hyst_config);
179 serializer(co2_store_config);
180 serializer(this->fipRegionStatistics_);
181 }
182
183 static bool rst_cmp(const EclipseState& full_state, const EclipseState& rst_state);
184
185 private:
186 void initIOConfigPostSchedule(const Deck& deck);
187 void assignRunTitle(const Deck& deck);
188 void reportNumberOfActivePhases() const;
189 void initLgrs(const Deck& deck);
190 void conveyNumericalAquiferEffects();
191 void applyMULTXYZ();
192 void initFaults(const Deck& deck);
193 void initPara(const Deck& deck);
194
195 void setMULTFLT(const Opm::DeckSection& section, bool edit = false);
196
197 void complainAboutAmbiguousKeyword(const Deck& deck,
198 const std::string& keywordName);
199
200 protected:
201 TableManager m_tables;
202 Runspec m_runspec;
203 EclipseConfig m_eclipseConfig;
204 UnitSystem m_deckUnitSystem;
205 EclipseGrid m_inputGrid;
206 NNC m_inputNnc;
207 std::vector<NNCdata> m_pinchNnc;
208 GridDims m_gridDims;
209 FieldPropsManager field_props;
210 LgrCollection m_lgrs;
211 SimulationConfig m_simulationConfig;
212 AquiferConfig aquifer_config;
213 CompositionalConfig compositional_config;
214 TransMult m_transMult;
215 SpeciesConfig species_config;
216 MineralConfig mineral_config;
217 IonExchangeConfig ionex_config;
218 TracerConfig tracer_config;
219 WagHysteresisConfig wag_hyst_config;
220 Co2StoreConfig co2_store_config;
221
222 std::string m_title{};
223 FaultCollection m_faults{};
224
225 std::optional<std::map<std::string, double> > m_restart_network_pressures{std::nullopt};
226
227 std::optional<FIPRegionStatistics> fipRegionStatistics_{std::nullopt};
228 };
229} // namespace Opm
230
231#endif // OPM_ECLIPSE_STATE_HPP
Definition AquiferConfig.hpp:46
Definition Co2StoreConfig.hpp:33
Definition CompositionalConfig.hpp:34
Definition DeckKeyword.hpp:36
Definition DeckSection.hpp:47
Definition Deck.hpp:46
Definition EclipseConfig.hpp:33
About cell information and dimension: The actual grid information is held in a pointer to an ERT ecl_...
Definition EclipseGrid.hpp:62
const EclipseConfig & getEclipseConfig() const
[[deprecated]] — use cfg()
Definition EclipseState.cpp:263
void setPinchNNC(std::vector< NNCdata > &&nnc)
Set NNCs created by PINCH.
Definition EclipseState.cpp:315
const std::vector< NNCdata > & getPinchNNC() const
Get sorted vector of NNCs created by PINCH.
Definition EclipseState.cpp:307
const IOConfig & getIOConfig() const
[[deprecated]] — use cfg().io()
Definition EclipseState.cpp:244
const NNC & getInputNNC() const
non-neighboring connections the non-standard adjacencies as specified in input deck
Definition EclipseState.cpp:303
const InitConfig & getInitConfig() const
[[deprecated]] — use cfg().init()
Definition EclipseState.cpp:254
Basic descriptive statistics about a model's fluid-in-place regions.
Definition FIPRegionStatistics.hpp:40
Definition FaultCollection.hpp:35
Definition FieldPropsManager.hpp:42
Definition GridDims.hpp:31
Definition IOConfig.hpp:143
Settings for model initialisation.
Definition InitConfig.hpp:39
Definition IonExchangeConfig.hpp:29
Definition LgrCollection.hpp:33
Definition MineralConfig.hpp:29
Definition NNC.hpp:103
Definition aquifer.hpp:45
Definition network.hpp:39
Definition Runspec.hpp:608
Class for (de-)serializing.
Definition Serializer.hpp:94
Definition SimulationConfig.hpp:39
Definition SpeciesConfig.hpp:29
Definition TableManager.hpp:66
Definition TracerConfig.hpp:33
Definition TransMult.hpp:52
Definition UnitSystem.hpp:34
Definition WagHysteresisConfig.hpp:30
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition Exceptions.hpp:30