Source code for pycif.plugins.transforms.basic.regrid.utils.conservative.conservative

from __future__ import annotations

import numpy as np

from .......utils.classes.domains import Domain
from .......utils.geometry.utils import get_cell_area, get_vertices, is_unstructured
from .weights import compute_weights_unstructured


[docs] def conservative( domain_in: Domain, domain_out: Domain, chunk_size: int | None = None, processes: int | None = None, ) -> dict[str, np.ndarray]: """Compute indices and weigths for conservative interpolation between unstructured or regular grids. Args: domain_in (Domain): Input domain plugin. domain_out (Domain): Output domain plugin. chunk_size (int, optional): Chunk size in the latitude bins. Defaults to None. processes (int, optional): Number of processes. Defaults to None. Returns: dict with keys "i", "j" and "wgt" """ lon_vertices_out, lat_vertices_out = get_vertices(domain_out) lon_vertices_in, lat_vertices_in = get_vertices(domain_in) cell_area_out = get_cell_area(domain_out) cell_area_in = get_cell_area(domain_in) indices, weights = compute_weights_unstructured( lon_vertices_out, lat_vertices_out, cell_area_out, lon_vertices_in, lat_vertices_in, cell_area_in, chunk_size, processes, ) if is_unstructured(domain_in): ind_j = indices ind_i = np.zeros_like(indices) else: shape = (domain_in.nlat, domain_in.nlon) # type: ignore # pylint: disable=unbalanced-tuple-unpacking ind_i, ind_j = np.unravel_index(indices, shape, order="F") output = {"i": ind_i, "j": ind_j, "wgt": weights} return output