# 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:])