Source code for imod.select.layers

"""
This module contains all kinds of utilities to work with layers.
"""

from imod.typing import GridDataArray
from imod.typing.grid import preserve_gridtype


[docs] @preserve_gridtype def get_upper_active_layer_number(active: GridDataArray) -> GridDataArray: """ Returns planar grid of integers with the layer number of the lower most active cell. Parameters ---------- active: {xr.DataArray, xu.UgridDataArray} Grid of booleans (..., layer, y, x) designating active cell. Returns ------- upper_active_layer: {xr.DataArray, xu.UgridDataArray} planar grid of integers (..., y, x) with the layer number of the uppermost active cell. Examples -------- To get the layer numbers of the uppermost active cells for an idomain grid: >>> active = idomain > 0 >>> upper_active_layer = get_upper_active_layer_number(active) To get the layer numbers of the uppermost active cells for a data grid with floats, where ``np.nan`` indicates inactive cells: >>> active = data.notnull() >>> upper_active_layer = get_upper_active_layer_number(active) """ layer = active.coords["layer"] # Set nodata to sentinel value to prevent a dtype shift from integer to # float as np.nan forces float. nodata = layer.max() + 1 return layer.where(active, nodata).min("layer")
[docs] @preserve_gridtype def get_upper_active_grid_cells(active: GridDataArray) -> GridDataArray: """ Returns grid of booleans designating location of the uppermost active grid cell. Parameters ---------- active: {xr.DataArray, xu.UgridDataArray} Grid of booleans (..., layer, y, x) designating active cell. Returns ------- upper_active_grid_cells: {xr.DataArray, xu.UgridDataArray} Grid of booleans (..., layer, y, x) designating location of the uppermost active grid cell. Examples -------- To get the uppermost active grid cells of an idomain grid and mask idomain with it: >>> active = idomain > 0 >>> upper_active = get_upper_active_grid_cells(active) >>> idomain_upper = idomain.where(upper_active, 0) To get the uppermost active grid cells of data grid with floats, where ``np.nan`` indicates inactive cells and use it to mask data: >>> active = data.notnull() >>> upper_active = get_upper_active_grid_cells(active) >>> data_upper = data.where(upper_active) """ layer = active.coords["layer"] upper_active_layer = get_upper_active_layer_number(active) return layer == upper_active_layer
[docs] @preserve_gridtype def get_lower_active_layer_number(active: GridDataArray) -> GridDataArray: """ Returns planar grid of integers with the layer number of the lower most active cell. Parameters ---------- active: {xr.DataArray, xu.UgridDataArray} Grid of booleans (..., layer, y, x) designating active cell. Returns ------- lower_active_layer: {xr.DataArray, xu.UgridDataArray} Planar grid of integers (..., y, x) with the layer number of the lowermost active cell. Examples -------- To get the layer numbers of the lowermost active cells for an idomain grid: >>> active = idomain > 0 >>> lower_active_layer = get_lower_active_layer_number(active) To get the layer numbers of the lowermost active cells for a data grid with floats, where ``np.nan`` indicates inactive cells: >>> active = data.notnull() >>> lower_active_layer = get_lower_active_layer_number(active) """ layer = active.coords["layer"] # Set nodata to sentinel value to prevent a dtype shift from integer to # float as np.nan forces float. nodata = layer.min() - 1 return layer.where(active, nodata).max("layer")
[docs] @preserve_gridtype def get_lower_active_grid_cells(active: GridDataArray) -> GridDataArray: """ Returns grid of booleans designating location of the lowermost active grid cell. Parameters ---------- active: {xr.DataArray, xu.UgridDataArray} Grid of booleans (..., layer, y, x) designating active cell. Returns ------- lower_active_grid_cells: {xr.DataArray, xu.UgridDataArray} Grid of booleans (..., layer, y, x) designating location of the lowermost active grid cell. Examples -------- To get the lowermost active grid cells of an idomain grid: >>> active = idomain > 0 >>> lower_active = get_lower_active_grid_cells(active) >>> idomain_lower = idomain.where(lower_active, 0) To get the lowermost active grid cells of data grid with floats, where ``np.nan`` indicates inactive cells: >>> active = data.notnull() >>> lower_active = get_lower_active_grid_cells(active) >>> data_lower = data.where(lower_active) """ layer = active.coords["layer"] lower_active_layer = get_lower_active_layer_number(active) return layer == lower_active_layer