Source code for pycif.plugins.modes.postproc.execute
import datetime
import os
import numpy as np
from ....utils.datastores.dump import read_datastore
[docs]
def execute(self, **kwargs):
"""Load existing inversion outputs and reproject fluxes to maps.
Optionally reads a pre-existing observation vector and/or control vector
from disk, projects flux tracers from the control-vector space to
spatially-resolved maps (prior and posterior), and saves the maps as
NetCDF files alongside their difference (``ratio_x-xb.nc``).
Args:
self (Plugin): mode plugin providing ``workdir``, ``datei``,
``datef``, and optionally ``file_monitor`` and
``controlvect_file``.
**kwargs: unused; accepted for interface consistency.
"""
# Working directory
workdir = self.workdir
# Control vector
controlvect = self.controlvect
# Observation operator
obsoper = self.obsoperator
# Simulation window
datei = self.datei
datef = self.datef
# Loads a monitor pickle
if hasattr(self, "file_monitor"):
obsvect = obsoper.obsvect
obsvect.datastore = read_datastore(self.file_monitor)
# Loads a control vector pickle
if hasattr(self, "controlvect_file"):
controlvect.load(self.controlvect_file)
# Fluxes to maps
flx_maps = {}
flx_maps_bg = {}
for trcr in controlvect.components.flux.parameters.attributes:
tracer = getattr(controlvect.components.flux.parameters, trcr)
dates = tracer.dates[:-1]
# Fetching the correct slice in the control vector
tmp = controlvect.x[tracer.xpointer: tracer.xpointer + tracer.dim]
# Projecting to a map
flx_map = controlvect.utils.scale2map(
tmp, tracer, dates, controlvect.domain
)
# Changing time format for saving in netcdf
flx_map["time"] = flx_map["time"].astype(datetime.datetime)
flx_maps[trcr] = flx_map
tmp = controlvect.xb[tracer.xpointer: tracer.xpointer + tracer.dim]
flx_map = controlvect.utils.scale2map(
tmp, tracer, dates, controlvect.domain
)
flx_maps_bg[trcr] = flx_map
# Save output as NetCDF
flx_maps[trcr].to_netcdf(
"{}/controlvect_x.nc".format(os.path.dirname(self.controlvect_file))
)
flx_maps_bg[trcr].to_netcdf(
"{}/controlvect_xb.nc".format(os.path.dirname(self.controlvect_file))
)
ratio = flx_maps[trcr] - flx_maps_bg[trcr]
ratio = ratio.where((ratio > -np.inf) * (ratio < np.inf))
trcr = "CH4"
ratio.to_netcdf(
"{}/ratio_x-xb.nc".format(os.path.dirname(self.controlvect_file))
)
# # Plot global average
# nseconds = [d.total_seconds() for d in dates[1:] - dates[:-1]] + [5 *
# 86400]
# nseconds = 3600 * 24 * 365
# x = (flx_maps['CH4'] * controlvect.domain.areas.T).sum(axis=(1,2))
# xb = (flx_maps_bg['CH4'] * controlvect.domain.areas.T).sum(axis=(1,2))
#
# plt.plot(dates, x, c='r', label='posterior')
# plt.plot(dates, xb, c='b', label='prior')
# plt.legend()
# plt.savefig('{}/figures/TotalBudget.pdf'.format(self.workdir),
# bbox='tight')
# plt.close()
#
# # Save Control vector to NetCDF
# dataset = xr.Dataset(data_vars={'CH4_bg': flx_maps_bg['CH4'],
# 'CH4_post': flx_maps['CH4']})
# dataset['time'] = list(dataset['time'].values)
# dataset.to_netcdf('{}/outputs/controlvect_CH4_0023.nc'.format(
# self.workdir))