Source code for pycif.plugins.transforms.basic.unit_conversion.adjoint
import copy
[docs]
def adjoint(
transf,
inout_datastore,
controlvect,
obsvect,
mapper,
di,
df,
mode,
runsubdir,
workdir,
onlyinit=False,
**kwargs
):
ddi = min(di, df)
for trid in mapper["inputs"]:
if onlyinit:
inout_datastore["inputs"][trid][ddi] = \
inout_datastore["outputs"][trid][ddi]
continue
# Compute scaling with/without areas
scaling = transf.scale
if transf.grid_to_surface:
domain = mapper["inputs"][trid]["domain"]
if not hasattr(domain, "areas"):
domain.calc_areas()
scaling /= domain.areas
# Apply scaling for sparse data
if mapper["inputs"][trid].get("sparse_data", False):
xmod_out = inout_datastore["outputs"][trid][ddi]
inout_datastore["inputs"][trid][ddi] = copy.deepcopy(
xmod_out
)
xmod_in = inout_datastore["inputs"][trid][ddi]
xmod_in.loc[:, ("maindata", "adj_out")] *= scaling
continue
# Initialize input data if cleaned by memory
if ddi not in inout_datastore["inputs"][trid]:
inout_datastore["inputs"][trid][ddi] = {}
# Propagate backward
inout_datastore["inputs"][trid][ddi]["adj_out"] \
= scaling * inout_datastore["outputs"][trid][ddi]["adj_out"]