diff --git a/docs/usage.rst b/docs/usage.rst index fb2365dc..0c752cbc 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -188,10 +188,10 @@ equivalent to the code lines above (except for capillary pressure) is then: .. code-block:: python - from pyscal import PyscalFactory + from pyscal import create_water_oil params = dict(swl=0.05, sorw=0.03, h=0.1, nw=2.1, krwend=0.6, now=2.5, kroend=0.9, tag="Foobarites") - wo = PyscalFactory.create_water_oil(params) + wo = create_water_oil(params) print(wo.SWOF()) Note that parameter names to factory functions are case *insensitive*, while diff --git a/src/pyscal/__init__.py b/src/pyscal/__init__.py index 2628e558..c0fe2060 100644 --- a/src/pyscal/__init__.py +++ b/src/pyscal/__init__.py @@ -86,4 +86,4 @@ def getLogger_pyscal( from .gaswater import GasWater # noqa from .scalrecommendation import SCALrecommendation # noqa from .pyscallist import PyscalList # noqa -from .factory import PyscalFactory # noqa +from .factory import PyscalFactory, create_water_oil # noqa diff --git a/src/pyscal/factory.py b/src/pyscal/factory.py index a96696a7..1de8ffa2 100644 --- a/src/pyscal/factory.py +++ b/src/pyscal/factory.py @@ -20,6 +20,8 @@ from .wateroil import WaterOil from .wateroilgas import WaterOilGas +import warnings + logger = getLogger_pyscal(__name__) @@ -128,6 +130,205 @@ def slicedict(dct: dict, keys: Iterable): WOG_INIT = ["swirr", "swl", "swcr", "sorw", "socr", "sorg", "sgcr", "h", "tag"] +def create_water_oil( + params: Optional[Dict[str, float]] = None, fast: bool = False +) -> WaterOil: + """Create a WaterOil object from a dictionary of parameters. + + Parameterization (Corey/LET) is inferred from presence + of certain parameters in the dictionary. + + Don't rely on behaviour of you supply both Corey and LET at + the same time. + + Parameter names in the dictionary are case insensitive. You + can use Swirr, swirr, sWirR, swiRR etc. + + NB: the add_LET_* methods have the names 'l', 'e' and 't' + in their signatures, which is not precise enough in this + context, so we require e.g. 'Lw' and 'Low' (which both will be + translated to 'l') + + Recognized parameters: + swirr, swl, swcr, sorw, socr, sgrw, h, tag, nw, now, krwmax, krwend, + lw, ew, tw, low, eow, tow, lo, eo, to, kroend, + a, a_petro, b, b_petro, poro_ref, perm_ref, drho, + a, b, poro, perm, sigma_costau + + Args: + params: Dictionary with parameters describing the WaterOil object. + fast: If fast-mode should be set for constructed object. + """ + if not params: + params = {} + if not isinstance(params, dict): + raise TypeError("Parameter to create_water_oil must be a dictionary") + + check_deprecated(params) + + sufficient_water_oil_params(params, failhard=True) + + # For case insensitiveness, all keys are converted to lower case: + params = {key.lower(): value for (key, value) in params.items()} + + # Allowing sending in NaN values, delete those keys. + params = filter_nan_from_dict(params) + + usedparams: Set[str] = set() + + # Check if we should initialize swl from a swlheight parameter: + if set(WO_SWL_FROM_HEIGHT).issubset(params): + if "swl" in params: + raise ValueError( + "Do not provide both swl and swlheight at the same time" + ) + if params["swlheight"] <= 0: + raise ValueError("swlheight must be larger than zero") + params_swl_from_height = slicedict(params, WO_SWL_FROM_HEIGHT) + params["swl"] = capillarypressure.swl_from_height_simpleJ( + **params_swl_from_height + ) + logger.debug("Computed swl from swlwheight to %s", str(params["swl"])) + if "swcr" in params and params["swcr"] < params["swl"]: + raise ValueError( + f'Provided swcr={params["swcr"]} is lower than ' + f'computed swl={params["swl"]}' + ) + elif set(WO_SWLHEIGHT).issubset(params): + raise ValueError( + ( + "Can't initialize from SWLHEIGHT without sufficient " + f"simple-J parameters, needs all of: {WO_SWL_FROM_HEIGHT}" + ) + ) + + # Should we have a swcr relative to swl? + if set(WO_SWCR_ADD).issubset(params): + if "swl" not in params: + raise ValueError( + ( + "If swcr should be relative to swl, " + "both swcr_add and swl must be provided" + ) + ) + if "swcr" in params: + raise ValueError( + "Do not provide both swcr and swcr_add at the same time" + ) + params["swcr"] = params["swl"] + params[WO_SWCR_ADD[0]] + + # No requirements to the base objects, defaults are ok. + wateroil = WaterOil( + **PyscalFactory.alias_sgrw(slicedict(params, WO_INIT)), fast=fast + ) + usedparams = usedparams.union(set(slicedict(params, WO_INIT).keys())) + logger.debug( + "Initialized WaterOil object from parameters %s", str(list(usedparams)) + ) + + # Water curve + params_corey_water = slicedict(params, WO_COREY_WATER + WO_WATER_ENDPOINTS) + params_let_water = slicedict(params, WO_LET_WATER + WO_WATER_ENDPOINTS) + if set(WO_COREY_WATER).issubset(set(params_corey_water)): + wateroil.add_corey_water(**params_corey_water) + logger.debug( + "Added Corey water to WaterOil object from parameters %s", + str(params_corey_water.keys()), + ) + elif set(WO_LET_WATER).issubset(set(params_let_water)): + params_let_water["l"] = params_let_water.pop("lw") + params_let_water["e"] = params_let_water.pop("ew") + params_let_water["t"] = params_let_water.pop("tw") + wateroil.add_LET_water(**params_let_water) + logger.debug( + "Added LET water to WaterOil object from parameters %s", + str(params_let_water.keys()), + ) + + # Oil curve: + params_corey_oil = slicedict(params, WO_COREY_OIL + WO_OIL_ENDPOINTS) + params_let_oil = slicedict( + params, WO_LET_OIL + WO_LET_OIL_ALT + WO_OIL_ENDPOINTS + ) + if set(WO_COREY_OIL).issubset(set(params_corey_oil)): + wateroil.add_corey_oil(**params_corey_oil) + logger.debug( + "Added Corey water to WaterOil object from parameters %s", + str(params_corey_oil.keys()), + ) + elif set(WO_LET_OIL).issubset(set(params_let_oil)): + params_let_oil["l"] = params_let_oil.pop("low") + params_let_oil["e"] = params_let_oil.pop("eow") + params_let_oil["t"] = params_let_oil.pop("tow") + wateroil.add_LET_oil(**params_let_oil) + logger.debug( + "Added LET water to WaterOil object from parameters %s", + str(params_let_oil.keys()), + ) + elif set(WO_LET_OIL_ALT).issubset(set(params_let_oil)): + params_let_oil["l"] = params_let_oil.pop("lo") + params_let_oil["e"] = params_let_oil.pop("eo") + params_let_oil["t"] = params_let_oil.pop("to") + wateroil.add_LET_oil(**params_let_oil) + logger.debug( + "Added LET water to WaterOil object from parameters %s", + str(params_let_oil.keys()), + ) + + # Capillary pressure: + params_simple_j = slicedict(params, WO_SIMPLE_J + ["g"]) + params_norm_j = slicedict(params, WO_NORM_J) + params_simple_j_petro = slicedict(params, WO_SIMPLE_J_PETRO + ["g"]) + params_let_pc_pd = slicedict(params, WO_LET_PC_PD) + params_let_pc_imb = slicedict(params, WO_LET_PC_IMB) + params_skjaeveland_pc = slicedict(params, WO_SKJAEVELAND_PC) + + if set(WO_SIMPLE_J).issubset(set(params_simple_j)): + wateroil.add_simple_J(**params_simple_j) + elif set(WO_SIMPLE_J_PETRO).issubset(set(params_simple_j_petro)): + params_simple_j_petro["a"] = params_simple_j_petro.pop("a_petro") + params_simple_j_petro["b"] = params_simple_j_petro.pop("b_petro") + wateroil.add_simple_J_petro(**params_simple_j_petro) + elif set(WO_NORM_J).issubset(set(params_norm_j)): + wateroil.add_normalized_J(**params_norm_j) + elif set(WO_LET_PC_PD).issubset(set(params_let_pc_pd)): + params_let_pc_pd["Lp"] = params_let_pc_pd.pop("lpow") + params_let_pc_pd["Ep"] = params_let_pc_pd.pop("epow") + params_let_pc_pd["Tp"] = params_let_pc_pd.pop("tpow") + params_let_pc_pd["Lt"] = params_let_pc_pd.pop("ltow") + params_let_pc_pd["Et"] = params_let_pc_pd.pop("etow") + params_let_pc_pd["Tt"] = params_let_pc_pd.pop("ttow") + params_let_pc_pd["Pcmax"] = params_let_pc_pd.pop("pcowmax") + params_let_pc_pd["Pct"] = params_let_pc_pd.pop("pcowt") + wateroil.add_LET_pc_pd(**params_let_pc_pd) + elif set(WO_LET_PC_IMB).issubset(set(params_let_pc_imb)): + params_let_pc_imb["Ls"] = params_let_pc_imb.pop("lsow") + params_let_pc_imb["Es"] = params_let_pc_imb.pop("esow") + params_let_pc_imb["Ts"] = params_let_pc_imb.pop("tsow") + params_let_pc_imb["Lf"] = params_let_pc_imb.pop("lfow") + params_let_pc_imb["Ef"] = params_let_pc_imb.pop("efow") + params_let_pc_imb["Tf"] = params_let_pc_imb.pop("tfow") + params_let_pc_imb["Pcmax"] = params_let_pc_imb.pop("pcowmax") + params_let_pc_imb["Pct"] = params_let_pc_imb.pop("pcowt") + params_let_pc_imb["Pcmin"] = params_let_pc_imb.pop("pcowmin") + wateroil.add_LET_pc_imb(**params_let_pc_imb) + elif set(WO_SKJAEVELAND_PC).issubset(set(params_skjaeveland_pc)): + wateroil.add_skjaeveland_pc(**params_skjaeveland_pc) + else: + logger.info( + ( + "Missing or ambiguous parameters for capillary pressure in " + "WaterOil object. Using zero." + ) + ) + if not wateroil.selfcheck(): + raise ValueError( + ("Incomplete WaterOil object, some parameters missing to factory") + ) + return wateroil + + + class PyscalFactory: """Class for implementing the factory pattern for Pyscal objects @@ -155,199 +356,9 @@ class PyscalFactory: def create_water_oil( params: Optional[Dict[str, float]] = None, fast: bool = False ) -> WaterOil: - """Create a WaterOil object from a dictionary of parameters. - - Parameterization (Corey/LET) is inferred from presence - of certain parameters in the dictionary. - - Don't rely on behaviour of you supply both Corey and LET at - the same time. - - Parameter names in the dictionary are case insensitive. You - can use Swirr, swirr, sWirR, swiRR etc. - - NB: the add_LET_* methods have the names 'l', 'e' and 't' - in their signatures, which is not precise enough in this - context, so we require e.g. 'Lw' and 'Low' (which both will be - translated to 'l') + warnings.warn("PyscalFactory.create_water_oil is deprecated. Please use create_water_oil function instead.", DeprecationWarning) + return create_water_oil(params, fast) - Recognized parameters: - swirr, swl, swcr, sorw, socr, sgrw, h, tag, nw, now, krwmax, krwend, - lw, ew, tw, low, eow, tow, lo, eo, to, kroend, - a, a_petro, b, b_petro, poro_ref, perm_ref, drho, - a, b, poro, perm, sigma_costau - - Args: - params: Dictionary with parameters describing the WaterOil object. - fast: If fast-mode should be set for constructed object. - """ - if not params: - params = {} - if not isinstance(params, dict): - raise TypeError("Parameter to create_water_oil must be a dictionary") - - check_deprecated(params) - - sufficient_water_oil_params(params, failhard=True) - - # For case insensitiveness, all keys are converted to lower case: - params = {key.lower(): value for (key, value) in params.items()} - - # Allowing sending in NaN values, delete those keys. - params = filter_nan_from_dict(params) - - usedparams: Set[str] = set() - - # Check if we should initialize swl from a swlheight parameter: - if set(WO_SWL_FROM_HEIGHT).issubset(params): - if "swl" in params: - raise ValueError( - "Do not provide both swl and swlheight at the same time" - ) - if params["swlheight"] <= 0: - raise ValueError("swlheight must be larger than zero") - params_swl_from_height = slicedict(params, WO_SWL_FROM_HEIGHT) - params["swl"] = capillarypressure.swl_from_height_simpleJ( - **params_swl_from_height - ) - logger.debug("Computed swl from swlwheight to %s", str(params["swl"])) - if "swcr" in params and params["swcr"] < params["swl"]: - raise ValueError( - f'Provided swcr={params["swcr"]} is lower than ' - f'computed swl={params["swl"]}' - ) - elif set(WO_SWLHEIGHT).issubset(params): - raise ValueError( - ( - "Can't initialize from SWLHEIGHT without sufficient " - f"simple-J parameters, needs all of: {WO_SWL_FROM_HEIGHT}" - ) - ) - - # Should we have a swcr relative to swl? - if set(WO_SWCR_ADD).issubset(params): - if "swl" not in params: - raise ValueError( - ( - "If swcr should be relative to swl, " - "both swcr_add and swl must be provided" - ) - ) - if "swcr" in params: - raise ValueError( - "Do not provide both swcr and swcr_add at the same time" - ) - params["swcr"] = params["swl"] + params[WO_SWCR_ADD[0]] - - # No requirements to the base objects, defaults are ok. - wateroil = WaterOil( - **PyscalFactory.alias_sgrw(slicedict(params, WO_INIT)), fast=fast - ) - usedparams = usedparams.union(set(slicedict(params, WO_INIT).keys())) - logger.debug( - "Initialized WaterOil object from parameters %s", str(list(usedparams)) - ) - - # Water curve - params_corey_water = slicedict(params, WO_COREY_WATER + WO_WATER_ENDPOINTS) - params_let_water = slicedict(params, WO_LET_WATER + WO_WATER_ENDPOINTS) - if set(WO_COREY_WATER).issubset(set(params_corey_water)): - wateroil.add_corey_water(**params_corey_water) - logger.debug( - "Added Corey water to WaterOil object from parameters %s", - str(params_corey_water.keys()), - ) - elif set(WO_LET_WATER).issubset(set(params_let_water)): - params_let_water["l"] = params_let_water.pop("lw") - params_let_water["e"] = params_let_water.pop("ew") - params_let_water["t"] = params_let_water.pop("tw") - wateroil.add_LET_water(**params_let_water) - logger.debug( - "Added LET water to WaterOil object from parameters %s", - str(params_let_water.keys()), - ) - - # Oil curve: - params_corey_oil = slicedict(params, WO_COREY_OIL + WO_OIL_ENDPOINTS) - params_let_oil = slicedict( - params, WO_LET_OIL + WO_LET_OIL_ALT + WO_OIL_ENDPOINTS - ) - if set(WO_COREY_OIL).issubset(set(params_corey_oil)): - wateroil.add_corey_oil(**params_corey_oil) - logger.debug( - "Added Corey water to WaterOil object from parameters %s", - str(params_corey_oil.keys()), - ) - elif set(WO_LET_OIL).issubset(set(params_let_oil)): - params_let_oil["l"] = params_let_oil.pop("low") - params_let_oil["e"] = params_let_oil.pop("eow") - params_let_oil["t"] = params_let_oil.pop("tow") - wateroil.add_LET_oil(**params_let_oil) - logger.debug( - "Added LET water to WaterOil object from parameters %s", - str(params_let_oil.keys()), - ) - elif set(WO_LET_OIL_ALT).issubset(set(params_let_oil)): - params_let_oil["l"] = params_let_oil.pop("lo") - params_let_oil["e"] = params_let_oil.pop("eo") - params_let_oil["t"] = params_let_oil.pop("to") - wateroil.add_LET_oil(**params_let_oil) - logger.debug( - "Added LET water to WaterOil object from parameters %s", - str(params_let_oil.keys()), - ) - - # Capillary pressure: - params_simple_j = slicedict(params, WO_SIMPLE_J + ["g"]) - params_norm_j = slicedict(params, WO_NORM_J) - params_simple_j_petro = slicedict(params, WO_SIMPLE_J_PETRO + ["g"]) - params_let_pc_pd = slicedict(params, WO_LET_PC_PD) - params_let_pc_imb = slicedict(params, WO_LET_PC_IMB) - params_skjaeveland_pc = slicedict(params, WO_SKJAEVELAND_PC) - - if set(WO_SIMPLE_J).issubset(set(params_simple_j)): - wateroil.add_simple_J(**params_simple_j) - elif set(WO_SIMPLE_J_PETRO).issubset(set(params_simple_j_petro)): - params_simple_j_petro["a"] = params_simple_j_petro.pop("a_petro") - params_simple_j_petro["b"] = params_simple_j_petro.pop("b_petro") - wateroil.add_simple_J_petro(**params_simple_j_petro) - elif set(WO_NORM_J).issubset(set(params_norm_j)): - wateroil.add_normalized_J(**params_norm_j) - elif set(WO_LET_PC_PD).issubset(set(params_let_pc_pd)): - params_let_pc_pd["Lp"] = params_let_pc_pd.pop("lpow") - params_let_pc_pd["Ep"] = params_let_pc_pd.pop("epow") - params_let_pc_pd["Tp"] = params_let_pc_pd.pop("tpow") - params_let_pc_pd["Lt"] = params_let_pc_pd.pop("ltow") - params_let_pc_pd["Et"] = params_let_pc_pd.pop("etow") - params_let_pc_pd["Tt"] = params_let_pc_pd.pop("ttow") - params_let_pc_pd["Pcmax"] = params_let_pc_pd.pop("pcowmax") - params_let_pc_pd["Pct"] = params_let_pc_pd.pop("pcowt") - wateroil.add_LET_pc_pd(**params_let_pc_pd) - elif set(WO_LET_PC_IMB).issubset(set(params_let_pc_imb)): - params_let_pc_imb["Ls"] = params_let_pc_imb.pop("lsow") - params_let_pc_imb["Es"] = params_let_pc_imb.pop("esow") - params_let_pc_imb["Ts"] = params_let_pc_imb.pop("tsow") - params_let_pc_imb["Lf"] = params_let_pc_imb.pop("lfow") - params_let_pc_imb["Ef"] = params_let_pc_imb.pop("efow") - params_let_pc_imb["Tf"] = params_let_pc_imb.pop("tfow") - params_let_pc_imb["Pcmax"] = params_let_pc_imb.pop("pcowmax") - params_let_pc_imb["Pct"] = params_let_pc_imb.pop("pcowt") - params_let_pc_imb["Pcmin"] = params_let_pc_imb.pop("pcowmin") - wateroil.add_LET_pc_imb(**params_let_pc_imb) - elif set(WO_SKJAEVELAND_PC).issubset(set(params_skjaeveland_pc)): - wateroil.add_skjaeveland_pc(**params_skjaeveland_pc) - else: - logger.info( - ( - "Missing or ambiguous parameters for capillary pressure in " - "WaterOil object. Using zero." - ) - ) - if not wateroil.selfcheck(): - raise ValueError( - ("Incomplete WaterOil object, some parameters missing to factory") - ) - return wateroil @staticmethod def create_gas_oil( @@ -478,7 +489,7 @@ def create_water_oil_gas( wateroil: Optional[WaterOil] if sufficient_water_oil_params(params, failhard=False): - wateroil = PyscalFactory.create_water_oil(params, fast=fast) + wateroil = create_water_oil(params, fast=fast) else: logger.info("No wateroil parameters. Assuming only gas-oil in wateroilgas") wateroil = None @@ -1028,7 +1039,7 @@ def create_wateroil_list( if h is not None: params["h"] = h try: - wol.append(PyscalFactory.create_water_oil(params.to_dict(), fast=fast)) + wol.append(create_water_oil(params.to_dict(), fast=fast)) except (AssertionError, ValueError, TypeError) as err: raise ValueError( f"Error for SATNUM {params['SATNUM']}: {str(err)}" diff --git a/src/pyscal/pyscalcli.py b/src/pyscal/pyscalcli.py index 02997b72..17bd4ddd 100644 --- a/src/pyscal/pyscalcli.py +++ b/src/pyscal/pyscalcli.py @@ -9,6 +9,10 @@ import pandas as pd +import pyscal + + + from pyscal import ( GasWater, SCALrecommendation, diff --git a/tests/test_factory.py b/tests/test_factory.py index 73d2da64..c8f92f31 100644 --- a/tests/test_factory.py +++ b/tests/test_factory.py @@ -14,6 +14,7 @@ WaterOil, WaterOilGas, factory, + create_water_oil, ) from pyscal.utils.testing import check_table, sat_table_str_ok @@ -24,16 +25,16 @@ def test_factory_wateroil(): # Factory refuses to create incomplete defaulted objects. with pytest.raises(ValueError): - pyscal_factory.create_water_oil() + create_water_oil() with pytest.raises(TypeError): # (it must be a dictionary) - pyscal_factory.create_water_oil(swirr=0.01) + create_water_oil(swirr=0.01) with pytest.raises(TypeError): - pyscal_factory.create_water_oil(params="swirr 0.01") + create_water_oil(params="swirr 0.01") - wateroil = pyscal_factory.create_water_oil( + wateroil = create_water_oil( { "swirr": 0.01, "swl": 0.1, @@ -56,7 +57,7 @@ def test_factory_wateroil(): sat_table_str_ok(wateroil.SWOF()) sat_table_str_ok(wateroil.SWFN()) - wateroil = pyscal_factory.create_water_oil( + wateroil = create_water_oil( {"nw": 3, "now": 2, "sorw": 0.1, "krwend": 0.2, "krwmax": 0.5} ) assert isinstance(wateroil, WaterOil) @@ -69,7 +70,7 @@ def test_factory_wateroil(): # Ambiguous works, but we don't guarantee that this results # in LET or Corey. - wateroil = pyscal_factory.create_water_oil( + wateroil = create_water_oil( {"nw": 3, "Lw": 2, "Ew": 2, "Tw": 2, "now": 3} ) assert "KRW" in wateroil.table @@ -79,7 +80,7 @@ def test_factory_wateroil(): sat_table_str_ok(wateroil.SWFN()) # Mixing Corey and LET - wateroil = pyscal_factory.create_water_oil( + wateroil = create_water_oil( {"Lw": 2, "Ew": 2, "Tw": 2, "krwend": 1, "now": 4} ) assert isinstance(wateroil, WaterOil) @@ -90,7 +91,7 @@ def test_factory_wateroil(): sat_table_str_ok(wateroil.SWOF()) sat_table_str_ok(wateroil.SWFN()) - wateroil = pyscal_factory.create_water_oil( + wateroil = create_water_oil( {"Lw": 2, "Ew": 2, "Tw": 2, "Low": 3, "Eow": 3, "Tow": 3, "krwend": 0.5} ) assert isinstance(wateroil, WaterOil) @@ -105,7 +106,7 @@ def test_factory_wateroil(): sat_table_str_ok(wateroil.SWFN()) # Add capillary pressure - wateroil = pyscal_factory.create_water_oil( + wateroil = create_water_oil( { "swl": 0.1, "nw": 1, @@ -125,7 +126,7 @@ def test_factory_wateroil(): sat_table_str_ok(wateroil.SWFN()) # Test that the optional gravity g is picked up: - wateroil = pyscal_factory.create_water_oil( + wateroil = create_water_oil( { "swl": 0.1, "nw": 1, @@ -145,7 +146,7 @@ def test_factory_wateroil(): sat_table_str_ok(wateroil.SWFN()) # Test petrophysical simple J: - wateroil = pyscal_factory.create_water_oil( + wateroil = create_water_oil( { "swl": 0.1, "nw": 1, @@ -165,7 +166,7 @@ def test_factory_wateroil(): sat_table_str_ok(wateroil.SWFN()) # One pc param missing: - wateroil = pyscal_factory.create_water_oil( + wateroil = create_water_oil( { "swl": 0.1, "nw": 1, @@ -184,9 +185,9 @@ def test_fast_mode(): """Test that the fast-flag is passed on to constructed objects Each object's own test code tests the actual effects of the fast flag""" - wateroil = PyscalFactory.create_water_oil({"nw": 2, "now": 2}) + wateroil = create_water_oil({"nw": 2, "now": 2}) assert not wateroil.fast - wateroil = PyscalFactory.create_water_oil({"nw": 2, "now": 2}, fast=True) + wateroil = create_water_oil({"nw": 2, "now": 2}, fast=True) assert wateroil.fast gasoil = PyscalFactory.create_gas_oil({"ng": 2, "nog": 2}) @@ -229,7 +230,7 @@ def test_init_with_swlheight(): """With sufficient parameters, swl will be calculated on the fly when initializing the WaterOil object""" pyscal_factory = PyscalFactory() - wateroil = pyscal_factory.create_water_oil( + wateroil = create_water_oil( { "swlheight": 200, "nw": 1, @@ -250,11 +251,11 @@ def test_init_with_swlheight(): match="Can't initialize from SWLHEIGHT without sufficient simple-J parameters", ): # This should fail because capillary pressure parameters are not provided. - pyscal_factory.create_water_oil({"swlheight": 200, "nw": 1, "now": 1}) + create_water_oil({"swlheight": 200, "nw": 1, "now": 1}) # swcr must be larger than swl: with pytest.raises(ValueError, match="lower than computed swl"): - pyscal_factory.create_water_oil( + create_water_oil( { "swlheight": 200, "nw": 1, @@ -271,7 +272,7 @@ def test_init_with_swlheight(): # swlheight must be positive: with pytest.raises(ValueError, match="swlheight must be larger than zero"): - pyscal_factory.create_water_oil( + create_water_oil( { "swlheight": -200, "nw": 1, @@ -286,7 +287,7 @@ def test_init_with_swlheight(): ) # If swcr is large enough, it will pass: - wateroil = pyscal_factory.create_water_oil( + wateroil = create_water_oil( { "swlheight": 200, "nw": 1, @@ -328,7 +329,7 @@ def test_init_with_swlheight(): with pytest.raises( ValueError, match="Can't initialize from SWLHEIGHT without sufficient simple-J" ): - pyscal_factory.create_water_oil( + create_water_oil( { "swlheight": 200, "nw": 1, @@ -349,20 +350,20 @@ def test_relative_swcr(): pyscal_factory = PyscalFactory() with pytest.raises(ValueError, match="swl must be provided"): - pyscal_factory.create_water_oil( + create_water_oil( {"swcr_add": 0.1, "nw": 1, "now": 1, "swirr": 0.01} ) with pytest.raises(ValueError, match="swcr and swcr_add at the same time"): - pyscal_factory.create_water_oil( + create_water_oil( {"swcr_add": 0.1, "swcr": 0.1, "swl": 0.1, "nw": 1, "now": 1, "swirr": 0.01} ) - wateroil = pyscal_factory.create_water_oil( + wateroil = create_water_oil( {"swcr_add": 0.1, "swl": 0.1, "nw": 1, "now": 1, "swirr": 0.01} ) assert wateroil.swcr == 0.2 # Test when relative to swlheight: - wateroil = pyscal_factory.create_water_oil( + wateroil = create_water_oil( { "swlheight": 200, "swcr_add": 0.01, @@ -401,7 +402,7 @@ def test_ambiguity(): """Test how the factory handles ambiguity between Corey and LET parameters""" pyscal_factory = PyscalFactory() - wateroil = pyscal_factory.create_water_oil( + wateroil = create_water_oil( {"swl": 0.1, "nw": 10, "Lw": 1, "Ew": 1, "Tw": 1, "now": 2, "h": 0.1, "no": 2} ) # Corey is picked here. @@ -1093,7 +1094,7 @@ def test_check_deprecated_krowgend(): ) assert gasoil.table["KROG"].max() == 0.3 - wateroil = PyscalFactory.create_water_oil( + wateroil = create_water_oil( {"swl": 0.1, "nw": 2, "now": 2, "krowend": 0.4, "kroend": 0.3} ) assert wateroil.table["KROW"].max() == 0.3