forked from 3rdparty/wrf-python
27 changed files with 1585 additions and 921 deletions
@ -1,30 +1,31 @@ |
|||||||
|
|
||||||
from wrf.var.decorators import convert_units |
from .decorators import convert_units, copy_and_set_metadata |
||||||
from wrf.var.util import extract_vars |
from .util import extract_vars, either |
||||||
|
|
||||||
__all__ = ["get_pressure", "get_pressure_hpa"] |
__all__ = ["get_pressure", "get_pressure_hpa"] |
||||||
|
|
||||||
|
@copy_and_set_metadata(copy_varname=either("P", "PRES"), name="pressure", |
||||||
|
description="pressure") |
||||||
@convert_units("pressure", "pa") |
@convert_units("pressure", "pa") |
||||||
def get_pressure(wrfnc, timeidx=0, units="pa"): |
def get_pressure(wrfnc, timeidx=0, units="pa", |
||||||
|
method="cat", squeeze=True, cache=None): |
||||||
try: |
|
||||||
p_vars = extract_vars(wrfnc, timeidx, varnames=("P", "PB")) |
varname = either("P", "PRES")(wrfnc) |
||||||
except KeyError: |
if varname == "P": |
||||||
try: |
p_vars = extract_vars(wrfnc, timeidx, ("P", "PB"), |
||||||
pres_vars = extract_vars(wrfnc, timeidx, varnames="PRES") |
method, squeeze, cache) |
||||||
except: |
|
||||||
raise RuntimeError("pressure variable not found in NetCDF file") |
|
||||||
else: |
|
||||||
pres = pres_vars["PRES"] |
|
||||||
else: |
|
||||||
p = p_vars["P"] |
p = p_vars["P"] |
||||||
pb = p_vars["PB"] |
pb = p_vars["PB"] |
||||||
pres = p + pb |
pres = p + pb |
||||||
|
else: |
||||||
|
pres = extract_vars(wrfnc, timeidx, "PRES", |
||||||
|
method, squeeze, cache)["PRES"] |
||||||
|
|
||||||
return pres |
return pres |
||||||
|
|
||||||
def get_pressure_hpa(wrfnc, timeidx=0, units="hpa"): |
def get_pressure_hpa(wrfnc, timeidx=0, units="hpa", |
||||||
return get_pressure(wrfnc, timeidx, units=units) |
method="cat", squeeze=True, cache=None): |
||||||
|
return get_pressure(wrfnc, timeidx, units, method, squeeze, cache) |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,24 +1,18 @@ |
|||||||
|
|
||||||
from wrf.var.decorators import convert_units |
from .decorators import convert_units, copy_and_set_metadata |
||||||
from wrf.var.util import extract_vars |
from .util import extract_vars, either |
||||||
|
|
||||||
__all__ = ["get_terrain"] |
__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") |
@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 @@ |
|||||||
|
|
||||||
import numpy as n |
import numpy as np |
||||||
|
|
||||||
from wrf.var.constants import Constants |
from .constants import Constants |
||||||
from wrf.var.destag import destagger_windcomp |
from .destag import destagger |
||||||
from wrf.var.decorators import convert_units |
from .util import extract_vars, either |
||||||
|
from .decorators import convert_units, set_wind_metadata |
||||||
|
|
||||||
__all__ = ["get_u_destag", "get_v_destag", "get_w_destag", |
__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") |
@convert_units("wind", "mps") |
||||||
def _calc_wspd(u, v, units="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): |
def _calc_wdir(u, v): |
||||||
wdir = 270.0 - n.arctan2(v,u) * (180.0/Constants.PI) |
wdir = 270.0 - np.arctan2(v,u) * (180.0/Constants.PI) |
||||||
return n.remainder(wdir, 360.0) |
return np.remainder(wdir, 360.0) |
||||||
|
|
||||||
def _calc_wspd_wdir(u, v, units): |
def _calc_wspd_wdir(u, v, two_d, units): |
||||||
return (_calc_wspd(u,v, units), _calc_wdir(u,v)) |
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") |
@convert_units("wind", "mps") |
||||||
def get_u_destag(wrfnc, timeidx=0, units="mps"): |
def get_u_destag(wrfnc, timeidx=0, units="mps", |
||||||
u = destagger_windcomp(wrfnc,"u", timeidx) |
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 |
return u |
||||||
|
|
||||||
|
@set_wind_metadata(wspd_wdir=False) |
||||||
@convert_units("wind", "mps") |
@convert_units("wind", "mps") |
||||||
def get_v_destag(wrfnc, timeidx=0, units="mps"): |
def get_v_destag(wrfnc, timeidx=0, units="mps", |
||||||
v = destagger_windcomp(wrfnc,"v", timeidx) |
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 |
return v |
||||||
|
|
||||||
|
@set_wind_metadata(wspd_wdir=False) |
||||||
@convert_units("wind", "mps") |
@convert_units("wind", "mps") |
||||||
def get_w_destag(wrfnc, timeidx=0, units="mps"): |
def get_w_destag(wrfnc, timeidx=0, units="mps", |
||||||
w = destagger_windcomp(wrfnc,"w", timeidx) |
method="cat", squeeze=True, cache=None): |
||||||
|
w_vars = extract_vars(wrfnc, timeidx, "W", method, squeeze, cache) |
||||||
|
w = destagger(w_vars["W"], -3) |
||||||
return w |
return w |
||||||
|
|
||||||
def get_destag_wspd_wdir(wrfnc, timeidx=0, units="mps"): |
@set_wind_metadata(wspd_wdir=True) |
||||||
u = destagger_windcomp(wrfnc,"u", timeidx) |
def get_destag_wspd_wdir(wrfnc, timeidx=0, units="mps", |
||||||
v = destagger_windcomp(wrfnc,"v", timeidx) |
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