added getCellVolume on sunbeam.grid
This commit is contained in:
@@ -81,6 +81,18 @@ class EclipseGrid(object):
|
||||
def getNZ(self):
|
||||
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):
|
||||
x,y,z = self._getXYZ()
|
||||
g = self.cartesianSize()
|
||||
|
||||
@@ -122,6 +122,12 @@ py::tuple getIJK( const EclipseGrid& grid, int g ) {
|
||||
const auto& ijk = grid.getIJK(g);
|
||||
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 {
|
||||
@@ -287,6 +293,8 @@ py::class_< EclipseGrid >( "EclipseGrid", py::no_init )
|
||||
.def( "cartesianSize", grid::getCartesianSize )
|
||||
.def( "globalIndex", grid::getGlobalIndex )
|
||||
.def( "getIJK", grid::getIJK )
|
||||
.def( "_cellVolume1G", grid::cellVolume1G)
|
||||
.def( "_cellVolume3", grid::cellVolume3)
|
||||
;
|
||||
|
||||
py::class_< Eclipse3DProperties >( "Eclipse3DProperties", py::no_init )
|
||||
|
||||
@@ -4,10 +4,10 @@ import sunbeam
|
||||
class TestProps(unittest.TestCase):
|
||||
spe3 = None
|
||||
|
||||
def assertClose(self, expected, observed, epsilon=1e-18):
|
||||
def assertClose(self, expected, observed, epsilon=1e-08):
|
||||
diff = abs(expected - observed)
|
||||
if diff > epsilon:
|
||||
raise AssertionError('|%g - %g| = %g > %g' % (expected, observed, diff, epsilon))
|
||||
err_msg = '|%g - %g| = %g > %g' % (expected, observed, diff, epsilon)
|
||||
self.assertTrue(diff <= epsilon, msg=err_msg)
|
||||
|
||||
def setUp(self):
|
||||
if self.spe3 is None:
|
||||
@@ -55,3 +55,16 @@ class TestProps(unittest.TestCase):
|
||||
perm = permx[g_idx]
|
||||
darcy = darcys[k]
|
||||
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