Skip to content

Commit

Permalink
Make sure ss and sy are used from the dataset when they are present
Browse files Browse the repository at this point in the history
  • Loading branch information
rubencalje committed Jul 17, 2023
1 parent 2813914 commit ab47dfa
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 22 deletions.
16 changes: 8 additions & 8 deletions nlmod/gwf/gwf.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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
Expand All @@ -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,
Expand Down
44 changes: 30 additions & 14 deletions nlmod/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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}'."
Expand All @@ -542,23 +550,28 @@ 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
----------
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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit ab47dfa

Please sign in to comment.