File: test_props.py

package info (click to toggle)
opm-common 2025.10%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 96,920 kB
  • sloc: cpp: 291,772; python: 3,609; sh: 198; xml: 174; pascal: 136; makefile: 12
file content (124 lines) | stat: -rw-r--r-- 4,186 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import unittest
import opm.io
import numpy as np

from opm.io.parser import Parser
from opm.io.ecl_state import EclipseState
try:
    from tests.utils import test_path
except ImportError:
    from utils import test_path


class TestProps(unittest.TestCase):

    def assertClose(self, expected, observed, epsilon=1e-08):
        diff = abs(expected - observed)
        err_msg = '|%g - %g| = %g > %g' % (expected, observed, diff, epsilon)
        self.assertTrue(diff <= epsilon, msg=err_msg)

    def setUp(self):
        parser = Parser()
        deck = parser.parse(test_path('spe3/SPE3CASE1.DATA'))
        self.spe3 = EclipseState(deck)
        self.props = self.spe3.field_props()

    def test_contains(self):
        p = self.props
        self.assertTrue('PORO'  in p)
        self.assertFalse('NONO' in p)
        self.assertTrue('PORV' in p) # auto generated

    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))

    def test_permx_values(self):
        def md2si(md):
            #millidarcy->SI
            return md * 1e-3 * 9.869233e-13
        e3dp  = self.props

        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)}
        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)
                    perm  = permx[g_idx]
                    darcy = darcys[k]
                    self.assertClose(darcy, perm)

    def test_volume(self):
        exp = 293.3 * 293.3 * 30  # cubicfeet = 73 078.6084 cubic meter
        exp *= (12*0.0254)**3  # cubic feet to cubic meter
        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)
                    if k == 0:
                        self.assertClose(exp, grid.getCellVolume(g_idx))
                    self.assertEqual(grid.getCellVolume(g_idx), grid.getCellVolume(i, j, k))

        celVol1 = grid.getCellVolume()
        self.assertTrue(isinstance(celVol1, np.ndarray))
        self.assertEqual(celVol1.dtype, "float64")
        self.assertEqual(len(celVol1), grid.nx*grid.ny*grid.nz)

        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))



if __name__ == "__main__":
    unittest.main()