2016-12-02 13:23:35 +01:00
|
|
|
import unittest
|
2019-08-12 08:36:00 +02:00
|
|
|
import opm
|
2019-09-14 23:04:26 +02:00
|
|
|
from opm.io.parser import Parser
|
|
|
|
|
from opm.io.ecl_state import EclipseState
|
|
|
|
|
from opm.io.schedule import Schedule
|
2019-10-28 20:16:13 +01:00
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
from tests.utils import test_path
|
|
|
|
|
except ImportError:
|
|
|
|
|
from utils import test_path
|
2019-09-14 23:04:26 +02:00
|
|
|
|
|
|
|
|
def injector(well):
|
|
|
|
|
return well.isinjector()
|
|
|
|
|
|
|
|
|
|
def producer(well):
|
|
|
|
|
return well.isproducer()
|
|
|
|
|
|
|
|
|
|
def defined(timestep):
|
|
|
|
|
def fn(well): return well.isdefined(timestep)
|
|
|
|
|
return fn
|
|
|
|
|
|
|
|
|
|
def open_at_1(well):
|
|
|
|
|
return well.status() == 'OPEN'
|
|
|
|
|
|
|
|
|
|
def closed(well):
|
|
|
|
|
return well.status() == 'SHUT'
|
|
|
|
|
|
2016-12-02 13:23:35 +01:00
|
|
|
|
|
|
|
|
class TestWells(unittest.TestCase):
|
2017-01-10 17:58:43 +01:00
|
|
|
|
2019-10-25 09:14:15 +02:00
|
|
|
|
2017-12-06 17:31:57 +01:00
|
|
|
@classmethod
|
|
|
|
|
def setUpClass(cls):
|
2019-10-25 09:48:30 +02:00
|
|
|
deck = Parser().parse(test_path('spe3/SPE3CASE1.DATA'))
|
2019-09-14 23:04:26 +02:00
|
|
|
state = EclipseState(deck)
|
|
|
|
|
cls.sch = Schedule( deck, state )
|
2018-02-14 17:27:18 +01:00
|
|
|
cls.timesteps = cls.sch.timesteps
|
2016-12-02 13:23:35 +01:00
|
|
|
|
2019-06-19 13:51:43 +02:00
|
|
|
def inje(self, wells):
|
2019-09-14 23:04:26 +02:00
|
|
|
return next(iter(filter(injector, wells)))
|
2016-12-11 12:01:53 +01:00
|
|
|
|
2019-06-19 13:51:43 +02:00
|
|
|
def prod(self, wells):
|
2019-09-14 23:04:26 +02:00
|
|
|
return next(iter(filter(producer, wells)))
|
|
|
|
|
|
2016-12-11 12:01:53 +01:00
|
|
|
|
2016-12-02 13:23:35 +01:00
|
|
|
def testWellPos0(self):
|
2019-06-19 13:51:43 +02:00
|
|
|
wells = self.sch.get_wells(0)
|
|
|
|
|
well = wells[0]
|
2019-09-14 23:04:26 +02:00
|
|
|
print( well.pos() )
|
2016-12-11 01:17:17 +01:00
|
|
|
i, j, refdepth = well.pos()
|
2016-12-02 13:23:35 +01:00
|
|
|
|
|
|
|
|
self.assertEqual(6, i)
|
|
|
|
|
self.assertEqual(6, j)
|
|
|
|
|
self.assertEqual(2247.9, refdepth)
|
2016-12-10 21:22:16 +01:00
|
|
|
|
2016-12-11 11:45:36 +01:00
|
|
|
def testWellStatus(self):
|
2019-06-19 13:51:43 +02:00
|
|
|
wells = self.sch.get_wells(0)
|
|
|
|
|
for well in wells:
|
|
|
|
|
self.assertEqual("OPEN", well.status())
|
2016-12-11 11:45:36 +01:00
|
|
|
|
2016-12-11 12:01:53 +01:00
|
|
|
def testGroupName(self):
|
2019-06-19 13:51:43 +02:00
|
|
|
wells = self.sch.get_wells(0)
|
|
|
|
|
for well in wells:
|
|
|
|
|
self.assertEqual("G1", well.group())
|
2016-12-11 12:01:53 +01:00
|
|
|
|
|
|
|
|
def testPreferredPhase(self):
|
2019-06-19 13:51:43 +02:00
|
|
|
wells = self.sch.get_wells(0)
|
2019-09-14 23:04:26 +02:00
|
|
|
for well in wells:
|
|
|
|
|
self.assertTrue("GAS", well.preferred_phase)
|
2016-12-11 12:01:53 +01:00
|
|
|
|
|
|
|
|
def testGuideRate(self):
|
2019-06-19 13:51:43 +02:00
|
|
|
wells = self.sch.get_wells(1)
|
|
|
|
|
inje, prod = self.inje(wells), self.prod(wells)
|
|
|
|
|
self.assertEqual(-1.0, inje.guide_rate())
|
|
|
|
|
self.assertEqual(-1.0, prod.guide_rate())
|
2016-12-11 12:01:53 +01:00
|
|
|
|
2019-06-19 13:51:43 +02:00
|
|
|
wells = self.sch.get_wells(14)
|
|
|
|
|
inje, prod = self.inje(wells), self.prod(wells)
|
|
|
|
|
self.assertEqual(-1.0, inje.guide_rate())
|
|
|
|
|
self.assertEqual(-1.0, prod.guide_rate())
|
2016-12-11 12:01:53 +01:00
|
|
|
|
|
|
|
|
def testGroupControl(self):
|
2019-06-19 13:51:43 +02:00
|
|
|
wells = self.sch.get_wells(1)
|
|
|
|
|
inje, prod = self.inje(wells), self.prod(wells)
|
|
|
|
|
self.assertTrue(inje.available_gctrl())
|
|
|
|
|
self.assertTrue(prod.available_gctrl())
|
2016-12-11 12:01:53 +01:00
|
|
|
|
2019-06-19 13:51:43 +02:00
|
|
|
wells = self.sch.get_wells(14)
|
|
|
|
|
inje, prod = self.inje(wells), self.prod(wells)
|
|
|
|
|
self.assertTrue(inje.available_gctrl())
|
|
|
|
|
self.assertTrue(prod.available_gctrl())
|
2016-12-11 12:01:53 +01:00
|
|
|
|
2016-12-10 21:22:16 +01:00
|
|
|
def testWellDefinedFilter(self):
|
2019-10-25 09:14:15 +02:00
|
|
|
|
2019-09-14 23:04:26 +02:00
|
|
|
defined0 = list(filter(defined(0), self.sch.get_wells(0) ))
|
|
|
|
|
defined1 = list(filter(defined(1), self.sch.get_wells(1) ))
|
2016-12-10 21:22:16 +01:00
|
|
|
self.assertEqual(len(list(defined0)), 2)
|
|
|
|
|
self.assertEqual(len(list(defined1)), 2)
|
|
|
|
|
|
|
|
|
|
def testWellProdInjeFilter(self):
|
2019-09-14 23:04:26 +02:00
|
|
|
inje = list(filter(injector, self.sch.get_wells(0) ))
|
|
|
|
|
prod = list(filter(producer, self.sch.get_wells(0) ))
|
2016-12-10 21:22:16 +01:00
|
|
|
|
2016-12-11 01:17:17 +01:00
|
|
|
self.assertEqual(len(inje), 1)
|
|
|
|
|
self.assertEqual(len(prod), 1)
|
|
|
|
|
|
|
|
|
|
self.assertEqual(inje[0].name, "INJ")
|
|
|
|
|
self.assertEqual(prod[0].name, "PROD")
|
2016-12-18 10:51:17 +01:00
|
|
|
|
|
|
|
|
def testOpenFilter(self):
|
2019-08-19 15:42:24 +02:00
|
|
|
wells = self.sch.get_wells(1)
|
2019-06-19 13:51:43 +02:00
|
|
|
|
2019-09-14 23:04:26 +02:00
|
|
|
flowing_list = list(filter(open_at_1, wells))
|
|
|
|
|
closed_list = list(filter(lambda well: not open_at_1(well), wells))
|
|
|
|
|
|
|
|
|
|
self.assertEqual(2, len(flowing_list))
|
|
|
|
|
self.assertEqual(0, len(closed_list))
|
2016-12-18 10:51:17 +01:00
|
|
|
|
2019-09-14 23:04:26 +02:00
|
|
|
flowing1_list = list(filter(lambda well: not closed(well), wells))
|
|
|
|
|
closed1_list = list(filter(closed, wells))
|
|
|
|
|
self.assertListEqual(list(closed_list), list(closed1_list))
|
2016-12-18 10:51:17 +01:00
|
|
|
|
2017-01-12 17:17:01 +01:00
|
|
|
|
|
|
|
|
def testCompletions(self):
|
2019-06-19 13:51:43 +02:00
|
|
|
num_steps = len( self.sch.timesteps )
|
|
|
|
|
w0 = self.sch.get_wells(num_steps - 1)[0]
|
|
|
|
|
c0,c1 = w0.connections()
|
2019-10-25 09:48:30 +02:00
|
|
|
|
2017-12-05 17:48:07 +01:00
|
|
|
self.assertEqual((6,6,2), c0.pos)
|
|
|
|
|
self.assertEqual((6,6,3), c1.pos)
|
2018-02-07 13:09:46 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
unittest.main()
|