Source code for hydromt_wflow.workflows.forcing

"""Forcing workflow for wflow."""

import logging
from typing import Optional

import numpy as np
import xarray as xr
from hydromt.workflows.forcing import resample_time

logger = logging.getLogger(__name__)

__all__ = ["pet"]


[docs] def pet( pet: xr.DataArray, ds_like: xr.Dataset, freq: str = "D", mask_name: Optional[str] = None, chunksize: Optional[int] = None, logger: Optional[logging.Logger] = logger, ) -> xr.DataArray: """ Resample and reproject PET to the grid of ds_like. Parameters ---------- pet : xr.DataArray PET data array with time as first dimension. ds_like : xr.Dataset Dataset with the grid to reproject to. freq : str, optional Resampling frequency, by default "D". mask_name : str, optional Name of the mask variable in ds_like, by default None. chunksize : int, optional Chunksize for the time dimension for resampling, by default None to use default time chunk. Returns ------- pet_out : xr.DataArray Resampled and reprojected PET data array. """ if chunksize is not None: pet = pet.chunk({"time": chunksize}) if pet.raster.dim0 != "time": raise ValueError(f'First pet dim should be "time", not {pet.raster.dim0}') # change nodata pet = pet.where(pet != pet.raster.nodata, np.nan) pet.raster.set_nodata(np.nan) # Minimum is zero pet_out = np.fmax(pet.raster.reproject_like(ds_like, method="nearest_index"), 0) # resample time resample_kwargs = dict(label="right", closed="right") if freq is not None: resample_kwargs.update(upsampling="bfill", downsampling="sum", logger=logger) pet_out = resample_time(pet_out, freq, conserve_mass=True, **resample_kwargs) # Mask if mask_name is not None: mask = ds_like[mask_name].values > 0 pet_out = pet_out.where(mask, pet_out.raster.nodata) # Attributes pet_out.name = "pet" pet_out.attrs.update(unit="mm") return pet_out