Rewrite EclFile wrapping

- Include the eclipse_io.cpp file in existing extension library - do not create
   a new library.

 - Remove Python class EclFile - just expose the C++ through Pybind1, include
   some monkey-patching of the class to ensure proper Python strings for CHAR
   keywords.

 - Remove string based keyword lookup.

 - Use standard Python methods __len__, __getitem__ and __contains__; get() is
   an equivalent alternative to __getitem__().

 - Add property arrays in addition to getListOfArrays()
This commit is contained in:
Joakim Hove
2019-10-30 22:38:23 +01:00
parent 629606c5d8
commit d66852d8de
9 changed files with 101 additions and 154 deletions

View File

@@ -10,37 +10,45 @@ except ImportError:
def array_index(ecl_file, target_kw):
index_list = []
for index,kw in enumerate(ecl_file.arrays):
if kw[0] == target_kw:
index_list.append(index)
return index_list
class TestEclFile(unittest.TestCase):
def test_getListOfArrays(self):
def test_arrays(self):
refList=["INTEHEAD","LOGIHEAD","DOUBHEAD","PORV","DEPTH","DX","DY","DZ","PORO",
"PERMX","PERMY", "PERMZ","NTG","TRANX","TRANY","TRANZ","TABDIMS","TAB",
"ACTNUM","EQLNUM","FIPNUM","PVTNUM","SATNUM","TRANNNC"]
self.assertRaises(ValueError, EclFile, "/file/that/does_not_exists")
self.assertEqual(file2uf.getNumArrays(), 24)
file2uf = EclFile(test_path("data/SPE9.INIT"))
file2uf = EclFile(test_path("data/SPE9.INIT"), preload=False)
self.assertEqual(len(file2uf), 24)
arrList = file2uf.getListOfArrays()
arrList = [ x[0] for x in file2uf.arrays ]
self.assertEqual(arrList, refList)
self.assertEqual(file2f.getNumArrays(), 24)
file2f = EclFile(test_path("data/SPE9.FINIT"))
self.assertEqual(len(file2f), 24)
def test_get_function(self):
file1 = EclFile(test_path("data/SPE9.INIT"))
file1 = EclFile(test_path("data/SPE9.INIT"), preload=True)
first = file1.get(0)
first = file1[0]
self.assertEqual(len(first), 95)
# get fourth array in file SPE9.INIT which is PORV
test1 = file1.get(3)
test2 = file1.get("PORV")
#fourth array in file SPE9.INIT which is PORV
test1 = file1[3]
porv_index = array_index(file1, "PORV")[0]
test2 = file1[porv_index]
for val1, val2 in zip(test1, test2):
self.assertEqual(val1, val2)
@@ -52,49 +60,52 @@ class TestEclFile(unittest.TestCase):
dzList=[20.0, 15.0, 26.0, 15.0, 16.0, 14.0, 8.0, 8.0, 18.0, 12.0, 19.0, 18.0, 20.0, 50.0, 100.0]
poroList = [0.087, 0.097, 0.111, 0.16, 0.13, 0.17, 0.17, 0.08, 0.14, 0.13, 0.12, 0.105, 0.12, 0.116, 0.157]
ft3_to_bbl = 0.1781076
refporv = []
for poro, dz in zip(dzList, poroList):
for i in range(0,600):
refporv.append(300.0*300.0*dz*poro*ft3_to_bbl)
self.assertTrue(file1.hasArray("PORV"))
porv_np = file1.get("PORV")
self.assertTrue("PORV" in file1)
porv_index = array_index(file1, "PORV")[0]
porv_np = file1[porv_index]
self.assertEqual(len(porv_np), 9000)
self.assertTrue(isinstance(porv_np, np.ndarray))
self.assertEqual(porv_np.dtype, "float32")
porv_list = file1.get("PORV")
porv_list = file1[porv_index]
for val1, val2 in zip(porv_np, refporv):
self.assertLess(abs(1.0 - val1/val2), 1e-6)
def test_get_function_double(self):
refTabData=[0.147E+02, 0.2E+21, 0.4E+03, 0.2E+21, 0.8E+03, 0.2E+21, 0.12E+04, 0.2E+21, 0.16E+04, 0.2E+21, 0.2E+04, 0.2E+21, 0.24E+04, 0.2E+21, 0.28E+04, 0.2E+21, 0.32E+04, 0.2E+21, 0.36E+04, 0.2E+21, 0.4E+04, 0.5E+04, 0.1E+01, 0.2E+21, 0.98814229249012E+00, 0.2E+21, 0.97513408093613E+00]
tab = file1.get("TAB")
file1 = EclFile(test_path("data/SPE9.INIT"))
tab_index = array_index(file1, "TAB")[0]
tab = file1[tab_index]
self.assertTrue(isinstance(tab, np.ndarray))
self.assertEqual(tab.dtype, "float64")
for i in range(0, len(refTabData)):
self.assertLess(abs(1.0 - refTabData[i]/tab[i]), 1e-12 )
def test_get_function_integer(self):
refTabdims = [ 885, 1, 1, 1, 1, 1, 1, 67, 11, 2, 1, 78, 1, 78, 78, 0, 0, 0, 83, 1, 686, 40, 1, 86, 40, 1,
refTabdims = [ 885, 1, 1, 1, 1, 1, 1, 67, 11, 2, 1, 78, 1, 78, 78, 0, 0, 0, 83, 1, 686, 40, 1, 86, 40, 1,
286, 1, 80, 1 ]
tabdims = file1.get("TABDIMS")
file1 = EclFile(test_path("data/SPE9.INIT"))
tabdims_index = array_index(file1, "TABDIMS")[0]
tabdims = file1[tabdims_index]
self.assertTrue(isinstance(tabdims, np.ndarray))
self.assertEqual(tabdims.dtype, "int32")
@@ -107,25 +118,28 @@ class TestEclFile(unittest.TestCase):
file1 = EclFile(test_path("data/9_EDITNNC.INIT"))
self.assertTrue(file1.hasArray("LOGIHEAD"))
logih = file1.get("LOGIHEAD")
self.assertTrue("LOGIHEAD" in file1)
logih_index = array_index(file1, "LOGIHEAD")[0]
logih = file1[logih_index]
self.assertEqual(len(logih), 121)
self.assertEqual(logih[0], True)
self.assertEqual(logih[2], False)
self.assertEqual(logih[8], True)
def test_get_function_char(self):
self.assertTrue(file1.hasArray("KEYWORDS"))
keyw = file1.get("KEYWORDS")
file1 = EclFile(test_path("data/9_EDITNNC.SMSPEC"))
self.assertTrue("KEYWORDS" in file1)
kw_index = array_index(file1, "KEYWORDS")[0]
keyw = file1[kw_index]
self.assertEqual(len(keyw), 312)
self.assertEqual(keyw[0], "TIME")
self.assertEqual(keyw[16], "FWCT")
if __name__ == "__main__":
unittest.main()