Source code for pycif.plugins.transforms.basic.vertical_interpolation.utils.array.closest

import numpy as np
import pandas as pd
import xarray as xr
import copy


[docs] def closest_fwd(transf, pres_in, pres_out, mode, inout_datastore, trid, ddi, mapper): nlev_in = pres_in.size nlev_out = pres_out.size xmod = inout_datastore["inputs"] is_sparse_in = mapper["inputs"][trid].get("sparse_data", False) if not is_sparse_in: data_id = ["spec"] if mode == "fwd" else ["spec", "incr"] inout_datastore["outputs"][trid][ddi] = {} for did in data_id: if did not in xmod[trid][ddi]: continue var_in = xmod[trid][ddi][did] ntimes, nlev, nlat, nlon = var_in.shape var_out = np.zeros( (ntimes, nlev_out, nlat, nlon), dtype=var_in.dtype) dpres = np.abs(pres_out[:, np.newaxis] - pres_in) for kin, kout in enumerate(np.argmin(dpres, axis=0)): var_out[:, kout] += var_in[:, kin] inout_datastore["outputs"][trid][ddi][did] = xr.DataArray( var_out, coords={"time": var_in.time}, dims=("time", "lev", "lat", "lon"), ) else: var_in = xmod[trid][ddi] var_out = copy.deepcopy(var_in) dpres = (pres_out[:, np.newaxis] - pres_in).T min_in = np.abs(dpres).argmin(axis=1) var_out.loc[:, ("metadata", "level")] = min_in inout_datastore["outputs"][trid][ddi] = var_out