From c45a5e5f1fb2f8224d87307564b68dc1c30063d9 Mon Sep 17 00:00:00 2001 From: spaulins-usgs Date: Wed, 22 Apr 2020 07:44:27 -0700 Subject: [PATCH] fix(#856): Specifying period data with value None now only removes data from that period. Also, fixed an unrelated problem by updating the multi-package list. (#857) --- autotest/t505_test.py | 3 ++- flopy/mf6/data/mfdataarray.py | 25 ++++++++++++++++++++----- flopy/mf6/data/mfdatalist.py | 25 ++++++++++++++++++++----- flopy/mf6/data/mfstructure.py | 9 +++++---- 4 files changed, 47 insertions(+), 15 deletions(-) diff --git a/autotest/t505_test.py b/autotest/t505_test.py index 1aed1b00e..048e5a903 100644 --- a/autotest/t505_test.py +++ b/autotest/t505_test.py @@ -189,7 +189,8 @@ def np001(): # test saving a binary file with list data well_spd = {0: {'filename': 'wel0.bin', 'binary': True, - 'data': [((0, 0, 4), -2000.0), ((0, 0, 7), -2.0)]}} + 'data': [((0, 0, 4), -2000.0), ((0, 0, 7), -2.0)]}, + 1: None} wel_package = ModflowGwfwel(model, print_input=True, print_flows=True, save_flows=True, maxbound=2, stress_period_data=well_spd) diff --git a/flopy/mf6/data/mfdataarray.py b/flopy/mf6/data/mfdataarray.py index 15721767c..9bda5ed98 100644 --- a/flopy/mf6/data/mfdataarray.py +++ b/flopy/mf6/data/mfdataarray.py @@ -1027,6 +1027,10 @@ def __init__(self, sim_data, model_or_sim, structure, enable=True, def data_type(self): return DataType.transient2d + def remove_transient_key(self, transient_key): + if transient_key in self._data_storage: + del self._data_storage[transient_key] + def add_transient_key(self, transient_key): super(MFTransientArray, self).add_transient_key(transient_key) self._data_storage[transient_key] = \ @@ -1112,10 +1116,17 @@ def set_data(self, data, multiplier=None, layer=None, key=None): if isinstance(data, dict) or isinstance(data, OrderedDict): # each item in the dictionary is a list for one stress period # the dictionary key is the stress period the list is for + del_keys = [] for key, list_item in data.items(): - self._set_data_prep(list_item, key) - super(MFTransientArray, self).set_data(list_item, multiplier, - layer) + if list_item is None: + self.remove_transient_key(key) + del_keys.append(key) + else: + self._set_data_prep(list_item, key) + super(MFTransientArray, self).set_data(list_item, + multiplier, layer) + for key in del_keys: + del data[key] else: if key is None: # search for a key @@ -1125,8 +1136,12 @@ def set_data(self, data, multiplier=None, layer=None, key=None): key = data[new_key_index] else: key = 0 - self._set_data_prep(data, key) - super(MFTransientArray, self).set_data(data, multiplier, layer) + if data is None: + self.remove_transient_key(key) + else: + self._set_data_prep(data, key) + super(MFTransientArray, self).set_data(data, multiplier, + layer) def get_file_entry(self, key=0, ext_file_action=ExtFileAction.copy_relative_paths): diff --git a/flopy/mf6/data/mfdatalist.py b/flopy/mf6/data/mfdatalist.py index accf6009d..18e12ccd3 100644 --- a/flopy/mf6/data/mfdatalist.py +++ b/flopy/mf6/data/mfdatalist.py @@ -955,6 +955,10 @@ def masked_4D_arrays_itr(self): def to_array(self, kper=0, mask=False): return super(MFTransientList, self).to_array(kper, mask) + def remove_transient_key(self, transient_key): + if transient_key in self._data_storage: + del self._data_storage[transient_key] + def add_transient_key(self, transient_key): super(MFTransientList, self).add_transient_key(transient_key) if isinstance(transient_key, int): @@ -1018,10 +1022,18 @@ def set_data(self, data, key=None, autofill=False): if 'filename' not in data: # each item in the dictionary is a list for one stress period # the dictionary key is the stress period the list is for + del_keys = [] for key, list_item in data.items(): - self._set_data_prep(list_item, key) - super(MFTransientList, self).set_data(list_item, - autofill=autofill) + if list_item is None: + self.remove_transient_key(key) + del_keys.append(key) + else: + self._set_data_prep(list_item, key) + super(MFTransientList, self).set_data(list_item, + autofill= + autofill) + for key in del_keys: + del data[key] else: self._set_data_prep(data['data'], key) super(MFTransientList, self).set_data(data, autofill) @@ -1033,8 +1045,11 @@ def set_data(self, data, key=None, autofill=False): key = data[new_key_index] else: key = 0 - self._set_data_prep(data, key) - super(MFTransientList, self).set_data(data, autofill) + if data is None: + self.remove_transient_key(key) + else: + self._set_data_prep(data, key) + super(MFTransientList, self).set_data(data, autofill) def get_file_entry(self, key=0, ext_file_action=ExtFileAction.copy_relative_paths): diff --git a/flopy/mf6/data/mfstructure.py b/flopy/mf6/data/mfstructure.py index 23d57bad7..0e96478f9 100644 --- a/flopy/mf6/data/mfstructure.py +++ b/flopy/mf6/data/mfstructure.py @@ -63,10 +63,11 @@ def __init__(self): self.dfndir = os.path.join('.', 'dfn') self.common = os.path.join(self.dfndir, 'common.dfn') # FIX: Transport - multi packages are hard coded - self.multi_package = {'gwfmvr': 0, 'exggwfgwf': 0, 'gwfchd': 0, - 'gwfrch': 0, 'gwfwel': 0, - 'gwfdrn': 0, 'gwfriv': 0, 'lnfcgeo': 0, - 'lnfrgeo': 0, 'lnfngeo':0, + self.multi_package = {'exggwfgwf': 0, 'gwfchd': 0, 'gwfwel': 0, + 'gwfdrn': 0, 'gwfriv': 0, 'gwfghb': 0, + 'gwfrch': 0, 'gwfevt': 0, 'gwfmaw': 0, + 'gwfsfr': 0, 'gwflak': 0, 'gwfuzf': 0, + 'lnfcgeo': 0, 'lnfrgeo': 0, 'lnfngeo': 0, 'utlobs': 0, 'utlts': 0, 'utltas': 0} def get_file_list(self):