OpenCAEPoro  v0.5.0
A simulator for multicomponent porous media flow
Grid.cpp
Go to the documentation of this file.
1 
12 #include "Grid.hpp"
13 
15 // Input Param and Setup
17 
18 void Grid::InputParam(const ParamReservoir& rs_param, const ParamOutput& output_param)
19 {
20  // dimensions
21  nx = rs_param.dimens.nx;
22  ny = rs_param.dimens.ny;
23  nz = rs_param.dimens.nz;
24  numGrid = rs_param.numGrid;
25 
26  // CornerPoint Grid or Orthogonal Grid
27  if (!rs_param.coord.empty()) {
28  // CornerPoint Grid
30  coord = rs_param.coord;
31  zcorn = rs_param.zcorn;
32  } else {
33  // Orthogonal Grid
35  tops = rs_param.tops;
36  dx = rs_param.dx;
37  dy = rs_param.dy;
38  dz = rs_param.dz;
39  }
40 
41  // General Information
42  ntg = rs_param.ntg;
43  poro = rs_param.poro;
44  kx = rs_param.permX;
45  ky = rs_param.permY;
46  kz = rs_param.permZ;
47  thconr = rs_param.thconr;
48 
49  // Regions
50  SATNUM.resize(numGrid, 0);
51  if (rs_param.SATNUM.activity) {
52  for (OCP_USI i = 0; i < numGrid; i++) {
53  SATNUM[i] = round(rs_param.SATNUM.data[i]) - 1;
54  }
55  }
56  PVTNUM.resize(numGrid, 0);
57  if (rs_param.PVTNUM.activity) {
58  for (OCP_USI i = 0; i < numGrid; i++) {
59  PVTNUM[i] = round(rs_param.PVTNUM.data[i]) - 1;
60  }
61  }
62  ACTNUM.resize(numGrid, 1);
63  if (rs_param.ACTNUM.activity) {
64  for (OCP_USI i = 0; i < numGrid; i++) {
65  ACTNUM[i] = round(rs_param.ACTNUM.data[i]);
66  }
67  }
68  ROCKNUM.resize(numGrid, 0);
69  if (rs_param.ROCKNUM.activity) {
70  for (OCP_USI i = 0; i < numGrid; i++) {
71  ROCKNUM[i] = round(rs_param.ROCKNUM.data[i]);
72  }
73  }
74 
75  // Initial Properties
76  SwatInit = rs_param.Swat;
77 
78  // Output
79  useVTK = output_param.outVTKParam.useVTK;
80 }
81 
83 {
84  Setup();
85  CalActiveGridIsoT(1E-6, 1E-6);
86  SetupGridTag();
87 }
88 
90 {
91  Setup();
92  CalActiveGridT(1E-6, 1E-6);
94  SetupGridTag();
95 }
96 
98 {
99  switch (gridType) {
100  case ORTHOGONAL_GRID:
102  break;
103  case CORNER_GRID:
104  SetupCornerGrid();
105  break;
106  default:
107  OCP_ABORT("WRONG Grid Type!");
108  }
109 
110  CalNumDigutIJK();
111  OutputBaiscInfo();
112 }
113 
115 {
116  // x -> y -> z
119  // for output
121 }
122 
124 {
125  depth.resize(numGrid, 0);
126  const OCP_USI nxny = nx * ny;
127  // 0th layer
128  for (USI j = 0; j < ny; j++) {
129  for (USI i = 0; i < nx; i++) {
130  OCP_USI id = j * nx + i;
131  depth[id] = tops[id] + dz[id] / 2;
132  }
133  }
134  // 1th - (nz-1)th layer
135  for (USI k = 1; k < nz; k++) {
136  OCP_USI knxny = k * nxny;
137  for (USI j = 0; j < ny; j++) {
138  for (USI i = 0; i < nx; i++) {
139  OCP_USI id = knxny + j * nx + i;
140  depth[id] = depth[id - nxny] + dz[id - nxny] / 2 + dz[id] / 2;
141  }
142  }
143  }
144 
145  v.resize(numGrid);
146  for (OCP_USI i = 0; i < numGrid; i++) v[i] = dx[i] * dy[i] * dz[i];
147 }
148 
150 {
151  gNeighbor.resize(numGrid);
152  // PreAllocate
153  for (OCP_USI n = 0; n < numGrid; n++) {
154  gNeighbor[n].reserve(6);
155  }
156 
157  // Begin Id and End Id in Grid, bIdg < eIdg
158  OCP_USI bIdg, eIdg;
159  OCP_DBL areaB, areaE;
160  USI direction;
161  const OCP_USI nxny = nx * ny;
162 
163  for (USI k = 0; k < nz; k++) {
164  for (USI j = 0; j < ny; j++) {
165  for (USI i = 0; i < nx; i++) {
166 
167  bIdg = k * nxny + j * nx + i;
168  // right -- x-direction
169  if (i < nx - 1) {
170  direction = 1;
171  eIdg = bIdg + 1;
172  areaB = 2 * dy[bIdg] * dz[bIdg] / dx[bIdg];
173  areaE = 2 * dy[eIdg] * dz[eIdg] / dx[eIdg];
174  gNeighbor[bIdg].push_back(GPair(eIdg, direction, areaB, areaE));
175  gNeighbor[eIdg].push_back(GPair(bIdg, direction, areaE, areaB));
176  }
177  // front -- y-direction
178  if (j < ny - 1) {
179  direction = 2;
180  eIdg = bIdg + nx;
181  areaB = 2 * dz[bIdg] * dx[bIdg] / dy[bIdg];
182  areaE = 2 * dz[eIdg] * dx[eIdg] / dy[eIdg];
183  gNeighbor[bIdg].push_back(GPair(eIdg, direction, areaB, areaE));
184  gNeighbor[eIdg].push_back(GPair(bIdg, direction, areaE, areaB));
185  }
186  // down -- z-direction
187  if (k < nz - 1) {
188  direction = 3;
189  eIdg = bIdg + nxny;
190  areaB = 2 * dx[bIdg] * dy[bIdg] / dz[bIdg];
191  areaE = 2 * dx[eIdg] * dy[eIdg] / dz[eIdg];
192  gNeighbor[bIdg].push_back(GPair(eIdg, direction, areaB, areaE));
193  gNeighbor[eIdg].push_back(GPair(bIdg, direction, areaE, areaB));
194  }
195  }
196  }
197  }
198 }
199 
201 {
202  OCP_COORD coordTmp;
203  coordTmp.Allocate(nx, ny, nz);
204  coordTmp.InputData(coord, zcorn);
205  coordTmp.SetupCornerPoints();
206  SetupBasicCornerGrid(coordTmp);
207  SetupNeighborCornerGrid(coordTmp);
208  // for output
209  SetHexaherdronGridCorner(coordTmp);
210 }
211 
213 {
214  dx = CoTmp.dx;
215  dy = CoTmp.dy;
216  dz = CoTmp.dz;
217  v = CoTmp.v;
218  depth = CoTmp.depth;
219 }
220 
222 {
223  gNeighbor.resize(numGrid);
224  // PreAllocate
225  for (OCP_USI n = 0; n < numGrid; n++) {
226  gNeighbor[n].reserve(10);
227  }
228 
229  OCP_USI bIdg, eIdg;
230  OCP_DBL areaB, areaE;
231  USI direction;
232  for (OCP_USI n = 0; n < CoTmp.numConn; n++) {
233  const GeneralConnect& ConnTmp = CoTmp.connect[n];
234  direction = ConnTmp.directionType;
235  bIdg = ConnTmp.begin;
236  eIdg = ConnTmp.end;
237  areaB = ConnTmp.Ad_dd_begin;
238  areaE = ConnTmp.Ad_dd_end;
239  gNeighbor[bIdg].push_back(GPair(eIdg, direction, areaB, areaE));
240  gNeighbor[eIdg].push_back(GPair(bIdg, direction, areaE, areaB));
241  }
242 }
243 
245 // Basic Grid and Rock Information
247 
249 // Note: Inactive cells do NOT participate simumlation; other rules can be given.
250 void Grid::CalActiveGridIsoT(const OCP_DBL& e1, const OCP_DBL& e2)
251 {
252  map_Act2All.reserve(numGrid);
253  map_All2Act.resize(numGrid);
254  OCP_USI count = 0;
255  for (OCP_USI n = 0; n < numGrid; n++) {
256  if (ACTNUM[n] == 0 || poro[n] * ntg[n] < e1 || v[n] < e2) {
257  map_All2Act[n] = GB_Pair(OCP_FALSE, 0);
258  ACTNUM[n] = 0;
259  continue;
260  }
261  map_Act2All.push_back(n);
262  map_All2Act[n] = GB_Pair(OCP_TRUE, count);
263  count++;
264  }
265  activeGridNum = count;
266  if (numGrid > activeGridNum) {
267  cout << " Number of inactive cells is " << (numGrid - activeGridNum) << " ("
268  << (numGrid - activeGridNum) * 100.0 / numGrid << "%)" << endl;
269  }
270 
271  // fluid grid = active grid
274 }
275 
276 void Grid::CalActiveGridT(const OCP_DBL& e1, const OCP_DBL& e2)
277 {
278  map_Act2All.reserve(numGrid);
279  map_All2Act.resize(numGrid);
280  map_All2Flu.resize(numGrid);
281  OCP_USI activeCount = 0;
282  OCP_USI fluidCount = 0;
283  for (OCP_USI n = 0; n < numGrid; n++) {
284  if (ACTNUM[n] == 0 || v[n] < e1) {
285  map_All2Act[n] = GB_Pair(OCP_FALSE, 0);
286  map_All2Flu[n] = GB_Pair(OCP_FALSE, 0);
287  ACTNUM[n] = 0;
288  } else {
289  if (poro[n] * ntg[n] < e2) {
290  map_All2Flu[n] = GB_Pair(OCP_FALSE, 0);
291  } else {
292  map_All2Flu[n] = GB_Pair(OCP_TRUE, fluidCount);
293  fluidCount++;
294  }
295  map_Act2All.push_back(n);
296  map_All2Act[n] = GB_Pair(OCP_TRUE, activeCount);
297  activeCount++;
298  }
299  }
300  activeGridNum = activeCount;
301  if (numGrid > activeGridNum) {
302  cout << " Number of inactive cells is " << (numGrid - activeGridNum) << " ("
303  << (numGrid - activeGridNum) * 100.0 / numGrid << "%)" << endl;
304  }
305 
306  fluidGridNum = fluidCount;
307  // temp
308  // output num of fluid grid
309 }
310 
312 {
313  gLocation.resize(numGrid);
314  // Be careful if there's only one floor, then top face is also bottom face.
315  // then one index is not enough
316  // top face
317  for (OCP_USI n = 0; n < nx * ny; n++) {
318  gLocation[n] = 1;
319  }
320  // bottom face
321  for (OCP_USI n = nx * ny * (nz - 1); n < nx * ny * nz; n++) {
322  gLocation[n] = 2;
323  }
324 }
325 
326 OCP_INT Grid::GetActIndex(const USI& I, const USI& J, const USI& K) const
327 {
328  const OCP_USI& n = K * nx * ny + J * nx + I;
329  if (map_All2Flu[n].IsAct()) {
330  return map_All2Act[n].GetId();
331  } else {
332  return -1;
333  }
334 }
335 
337 // Output
339 
340 void Grid::GetIJKGrid(USI& i, USI& j, USI& k, const OCP_USI& n) const
341 {
342  k = n / (nx * ny) + 1;
343  j = (n - (k - 1) * nx * ny) / nx + 1;
344  i = n - (k - 1) * nx * ny - (j - 1) * nx + 1;
345 }
346 
347 void Grid::GetIJKBulk(USI& i, USI& j, USI& k, const OCP_USI& n) const
348 {
349  GetIJKGrid(i, j, k, map_Act2All[n]);
350 }
351 
353 {
354  // x,y-coordinate begins from 0
355  if (!useVTK) return;
356 
357  polyhedronGrid.reserve(numGrid);
358  OCPpolyhedron tmpP(8);
359  OCP_DBL tmpX, tmpY;
360  OCP_USI id;
361 
362  for (USI k = 0; k < nz; k++) {
363  tmpY = 0;
364  for (USI j = 0; j < ny; j++) {
365  tmpX = 0;
366  for (USI i = 0; i < nx; i++) {
367  id = k * nx * ny + j * nx + i;
368  tmpP.Points.push_back(Point3D(tmpX, tmpY, depth[id] + dz[id] / 2));
369  tmpP.Points.push_back(
370  Point3D(tmpX + dx[id], tmpY, depth[id] + dz[id] / 2));
371  tmpP.Points.push_back(
372  Point3D(tmpX + dx[id], tmpY + dy[id], depth[id] + dz[id] / 2));
373  tmpP.Points.push_back(
374  Point3D(tmpX, tmpY + dy[id], depth[id] + dz[id] / 2));
375  tmpP.Points.push_back(Point3D(tmpX, tmpY, depth[id] - dz[id] / 2));
376  tmpP.Points.push_back(
377  Point3D(tmpX + dx[id], tmpY, depth[id] - dz[id] / 2));
378  tmpP.Points.push_back(
379  Point3D(tmpX + dx[id], tmpY + dy[id], depth[id] - dz[id] / 2));
380  tmpP.Points.push_back(
381  Point3D(tmpX, tmpY + dy[id], depth[id] - dz[id] / 2));
382 
383  polyhedronGrid.push_back(tmpP);
384  tmpP.Points.clear();
385  tmpX += dx[id];
386  }
387  tmpY += dy[id];
388  }
389  }
390 }
391 
393 {
394  if (!useVTK) return;
395 
396  polyhedronGrid.reserve(numGrid);
397  OCPpolyhedron tmpP(8);
398 
399  for (USI k = 0; k < nz; k++) {
400  for (USI j = 0; j < ny; j++) {
401  for (USI i = 0; i < nx; i++) {
402  tmpP.Points.push_back(mycord.cornerPoints[i][j][k].p4);
403  tmpP.Points.push_back(mycord.cornerPoints[i][j][k].p5);
404  tmpP.Points.push_back(mycord.cornerPoints[i][j][k].p6);
405  tmpP.Points.push_back(mycord.cornerPoints[i][j][k].p7);
406  tmpP.Points.push_back(mycord.cornerPoints[i][j][k].p0);
407  tmpP.Points.push_back(mycord.cornerPoints[i][j][k].p1);
408  tmpP.Points.push_back(mycord.cornerPoints[i][j][k].p2);
409  tmpP.Points.push_back(mycord.cornerPoints[i][j][k].p3);
410  polyhedronGrid.push_back(tmpP);
411  tmpP.Points.clear();
412  }
413  }
414  }
415 }
416 
418 {
419  if (!useVTK) return;
420 
421  gridTag.resize(numGrid);
422  for (OCP_USI n = 0; n < numGrid; n++) {
423  if (map_All2Act[n].IsAct()) {
424  if (map_All2Flu[n].IsAct()) {
425  gridTag[n] = 2;
426  } else {
427  gridTag[n] = 1;
428  }
429  } else {
430  gridTag[n] = 0;
431  }
432  }
433 }
434 
436 {
437  OCP_DBL depthMax = 0;
438  OCP_DBL depthMin = 1E8;
439  OCP_DBL dxMax = 0;
440  OCP_DBL dxMin = 1E8;
441  OCP_DBL dyMax = 0;
442  OCP_DBL dyMin = 1E8;
443  OCP_DBL dzMax = 0;
444  OCP_DBL dzMin = 1E8;
445 
446  for (OCP_USI n = 0; n < numGrid; n++) {
447  if (depthMax < depth[n]) {
448  depthMax = depth[n];
449  }
450  if (depthMin > depth[n]) {
451  depthMin = depth[n];
452  }
453  if (dxMax < dx[n]) {
454  dxMax = dx[n];
455  }
456  if (dxMin > dx[n]) {
457  dxMin = dx[n];
458  }
459  if (dyMax < dy[n]) {
460  dyMax = dy[n];
461  }
462  if (dyMin > dy[n]) {
463  dyMin = dy[n];
464  }
465  if (dzMax < dz[n]) {
466  dzMax = dz[n];
467  }
468  if (dzMin > dz[n]) {
469  dzMin = dz[n];
470  }
471  }
472 
473  cout << "\n---------------------" << endl
474  << "GRID"
475  << "\n---------------------" << endl;
476  cout << " depthMax = " << depthMax << endl
477  << " depthMin = " << depthMin << endl
478  << " dxMax = " << dxMax << endl
479  << " dxMin = " << dxMin << endl
480  << " dyMax = " << dyMax << endl
481  << " dyMin = " << dyMin << endl
482  << " dzMax = " << dzMax << endl
483  << " dzMin = " << dzMin << endl;
484 }
485 
487 {
488  OCP_ASSERT((nx > 0 && ny > 0 && nz > 0), "Wrong Dimension!");
489  numDigutIJK = 1;
490  if (log10(nx) >= numDigutIJK) numDigutIJK = ceil(log10(nx) + 1);
491  if (log10(ny) >= numDigutIJK) numDigutIJK = ceil(log10(ny) + 1);
492  if (log10(nz) >= numDigutIJK) numDigutIJK = ceil(log10(nz) + 1);
493 }
494 
495 /*----------------------------------------------------------------------------*/
496 /* Brief Change History of This File */
497 /*----------------------------------------------------------------------------*/
498 /* Author Date Actions */
499 /*----------------------------------------------------------------------------*/
500 /* Shizhe Li Oct/01/2021 Create file */
501 /* Chensong Zhang Oct/15/2021 Format file */
502 /* Chensong Zhang Jan/16/2022 Fix Doxygen */
503 /*----------------------------------------------------------------------------*/
Grid class declaration.
const USI CORNER_GRID
Grid type = corner-point.
Definition: OCPConst.hpp:77
unsigned int USI
Generic unsigned integer.
Definition: OCPConst.hpp:23
double OCP_DBL
Double precision.
Definition: OCPConst.hpp:27
const USI ORTHOGONAL_GRID
Grid type = orthogonal.
Definition: OCPConst.hpp:76
unsigned int OCP_USI
Long unsigned integer.
Definition: OCPConst.hpp:25
int OCP_INT
Long integer.
Definition: OCPConst.hpp:26
#define OCP_ASSERT(cond, msg)
Assert condition and log user messages in DEBUG mode.
Definition: UtilError.hpp:58
#define OCP_ABORT(msg)
Abort if critical error happens.
Definition: UtilError.hpp:47
USI nx
Num of bulks along x-direction.
USI ny
Num of bulks along y-direction.
USI nz
Num of bulks along z-direction.
Active cell indicator and its index among active cells.
Definition: Grid.hpp:32
Effective area of intersection surfaces with neighboring cells.
Definition: Grid.hpp:53
void SetupBasicCornerGrid(const OCP_COORD &CoTmp)
Setup dx,dy,dz,depth, v for a corner-point grid.
Definition: Grid.cpp:212
vector< USI > ACTNUM
Definition: Grid.hpp:179
OCP_BOOL useVTK
If output in vtk format.
Definition: Grid.hpp:218
vector< OCP_DBL > ky
Absolute permeability in y-direction: numGrid.
Definition: Grid.hpp:172
vector< OCP_DBL > v
Volume of cells: numGrid.
Definition: Grid.hpp:165
void CalNumDigutIJK()
only used in structured grid
Definition: Grid.cpp:486
vector< OCP_USI > map_Act2All
Mapping from active grid to all grid: activeGridNum.
Definition: Grid.hpp:192
vector< USI > ROCKNUM
index of rock table for each grid: numGrid
Definition: Grid.hpp:181
USI nx
Number of cells in x-direction.
Definition: Grid.hpp:145
void CalActiveGridT(const OCP_DBL &e1, const OCP_DBL &e2)
Calculate the activity of grid cells for ifThermal model.
Definition: Grid.cpp:276
USI numDigutIJK
number of digits of maximum nx,ny,nz
Definition: Grid.hpp:221
OCP_USI activeGridNum
Num of active grid.
Definition: Grid.hpp:190
void SetHexaherdronGridCorner(const OCP_COORD &mycord)
Definition: Grid.cpp:392
vector< OCP_DBL > SwatInit
Initial water saturation.
Definition: Grid.hpp:184
void SetupCornerGrid()
Setup corner-point grid.
Definition: Grid.cpp:200
vector< USI > PVTNUM
Identify PVT region for the blackoil model: numGrid.
Definition: Grid.hpp:178
vector< OCP_DBL > depth
Depth of center of grid cells: numGrid.
Definition: Grid.hpp:166
vector< USI > SATNUM
Identify SAT region: numGrid.
Definition: Grid.hpp:177
vector< OCP_DBL > kz
Absolute permeability in z-direction: numGrid.
Definition: Grid.hpp:173
USI gridType
Orthogonal or Corner grid.
Definition: Grid.hpp:141
OCP_USI fluidGridNum
Num of fluid grids.
Definition: Grid.hpp:195
void SetupGridTag()
Setup grid tag.
Definition: Grid.cpp:417
vector< USI > gLocation
Top face, bottom face, side face, numGrid.
Definition: Grid.hpp:156
vector< OCP_DBL > dz
Size of cell in z-direction: numGrid.
Definition: Grid.hpp:164
void SetHexaherdronGridOrthogonal()
setup polyhedronGrid for orthogonal grid
Definition: Grid.cpp:352
USI nz
Number of cells in z-direction.
Definition: Grid.hpp:147
vector< OCPpolyhedron > polyhedronGrid
Coordinates of grid points.
Definition: Grid.hpp:219
vector< USI > gridTag
Tag of grid: dead, live(fluid), live(rock)
Definition: Grid.hpp:220
void SetupNeighborCornerGrid(const OCP_COORD &CoTmp)
Setup the neighboring info for a corner-point grid.
Definition: Grid.cpp:221
vector< OCP_DBL > zcorn
ZValues of a corner-point grid.
Definition: Grid.hpp:151
vector< GB_Pair > map_All2Flu
Mapping from all grid to fluid grid: numGrid.
Definition: Grid.hpp:196
vector< OCP_DBL > coord
Lines of a corner-point grid.
Definition: Grid.hpp:150
void CalActiveGridIsoT(const OCP_DBL &e1, const OCP_DBL &e2)
Calculate the activity of grid cells.
Definition: Grid.cpp:250
void Setup()
Setup the grid information and calculate the properties.
Definition: Grid.cpp:97
void OutputBaiscInfo() const
Calculate and return basic informations for grid.
Definition: Grid.cpp:435
vector< OCP_DBL > thconr
Rock if Thermal conductivity: numGrid.
Definition: Grid.hpp:174
void InputParam(const ParamReservoir &rs_param, const ParamOutput &output_param)
Input parameters from the internal param structure.
Definition: Grid.cpp:18
void SetupOrthogonalGrid()
Setup orthogonal grid.
Definition: Grid.cpp:114
vector< OCP_DBL > poro
Initial porosity of rock cells: numGrid.
Definition: Grid.hpp:170
USI ny
Number of cells in y-direction.
Definition: Grid.hpp:146
vector< OCP_DBL > dy
Size of cell in y-direction: numGrid.
Definition: Grid.hpp:163
void SetupT()
Setup for thermal model.
Definition: Grid.cpp:89
vector< GB_Pair > map_All2Act
Mapping from grid to active all grid: numGrid.
Definition: Grid.hpp:193
vector< OCP_DBL > tops
Depth of center of grid cells: numGrid.
Definition: Grid.hpp:159
vector< OCP_DBL > dx
Size of cell in x-direction: numGrid.
Definition: Grid.hpp:162
OCP_USI numGrid
Number of all cells.
Definition: Grid.hpp:142
vector< OCP_DBL > ntg
Net to gross ratio of cells: numGrid.
Definition: Grid.hpp:169
void CalDepthVOrthogonalGrid()
Calculate the depth and volume for orthogonal grid.
Definition: Grid.cpp:123
void SetupIsoT()
Setup for Isothermal model.
Definition: Grid.cpp:82
vector< vector< GPair > > gNeighbor
Neighboring information of grid.
Definition: Grid.hpp:187
void SetupGridLocation()
Setup Grid location for Structured grid.
Definition: Grid.cpp:311
void SetupNeighborOrthogonalGrid()
Setup the neighboring info for an orthogonal grid.
Definition: Grid.cpp:149
vector< OCP_DBL > kx
Absolute permeability in x-direction: numGrid.
Definition: Grid.hpp:171
Record the initial grid information, all of grids are contained.
Definition: Grid.hpp:75
OutputVTKParam outVTKParam
See OutputVTKParam.
vector< OCP_DBL > permY
Permeability along the y-direction for each grid.
vector< OCP_DBL > zcorn
TODO: Add Doxygen.
Type_A_r< OCP_DBL > SATNUM
Records the index of SAT region for each grid.
Type_A_r< OCP_DBL > ACTNUM
Records the index of Active region for each grid.
vector< OCP_DBL > poro
Porosity for each grid.
vector< OCP_DBL > dy
Size along the y - direction for each grid.
vector< OCP_DBL > permX
Permeability along the x - direction for each grid.
vector< OCP_DBL > permZ
Permeability along the z-direction for each grid.
vector< OCP_DBL > dx
Size along the x - direction for each grid.
vector< OCP_DBL > tops
Depth of the top surface of the uppermost grids.
Type_A_r< OCP_DBL > PVTNUM
Records the index of PVT region for each grid.
vector< OCP_DBL > ntg
Net to gross for each grid.
vector< OCP_DBL > thconr
Rock ifThermal conductivity.
vector< OCP_DBL > coord
TODO: Add Doxygen.
Dimens dimens
Dimension of grid: the number of grids along x,y,z direction.
Type_A_r< OCP_DBL > ROCKNUM
Records the index of ROCK region for each grid.
vector< OCP_DBL > dz
Size along the z - direction for each grid.
vector< OCP_DBL > Swat
Initial water saturation in each grid.
OCP_USI numGrid
Num of grids.
A point in 3D.
Definition: CornerGrid.hpp:47
OCP_BOOL activity
If OCP_FALSE, this param is not given.
vector< T > data
Data of param.