From 0af195437d813c575ff21438e1ef44b3b6bb7303 Mon Sep 17 00:00:00 2001 From: Briochh Date: Wed, 28 Aug 2019 11:39:18 +1200 Subject: [PATCH 1/4] making sfr reachdata (ds2) write insensitive to data field order currently uses dtype.descr which can fail is struct array fields change order. --- flopy/modflow/mfsfr2.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flopy/modflow/mfsfr2.py b/flopy/modflow/mfsfr2.py index 2a73c11317..bb3f4d338f 100644 --- a/flopy/modflow/mfsfr2.py +++ b/flopy/modflow/mfsfr2.py @@ -2829,8 +2829,8 @@ def _get_item2_names(nstrm, reachinput, isfropt, structured=False): def _fmt_string(array, float_format='{!s}'): fmt_string = '' - for field in array.dtype.descr: - vtype = field[1][1].lower() + for field in array.dtype.names: #TODO handle out of order arrays - iter over dtype.names; + vtype = array.dtype[field].str[1].lower() #TODO vtype = array.dtype[field].str if vtype == 'v': continue if vtype == 'i': From 51d4442cb0ff96024be0bc81c554a4e1d2d9ed78 Mon Sep 17 00:00:00 2001 From: Briochh Date: Wed, 28 Aug 2019 11:45:46 +1200 Subject: [PATCH 2/4] happend upon etvr not evtr in evt package --- flopy/modflow/mfevt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flopy/modflow/mfevt.py b/flopy/modflow/mfevt.py index b2fc01241f..ec3776246a 100644 --- a/flopy/modflow/mfevt.py +++ b/flopy/modflow/mfevt.py @@ -139,7 +139,7 @@ def __init__(self, model, nevtop=3, ipakcb=None, surf=0., evtr=1e-3, self.surf = Transient2d(model, (nrow, ncol), np.float32, surf, name='surf') self.evtr = Transient2d(model, (nrow, ncol), np.float32, - evtr, name='etvr') + evtr, name='evtr') self.exdp = Transient2d(model, (nrow, ncol), np.float32, exdp, name='exdp') self.ievt = Transient2d(model, (nrow, ncol), np.int32, From 97168f5e2fd960ed8388cb77f84a969642f916b6 Mon Sep 17 00:00:00 2001 From: Briochh Date: Wed, 28 Aug 2019 13:21:18 +1200 Subject: [PATCH 3/4] Adding test that exposes issue with passing disordered reach_data arrays --- autotest/t009_test.py | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/autotest/t009_test.py b/autotest/t009_test.py index 9649bb77cb..f2a6a4dad0 100644 --- a/autotest/t009_test.py +++ b/autotest/t009_test.py @@ -398,7 +398,6 @@ def test_ds_6d_6e_disordered(): sfr = m.get_package("SFR") sfr2 = m2.get_package("SFR") - if len(sfr.graph) != len(sfr2.graph): raise AssertionError @@ -416,6 +415,28 @@ def test_ds_6d_6e_disordered(): raise AssertionError +def test_disordered_reachdata_fields(): + path = os.path.join("..", "examples", "data", "hydmod_test") + wpath = os.path.join(".", "temp", "t009_disorderfields") + m = flopy.modflow.Modflow.load("test1tr2.nam", + model_ws=path) + sfr = m.get_package("SFR") + orig_reach_data = sfr.reach_data + # build shuffled rec array + shuffled_fields = list(set(orig_reach_data.dtype.names)) + data = [] + names = [] + formats = [] + for field in shuffled_fields: + data.append(orig_reach_data[field]) + names.append(field) + formats.append(orig_reach_data.dtype[field].str) + reach_data = np.rec.fromarrays(data, names=names, formats=formats) + m.sfr.reach_data = reach_data + m.change_model_ws(wpath) + m.write_input() + + def test_transient_example(): path = os.path.join('temp', 't009') gpth = os.path.join('..', 'examples', 'data', 'mf2005_test', 'testsfr2.*') @@ -488,14 +509,16 @@ def test_sfr_plot(): #assert True pass + if __name__ == '__main__': # test_sfr() # test_ds_6d_6e_disordered() + test_disordered_reachdata_fields() # test_sfr_renumbering() # test_example() # test_export() - #test_transient_example() - #test_sfr_plot() + # test_transient_example() + # mtest_sfr_plot() # test_assign_layers() # test_SfrFile() # test_const() From ccec2d6829e0bbd987e8b99be56d289b0d800bac Mon Sep 17 00:00:00 2001 From: Briochh Date: Wed, 28 Aug 2019 13:43:39 +1200 Subject: [PATCH 4/4] tidy-up --- flopy/modflow/mfsfr2.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flopy/modflow/mfsfr2.py b/flopy/modflow/mfsfr2.py index 01f7bcd316..1dd84ea91c 100644 --- a/flopy/modflow/mfsfr2.py +++ b/flopy/modflow/mfsfr2.py @@ -1605,7 +1605,7 @@ def _write_reach_data(self, f_sfr): for idx in ['k', 'i', 'j', 'node']: if (idx in columns): d[idx] += 1 - d = d[columns] + d = d[columns] # data columns sorted formats = _fmt_string(d)[:-1] + '\n' for rec in d: f_sfr.write(formats.format(*rec)) @@ -2805,8 +2805,8 @@ def _get_item2_names(nstrm, reachinput, isfropt, structured=False): def _fmt_string(array, float_format='{!s}'): fmt_string = '' - for field in array.dtype.names: #TODO handle out of order arrays - iter over dtype.names; - vtype = array.dtype[field].str[1].lower() #TODO vtype = array.dtype[field].str + for field in array.dtype.names: # data already sorted + vtype = array.dtype[field].str[1].lower() if vtype == 'v': continue if vtype == 'i':