2017-01-10 17:58:43 +01:00
|
|
|
import unittest
|
2019-08-23 10:25:54 +02:00
|
|
|
import opm.io
|
2020-01-05 18:10:09 +01:00
|
|
|
import numpy as np
|
2017-01-10 17:58:43 +01:00
|
|
|
|
2019-09-13 15:38:00 +02:00
|
|
|
from opm.io.parser import Parser
|
2020-01-13 15:46:06 +01:00
|
|
|
from opm.io.ecl_state import EclipseState
|
2019-10-28 20:16:13 +01:00
|
|
|
try:
|
|
|
|
|
from tests.utils import test_path
|
|
|
|
|
except ImportError:
|
|
|
|
|
from utils import test_path
|
2019-09-13 15:38:00 +02:00
|
|
|
|
|
|
|
|
|
2017-01-10 17:58:43 +01:00
|
|
|
class TestProps(unittest.TestCase):
|
|
|
|
|
|
2017-03-31 12:19:39 +02:00
|
|
|
def assertClose(self, expected, observed, epsilon=1e-08):
|
2017-01-12 16:02:09 +01:00
|
|
|
diff = abs(expected - observed)
|
2017-03-31 12:19:39 +02:00
|
|
|
err_msg = '|%g - %g| = %g > %g' % (expected, observed, diff, epsilon)
|
|
|
|
|
self.assertTrue(diff <= epsilon, msg=err_msg)
|
2017-01-12 16:02:09 +01:00
|
|
|
|
2017-01-10 17:58:43 +01:00
|
|
|
def setUp(self):
|
2019-09-13 15:38:00 +02:00
|
|
|
parser = Parser()
|
2019-10-25 09:48:30 +02:00
|
|
|
deck = parser.parse(test_path('spe3/SPE3CASE1.DATA'))
|
|
|
|
|
self.spe3 = EclipseState(deck)
|
2020-01-13 15:46:06 +01:00
|
|
|
self.props = self.spe3.field_props()
|
2019-10-25 09:48:30 +02:00
|
|
|
|
2017-01-10 17:58:43 +01:00
|
|
|
def test_contains(self):
|
|
|
|
|
p = self.props
|
|
|
|
|
self.assertTrue('PORO' in p)
|
|
|
|
|
self.assertFalse('NONO' in p)
|
2017-02-17 16:09:24 +01:00
|
|
|
self.assertTrue('PORV' in p) # auto generated
|
2017-01-10 17:58:43 +01:00
|
|
|
|
|
|
|
|
def test_getitem(self):
|
|
|
|
|
p = self.props
|
|
|
|
|
poro = p['PORO']
|
|
|
|
|
self.assertEqual(324, len(poro))
|
|
|
|
|
self.assertEqual(0.13, poro[0])
|
|
|
|
|
self.assertTrue( 'PERMX' in p )
|
|
|
|
|
px = p['PERMX']
|
|
|
|
|
print(len(px))
|
|
|
|
|
self.assertEqual(324, len(px))
|
|
|
|
|
|
2017-01-12 16:02:09 +01:00
|
|
|
def test_permx_values(self):
|
|
|
|
|
def md2si(md):
|
2019-09-12 15:56:31 +02:00
|
|
|
#millidarcy->SI
|
2017-01-12 16:02:09 +01:00
|
|
|
return md * 1e-3 * 9.869233e-13
|
|
|
|
|
e3dp = self.props
|
2019-10-25 09:48:30 +02:00
|
|
|
|
2017-01-12 16:02:09 +01:00
|
|
|
grid = self.spe3.grid()
|
|
|
|
|
permx = e3dp['PERMX']
|
|
|
|
|
print('set(PERMX) = %s' % set(permx))
|
|
|
|
|
# 130mD, 40mD, 20mD, and 150mD, respectively, top to bottom
|
|
|
|
|
darcys = {0:md2si(130), 1:md2si(40), 2:md2si(20), 3:md2si(150)}
|
2019-09-13 15:38:00 +02:00
|
|
|
for i in range(grid.nx):
|
|
|
|
|
for j in range(grid.ny):
|
|
|
|
|
for k in range(grid.nz):
|
2017-01-12 16:02:09 +01:00
|
|
|
g_idx = grid.globalIndex(i,j,k)
|
|
|
|
|
perm = permx[g_idx]
|
|
|
|
|
darcy = darcys[k]
|
|
|
|
|
self.assertClose(darcy, perm)
|
2019-10-25 09:48:30 +02:00
|
|
|
|
2017-03-31 12:19:39 +02:00
|
|
|
def test_volume(self):
|
2020-01-05 18:10:09 +01:00
|
|
|
exp = 293.3 * 293.3 * 30 # cubicfeet = 73 078.6084 cubic meter
|
|
|
|
|
exp *= (12*0.0254)**3 # cubic feet to cubic meter
|
2017-03-31 12:19:39 +02:00
|
|
|
grid = self.spe3.grid()
|
2019-09-13 15:38:00 +02:00
|
|
|
for i in range(grid.nx):
|
|
|
|
|
for j in range(grid.ny):
|
|
|
|
|
for k in range(grid.nz):
|
2017-03-31 12:19:39 +02:00
|
|
|
g_idx = grid.globalIndex(i,j,k)
|
|
|
|
|
if k == 0:
|
|
|
|
|
self.assertClose(exp, grid.getCellVolume(g_idx))
|
2019-09-13 15:38:00 +02:00
|
|
|
self.assertEqual(grid.getCellVolume(g_idx), grid.getCellVolume(i, j, k))
|
2019-10-25 09:48:30 +02:00
|
|
|
|
2020-01-05 18:10:09 +01:00
|
|
|
celVol1 = grid.getCellVolume()
|
|
|
|
|
self.assertTrue(isinstance(celVol1, np.ndarray))
|
|
|
|
|
self.assertEqual(celVol1.dtype, "float64")
|
|
|
|
|
self.assertEqual(len(celVol1), grid.nx*grid.ny*grid.nz)
|
2017-12-11 12:57:22 +01:00
|
|
|
|
2020-01-05 18:10:09 +01:00
|
|
|
mask = [0] * (grid.nx*grid.ny*grid.nz)
|
|
|
|
|
for ind in [0,10,11,12,15]:
|
|
|
|
|
mask[ind]=1
|
|
|
|
|
|
|
|
|
|
self.assertEqual(len(mask), grid.nx*grid.ny*grid.nz)
|
|
|
|
|
self.assertEqual(sum(mask), 5)
|
|
|
|
|
|
|
|
|
|
celVol2 = grid.getCellVolume(mask)
|
|
|
|
|
self.assertEqual(len(celVol2), grid.nx*grid.ny*grid.nz)
|
|
|
|
|
self.assertClose(exp, sum(celVol2)/5.0)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_depth(self):
|
|
|
|
|
|
|
|
|
|
refDepth = np.array([7330.0, 7360.0, 7400.0, 7450.0], dtype="float64")
|
|
|
|
|
|
|
|
|
|
grid = self.spe3.grid()
|
|
|
|
|
for i in range(grid.nx):
|
|
|
|
|
for j in range(grid.ny):
|
|
|
|
|
for k in range(grid.nz):
|
|
|
|
|
g_idx = grid.globalIndex(i,j,k)
|
|
|
|
|
exp = refDepth[k] * 12*0.0254
|
|
|
|
|
g_idx = grid.globalIndex(i,j,k)
|
|
|
|
|
self.assertClose(exp, grid.getCellDepth(g_idx))
|
|
|
|
|
self.assertClose(exp, grid.getCellDepth(i, j, k))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
depth1 = grid.getCellDepth()
|
|
|
|
|
self.assertTrue(isinstance(depth1, np.ndarray))
|
|
|
|
|
self.assertEqual(depth1.dtype, "float64")
|
|
|
|
|
self.assertEqual(len(depth1), grid.nx*grid.ny*grid.nz)
|
|
|
|
|
|
|
|
|
|
mask = [0] * (grid.nx*grid.ny*grid.nz)
|
|
|
|
|
for k in range(grid.nz):
|
|
|
|
|
mask[grid.globalIndex(0, 0, k)]=1
|
|
|
|
|
|
|
|
|
|
self.assertEqual(len(mask), grid.nx*grid.ny*grid.nz)
|
|
|
|
|
self.assertEqual(sum(mask), grid.nz)
|
|
|
|
|
|
|
|
|
|
depth2 = grid.getCellDepth(mask)
|
|
|
|
|
self.assertEqual(len(depth2), grid.nx*grid.ny*grid.nz)
|
|
|
|
|
self.assertClose(sum(refDepth)*12*0.0254, sum(depth2))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-12-11 12:57:22 +01:00
|
|
|
if __name__ == "__main__":
|
|
|
|
|
unittest.main()
|