Source code for pycif.plugins.transforms.system.array2sampled.forward

import numpy as np
import xarray as xr

from logging import warning

from .....utils.datastores.empty import init_empty


[docs] def forward( transform, inout_datastore, controlvect, obsvect, mapper, di, df, mode, runsubdir, workdir, onlyinit=False, **kwargs ): """Extract point-observation values from a gridded model output field. For each (input tracer, output tracer) pair in the mapper, reads the gridded field ``xmod_in["spec"]`` and uses the pre-computed grid indices ``(i, j, level, tstep)`` stored in the output observation DataFrame's metadata to extract the corresponding model values via xarray label-based indexing. In TL mode (``mode = 'tl'``) the ``'incr'`` field is sampled in the same way. Single-level fields are handled by setting ``lev = 0`` for all observations. Args: transform (Plugin): array2sampled instance (unused directly). inout_datastore (dict): mutable datastore; ``'inputs'`` has the gridded field, ``'outputs'`` has the sparse observation DataFrame to be populated. controlvect: unused. obsvect: unused. mapper (dict): transform mapper. di (datetime): sub-simulation start date. df (datetime): sub-simulation end date. mode (str): ``'fwd'`` or ``'tl'``. runsubdir (str): unused. workdir (str): unused. onlyinit (bool): if ``True``, return immediately. **kwargs: unused. """ if onlyinit: return ddi = min(di, df) for trid_in, trid_out in zip(mapper["inputs"], mapper["outputs"]): xmod_in = inout_datastore["inputs"][trid_in][ddi] # Fetch metadata from adjoint metadata = transform.metadata[ddi][trid_in] t = metadata["tstep"] i = metadata["i"] j = metadata["j"] lev = metadata["level"] # Initialize output with size from metadata xmod_out = init_empty(nlines=len(t)) columns = ["spec", "incr"] for c in columns: if c not in xmod_in: xmod_out[("maindata", c)] = np.nan continue xmod_out[("maindata", c)] = xmod_in[c].isel( lat=xr.DataArray(i), lon=xr.DataArray(j), time=xr.DataArray(t), lev=xr.DataArray(lev)).data inout_datastore["outputs"][trid_out][ddi] = xmod_out