Source code for pycif.plugins.domains.wrfchem.get_sides

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