Source code for pycif.plugins.models.TM5.io.outputs2native
import datetime
import glob
import os
import numpy as np
import pandas as pd
import xarray as xr
from netCDF4 import Dataset
from logging import info
from .....utils.datastores.empty import init_empty
from .....utils.hdf5 import _hdf5_lock
[docs]
def outputs2native(
self, data2dump, input_type, di, df, runsubdir, mode="fwd", dump=True,
onlyinit=False, check_transforms=False, **kwargs
):
"""Read concentrations as simulated by TM5 at observation points"""
ddi = min(di, df)
# if not hasattr(self, "dataobs"):
# self.dataobs = {spec: init_empty()
# for spec in self.chemistry.acspecies.attributes}
# If no data to extract, pass
if data2dump == {}:
return data2dump
# If species to extract are empty, pass
extract = len([trid for trid in data2dump
if len(self.dataobs.get(trid[1], {})) > 0]) > 0
if not extract or onlyinit:
return data2dump
# Here simulations should be read
# Filling random values so far
file_output = f"{runsubdir}/output/point_output.nc4"
with _hdf5_lock:
with Dataset(file_output) as f:
mixing_ratio = f.groups['glb600x400'].variables["mixing_ratio"][:]
# Adds mixing ratios from observations with dtstep > 1
# (the division for the average is done later in the CIF)
dataloc = self.dataobs["CH4"]
inds = [0] + list(np.cumsum(dataloc["metadata"].loc[:, "dtstep"][:-1]))
avg_inds = pd.Series(np.nan, index=np.arange(len(mixing_ratio)))
avg_inds.loc[inds] = np.arange(len(dataloc))
avg_inds = avg_inds.ffill().astype(int).values
output_sim = np.zeros(len(dataloc))
np.add.at(output_sim, avg_inds, mixing_ratio.flatten())
self.dataobs["CH4"].loc[:, ("maindata", "spec")] = output_sim
data2dump[("concs", "CH4")] = self.dataobs["CH4"]
return data2dump