Source code for pycif.plugins.transforms.basic.exp.adjoint
import copy
import xarray as xr
import numpy as np
[docs]
def adjoint(
transform,
inout_datastore,
controlvect,
obsvect,
mapper,
di,
df,
mode,
runsubdir,
workdir,
onlyinit=False,
**kwargs
):
if onlyinit:
return
ddi = min(di, df)
xmod_out = inout_datastore["outputs"]
xmod_in = inout_datastore["inputs"]
parameter = transform.parameter
component = transform.component
trid_out = (component, parameter)
# Reload forward information
file_fwd_dataset = ddi.strftime(
"{}/chain/product/{}_fwd_%Y%m%d%H%M.nc".format(
transform.model.adj_refdir, transform.orig_name))
fwd_dataset = xr.open_dataset(file_fwd_dataset)
# Initialize inputs if cleared with memory
if ddi not in xmod_in[trid_out]:
xmod_in[trid_out][ddi] = {}
# Applying adjoint
xmod_in[trid_out][ddi]["adj_out"] = \
copy.deepcopy(xmod_out[trid_out][ddi]["adj_out"]) * \
np.exp(fwd_dataset["___".join(trid_out)])