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"]