From f7e7d6c9246b7f85d002a0be15c39d4aa94767ec Mon Sep 17 00:00:00 2001 From: scottrp <45947939+scottrp@users.noreply.github.com> Date: Fri, 30 Jun 2023 12:14:48 -0700 Subject: [PATCH] fix(exchanage and gnc package cellids) --- flopy/mf6/data/mfdatalist.py | 19 +++++++++++------- flopy/mf6/data/mfdatastorage.py | 34 +++++++++++++++++++-------------- flopy/mf6/data/mfdatautil.py | 9 +++------ flopy/mf6/data/mffileaccess.py | 12 ++++-------- flopy/utils/datautil.py | 12 +++++++----- 5 files changed, 46 insertions(+), 40 deletions(-) diff --git a/flopy/mf6/data/mfdatalist.py b/flopy/mf6/data/mfdatalist.py index c9635b458f..7cffa30bc0 100644 --- a/flopy/mf6/data/mfdatalist.py +++ b/flopy/mf6/data/mfdatalist.py @@ -7,7 +7,7 @@ from ...datbase import DataListInterface, DataType from ...mbase import ModelInterface -from ...utils import datautil +from ...utils.datautil import DatumUtil from ..data import mfdata, mfstructure from ..mfbase import ExtFileAction, MFDataException, VerbosityLevel from ..utils.mfenums import DiscretizationType @@ -1043,14 +1043,21 @@ def _get_file_entry_record( data_val = data_line[index] if data_item.is_cellid or ( data_item.possible_cellid - and storage._validate_cellid([data_val], 0) + and storage._validate_cellid( + [data_val], 0, data_item + ) ): if ( data_item.shape is not None and len(data_item.shape) > 0 and data_item.shape[0] == "ncelldim" ): - model_grid = data_dim.get_model_grid() + model_num = DatumUtil.cellid_model_num( + data_item, + self.structure.model_data, + self._data_dimensions.package_dim.model_dim, + ) + model_grid = data_dim.get_model_grid(model_num) cellid_size = ( model_grid.get_num_spatial_coordinates() ) @@ -1058,9 +1065,7 @@ def _get_file_entry_record( resolved_shape, cellid_size ) data_size = 1 - if len( - resolved_shape - ) == 1 and datautil.DatumUtil.is_int( + if len(resolved_shape) == 1 and DatumUtil.is_int( resolved_shape[0] ): data_size = int(resolved_shape[0]) @@ -1722,7 +1727,7 @@ def store_as_external_file( or replace_existing_external ): fname, ext = os.path.splitext(external_file_path) - if datautil.DatumUtil.is_int(sp): + if DatumUtil.is_int(sp): full_name = f"{fname}_{sp + 1}{ext}" else: full_name = f"{fname}_{sp}{ext}" diff --git a/flopy/mf6/data/mfdatastorage.py b/flopy/mf6/data/mfdatastorage.py index b235e38ad0..491c2e20cf 100644 --- a/flopy/mf6/data/mfdatastorage.py +++ b/flopy/mf6/data/mfdatastorage.py @@ -1569,25 +1569,35 @@ def _build_recarray(self, data, key, autofill): self._verify_list(new_data) return new_data + def _get_cellid_size(self, data_item_name): + model_num = DatumUtil.cellid_model_num( + data_item_name, + self.data_dimensions.structure.model_data, + self.data_dimensions.package_dim.model_dim, + ) + model_grid = self.data_dimensions.get_model_grid(model_num=model_num) + return model_grid.get_num_spatial_coordinates() + def make_tuple_cellids(self, data): # convert cellids from individual layer, row, column fields into # tuples (layer, row, column) - data_dim = self.data_dimensions - model_grid = data_dim.get_model_grid() - cellid_size = model_grid.get_num_spatial_coordinates() - new_data = [] current_cellid = () for line in data: + data_idx = 0 new_line = [] for item, is_cellid in zip(line, self.recarray_cellid_list_ex): if is_cellid: + cellid_size = self._get_cellid_size( + self._recarray_type_list[data_idx][0], + ) current_cellid += (item,) if len(current_cellid) == cellid_size: new_line.append(current_cellid) current_cellid = () else: new_line.append(item) + data_idx += 1 new_data.append(tuple(new_line)) return new_data @@ -2092,14 +2102,14 @@ def resolve_shape_list( return False, True return False, False - def _validate_cellid(self, arr_line, data_index): + def _validate_cellid(self, arr_line, data_index, data_item): if not self.data_dimensions.structure.model_data: # not model data so this is not a cell id return False if arr_line is None: return False + cellid_size = self._get_cellid_size(data_item.name) model_grid = self.data_dimensions.get_model_grid() - cellid_size = model_grid.get_num_spatial_coordinates() if cellid_size + data_index > len(arr_line): return False for index, dim_size in zip( @@ -2353,9 +2363,8 @@ def _verify_list(self, data): # this is a cell id. verify that it contains the # correct number of integers if cellid_size is None: - model_grid = datadim.get_model_grid() - cellid_size = ( - model_grid.get_num_spatial_coordinates() + cellid_size = self._get_cellid_size( + self._recarray_type_list[index][0] ) if ( cellid_size != 1 @@ -2934,9 +2943,7 @@ def build_type_list( ): # A cellid is a single entry (tuple) in the # recarray. Adjust dimensions accordingly. - data_dim = self.data_dimensions - grid = data_dim.get_model_grid() - size = grid.get_num_spatial_coordinates() + size = self._get_cellid_size(data_item.name) data_item.remove_cellid(resolved_shape, size) if not data_item.optional or not min_size: for index in range(0, resolved_shape[0]): @@ -2973,8 +2980,7 @@ def _append_type_lists(self, name, data_type, iscellid): if iscellid and self._model_or_sim.model_type is not None: # write each part of the cellid out as a separate entry # to _recarray_list_list_ex - model_grid = self.data_dimensions.get_model_grid() - cellid_size = model_grid.get_num_spatial_coordinates() + cellid_size = self._get_cellid_size(name) # determine header for different grid types if cellid_size == 1: self._do_ex_list_append(name, int, iscellid) diff --git a/flopy/mf6/data/mfdatautil.py b/flopy/mf6/data/mfdatautil.py index 63fb7edfb8..1fa241ea08 100644 --- a/flopy/mf6/data/mfdatautil.py +++ b/flopy/mf6/data/mfdatautil.py @@ -187,13 +187,10 @@ def to_string( and data_dim.get_model_dim(None).model_name is not None ): model_num = DatumUtil.cellid_model_num( - data_item, data_dim.structure.model_data + data_item.name, + data_dim.structure.model_data, + data_dim.package_dim.model_dim, ) - if ( - model_num is not None - and len(data_dim.package_dim.model_dim) <= model_num - ): - model_num = None model_grid = data_dim.get_model_grid(model_num=model_num) cellid_size = model_grid.get_num_spatial_coordinates() if len(val) != cellid_size: diff --git a/flopy/mf6/data/mffileaccess.py b/flopy/mf6/data/mffileaccess.py index eb78190ea1..94efd59535 100644 --- a/flopy/mf6/data/mffileaccess.py +++ b/flopy/mf6/data/mffileaccess.py @@ -2071,7 +2071,7 @@ def _append_data_list( self._last_line_info.append([]) if data_item.is_cellid or ( data_item.possible_cellid - and storage._validate_cellid(arr_line, data_index) + and storage._validate_cellid(arr_line, data_index, data_item) ): if self._data_dimensions is None: comment = ( @@ -2098,14 +2098,10 @@ def _append_data_list( ) # in case of multiple model grids, determine which one to use model_num = DatumUtil.cellid_model_num( - data_item, struct.model_data + data_item.name, + struct.model_data, + self._data_dimensions.package_dim.model_dim, ) - if ( - model_num is not None - and len(self._data_dimensions.package_dim.model_dim) - <= model_num - ): - model_num = None model_grid = self._data_dimensions.get_model_grid( model_num=model_num ) diff --git a/flopy/utils/datautil.py b/flopy/utils/datautil.py index 1004cd825e..53844ae46b 100644 --- a/flopy/utils/datautil.py +++ b/flopy/utils/datautil.py @@ -84,20 +84,22 @@ def is_basic_type(obj): return False @staticmethod - def cellid_model_num(data_item, model_data): + def cellid_model_num(data_item_name, model_data, model_dim): # determine which model to use based on cellid name # contains hard coded relationship between data item names and # model number # TODO: Incorporate this into the DFNs if model_data: return None - if data_item.name.startswith("cellidm") and len(data_item.name) > 7: - model_num = data_item.name[7:] + if data_item_name.startswith("cellidm") and len(data_item_name) > 7: + model_num = data_item_name[7:] if DatumUtil.is_int(model_num): return int(model_num) - 1 - if data_item.name == "cellidn" or data_item.name == "cellidsj": + if ( + data_item_name == "cellidn" or data_item_name == "cellidsj" + ) and len(model_dim) > 0: return 0 - elif data_item.name == "cellidm": + elif data_item_name == "cellidm" and len(model_dim) > 1: return 1 return None