Add `has_package(name)` feature to see if a package exists. (#272)

This feature goes nicely beside `get_package(name)` (modified slightly).

Updated/amended other parts of code and a few autotests.
develop
Mike Toews 2017-12-16 04:42:12 +13:00 committed by langevin-usgs
parent 08570caa32
commit 8561d21a28
5 changed files with 39 additions and 8 deletions

View File

@ -4,7 +4,11 @@ def test_modflow():
import flopy
mf = flopy.modflow.Modflow()
assert isinstance(mf, flopy.modflow.Modflow)
assert not mf.has_package('DIS') # not yet
dis = flopy.modflow.ModflowDis(mf)
assert mf.has_package('DIS')
assert mf.has_package('dis') # case-insensitive
assert not mf.has_package('DISU') # not here
assert isinstance(dis, flopy.modflow.ModflowDis)
bas = flopy.modflow.ModflowBas(mf)
assert isinstance(bas, flopy.modflow.ModflowBas)

View File

@ -30,8 +30,8 @@ def test_load():
m = flopy.modflow.Modflow.load('MNW2-Fig28.nam', model_ws=mf2005pth,
verbose=True, forgive=False)
m.change_model_ws(cpth)
assert 'MNW2' in m.get_package_list()
assert 'MNWI' in m.get_package_list()
assert m.has_package('MNW2')
assert m.has_package('MNWI')
# load a real mnw2 package from a steady state model (multiple wells)
m2 = flopy.modflow.Modflow('br', model_ws=cpth)

View File

@ -718,6 +718,30 @@ class BaseModel(object):
'{:s} {:s}\n'.format(p.file_name[i], p.extra[i])
return s
def has_package(self, name):
"""
Check if package name is in package list.
Parameters
----------
name : str
Name of the package, 'DIS', 'BAS6', etc. (case-insensitive).
Returns
-------
bool
True if package name exists, otherwise False if not found.
"""
if not name:
raise ValueError('invalid package name')
name = name.upper()
for p in self.packagelist:
for pn in p.name:
if pn.upper() == name:
return True
return False
def get_package(self, name):
"""
Get a package.
@ -725,7 +749,7 @@ class BaseModel(object):
Parameters
----------
name : str
Name of the package, 'RIV', 'LPF', etc.
Name of the package, 'RIV', 'LPF', etc. (case-insensitive).
Returns
-------
@ -733,8 +757,11 @@ class BaseModel(object):
Package object of type :class:`flopy.pakbase.Package`
"""
if not name:
raise ValueError('invalid package name')
name = name.upper()
for pp in (self.packagelist):
if (pp.name[0].upper() == name.upper()):
if pp.name[0].upper() == name:
return pp
return None

View File

@ -349,11 +349,11 @@ class ModflowSfr2(Package):
self.reach_data[n] = reach_data[n]
# assign node numbers if there are none (structured grid)
if np.diff(
self.reach_data.node).max() == 0 and 'DIS' in self.parent.get_package_list():
if np.diff(self.reach_data.node).max() == 0 and self.parent.has_package('DIS'):
# first make kij list
lrc = self.reach_data[['k', 'i', 'j']].copy()
lrc = (lrc.view((int, len(lrc.dtype.names)))).tolist()
self.reach_data['node'] = self.parent.dis.get_node(lrc)
# assign unique ID and outreach columns to each reach
self.reach_data.sort(order=['iseg', 'ireach'])

View File

@ -226,12 +226,12 @@ class check:
def _stress_period_data_valid_indices(self, stress_period_data):
"""Check that stress period data inds are valid for model grid."""
spd_inds_valid = True
if 'DIS' in self.model.get_package_list() and\
if self.model.has_package('DIS') and \
{'k', 'i', 'j'}.intersection(set(stress_period_data.dtype.names)) != {'k', 'i', 'j'}:
self._add_to_summary(type='Error',
desc='\r Stress period data missing k, i, j for structured grid.')
spd_inds_valid = False
elif 'DISU' in self.model.get_package_list() and \
elif self.model.has_package('DISU') and \
'node' not in stress_period_data.dtype.names:
self._add_to_summary(type='Error',
desc='\r Stress period data missing node number for unstructured grid.')