import os
import netCDF4 as nc
import numpy as np
[docs]
def get_sides(self):
"""
Gets the coordinates of lateral WRF domain boundaries
"""
# WRF lateral boundaries have widths, which is not the case in other
# models implemented in CIF so far. To accomodate this, we overwrite
# the domain's default 'get_sides' function here.
# The sides are stored in zlon_sides, zlat_sides, zlonc_sides and
# zlatc_sides. Each is a flat list that contains the coordinates in
# similar order as in the default get_sides
# - As in the default plugin, overlapping cells at the corners are
# duplicated
if self.max_dom>1:
raise NotImplementedError("Can't work with nested domains yet.")
# For now, work on domain 1 (domain numbering in WRF starts at 1)
ndom = 1
# Get the boundary width
file_path = os.path.join(self.dir_wrfinput, "wrfbdy_d{:02d}".format(ndom))
ncf = nc.Dataset(file_path, "r")
bdy_width = len(ncf.dimensions["bdy_width"])
ncf.close()
# Get coordinates
zlon_side = []
zlat_side = []
zlonc_side = []
zlatc_side = []
for n in range(bdy_width):
# Cell centers
zlon_side.extend(self.zlon2d[n, :])
zlon_side.extend(self.zlon2d[-n-1, :])
zlon_side.extend(self.zlon2d[:, n])
zlon_side.extend(self.zlon2d[:, -n-1])
zlat_side.extend(self.zlat2d[n, :])
zlat_side.extend(self.zlat2d[-n-1, :])
zlat_side.extend(self.zlat2d[:, n])
zlat_side.extend(self.zlat2d[:, -n-1])
# Cell corners: N (grid cells in zlon_side/zlat_side) x 4 (corners)
for nlon in range(self.zlon2d.shape[1]):
zlonc_side.append([self.zlonc2d[n, nlon],
self.zlonc2d[n, nlon+1],
self.zlonc2d[n+1, nlon],
self.zlonc2d[n+1, nlon+1]])
for nlon in range(self.zlon2d.shape[1]):
zlonc_side.append([self.zlonc2d[-n-2, nlon],
self.zlonc2d[-n-2, nlon+1],
self.zlonc2d[-n-1, nlon],
self.zlonc2d[-n-1, nlon+1]])
for nlat in range(self.zlon2d.shape[0]):
zlonc_side.append([self.zlonc2d[nlat, n],
self.zlonc2d[nlat, n+1],
self.zlonc2d[nlat+1, n],
self.zlonc2d[nlat+1, n+1]])
for nlat in range(self.zlon2d.shape[0]):
zlonc_side.append([self.zlonc2d[nlat, -n-2],
self.zlonc2d[nlat, -n-1],
self.zlonc2d[nlat+1, -n-2],
self.zlonc2d[nlat+1, -n-1]])
for nlon in range(self.zlon2d.shape[1]):
zlatc_side.append([self.zlatc2d[n, nlon],
self.zlatc2d[n, nlon+1],
self.zlatc2d[n+1, nlon],
self.zlatc2d[n+1, nlon+1]])
for nlon in range(self.zlon2d.shape[1]):
zlatc_side.append([self.zlatc2d[-n-2, nlon],
self.zlatc2d[-n-2, nlon+1],
self.zlatc2d[-n-1, nlon],
self.zlatc2d[-n-1, nlon+1]])
for nlat in range(self.zlon2d.shape[0]):
zlatc_side.append([self.zlatc2d[nlat, n],
self.zlatc2d[nlat, n+1],
self.zlatc2d[nlat+1, n],
self.zlatc2d[nlat+1, n+1]])
for nlat in range(self.zlon2d.shape[0]):
zlatc_side.append([self.zlatc2d[nlat, -n-2],
self.zlatc2d[nlat, -n-1],
self.zlatc2d[nlat+1, -n-2],
self.zlatc2d[nlat+1, -n-1]])
# Store as numpy.array. The shapes are the same as in the default
# get_sides.
self.zlon_side = np.array(zlon_side, ndmin=2, dtype=self.zlon.dtype)
self.zlat_side = np.array(zlat_side, ndmin=2, dtype=self.zlon.dtype)
self.zlonc_side = np.array(zlonc_side)
self.zlatc_side = np.array(zlatc_side)
self.nlon_side = self.zlon_side.size
self.nlat_side = 1