Source code for NEDAS.models.topaz.model_grid

import struct
import numpy as np
from NEDAS.grid.grid_regular import RegularGrid
from NEDAS.models.topaz.abfile import ABFileBathy
from NEDAS.models.topaz.confmap import ConformalMapping

[docs] def get_topaz_grid(grid_info_file) -> RegularGrid: proj = ConformalMapping.init_from_file(grid_info_file) # the coordinates in topaz model native grid ii, jj = np.meshgrid(np.arange(proj._ires), np.arange(proj._jres)) x = ii * proj._dx y = jj * proj._dy return RegularGrid(proj, x, y, distance_type='spherical')
[docs] def get_depth(depthfile, grid): f = ABFileBathy(depthfile, 'r', idm=grid.nx, jdm=grid.ny) depth = f.read_field('depth') f.close() d = -depth.data # depth is negative for ocean variables mask = np.asarray(depth.mask, bool) d[mask] = np.nan return d, mask
[docs] def get_mean_ssh(meansshfile, grid): with open(meansshfile, 'rb') as f: f.seek(4) data = f.read(8 * grid.nx * grid.ny) data = struct.unpack('>'+'d'*grid.nx*grid.ny, data) meanssh = np.array(data).reshape(grid.ny, grid.nx) return meanssh
# some variables will need (de)staggering in topaz grid: # --- *--*--* # --- | | | # --- stencil: u--p--* # --- | | | # --- q--v--* # these two functions are uniq to topaz
[docs] def stagger(dat, vtype): # stagger u,v for C-grid configuration dat_stag = dat.copy() if vtype == 'u': dat_stag[:, 1:] = 0.5*(dat[:, :-1] + dat[:, 1:]) dat_stag[:, 0] = 3*dat[:, 1] - 3*dat[:, 2] + dat[:, 3] elif vtype == 'v': dat_stag[1:, :] = 0.5*(dat[:-1, :] + dat[1:, :]) dat_stag[0, :] = 3*dat[1, :] - 3*dat[2, :] + dat[3, :] return dat_stag
[docs] def destagger(dat_stag, vtype): # destagger u,v from C-grid dat = dat_stag.copy() if vtype == 'u': dat[:, :-1] = 0.5*(dat_stag[:, :-1] + dat_stag[:, 1:]) dat[:, -1] = 3*dat_stag[:, -2] - 3*dat_stag[:, -3] + dat_stag[:, -4] elif vtype == 'v': dat[:-1, :] = 0.5*(dat_stag[:-1, :] + dat_stag[1:, :]) dat[-1, :] = 3*dat_stag[-2, :] - 3*dat_stag[-3, :] + dat_stag[-4, :] return dat