Source code for salishsea_tools.UBC_subdomain

# Python script for extracting a subset of Live Ocean results
# ---------------------------------------------------------------------------
# Usage
#
# From command line:
# python UBC_subdomain.py filename1 filename2 filename3 ...
#
# Inside python:
# import UBC_subdomain
# UBC_subdomain.get_UBC_subdomain([filename1, filename2, filename3,...])
# ----------------------------------------------------------------------------
# Description
#
# Creates new netCDF files that store a subdomain and subset of variables
# for UBC users (S. Allen's group).
# New file names are derived from the original file name with '_UBC' suffix.
# For example: ocean_his_0002.nc becomes ocean_his_0002_UBC.nc
# ----------------------------------------------------------------------------
# Written by
# Nancy Soontiens 2016
# nsoontie@eos.ubc.ca

import sys
import netCDF4 as nc

# Bounds of subdomain (rho grid)
XBS = [55, 80]  # x-limits
YBS = [295, 325]  # y-limits
# Variables to copy
VAR_LIST = [
    "salt",
    "temp",
    "h",
    "lon_rho",
    "lat_rho",
    "mask_rho",
    "pn",
    "pm",
    "s_rho",
    "hc",
    "Cs_r",
    "Vtransform",
    "zeta",
    "ocean_time",
    "lon_u",
    "lat_u",
    "mask_u",
    "u",
    "lon_v",
    "lat_v",
    "mask_v",
    "v",
    "NO3",
    "phytoplankton",
    "zooplankton",
    "detritus",
    "Ldetritus",
    "oxygen",
    "TIC",
    "alkalinity",
    "CaCO3",
    "rho",
]
# Dimensions to copy
DIM_LIST = [
    "xi_rho",
    "eta_rho",
    "N",
    "s_rho",
    "ocean_time",
    "xi_u",
    "eta_u",
    "xi_v",
    "eta_v",
]


[docs] def get_UBC_subdomain(f_list): """Create subdomain files for all netCDF files in f_list""" for fname in f_list: fnew = "{}_UBC.nc".format(fname.split(".nc", 1)[0]) with nc.Dataset(fname) as G, nc.Dataset(fnew, "w") as Gnew: _copy_netCDF_subdomain(G, Gnew, XBS, YBS, VAR_LIST, DIM_LIST)
def _copy_netCDF_subdomain(oldfile, newfile, xbounds, ybounds, var_list, dim_list): """Copy variables in var_list in subdomain [xbounds, ybounds] from oldfile to newfile. Also copies dimensions in dim_list and all global attributes. """ _copy_dimensions(oldfile, newfile, dim_list, xbounds, ybounds) _copy_variables(oldfile, newfile, var_list, xbounds, ybounds) # copy global attributes newfile.setncatts({att: oldfile.getncattr(att) for att in oldfile.ncattrs()}) def _copy_dimensions(oldfile, newfile, dim_list, xbounds, ybounds): """Copy the dimensions in dims_list from oldfile to newfile. Dimensions of eta_rho, xi_rho are determined by limits of ybounds, xbounds. eta_v and xi_u have one extra because of staggering. """ dim_size_dict = { "eta_rho": ybounds[1] - ybounds[0] + 1, "eta_u": ybounds[1] - ybounds[0] + 1, "xi_rho": xbounds[1] - xbounds[0] + 1, "xi_v": xbounds[1] - xbounds[0] + 1, "xi_u": xbounds[1] - xbounds[0], "eta_v": ybounds[1] - ybounds[0], "ocean_time": 0, } for dimname in dim_list: dim = oldfile.dimensions[dimname] newfile.createDimension(dimname, size=dim_size_dict.get(dimname, dim.__len__())) def _copy_variables(oldfile, newfile, var_list, xbounds, ybounds): """Copy variables in var_list from oldfile to newfile for subdomain [xbounds, ybounds]""" varnames_in_file = list(oldfile.variables.keys()) for varname in var_list: if varname in varnames_in_file: var = oldfile.variables[varname] dims = var.dimensions newvar = newfile.createVariable(varname, var.datatype, dims) # copy variable attributes newvar.setncatts({att: var.getncattr(att) for att in var.ncattrs()}) # fill data if "eta_rho" in dims or "xi_rho" in dims: newvar[:] = var[ ..., ybounds[0] : ybounds[1] + 1, xbounds[0] : xbounds[1] + 1 ] elif "eta_u" in dims or "xi_u" in dims: newvar[:] = var[ ..., ybounds[0] : ybounds[1] + 1, xbounds[0] : xbounds[1] ] elif "eta_v" in dims or "xi_v" in dims: newvar[:] = var[ ..., ybounds[0] : ybounds[1], xbounds[0] : xbounds[1] + 1 ] else: newvar[:] = var[:] if __name__ == "__main__": get_UBC_subdomain(sys.argv[1:])