Source code for imod.select.grid

from typing import List

import numpy as np
import xarray as xr
import xugrid as xu
from fastcore.dispatch import typedispatch
from scipy.ndimage import binary_dilation

from imod.mf6.validation import BOUNDARY_DIMS_SCHEMA
from imod.schemata import DTypeSchema
from imod.typing import GridDataArray


def _reduce_grid_except_dims(
    grid: GridDataArray, preserve_dims: List[str]
) -> GridDataArray:
    to_reduce = {dim: 0 for dim in grid.dims if dim not in preserve_dims}
    return grid.isel(**to_reduce)  # type: ignore [misc, arg-type]


def _validate_grid(grid):
    # Validate if required dimensions are present
    schemata = [BOUNDARY_DIMS_SCHEMA, DTypeSchema(np.bool_)]
    for schema in schemata:
        schema.validate(grid)


[docs] def grid_boundary_xy(grid: GridDataArray) -> GridDataArray: """ Return grid boundary on the xy plane. Wraps the binary_dilation function. Parameters ---------- grid : {xarray.DataArray, xugrid.UgridDataArray} Grid with either ``x`` and ``y`` dimensions or a face dimesion. Returns ------- {xarray.DataArray, xugrid.UgridDataArray} 2d grid with locations of grid boundaries """ return _grid_boundary_xy(grid)
@typedispatch def _grid_boundary_xy(grid: object) -> None: raise TypeError( f"Grid should be of type DataArray or UgridDataArray, got type {type(grid)}" ) @typedispatch # type: ignore [no-redef] def _grid_boundary_xy(grid: xr.DataArray) -> xr.DataArray: _validate_grid(grid) like_2d = _reduce_grid_except_dims(grid, ["x", "y"]) boundary_grid = xr.zeros_like(like_2d) boundary_grid.values = binary_dilation(boundary_grid, border_value=1) return boundary_grid @typedispatch # type: ignore [no-redef] def _grid_boundary_xy(grid: xu.UgridDataArray) -> xu.UgridDataArray: _validate_grid(grid) like_2d = _reduce_grid_except_dims(grid, [grid.grid.face_dimension]) zeros_grid = xu.zeros_like(like_2d) return zeros_grid.ugrid.binary_dilation(border_value=1)
[docs] def active_grid_boundary_xy( active: GridDataArray, ) -> GridDataArray: """ Return active boundary cells on the xy plane. Parameters ---------- active : {xarray.DataArray, xugrid.UgridDataArray} Grid with active cells, either with ``x`` and ``y`` dimensions or a face dimesion. Returns ------- {xarray.DataArray, xugrid.UgridDataArray} Locations of active grid boundaries """ grid_boundary = grid_boundary_xy(active) return active & grid_boundary