Source code for pycif.plugins.datastreams.fields.netcdf_cams.get_domain
import numpy as np
import glob
import datetime
import os
import pandas as pd
import xarray as xr
from .....utils.classes.setup import Setup
from .....utils.classes.domains import Domain
import copy
from logging import debug
import itertools
[docs]
def get_domain(ref_dir, ref_file, input_interval, target_dir, tracer=None):
domain_file = list(itertools.chain.from_iterable(
tracer.input_files.values()))[0]
if not os.path.isfile(domain_file):
raise Exception("Could not initialize the domain "
"as no reference file is available. "
"Expecting the following file: {}".format(ref_file))
debug('Domain file for CAMS BCs: {}'.format(domain_file))
nc = xr.open_dataset(domain_file, decode_times=False)
# Read lon/lat in domain_file
lon = nc["longitude"]
lat = nc["latitude"]
# must be increasing
if lat[1] < lat[0]:
lat = np.flip(lat)
nlon = lon.size
nlat = lat.size
zlon, zlat = np.meshgrid(lon, lat)
# Compute corners
dlat = np.unique(np.diff(lat))[0]
dlon = np.unique(np.diff(lon))[0]
latc = np.append(lat - dlat / 2, lat[-1] + dlat / 2)
lonc = np.append(lon - dlon / 2, lon[-1] + dlon / 2)
zlonc, zlatc = np.meshgrid(lonc, latc)
zlatc = np.minimum(np.maximum(zlatc, -90), 90)
# Read vertical information in domain_file
if getattr(tracer, 'aibi_name', False):
# if tracer.aibi_name:
if hasattr(tracer, "aibi_file"):
aibi_file = tracer.aibi_file
tab = pd.read_csv(aibi_file, sep=',', header=0, usecols=[0, 1, 2])
sigma_a = tab.values[::-1, 1]
sigma_b = tab.values[::-1, 2]
else:
sigma_a = nc["ap"].values
sigma_b = nc["bp"].values
nlevs = sigma_b.size - 1
domain = Domain(
nlon=nlon, nlat=nlat, zlon=zlon, zlat=zlat,
zlonc=zlonc, zlatc=zlatc,
pressure_unit="Pa", lon_cyclic=True, nlev=nlevs,
sigma_a=sigma_a, sigma_b=sigma_b
)
else:
sigma_a_mid = nc["hyam"].values
sigma_b_mid = nc["hybm"].values
nlevs = sigma_a_mid.size
domain = Domain(
nlon=nlon, nlat=nlat, zlon=zlon, zlat=zlat,
zlonc=zlonc, zlatc=zlatc,
pressure_unit="Pa", lon_cyclic=True, nlev=nlevs,
sigma_a_mid=sigma_a_mid, sigma_b_mid=sigma_b_mid
)
# Initializes domain
return domain