From ab47dfad9ad30295134f8c93375dc3e555044fd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20Calj=C3=A9?= Date: Mon, 17 Jul 2023 17:00:35 +0200 Subject: [PATCH] Make sure ss and sy are used from the dataset when they are present --- nlmod/gwf/gwf.py | 16 ++++++++-------- nlmod/util.py | 44 ++++++++++++++++++++++++++++++-------------- 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/nlmod/gwf/gwf.py b/nlmod/gwf/gwf.py index de6c957d..c48e245a 100644 --- a/nlmod/gwf/gwf.py +++ b/nlmod/gwf/gwf.py @@ -537,8 +537,8 @@ def ic(ds, gwf, starting_head="starting_head", pname="ic", **kwargs): def sto( ds, gwf, - sy=0.2, - ss=0.000001, + sy="sy", + ss="ss", iconvert=1, save_flows=False, pname="sto", @@ -552,10 +552,10 @@ def sto( dataset with model data. gwf : flopy ModflowGwf groundwaterflow object. - sy : float, optional - specific yield. The default is 0.2. - ss : float, optional - specific storage. The default is 0.000001. + sy : str or float, optional + specific yield. The default is "sy", or 0.2 if "sy" is not in ds. + ss : str or float, optional + specific storage. The default is "ss", or 0.000001 if "ss" is not in ds. iconvert : int, optional See description in ModflowGwfsto. The default is 1 (differs from FloPY). save_flows : bool, optional @@ -581,8 +581,8 @@ def sto( sts_spd = None trn_spd = {0: True} - sy = _get_value_from_ds_datavar(ds, "sy", sy) - ss = _get_value_from_ds_datavar(ds, "ss", ss) + sy = _get_value_from_ds_datavar(ds, "sy", sy, default=0.2) + ss = _get_value_from_ds_datavar(ds, "ss", ss, default=0.000001) sto = flopy.mf6.ModflowGwfsto( gwf, diff --git a/nlmod/util.py b/nlmod/util.py index f9227b73..6642d021 100644 --- a/nlmod/util.py +++ b/nlmod/util.py @@ -499,7 +499,9 @@ def get_color_logger(level="INFO"): return logger -def _get_value_from_ds_attr(ds, varname, attr=None, value=None, warn=True): +def _get_value_from_ds_attr( + ds, varname, attr=None, value=None, default=None, warn=True +): """Internal function to get value from dataset attributes. Parameters @@ -512,6 +514,9 @@ def _get_value_from_ds_attr(ds, varname, attr=None, value=None, warn=True): name of the attribute in dataset (is sometimes different to varname) value : Any, optional variable value, by default None + default : Any, optional + When default is not None, value is None, and attr is not present in ds, + this default is returned. The default is None. warn : bool, optional log warning if value not found @@ -532,7 +537,10 @@ def _get_value_from_ds_attr(ds, varname, attr=None, value=None, warn=True): logger.debug(f"Using stored data attribute '{attr}' for '{varname}'") value = ds.attrs[attr] elif value is None: - if warn: + if default is not None: + logger.debug(f"Using default value of {default} for '{varname}'") + value = default + elif warn: msg = ( f"No value found for '{varname}', returning None. " f"To fix this error pass '{varname}' to function or set 'ds.{attr}'." @@ -542,7 +550,9 @@ def _get_value_from_ds_attr(ds, varname, attr=None, value=None, warn=True): return value -def _get_value_from_ds_datavar(ds, varname, datavar=None, warn=True, return_da=False): +def _get_value_from_ds_datavar( + ds, varname, datavar=None, default=None, warn=True, return_da=False +): """Internal function to get value from dataset data variables. Parameters @@ -550,15 +560,18 @@ def _get_value_from_ds_datavar(ds, varname, datavar=None, warn=True, return_da=F ds : xarray.Dataset dataset containing model data varname : str - name of the variable in flopy package + name of the variable in flopy package (used for logging) datavar : Any, optional if str, treated as the name of the data variable (which can be different to varname) in dataset, if not provided is assumed to be the same as varname. If not passed as string, it is treated as data + default : Any, optional + When default is not None, datavar is a string, and not present in ds, this + default is returned. The default is None. warn : bool, optional log warning if value not found return_da : bool, optional - if True a dataarray can be returned, if False a dataarray is always + if True, a DataArray can be returned. If False, a DataArray is always converted to a numpy array before being returned. The default is False. Returns @@ -598,15 +611,18 @@ def _get_value_from_ds_datavar(ds, varname, datavar=None, warn=True, return_da=F value = ds[datavar] # warn if value is None elif isinstance(value, str): - value = None - if warn: - msg = ( - f"No value found for '{varname}', returning None. " - f"To silence this warning pass '{varname}' data directly " - f"to function or check whether 'ds.{datavar}' was set correctly." - ) - logger.warning(msg) - + if default is not None: + logger.debug(f"Using default value of {default} for '{varname}'") + value = default + else: + value = None + if warn: + msg = ( + f"No value found for '{varname}', returning None. " + f"To silence this warning pass '{varname}' data directly " + f"to function or check whether 'ds.{datavar}' was set correctly." + ) + logger.warning(msg) if not return_da: if isinstance(value, xr.DataArray): value = value.values