From 4bfab916592784180d57df59b78d190e28c9099b Mon Sep 17 00:00:00 2001 From: spaulins-usgs Date: Wed, 25 Mar 2020 10:44:41 -0700 Subject: [PATCH] fix:(#830): handling 'none' cellids in SFR package (#834) * fix(#830): handling 'none' in SFR package * fix(#830): handling 'none' in sfr package * fix(#830): added test case with cellid 'none' * fix(#830) * fix(#830): updated data for sfr cellid 'none' test * fix(#830) --- autotest/t505_test.py | 9 +++++- .../mf6/create_tests/test028_sfr/sfr_rec.txt | 2 +- flopy/mf6/data/mfdatastorage.py | 3 +- flopy/mf6/data/mfdatautil.py | 12 +++++--- flopy/mf6/data/mffileaccess.py | 2 ++ flopy/mf6/utils/testutils.py | 28 +++++++++++-------- 6 files changed, 38 insertions(+), 18 deletions(-) diff --git a/autotest/t505_test.py b/autotest/t505_test.py index c1dfe4745..e0b66352d 100644 --- a/autotest/t505_test.py +++ b/autotest/t505_test.py @@ -1680,7 +1680,7 @@ def test028_sfr(): os.path.join(pth, 'sfr_reach_per_rec.txt')) # test zero based indexes reach_con_rec[0] = (0, -0.0) - sfr_package = ModflowGwfsfr(model, unit_conversion=1.486, + sfr_package = ModflowGwfsfr(model, unit_conversion=1.486, stage_filerecord='test1tr.sfr.stage.bin', budget_filerecord='test1tr.sfr.cbc', nreaches=36, packagedata=sfr_rec, @@ -1690,6 +1690,7 @@ def test028_sfr(): assert (sfr_package.connectiondata.get_data()[0][1] == -0.0) assert (sfr_package.connectiondata.get_data()[1][1] == 0.0) assert (sfr_package.connectiondata.get_data()[2][1] == 1.0) + assert (sfr_package.packagedata.get_data()[1][1].lower() == 'none') sim.simulation_data.mfpath.set_sim_path(run_folder) sim.write_simulation() @@ -1700,11 +1701,17 @@ def test028_sfr(): assert (sfr_package.connectiondata.get_data()[0][1] == -0.0) assert (sfr_package.connectiondata.get_data()[1][1] == 0.0) assert (sfr_package.connectiondata.get_data()[2][1] == 1.0) + assert (sfr_package.packagedata.get_data()[1][1].lower() == 'none') # undo zero based test and move on model.remove_package(sfr_package.package_type) reach_con_rec = testutils.read_reach_con_rec( os.path.join(pth, 'sfr_reach_con_rec.txt')) + + # set sfr settings back to expected package data + rec_line = (sfr_rec[1][0], (0, 1, 1)) + sfr_rec[1][2:] + sfr_rec[1] = rec_line + sfr_package = ModflowGwfsfr(model, unit_conversion=1.486, stage_filerecord='test1tr.sfr.stage.bin', budget_filerecord='test1tr.sfr.cbc', diff --git a/examples/data/mf6/create_tests/test028_sfr/sfr_rec.txt b/examples/data/mf6/create_tests/test028_sfr/sfr_rec.txt index 1d712ce41..9bcef2550 100644 --- a/examples/data/mf6/create_tests/test028_sfr/sfr_rec.txt +++ b/examples/data/mf6/create_tests/test028_sfr/sfr_rec.txt @@ -1,5 +1,5 @@ 1 1 1 1 4500. 12 8.6767896E-04 1093.048 3.0 0.00003 0.03 1 1.0 0 - 2 1 2 2 7000. 12 8.6767896E-04 1088.059 3.0 0.00003 0.03 2 1.0 0 + 2 None 7000. 12 8.6767896E-04 1088.059 3.0 0.00003 0.03 2 1.0 0 3 1 3 3 6000. 12 8.6767896E-04 1082.419 3.0 0.00003 0.03 2 1.0 0 4 1 3 4 5550. 12 8.6767896E-04 1077.408 3.0 0.00003 0.03 3 1.0 1 5 1 4 5 6500. 12 9.4339624E-04 1071.934 3.0 0.00003 0.03 2 1.0 0 diff --git a/flopy/mf6/data/mfdatastorage.py b/flopy/mf6/data/mfdatastorage.py index b193e745b..0e242d896 100644 --- a/flopy/mf6/data/mfdatastorage.py +++ b/flopy/mf6/data/mfdatastorage.py @@ -1536,7 +1536,8 @@ def _verify_list(self, data): cellid_size = model_grid.\ get_num_spatial_coordinates() if cellid_size != 1 and \ - len(data_line[index]) != cellid_size: + len(data_line[index]) != cellid_size and \ + isinstance(data_line[index], int): message = 'Cellid "{}" contains {} integer(s). ' \ 'Expected a cellid containing {} ' \ 'integer(s) for grid type' \ diff --git a/flopy/mf6/data/mfdatautil.py b/flopy/mf6/data/mfdatautil.py index a6eaa4b48..39b6e9c20 100644 --- a/flopy/mf6/data/mfdatautil.py +++ b/flopy/mf6/data/mfdatautil.py @@ -124,9 +124,10 @@ def to_string(val, data_type, sim_data, data_dim, is_cellid=False, elif is_cellid or (possible_cellid and isinstance(val, tuple)): if DatumUtil.is_int(val): return str(val + 1) - if len(val) > 0 and val[0] == 'none': + if len(val) > 0 and isinstance(val, str) and \ + val.lower() == 'none': # handle case that cellid is 'none' - return val[0] + return val if is_cellid and \ data_dim.get_model_dim(None).model_name is not \ None: @@ -148,8 +149,11 @@ def to_string(val, data_type, sim_data, data_dim, is_cellid=False, sim_data.debug) string_val = [] - for item in val: - string_val.append(str(item + 1)) + if isinstance(val, str): + string_val.append(val) + else: + for item in val: + string_val.append(str(item + 1)) return ' '.join(string_val) elif data_type == DatumType.integer: if data_item is not None and data_item.numeric_index: diff --git a/flopy/mf6/data/mffileaccess.py b/flopy/mf6/data/mffileaccess.py index c697f4bc9..bb2517719 100644 --- a/flopy/mf6/data/mffileaccess.py +++ b/flopy/mf6/data/mffileaccess.py @@ -945,6 +945,8 @@ def read_list_data_from_file(self, file_handle, storage, current_key, True) storage.data_dimensions.unlock() return data_rec + self.simple_line = self.simple_line \ + and self.structure.package_type != 'sfr' if self.simple_line: line_len = len(self._last_line_info) if struct.num_optional > 0 and not line_info_processed: diff --git a/flopy/mf6/utils/testutils.py b/flopy/mf6/utils/testutils.py index e824f50f5..b2a0bfa18 100644 --- a/flopy/mf6/utils/testutils.py +++ b/flopy/mf6/utils/testutils.py @@ -122,18 +122,24 @@ def read_sfr_rec(sfr_file, cellid_size=3): sfrrecarray = [] for line in fd: fd_spl = line.strip().split() + try: + cellid = make_int_tuple(fd_spl[1:1+cellid_size]) + temp_size = cellid_size + except ValueError: + cellid = fd_spl[1] + temp_size = 1 sfrrecarray.append((int(fd_spl[0]) - 1, - make_int_tuple(fd_spl[1:1+cellid_size]), - float(fd_spl[cellid_size+1]), - int(fd_spl[cellid_size+2]), - float(fd_spl[cellid_size+3]), - float(fd_spl[cellid_size+4]), - float(fd_spl[cellid_size+5]), - float(fd_spl[cellid_size+6]), - float(fd_spl[cellid_size+7]), - int(fd_spl[cellid_size+8]), - float(fd_spl[cellid_size+9]), - int(fd_spl[cellid_size+10]))) + cellid, + float(fd_spl[temp_size+1]), + int(fd_spl[temp_size+2]), + float(fd_spl[temp_size+3]), + float(fd_spl[temp_size+4]), + float(fd_spl[temp_size+5]), + float(fd_spl[temp_size+6]), + float(fd_spl[temp_size+7]), + int(fd_spl[temp_size+8]), + float(fd_spl[temp_size+9]), + int(fd_spl[temp_size+10]))) fd.close() return sfrrecarray