def test_gensatfunc(): """Test how the external tool gen_satfunc could use the factory functionality""" factory = PyscalFactory() # Example config line for gen_satfunc: conf_line_pc = "RELPERM 4 2 1 3 2 1 0.15 0.10 0.5 20 100 0.2 0.22 -0.5 30" wateroil = factory.create_water_oil(parse_gensatfuncline(conf_line_pc)) swof = wateroil.SWOF() assert "0.17580" in swof # krw at sw=0.65 assert "0.0127" in swof # krow at sw=0.65 assert "Capillary pressure from normalized J-function" in swof assert "2.0669" in swof # pc at swl conf_line_min = "RELPERM 1 2 3 1 2 3 0.1 0.15 0.5 20" wateroil = factory.create_water_oil(parse_gensatfuncline(conf_line_min)) swof = wateroil.SWOF() assert "Zero capillary pressure" in swof conf_line_few = "RELPERM 1 2 3 1 2 3" with pytest.raises(ValueError): parse_gensatfuncline(conf_line_few) # sigma_costau is missing here: conf_line_almost_pc = "RELPERM 4 2 1 3 2 1 0.15 0.10 0.5 20 100 0.2 0.22 -0.5" wateroil = factory.create_water_oil(parse_gensatfuncline(conf_line_almost_pc)) swof = wateroil.SWOF() # The factory will not recognize the normalized J-function # when costau is missing. Any error message would be the responsibility # of the parser assert "Zero capillary pressure" in swof
def test_ambiguity(): """Test how the factory handles ambiguity between Corey and LET parameters""" factory = PyscalFactory() wateroil = factory.create_water_oil( dict(swl=0.1, nw=10, Lw=1, Ew=1, Tw=1, now=2, h=0.1, no=2)) # Corey is picked here. assert "Corey" in wateroil.krwcomment assert "krw" in wateroil.table
def test_factory_wateroil(): """Test that we can create curves from dictionaries of parameters""" logging.getLogger().setLevel("INFO") factory = PyscalFactory() # Factory refuses to create incomplete defaulted objects. with pytest.raises(ValueError): factory.create_water_oil() with pytest.raises(TypeError): # (it must be a dictionary) factory.create_water_oil(swirr=0.01) # noqa wateroil = factory.create_water_oil( dict( swirr=0.01, swl=0.1, bogus="foobar", tag="Good sand", nw=3, now=2, krwend=0.2, krwmax=0.5, ) ) assert isinstance(wateroil, WaterOil) assert wateroil.swirr == 0.01 assert wateroil.swl == 0.1 assert wateroil.tag == "Good sand" assert "krw" in wateroil.table assert "Corey" in wateroil.krwcomment assert wateroil.table["krw"].max() == 0.2 # Because sorw==0 by default check_table(wateroil.table) sat_table_str_ok(wateroil.SWOF()) sat_table_str_ok(wateroil.SWFN()) wateroil = factory.create_water_oil( dict(nw=3, now=2, sorw=0.1, krwend=0.2, krwmax=0.5) ) assert isinstance(wateroil, WaterOil) assert "krw" in wateroil.table assert "Corey" in wateroil.krwcomment assert wateroil.table["krw"].max() == 0.5 check_table(wateroil.table) sat_table_str_ok(wateroil.SWOF()) sat_table_str_ok(wateroil.SWFN()) # Ambiguous works, but we don't guarantee that this results # in LET or Corey. wateroil = factory.create_water_oil(dict(nw=3, Lw=2, Ew=2, Tw=2, now=3)) assert "krw" in wateroil.table assert "Corey" in wateroil.krwcomment or "LET" in wateroil.krwcomment check_table(wateroil.table) sat_table_str_ok(wateroil.SWOF()) sat_table_str_ok(wateroil.SWFN()) wateroil = factory.create_water_oil(dict(Lw=2, Ew=2, Tw=2, krwend=1, now=4)) assert isinstance(wateroil, WaterOil) assert "krw" in wateroil.table assert wateroil.table["krw"].max() == 1.0 assert "LET" in wateroil.krwcomment check_table(wateroil.table) sat_table_str_ok(wateroil.SWOF()) sat_table_str_ok(wateroil.SWFN()) wateroil = factory.create_water_oil( dict(Lw=2, Ew=2, Tw=2, Low=3, Eow=3, Tow=3, krwend=0.5) ) assert isinstance(wateroil, WaterOil) assert "krw" in wateroil.table assert "krow" in wateroil.table assert wateroil.table["krw"].max() == 0.5 assert wateroil.table["krow"].max() == 1 assert "LET" in wateroil.krwcomment assert "LET" in wateroil.krowcomment check_table(wateroil.table) sat_table_str_ok(wateroil.SWOF()) sat_table_str_ok(wateroil.SWFN()) # Add capillary pressure wateroil = factory.create_water_oil( dict(swl=0.1, nw=1, now=1, a=2, b=-1, poro_ref=0.2, perm_ref=100, drho=200) ) assert "pc" in wateroil.table assert wateroil.table["pc"].max() > 0.0 assert "Simplified J" in wateroil.pccomment check_table(wateroil.table) sat_table_str_ok(wateroil.SWOF()) sat_table_str_ok(wateroil.SWFN()) # Test that the optional gravity g is picked up: wateroil = factory.create_water_oil( dict(swl=0.1, nw=1, now=1, a=2, b=-1, poro_ref=0.2, perm_ref=100, drho=200, g=0) ) assert "pc" in wateroil.table assert wateroil.table["pc"].max() == 0.0 check_table(wateroil.table) sat_table_str_ok(wateroil.SWOF()) sat_table_str_ok(wateroil.SWFN()) # Test petrophysical simple J: wateroil = factory.create_water_oil( dict( swl=0.1, nw=1, now=1, a_petro=2, b_petro=-1, poro_ref=0.2, perm_ref=100, drho=200, ) ) assert "pc" in wateroil.table assert wateroil.table["pc"].max() > 0.0 assert "etrophysic" in wateroil.pccomment check_table(wateroil.table) sat_table_str_ok(wateroil.SWOF()) sat_table_str_ok(wateroil.SWFN()) # One pc param missing: wateroil = factory.create_water_oil( dict(swl=0.1, nw=1, now=1, a=2, b=-1, perm_ref=100, drho=200, g=0) ) assert "pc" not in wateroil.table