added getCellVolume on sunbeam.grid
This commit is contained in:
@@ -81,6 +81,18 @@ class EclipseGrid(object):
|
|||||||
def getNZ(self):
|
def getNZ(self):
|
||||||
return self._getXYZ()[2]
|
return self._getXYZ()[2]
|
||||||
|
|
||||||
|
def getCellVolume(self, global_idx=None, i_idx=None, j_idx=None, k_idx=None):
|
||||||
|
if global_idx is not None:
|
||||||
|
if set([i_idx, j_idx, k_idx]) != set([None]):
|
||||||
|
raise ValueError('Specify exactly one of global and all three i,j,k.')
|
||||||
|
return self._cellVolume1G(global_idx)
|
||||||
|
if None in [i_idx, j_idx, k_idx]:
|
||||||
|
raise ValueError('If not global_idx, need all three of i_idx, j_idx, and k_idx.')
|
||||||
|
return self._cellVolume3(i_idx, j_idx, k_idx)
|
||||||
|
|
||||||
|
def eclGrid(self):
|
||||||
|
return self._ecl_grid_ptr()
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
x,y,z = self._getXYZ()
|
x,y,z = self._getXYZ()
|
||||||
g = self.cartesianSize()
|
g = self.cartesianSize()
|
||||||
|
|||||||
@@ -122,6 +122,12 @@ py::tuple getIJK( const EclipseGrid& grid, int g ) {
|
|||||||
const auto& ijk = grid.getIJK(g);
|
const auto& ijk = grid.getIJK(g);
|
||||||
return py::make_tuple(ijk[0], ijk[1], ijk[2]);
|
return py::make_tuple(ijk[0], ijk[1], ijk[2]);
|
||||||
}
|
}
|
||||||
|
double cellVolume1G( const EclipseGrid& grid, size_t glob_idx) {
|
||||||
|
return grid.getCellVolume(glob_idx);
|
||||||
|
}
|
||||||
|
double cellVolume3( const EclipseGrid& grid, size_t i_idx, size_t j_idx, size_t k_idx) {
|
||||||
|
return grid.getCellVolume(i_idx, j_idx, k_idx);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace props {
|
namespace props {
|
||||||
@@ -287,6 +293,8 @@ py::class_< EclipseGrid >( "EclipseGrid", py::no_init )
|
|||||||
.def( "cartesianSize", grid::getCartesianSize )
|
.def( "cartesianSize", grid::getCartesianSize )
|
||||||
.def( "globalIndex", grid::getGlobalIndex )
|
.def( "globalIndex", grid::getGlobalIndex )
|
||||||
.def( "getIJK", grid::getIJK )
|
.def( "getIJK", grid::getIJK )
|
||||||
|
.def( "_cellVolume1G", grid::cellVolume1G)
|
||||||
|
.def( "_cellVolume3", grid::cellVolume3)
|
||||||
;
|
;
|
||||||
|
|
||||||
py::class_< Eclipse3DProperties >( "Eclipse3DProperties", py::no_init )
|
py::class_< Eclipse3DProperties >( "Eclipse3DProperties", py::no_init )
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ import sunbeam
|
|||||||
class TestProps(unittest.TestCase):
|
class TestProps(unittest.TestCase):
|
||||||
spe3 = None
|
spe3 = None
|
||||||
|
|
||||||
def assertClose(self, expected, observed, epsilon=1e-18):
|
def assertClose(self, expected, observed, epsilon=1e-08):
|
||||||
diff = abs(expected - observed)
|
diff = abs(expected - observed)
|
||||||
if diff > epsilon:
|
err_msg = '|%g - %g| = %g > %g' % (expected, observed, diff, epsilon)
|
||||||
raise AssertionError('|%g - %g| = %g > %g' % (expected, observed, diff, epsilon))
|
self.assertTrue(diff <= epsilon, msg=err_msg)
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
if self.spe3 is None:
|
if self.spe3 is None:
|
||||||
@@ -55,3 +55,16 @@ class TestProps(unittest.TestCase):
|
|||||||
perm = permx[g_idx]
|
perm = permx[g_idx]
|
||||||
darcy = darcys[k]
|
darcy = darcys[k]
|
||||||
self.assertClose(darcy, perm)
|
self.assertClose(darcy, perm)
|
||||||
|
|
||||||
|
def test_volume(self):
|
||||||
|
e3dp = self.props
|
||||||
|
grid = self.spe3.grid()
|
||||||
|
for i in range(grid.getNX()):
|
||||||
|
for j in range(grid.getNY()):
|
||||||
|
for k in range(grid.getNZ()):
|
||||||
|
g_idx = grid.globalIndex(i,j,k)
|
||||||
|
exp = 293.3 * 293.3 * 30 # cubicfeet = 73 078.6084 cubic meter
|
||||||
|
exp *= (12*0.0254)**3 # cubic feet to cubic meter
|
||||||
|
if k == 0:
|
||||||
|
self.assertClose(exp, grid.getCellVolume(g_idx))
|
||||||
|
self.assertEqual(grid.getCellVolume(g_idx), grid.getCellVolume(None, i, j, k))
|
||||||
|
|||||||
Reference in New Issue
Block a user