Skip to content

Commit

Permalink
fix(exchanage and gnc package cellids)
Browse files Browse the repository at this point in the history
  • Loading branch information
scottrp committed Jun 30, 2023
1 parent da97559 commit f7e7d6c
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 40 deletions.
19 changes: 12 additions & 7 deletions flopy/mf6/data/mfdatalist.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -1043,24 +1043,29 @@ 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()
)
data_item.remove_cellid(
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])
Expand Down Expand Up @@ -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}"
Expand Down
34 changes: 20 additions & 14 deletions flopy/mf6/data/mfdatastorage.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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]):
Expand Down Expand Up @@ -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)
Expand Down
9 changes: 3 additions & 6 deletions flopy/mf6/data/mfdatautil.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
12 changes: 4 additions & 8 deletions flopy/mf6/data/mffileaccess.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = (
Expand All @@ -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
)
Expand Down
12 changes: 7 additions & 5 deletions flopy/utils/datautil.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down

0 comments on commit f7e7d6c

Please sign in to comment.