Source code for pycif.plugins.transforms.basic.vertical_interpolation.utils.array.linear
import numpy as np
import pandas as pd
import xarray as xr
[docs]
def linear_fwd(transf, pres_in, pres_out,
mode, inout_datastore, trid, ddi):
nlev_in = pres_in.size
nlev_out = pres_out.size
xmod = inout_datastore["inputs"]
pres_tmp = np.sort(np.unique(np.append(pres_in, pres_out)))
df_pres = pd.DataFrame(range(len(pres_in)), index=pres_in)
df_pres = df_pres.reindex(pres_tmp).interpolate(method="index")
if transf.fill_nans:
df_pres = df_pres.fillna(method="bfill").fillna(method="ffill")
df_pres = df_pres.reindex(pres_out)
data_id = ["spec"]
if mode == "tl" and "incr" in xmod[trid][ddi]:
data_id += ["incr"]
inout_datastore["outputs"][trid][ddi] = {}
for did in data_id:
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)
for k, dd in enumerate(pres_out):
ind = df_pres.iloc[k, 0]
if np.isnan(ind):
continue
dmin = np.floor(ind).astype(int)
wgt = ind - dmin
try:
var_out[:, k] = (
var_in[:, dmin] * (1 - wgt)
+ var_in[:, min(dmin + 1, nlev_in - 1)] * wgt
).values
except:
print(__file__)
import code
code.interact(local=dict(locals(), **globals()))
inout_datastore["outputs"][trid][ddi][did] = xr.DataArray(
var_out,
coords={"time": var_in.time},
dims=("time", "lev", "lat", "lon"),
)