forked from 3rdparty/wrf-python
27 changed files with 1585 additions and 921 deletions
@ -1,30 +1,31 @@
@@ -1,30 +1,31 @@
|
||||
|
||||
from wrf.var.decorators import convert_units |
||||
from wrf.var.util import extract_vars |
||||
from .decorators import convert_units, copy_and_set_metadata |
||||
from .util import extract_vars, either |
||||
|
||||
__all__ = ["get_pressure", "get_pressure_hpa"] |
||||
|
||||
@copy_and_set_metadata(copy_varname=either("P", "PRES"), name="pressure", |
||||
description="pressure") |
||||
@convert_units("pressure", "pa") |
||||
def get_pressure(wrfnc, timeidx=0, units="pa"): |
||||
|
||||
try: |
||||
p_vars = extract_vars(wrfnc, timeidx, varnames=("P", "PB")) |
||||
except KeyError: |
||||
try: |
||||
pres_vars = extract_vars(wrfnc, timeidx, varnames="PRES") |
||||
except: |
||||
raise RuntimeError("pressure variable not found in NetCDF file") |
||||
else: |
||||
pres = pres_vars["PRES"] |
||||
else: |
||||
def get_pressure(wrfnc, timeidx=0, units="pa", |
||||
method="cat", squeeze=True, cache=None): |
||||
|
||||
varname = either("P", "PRES")(wrfnc) |
||||
if varname == "P": |
||||
p_vars = extract_vars(wrfnc, timeidx, ("P", "PB"), |
||||
method, squeeze, cache) |
||||
p = p_vars["P"] |
||||
pb = p_vars["PB"] |
||||
pres = p + pb |
||||
else: |
||||
pres = extract_vars(wrfnc, timeidx, "PRES", |
||||
method, squeeze, cache)["PRES"] |
||||
|
||||
return pres |
||||
|
||||
def get_pressure_hpa(wrfnc, timeidx=0, units="hpa"): |
||||
return get_pressure(wrfnc, timeidx, units=units) |
||||
def get_pressure_hpa(wrfnc, timeidx=0, units="hpa", |
||||
method="cat", squeeze=True, cache=None): |
||||
return get_pressure(wrfnc, timeidx, units, method, squeeze, cache) |
||||
|
||||
|
||||
|
||||
|
@ -1,24 +1,18 @@
@@ -1,24 +1,18 @@
|
||||
|
||||
from wrf.var.decorators import convert_units |
||||
from wrf.var.util import extract_vars |
||||
from .decorators import convert_units, copy_and_set_metadata |
||||
from .util import extract_vars, either |
||||
|
||||
__all__ = ["get_terrain"] |
||||
|
||||
# Need to handle either |
||||
@copy_and_set_metadata(copy_varname=either("HGT", "HGT_M"), name="terrain", |
||||
description="terrain height") |
||||
@convert_units("height", "m") |
||||
def get_terrain(wrfnc, timeidx=0, units="m"): |
||||
def get_terrain(wrfnc, timeidx=0, units="m", method="cat", squeeze=True, |
||||
cache=None): |
||||
varname = either("HGT", "HGT_M")(wrfnc) |
||||
return extract_vars(wrfnc, timeidx, varname, |
||||
method, squeeze, cache)[varname] |
||||
|
||||
try: |
||||
hgt_vars = extract_vars(wrfnc, timeidx, varnames="HGT") |
||||
except KeyError: |
||||
try: |
||||
hgt_m_vars = extract_vars(wrfnc, timeidx, varnames="HGT_M") |
||||
except KeyError: |
||||
raise RuntimeError("height variable not found in NetCDF file") |
||||
else: |
||||
hgt = hgt_m_vars["HGT_M"] |
||||
else: |
||||
hgt = hgt_vars["HGT"] |
||||
|
||||
return hgt |
||||
|
||||
|
@ -1,42 +1,88 @@
@@ -1,42 +1,88 @@
|
||||
|
||||
import numpy as n |
||||
import numpy as np |
||||
|
||||
from wrf.var.constants import Constants |
||||
from wrf.var.destag import destagger_windcomp |
||||
from wrf.var.decorators import convert_units |
||||
from .constants import Constants |
||||
from .destag import destagger |
||||
from .util import extract_vars, either |
||||
from .decorators import convert_units, set_wind_metadata |
||||
|
||||
__all__ = ["get_u_destag", "get_v_destag", "get_w_destag", |
||||
"get_destag_wspd_wdir"] |
||||
"get_destag_wspd_wdir", "get_destag_wspd_wdir10"] |
||||
|
||||
@convert_units("wind", "mps") |
||||
def _calc_wspd(u, v, units="mps"): |
||||
return n.sqrt(u**2 + v**2) |
||||
return np.sqrt(u**2 + v**2) |
||||
|
||||
def _calc_wdir(u, v): |
||||
wdir = 270.0 - n.arctan2(v,u) * (180.0/Constants.PI) |
||||
return n.remainder(wdir, 360.0) |
||||
wdir = 270.0 - np.arctan2(v,u) * (180.0/Constants.PI) |
||||
return np.remainder(wdir, 360.0) |
||||
|
||||
def _calc_wspd_wdir(u, v, units): |
||||
return (_calc_wspd(u,v, units), _calc_wdir(u,v)) |
||||
def _calc_wspd_wdir(u, v, two_d, units): |
||||
wspd = _calc_wspd(u, v, units) |
||||
wdir = _calc_wdir(u, v) |
||||
|
||||
idx_end = -2 if two_d else -3 |
||||
|
||||
outdims = list(wspd.shape[0:idx_end]) + [2] + list(wspd.shape[idx_end:]) |
||||
res = np.zeros(outdims, wspd.dtype) |
||||
res[...,0,:] = wspd[:] |
||||
res[...,1,:] = wdir[:] |
||||
|
||||
return res |
||||
|
||||
@set_wind_metadata(wspd_wdir=False) |
||||
@convert_units("wind", "mps") |
||||
def get_u_destag(wrfnc, timeidx=0, units="mps"): |
||||
u = destagger_windcomp(wrfnc,"u", timeidx) |
||||
def get_u_destag(wrfnc, timeidx=0, units="mps", |
||||
method="cat", squeeze=True, cache=None): |
||||
varname = either("U", "UU")(wrfnc) |
||||
u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache) |
||||
u = destagger(u_vars[varname], -1) |
||||
|
||||
return u |
||||
|
||||
@set_wind_metadata(wspd_wdir=False) |
||||
@convert_units("wind", "mps") |
||||
def get_v_destag(wrfnc, timeidx=0, units="mps"): |
||||
v = destagger_windcomp(wrfnc,"v", timeidx) |
||||
def get_v_destag(wrfnc, timeidx=0, units="mps", |
||||
method="cat", squeeze=True, cache=None): |
||||
varname = either("V", "VV")(wrfnc) |
||||
v_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache) |
||||
v = destagger(v_vars[varname], -2) |
||||
return v |
||||
|
||||
@set_wind_metadata(wspd_wdir=False) |
||||
@convert_units("wind", "mps") |
||||
def get_w_destag(wrfnc, timeidx=0, units="mps"): |
||||
w = destagger_windcomp(wrfnc,"w", timeidx) |
||||
def get_w_destag(wrfnc, timeidx=0, units="mps", |
||||
method="cat", squeeze=True, cache=None): |
||||
w_vars = extract_vars(wrfnc, timeidx, "W", method, squeeze, cache) |
||||
w = destagger(w_vars["W"], -3) |
||||
return w |
||||
|
||||
def get_destag_wspd_wdir(wrfnc, timeidx=0, units="mps"): |
||||
u = destagger_windcomp(wrfnc,"u", timeidx) |
||||
v = destagger_windcomp(wrfnc,"v", timeidx) |
||||
@set_wind_metadata(wspd_wdir=True) |
||||
def get_destag_wspd_wdir(wrfnc, timeidx=0, units="mps", |
||||
method="cat", squeeze=True, cache=None): |
||||
varname = either("U", "UU")(wrfnc) |
||||
u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache) |
||||
u = destagger(u_vars[varname], -1) |
||||
|
||||
varname = either("V", "VV")(wrfnc) |
||||
v_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache) |
||||
v = destagger(v_vars[varname], -2) |
||||
|
||||
return _calc_wspd_wdir(u, v, False, units) |
||||
|
||||
@set_wind_metadata(wspd_wdir=True) |
||||
def get_destag_wspd_wdir10(wrfnc, timeidx=0, units="mps", |
||||
method="cat", squeeze=True, cache=None): |
||||
|
||||
varname = either("U10", "UU")(wrfnc) |
||||
u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache) |
||||
u = (u_vars[varname] if varname == "U10" else |
||||
destagger(u_vars[varname][...,0,:,:], -1)) |
||||
|
||||
varname = either("V10", "VV")(wrfnc) |
||||
v_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache) |
||||
v = (v_vars[varname] if varname == "V10" else |
||||
destagger(v_vars[varname][...,0,:,:], -2)) |
||||
|
||||
return _calc_wspd_wdir(u,v,units) |
||||
return _calc_wspd_wdir(u,v,True,units) |
||||
|
||||
|
Loading…
Reference in new issue