Source code for pycif.plugins.datastreams.fields.oldlmdz_ic.get_domain
import numpy as np
import glob
import datetime
import os
import xarray as xr
from .....utils.classes.setup import Setup
from .....utils.netcdf import readnc
[docs]
def get_domain(ref_dir, ref_file, input_interval, target_dir, tracer=None):
# Looking for a reference file to read lon/lat in
list_file = glob.glob("{}/*nc".format(ref_dir))
domain_file = None
# Either a file is specified in the Yaml
if ref_file in list_file:
domain_file = "{}/{}".format(ref_dir, ref_file)
# Or loop over available file regarding file pattern
else:
for bc_file in list_file:
try:
date = datetime.datetime.strptime(
os.path.basename(bc_file), ref_file
)
domain_file = bc_file
break
except ValueError:
continue
if domain_file is None:
raise Exception(
"Old LMDz domain could not be initialized as no file was found"
)
print('Domain file for old LMDZ BCs:', domain_file)
# Define horizontal grid :reference from PYVAR for 96 x 72
# nlon = 97
# zlon = np.zeros(nlon)
# for i in range(nlon): zlon[i] = -180. + i*3.75
# nlat = 73
# zlat = np.zeros(nlat)
# for i in range(nlat): zlat[i] = 90.0 - i*2.5
# zlat[0] = 89.375
# zlat[nlat-1] = -89.375
# print('LATLATLATLAT',zlat)
# print('LONLONLONLON',zlon)
# print('cccccccccccc',zlat*np.pi/180.)
rlatu, rlonv = readnc(domain_file, ['rlatu', 'rlonv'])
lon = rlonv[:-1]*180./np.pi
lat = rlatu*180./np.pi
nlon = lon.size
nlat = lat.size
# avoid pole issues: #ATTENTION: check for all grids, here OK for 96 x 72
lat[nlat - 1] = -90. + (lat[0] - lat[1]) / 4.
lat[0] = 90. - (lat[0] - lat[1]) / 4.
lon_min = lon.min()
lon_max = lon.max()
lat_min = lat.min()
lat_max = lat.max()
# Compute corners
lonc = np.zeros(nlon + 1)
latc = np.zeros(nlat + 1)
for i in range(nlon + 1):
if i == nlon - 1:
lonc[i] = lon[i] - (lon[i]-lon[i-1]) / 2.
elif i == nlon:
lonc[i] = lon[i-1] + (lon[i-1] - lonc[i-1])
else:
lonc[i] = lon[i] - (lon[i+1]-lon[i]) / 2.
for i in range(nlat + 1):
if i == nlat - 1:
latc[i] = lat[i] - (lat[i]-lat[i-1]) / 2.
elif i == nlat:
latc[i] = lat[i-1] + (lat[i-1] - latc[i-1])
else:
latc[i] = lat[i] - (lat[i+1]-lat[i]) / 2.
latc[latc > 90.] = 90.
latc[latc < -90.] = -90.
# Read vertical information in domain_file
sigma_a = readnc(domain_file, ['ap'])
sigma_b = readnc(domain_file, ['bp'])
# print('aaaaaaaaa',sigma_a)
# print('bbbbbbbbb',sigma_b)
nlevs = sigma_a.size - 1
# Initializes domain
setup = Setup.from_dict(
{
"domain": {
"plugin": {
"name": "dummy",
"version": "std",
"type": "domain",
},
"xmin": lon_min,
"xmax": lon_max,
"ymin": lat_min,
"ymax": lat_max,
"nlon": nlon,
"nlat": nlat,
"nlev": nlevs,
"sigma_a": sigma_a[1:],
"sigma_b": sigma_b[1:],
"pressure_unit": "Pa" # TO CHECK FOR LMDZ
}
}
)
Setup.load_setup(setup, level=1)
zlon, zlat = np.meshgrid(lon, lat)
zlonc, zlatc = np.meshgrid(lonc, latc)
setup.domain.zlon = zlon
setup.domain.zlat = zlat
setup.domain.zlonc = zlonc
setup.domain.zlatc = zlatc
return setup.domain