Source code for pycif.plugins.transforms.basic.clipcrop.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
):
"""Propagate adjoint sensitivities through the clip/crop mask.
The adjoint of :func:`forward`: copies ``adj_out`` from the output
datastore to the input datastore, then zeroes the same spatial mask
(sensitivities at zeroed cells in the forward pass are zero in the
adjoint too).
Args:
transform (Plugin): clipcrop instance.
inout_datastore (dict): mutable datastore.
controlvect: unused.
obsvect: unused.
mapper (dict): transform mapper.
di (datetime): sub-simulation start date.
df (datetime): unused.
mode (str): ``'adj'``.
runsubdir (str): unused.
workdir (str): unused.
onlyinit (bool): if ``True``, return immediately.
**kwargs: unused.
"""
if onlyinit:
return
ddi = min(di, df)
xmod_in = inout_datastore["inputs"]
xmod_out = inout_datastore["outputs"]
parameter = transform.parameter
component = transform.component
trid = (component, parameter)
# Find pixels to clip/crop
domain = mapper["inputs"][trid]["domain"]
mask = (domain.zlon >= transform.xmin) & (domain.zlon <= transform.xmax) \
& (domain.zlat >= transform.ymin) & (domain.zlat <= transform.ymax)
if transform.mode == "crop":
mask = ~mask
# Propagate adj_out
for trid in xmod_out:
if "adj_out" not in xmod_out[trid][di]:
continue
xmod_in[trid][di]["adj_out"] = \
copy.deepcopy(xmod_out[trid][di]["adj_out"])
xmod_in[trid][di]["adj_out"].values[..., mask] = 0.