20#ifndef OPM_PARSER_ECLIPSE_GRID_HPP
21#define OPM_PARSER_ECLIPSE_GRID_HPP
23#include <opm/input/eclipse/EclipseState/Grid/GridDims.hpp>
24#include <opm/input/eclipse/EclipseState/Grid/MapAxes.hpp>
25#include <opm/input/eclipse/EclipseState/Grid/MinpvMode.hpp>
26#include <opm/input/eclipse/EclipseState/Grid/PinchMode.hpp>
32#include <unordered_set>
38 namespace EclIO {
class EclFile; }
67 double dx = 1.0,
double dy = 1.0,
double dz = 1.0);
71 const std::vector<double>& coord ,
72 const std::vector<double>& zcorn ,
73 const int * actnum =
nullptr);
80 static bool hasGDFILE(
const Deck& deck);
81 static bool hasCylindricalKeywords(
const Deck& deck);
82 static bool hasCornerPointKeywords(
const Deck&);
83 static bool hasCartesianKeywords(
const Deck&);
84 size_t getNumActive( )
const;
85 bool allActive()
const;
87 size_t activeIndex(
size_t i,
size_t j,
size_t k)
const;
88 size_t activeIndex(
size_t globalIndex)
const;
90 size_t getActiveIndex(
size_t i,
size_t j,
size_t k)
const {
91 return activeIndex(i, j, k);
94 void save(
const std::string& filename,
bool formatted,
const std::vector<Opm::NNCdata>& nnc,
const Opm::UnitSystem& units)
const;
101 size_t getGlobalIndex(
size_t active_index)
const;
102 size_t getGlobalIndex(
size_t i,
size_t j,
size_t k)
const;
112 bool isPinchActive()
const;
113 double getPinchThresholdThickness()
const;
114 PinchMode getPinchOption()
const;
115 PinchMode getMultzOption()
const;
116 PinchMode getPinchGapMode()
const;
117 double getPinchMaxEmptyGap()
const;
119 MinpvMode getMinpvMode()
const;
120 const std::vector<double>& getMinpvVector( )
const;
136 std::vector<T> compressedVector(
const std::vector<T>& input_vector)
const {
137 if( input_vector.size() == this->getNumActive() ) {
141 if (input_vector.size() != getCartesianSize())
142 throw std::invalid_argument(
"Input vector must have full size");
145 std::vector<T> compressed_vector( this->getNumActive() );
148 for (
size_t i = 0; i < this->getNumActive(); ++i)
149 compressed_vector[i] = input_vector[ active_map[i] ];
151 return compressed_vector;
159 std::array<double, 3> getCellCenter(
size_t i,
size_t j,
size_t k)
const;
160 std::array<double, 3> getCellCenter(
size_t globalIndex)
const;
161 std::array<double, 3> getCornerPos(
size_t i,
size_t j,
size_t k,
size_t corner_index)
const;
162 const std::vector<double>& activeVolume()
const;
163 double getCellVolume(
size_t globalIndex)
const;
164 double getCellVolume(
size_t i ,
size_t j ,
size_t k)
const;
165 double getCellThickness(
size_t globalIndex)
const;
166 double getCellThickness(
size_t i ,
size_t j ,
size_t k)
const;
167 std::array<double, 3> getCellDims(
size_t i,
size_t j,
size_t k)
const;
168 std::array<double, 3> getCellDims(
size_t globalIndex)
const;
169 bool cellActive(
size_t globalIndex )
const;
170 bool cellActive(
size_t i ,
size_t j,
size_t k )
const;
172 std::array<double, 3> getCellDimensions(
size_t i,
size_t j,
size_t k)
const {
173 return getCellDims(i, j, k);
176 bool isCellActive(
size_t i,
size_t j,
size_t k)
const {
177 return cellActive(i, j, k);
188 double getCellDepth(
size_t i,
size_t j,
size_t k)
const;
189 double getCellDepth(
size_t globalIndex)
const;
192 const std::vector<double>& getCOORD()
const;
193 const std::vector<double>& getZCORN()
const;
194 const std::vector<int>& getACTNUM( )
const;
204 size_t getZcornFixed() {
return zcorn_fixed; };
209 void resetACTNUM(
const std::vector<int>& actnum);
212 static bool hasDVDEPTHZKeywords(
const Deck&);
221 static bool hasEqualDVDEPTHZ(
const Deck&);
222 static bool allEqual(
const std::vector<double> &v);
225 std::vector<double> m_minpvVector;
226 MinpvMode m_minpvMode;
227 std::optional<double> m_pinch;
228 PinchMode m_pinchoutMode;
229 PinchMode m_multzMode;
230 PinchMode m_pinchGapMode;
231 double m_pinchMaxEmptyGap;
233 mutable std::optional<std::vector<double>> active_volume;
235 bool m_circle =
false;
237 size_t zcorn_fixed = 0;
238 bool m_useActnumFromGdfile =
false;
241 mutable std::optional<std::vector<double>> m_input_zcorn;
242 mutable std::optional<std::vector<double>> m_input_coord;
244 std::vector<double> m_zcorn;
245 std::vector<double> m_coord;
248 std::vector<int> m_actnum;
249 std::optional<MapAxes> m_mapaxes;
253 std::vector<int> m_active_to_global;
254 std::vector<int> m_global_to_active;
256 std::unordered_set<size_t> m_aquifer_cells;
259 std::optional<std::vector<double>> m_thetav;
260 std::optional<std::vector<double>> m_rv;
262 void updateNumericalAquiferCells(
const Deck&);
265 void resetACTNUM(
const int* actnum);
267 void initBinaryGrid(
const Deck& deck);
269 void initCornerPointGrid(
const std::vector<double>& coord ,
270 const std::vector<double>& zcorn ,
273 bool keywInputBeforeGdfile(
const Deck& deck,
const std::string& keyword)
const;
275 void initCylindricalGrid(
const Deck&);
276 void initSpiderwebGrid(
const Deck&);
277 void initSpiderwebOrCylindricalGrid(
const Deck&,
const bool);
278 void initCartesianGrid(
const Deck&);
279 void initDTOPSGrid(
const Deck&);
280 void initDVDEPTHZGrid(
const Deck&);
281 void initGrid(
const Deck&,
const int* actnum);
282 void initCornerPointGrid(
const Deck&);
283 void assertCornerPointKeywords(
const Deck&);
285 static bool hasDTOPSKeywords(
const Deck&);
286 static void assertVectorSize(
const std::vector<double>& vector,
size_t expectedSize,
const std::string& msg);
288 static std::vector<double> createTOPSVector(
const std::array<int, 3>& dims,
const std::vector<double>& DZ,
const Deck&);
289 static std::vector<double> createDVector(
const std::array<int, 3>& dims, std::size_t dim,
const std::string& DKey,
const std::string& DVKey,
const Deck&);
290 static void scatterDim(
const std::array<int, 3>& dims ,
size_t dim ,
const std::vector<double>& DV , std::vector<double>& D);
293 std::vector<double> makeCoordDxDyDzTops(
const std::vector<double>& dx,
const std::vector<double>& dy,
const std::vector<double>& dz,
const std::vector<double>& tops)
const;
294 std::vector<double> makeZcornDzTops(
const std::vector<double>& dz,
const std::vector<double>& tops)
const ;
295 std::vector<double> makeZcornDzvDepthz(
const std::vector<double>& dzv,
const std::vector<double>& depthz)
const;
296 std::vector<double> makeCoordDxvDyvDzvDepthz(
const std::vector<double>& dxv,
const std::vector<double>& dyv,
const std::vector<double>& dzv,
const std::vector<double>& depthz)
const;
298 void getCellCorners(
const std::array<int, 3>& ijk,
const std::array<int, 3>& dims, std::array<double,8>& X, std::array<double,8>& Y, std::array<double,8>& Z)
const;
299 void getCellCorners(
const std::size_t globalIndex,
300 std::array<double,8>& X,
301 std::array<double,8>& Y,
302 std::array<double,8>& Z)
const;
317 size_t index(
size_t i,
size_t j,
size_t dim,
size_t layer)
const;
328 size_t index(
size_t i,
size_t j,
size_t k,
int c)
const;
329 size_t index(
size_t g,
int c)
const;
347 size_t fixupZCORN( std::vector<double>& zcorn);
348 bool validZCORN(
const std::vector<double>& zcorn)
const;
350 std::array<size_t,3> dims;
351 std::array<size_t,3> stride;
352 std::array<size_t,8> cell_shift;
Definition: EclipseGrid.hpp:306
Definition: EclFile.hpp:36
About cell information and dimension: The actual grid information is held in a pointer to an ERT ecl_...
Definition: EclipseGrid.hpp:54
EclipseGrid(const Deck &deck, const int *actnum=nullptr)
EclipseGrid ignores ACTNUM in Deck, and therefore needs ACTNUM explicitly.
const std::vector< int > & getActiveMap() const
Will return a vector a length num_active; where the value of each element is the corresponding global...
bool isValidCellGeomtry(const std::size_t globalIndex, const UnitSystem &usys) const
Whether or not given cell has a valid cell geometry.
Definition: GridDims.hpp:31
Definition: UnitSystem.hpp:33
Definition: EclipseGrid.hpp:325
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition: Exceptions.hpp:30