Skip to content

Commit

Permalink
feat(disv2d): introduce support for a 2D vertex grid (for overland fl…
Browse files Browse the repository at this point in the history
…ow) (#2151)

* feat(disv2d): introduce limited support for a 2D vertex grid (for overland flow)

* ruff ruff
  • Loading branch information
langevin-usgs authored Apr 15, 2024
1 parent f4a4274 commit e023235
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 2 deletions.
6 changes: 6 additions & 0 deletions flopy/mf6/coordinates/modeldimensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -411,6 +411,12 @@ def _create_model_grid(self, grid_type):
self._model_grid = ModelGrid(
self.model_name, self.simulation_data, DiscretizationType.DIS2D
)
elif grid_type == DiscretizationType.DISV2D:
self._model_grid = ModelGrid(
self.model_name,
self.simulation_data,
DiscretizationType.DISV2D,
)
else:
self._model_grid = ModelGrid(
self.model_name,
Expand Down
37 changes: 35 additions & 2 deletions flopy/mf6/coordinates/modelgrid.py
Original file line number Diff line number Diff line change
Expand Up @@ -464,6 +464,13 @@ def get_grid_type(simulation_data, model_name):
is not None
):
return DiscretizationType.DIS2D
elif (
package_recarray.search_data(
f"disv2d{structure.get_version_string()}", 0
)
is not None
):
return DiscretizationType.DISV2D
return DiscretizationType.UNDEFINED

def get_idomain(self):
Expand All @@ -487,6 +494,10 @@ def get_idomain(self):
return self._simulation_data.mfdata[
(self._model_name, "dis2d", "griddata", "idomain")
].get_data()
elif self._grid_type == DiscretizationType.DISV2D:
return self._simulation_data.mfdata[
(self._model_name, "disv2d", "griddata", "idomain")
].get_data()
except_str = (
"ERROR: Grid type {} for model {} not " "recognized.".format(
self._grid_type, self._model_name
Expand Down Expand Up @@ -522,7 +533,10 @@ def get_horizontal_cross_section_dim_arrays(self):
np.arange(1, self.num_rows() + 1, 1, np.int32),
np.arange(1, self.num_columns() + 1, 1, np.int32),
]
elif self.grid_type() == DiscretizationType.DISV:
elif (
self.grid_type() == DiscretizationType.DISV
or self.grid_type() == DiscretizationType.DISV2D
):
return [np.arange(1, self.num_cells_per_layer() + 1, 1, np.int32)]
elif (
self.grid_type() == DiscretizationType.DISU
Expand All @@ -546,6 +560,7 @@ def get_model_dim(self):
elif (
self.grid_type() == DiscretizationType.DISU
or self.grid_type() == DiscretizationType.DISV1D
or self.grid_type() == DiscretizationType.DISV2D
):
return [self.num_cells()]

Expand All @@ -569,6 +584,7 @@ def get_model_dim_arrays(self):
elif (
self.grid_type() == DiscretizationType.DISU
or self.grid_type() == DiscretizationType.DISV1D
or self.grid_type() == DiscretizationType.DISV2D
):
return [np.arange(1, self.num_cells() + 1, 1, np.int32)]

Expand All @@ -584,7 +600,10 @@ def get_layer_array(self):
def get_horizontal_cross_section_dim_names(self):
if self.grid_type() == DiscretizationType.DIS:
return ["row", "column"]
elif self.grid_type() == DiscretizationType.DISV:
elif (
self.grid_type() == DiscretizationType.DISV
or self.grid_type() == DiscretizationType.DISV2D
):
return ["layer_cell_num"]
elif (
self.grid_type() == DiscretizationType.DISU
Expand All @@ -605,6 +624,8 @@ def get_model_dim_names(self):
return ["row", "column"]
elif self.grid_type() == DiscretizationType.DISV:
return ["layer", "layer_cell_num"]
elif self.grid_type() == DiscretizationType.DISV2D:
return ["cell_num"]
elif (
self.grid_type() == DiscretizationType.DISU
or self.grid_type() == DiscretizationType.DISV1D
Expand All @@ -619,6 +640,8 @@ def get_num_spatial_coordinates(self):
return 2
elif grid_type == DiscretizationType.DISV:
return 2
elif grid_type == DiscretizationType.DISV2D:
return 1
elif grid_type == DiscretizationType.DISU:
return 1
elif grid_type == DiscretizationType.DISV1D:
Expand Down Expand Up @@ -680,6 +703,10 @@ def num_cells_per_layer(self):
return self._simulation_data.mfdata[
(self._model_name, "disv", "dimensions", "ncpl")
].get_data()
elif self.grid_type() == DiscretizationType.DISV2D:
return self._simulation_data.mfdata[
(self._model_name, "disv", "dimensions", "nodes")
].get_data()
elif self.grid_type() == DiscretizationType.DISU:
return self._simulation_data.mfdata[
(self._model_name, "disu", "dimensions", "nodes")
Expand All @@ -698,6 +725,7 @@ def num_layers(self):
self.grid_type() == DiscretizationType.DISU
or self.grid_type() == DiscretizationType.DISV1D
or self.grid_type() == DiscretizationType.DIS2D
or self.grid_type() == DiscretizationType.DISV2D
):
return None

Expand All @@ -712,6 +740,10 @@ def num_cells(self):
return self._simulation_data.mfdata[
(self._model_name, "disu", "dimensions", "nodes")
].get_data()
elif self.grid_type() == DiscretizationType.DISV2D:
return self._simulation_data.mfdata[
(self._model_name, "disv2d", "dimensions", "nodes")
].get_data()
elif self.grid_type() == DiscretizationType.DISV1D:
return self._simulation_data.mfdata[
(self._model_name, "disv1d", "dimensions", "nodes")
Expand All @@ -738,6 +770,7 @@ def get_all_model_cells(self):
elif (
self.grid_type() == DiscretizationType.DISU
or self.grid_type() == DiscretizationType.DISV1D
or self.grid_type() == DiscretizationType.DISV2D
):
for node in range(0, self.num_cells()):
model_cells.append(node + 1)
Expand Down
45 changes: 45 additions & 0 deletions flopy/mf6/mfmodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -531,6 +531,44 @@ def modelgrid(self):
yoff=self._modelgrid.yoffset,
angrot=self._modelgrid.angrot,
)
elif self.get_grid_type() == DiscretizationType.DISV2D:
dis = self.get_package("disv2d")
if not hasattr(dis, "_init_complete"):
if not hasattr(dis, "cell2d"):
# disv package has not yet been initialized
return self._modelgrid
else:
# disv package has been partially initialized
self._modelgrid = VertexGrid(
vertices=dis.vertices.array,
cell2d=dis.cell2d.array,
top=None,
botm=None,
idomain=None,
lenuni=None,
crs=self._modelgrid.crs,
xoff=self._modelgrid.xoffset,
yoff=self._modelgrid.yoffset,
angrot=self._modelgrid.angrot,
)
else:
botm = dis.botm.array
idomain = dis.idomain.array
if idomain is None:
force_resync = True
idomain = self._resolve_idomain(idomain, botm)
self._modelgrid = VertexGrid(
vertices=dis.vertices.array,
cell2d=dis.cell2d.array,
top=dis.top.array,
botm=botm,
idomain=idomain,
lenuni=dis.length_units.array,
crs=self._modelgrid.crs,
xoff=self._modelgrid.xoffset,
yoff=self._modelgrid.yoffset,
angrot=self._modelgrid.angrot,
)
else:
return self._modelgrid

Expand Down Expand Up @@ -1217,6 +1255,13 @@ def get_grid_type(self):
is not None
):
return DiscretizationType.DISV1D
elif (
package_recarray.search_data(
f"disv2d{structure.get_version_string()}", 0
)
is not None
):
return DiscretizationType.DISV2D

return DiscretizationType.UNDEFINED

Expand Down
1 change: 1 addition & 0 deletions flopy/mf6/utils/mfenums.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@ class DiscretizationType(Enum):
DISU = 3
DISV1D = 4
DIS2D = 5
DISV2D = 6

0 comments on commit e023235

Please sign in to comment.