Browse Source

Added ability to turn off metadata to getvar. Modified function argument ordering

main
Bill Ladwig 9 years ago
parent
commit
db0c4d37f2
  1. 14
      wrf_open/var/src/python/wrf/var/cape.py
  2. 11
      wrf_open/var/src/python/wrf/var/ctt.py
  3. 21
      wrf_open/var/src/python/wrf/var/dbz.py
  4. 13
      wrf_open/var/src/python/wrf/var/dewpoint.py
  5. 42
      wrf_open/var/src/python/wrf/var/extension.py
  6. 24
      wrf_open/var/src/python/wrf/var/geoht.py
  7. 20
      wrf_open/var/src/python/wrf/var/helicity.py
  8. 17
      wrf_open/var/src/python/wrf/var/interp.py
  9. 3
      wrf_open/var/src/python/wrf/var/interputils.py
  10. 18
      wrf_open/var/src/python/wrf/var/latlon.py
  11. 4
      wrf_open/var/src/python/wrf/var/latlonutils.py
  12. 47
      wrf_open/var/src/python/wrf/var/metadecorators.py
  13. 5
      wrf_open/var/src/python/wrf/var/omega.py
  14. 16
      wrf_open/var/src/python/wrf/var/pressure.py
  15. 5
      wrf_open/var/src/python/wrf/var/pw.py
  16. 10
      wrf_open/var/src/python/wrf/var/rh.py
  17. 8
      wrf_open/var/src/python/wrf/var/routines.py
  18. 7
      wrf_open/var/src/python/wrf/var/slp.py
  19. 47
      wrf_open/var/src/python/wrf/var/temp.py
  20. 7
      wrf_open/var/src/python/wrf/var/terrain.py
  21. 4
      wrf_open/var/src/python/wrf/var/times.py
  22. 40
      wrf_open/var/src/python/wrf/var/util.py
  23. 49
      wrf_open/var/src/python/wrf/var/uvmet.py
  24. 10
      wrf_open/var/src/python/wrf/var/vorticity.py
  25. 47
      wrf_open/var/src/python/wrf/var/wind.py

14
wrf_open/var/src/python/wrf/var/cape.py

@ -20,12 +20,13 @@ __all__ = ["get_2dcape", "get_3dcape"]
description="mcape ; mcin ; lcl ; lfc", description="mcape ; mcin ; lcl ; lfc",
units="J/kg ; J/kg ; m ; m", units="J/kg ; J/kg ; m ; m",
MemoryOrder="XY") MemoryOrder="XY")
def get_2dcape(wrfnc, timeidx=0, missing=Constants.DEFAULT_FILL, def get_2dcape(wrfnc, timeidx=0, method="cat",
method="cat", squeeze=True, cache=None): squeeze=True, cache=None, meta=True,
missing=Constants.DEFAULT_FILL):
"""Return the 2d fields of cape, cin, lcl, and lfc""" """Return the 2d fields of cape, cin, lcl, and lfc"""
varnames = ("T", "P", "PB", "QVAPOR", "PH","PHB", "HGT", "PSFC") varnames = ("T", "P", "PB", "QVAPOR", "PH","PHB", "HGT", "PSFC")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache, ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True) meta=False)
t = ncvars["T"] t = ncvars["T"]
p = ncvars["P"] p = ncvars["P"]
@ -82,12 +83,13 @@ def get_2dcape(wrfnc, timeidx=0, missing=Constants.DEFAULT_FILL,
description="cape ; cin", description="cape ; cin",
units="J kg-1 ; J kg-1", units="J kg-1 ; J kg-1",
MemoryOrder="XY") MemoryOrder="XY")
def get_3dcape(wrfnc, timeidx=0, missing=Constants.DEFAULT_FILL, def get_3dcape(wrfnc, timeidx=0, method="cat",
method="cat", squeeze=True, cache=None): squeeze=True, cache=None, meta=True,
missing=Constants.DEFAULT_FILL):
"""Return the 3d fields of cape and cin""" """Return the 3d fields of cape and cin"""
varnames = ("T", "P", "PB", "QVAPOR", "PH", "PHB", "HGT", "PSFC") varnames = ("T", "P", "PB", "QVAPOR", "PH", "PHB", "HGT", "PSFC")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache, ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True) meta=False)
t = ncvars["T"] t = ncvars["T"]
p = ncvars["P"] p = ncvars["P"]
pb = ncvars["PB"] pb = ncvars["PB"]

11
wrf_open/var/src/python/wrf/var/ctt.py

@ -17,14 +17,15 @@ __all__ = ["get_ctt"]
description="cloud top temperature", description="cloud top temperature",
MemoryOrder="XY") MemoryOrder="XY")
@convert_units("temp", "c") @convert_units("temp", "c")
def get_ctt(wrfnc, timeidx=0, units="c", method="cat", squeeze=True, def get_ctt(wrfnc, timeidx=0, method="cat",
cache=None): squeeze=True, cache=None, meta=True,
units="c"):
"""Return the cloud top temperature. """Return the cloud top temperature.
""" """
varnames = ("T", "P", "PB", "PH", "PHB", "HGT", "QVAPOR") varnames = ("T", "P", "PB", "PH", "PHB", "HGT", "QVAPOR")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache, ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True) meta=False)
t = ncvars["T"] t = ncvars["T"]
p = ncvars["P"] p = ncvars["P"]
pb = ncvars["PB"] pb = ncvars["PB"]
@ -36,7 +37,7 @@ def get_ctt(wrfnc, timeidx=0, units="c", method="cat", squeeze=True,
haveqci = 1 haveqci = 1
try: try:
icevars = extract_vars(wrfnc, timeidx, "QICE", icevars = extract_vars(wrfnc, timeidx, "QICE",
method, squeeze, cache) method, squeeze, cache, meta=False)
except KeyError: except KeyError:
qice = n.zeros(qv.shape, qv.dtype) qice = n.zeros(qv.shape, qv.dtype)
haveqci = 0 haveqci = 0
@ -45,7 +46,7 @@ def get_ctt(wrfnc, timeidx=0, units="c", method="cat", squeeze=True,
try: try:
cldvars = extract_vars(wrfnc, timeidx, "QCLOUD", cldvars = extract_vars(wrfnc, timeidx, "QCLOUD",
method, squeeze, cache) method, squeeze, cache, meta=False)
except KeyError: except KeyError:
raise RuntimeError("'QCLOUD' not found in NetCDF file") raise RuntimeError("'QCLOUD' not found in NetCDF file")
else: else:

21
wrf_open/var/src/python/wrf/var/dbz.py

@ -13,8 +13,9 @@ __all__ = ["get_dbz", "get_max_dbz"]
@copy_and_set_metadata(copy_varname="T", name="dbz", @copy_and_set_metadata(copy_varname="T", name="dbz",
description="radar reflectivity", description="radar reflectivity",
units="dBz") units="dBz")
def get_dbz(wrfnc, timeidx=0, do_varint=False, do_liqskin=False, def get_dbz(wrfnc, timeidx=0, method="cat",
method="cat", squeeze=True, cache=None): squeeze=True, cache=None, meta=True,
do_varint=False, do_liqskin=False):
""" Return the dbz """ Return the dbz
do_varint - do variable intercept (if False, constants are used. Otherwise, do_varint - do variable intercept (if False, constants are used. Otherwise,
@ -27,7 +28,7 @@ def get_dbz(wrfnc, timeidx=0, do_varint=False, do_liqskin=False,
""" """
varnames = ("T", "P", "PB", "QVAPOR", "QRAIN") varnames = ("T", "P", "PB", "QVAPOR", "QRAIN")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache, ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True) meta=False)
t = ncvars["T"] t = ncvars["T"]
p = ncvars["P"] p = ncvars["P"]
pb = ncvars["PB"] pb = ncvars["PB"]
@ -36,7 +37,7 @@ def get_dbz(wrfnc, timeidx=0, do_varint=False, do_liqskin=False,
try: try:
snowvars = extract_vars(wrfnc, timeidx, "QSNOW", snowvars = extract_vars(wrfnc, timeidx, "QSNOW",
method, squeeze, cache) method, squeeze, cache, meta=False)
except KeyError: except KeyError:
qs = n.zeros(qv.shape, "float") qs = n.zeros(qv.shape, "float")
else: else:
@ -44,7 +45,7 @@ def get_dbz(wrfnc, timeidx=0, do_varint=False, do_liqskin=False,
try: try:
graupvars = extract_vars(wrfnc, timeidx, "QGRAUP", graupvars = extract_vars(wrfnc, timeidx, "QGRAUP",
method, squeeze, cache) method, squeeze, cache, meta=False)
except KeyError: except KeyError:
qg = n.zeros(qv.shape, "float") qg = n.zeros(qv.shape, "float")
else: else:
@ -75,9 +76,11 @@ def get_dbz(wrfnc, timeidx=0, do_varint=False, do_liqskin=False,
description="maximum radar reflectivity", description="maximum radar reflectivity",
units="dBz", units="dBz",
MemoryOrder="XY") MemoryOrder="XY")
def get_max_dbz(wrfnc, timeidx=0, do_varint=False, do_liqskin=False, def get_max_dbz(wrfnc, timeidx=0, method="cat",
method="cat", squeeze=True, cache=None): squeeze=True, cache=None, meta=True,
return n.amax(get_dbz(wrfnc, timeidx, do_varint, do_liqskin, do_varint=False, do_liqskin=False):
method, squeeze, cache), return n.amax(get_dbz(wrfnc, timeidx, method,
squeeze, cache, meta,
do_varint, do_liqskin),
axis=-3) axis=-3)

13
wrf_open/var/src/python/wrf/var/dewpoint.py

@ -11,12 +11,12 @@ __all__ = ["get_dp", "get_dp_2m"]
@copy_and_set_metadata(copy_varname="QVAPOR", name="td", @copy_and_set_metadata(copy_varname="QVAPOR", name="td",
description="dew point temperature") description="dew point temperature")
@convert_units("temp", "c") @convert_units("temp", "c")
def get_dp(wrfnc, timeidx=0, units="c", def get_dp(wrfnc, timeidx=0, method="cat", squeeze=True,
method="cat", squeeze=True, cache=None): cache=None, meta=True, units="c"):
varnames=("P", "PB", "QVAPOR") varnames=("P", "PB", "QVAPOR")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache, ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True) meta=False)
p = ncvars["P"] p = ncvars["P"]
pb = ncvars["PB"] pb = ncvars["PB"]
@ -32,11 +32,12 @@ def get_dp(wrfnc, timeidx=0, units="c",
@copy_and_set_metadata(copy_varname="Q2", name="td2", @copy_and_set_metadata(copy_varname="Q2", name="td2",
description="2m dew point temperature") description="2m dew point temperature")
@convert_units("temp", "c") @convert_units("temp", "c")
def get_dp_2m(wrfnc, timeidx=0, units="c", def get_dp_2m(wrfnc, timeidx=0, method="cat", squeeze=True,
method="cat", squeeze=True, cache=None): cache=None, meta=True,
units="c"):
varnames=("PSFC", "Q2") varnames=("PSFC", "Q2")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache, ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True) meta=False)
# Algorithm requires hPa # Algorithm requires hPa
psfc = .01*(ncvars["PSFC"]) psfc = .01*(ncvars["PSFC"])

42
wrf_open/var/src/python/wrf/var/extension.py

@ -226,7 +226,6 @@ def computeomega(qv, tk, w, p):
w, w,
p) p)
#return res.T
return res return res
@handle_left_iter(3,0) @handle_left_iter(3,0)
@ -337,8 +336,8 @@ def computecape(p_hpa, tk, qv, ht, ter, sfp, missing, i3dflag, ter_follow):
# The fortran routine needs pressure to be ascending in z-direction, # The fortran routine needs pressure to be ascending in z-direction,
# along with tk,qv,and ht. # along with tk,qv,and ht.
# The extra mumbo-jumbo is so that the view created by numpy is fortran # The extra mumbo-jumbo is so that the view created by numpy is fortran
# contiguous. 'ascontiguousarray' only works in C ordering, hence the extra # contiguous. 'ascontiguousarray' only works in C ordering, hence the
# transposes. # extra transposes.
flip_p = np.ascontiguousarray(p_hpa[:,:,::-1].T).T flip_p = np.ascontiguousarray(p_hpa[:,:,::-1].T).T
flip_tk = np.ascontiguousarray(tk[:,:,::-1].T).T flip_tk = np.ascontiguousarray(tk[:,:,::-1].T).T
flip_qv = np.ascontiguousarray(qv[:,:,::-1].T).T flip_qv = np.ascontiguousarray(qv[:,:,::-1].T).T
@ -370,9 +369,21 @@ def computeij(map_proj, truelat1, truelat2, stdlon,
lat1, lon1, pole_lat, pole_lon, lat1, lon1, pole_lat, pole_lon,
knowni, knownj, dx, latinc, loninc, lat, lon): knowni, knownj, dx, latinc, loninc, lat, lon):
res = f_lltoij(map_proj,truelat1,truelat2,stdlon, res = f_lltoij(map_proj,
lat1,lon1,pole_lat,pole_lon, truelat1,
knowni,knownj,dx,latinc,loninc,lat,lon, truelat2,
stdlon,
lat1,
lon1,
pole_lat,
pole_lon,
knowni,
knownj,
dx,
latinc,
loninc,
lat,
lon,
FortranException()) FortranException())
return res return res
@ -381,9 +392,22 @@ def computell(map_proj, truelat1, truelat2, stdlon, lat1, lon1,
pole_lat, pole_lon, knowni, knownj, dx, latinc, pole_lat, pole_lon, knowni, knownj, dx, latinc,
loninc, i, j): loninc, i, j):
res = f_ijtoll(map_proj,truelat1,truelat2,stdlon,lat1,lon1, res = f_ijtoll(map_proj,
pole_lat,pole_lon,knowni,knownj,dx,latinc, truelat1,
loninc,i,j,FortranException()) truelat2,
stdlon,
lat1,
lon1,
pole_lat,
pole_lon,
knowni,
knownj,
dx,
latinc,
loninc,
i,
j,
FortranException())
return res return res

24
wrf_open/var/src/python/wrf/var/geoht.py

@ -9,8 +9,9 @@ from .util import extract_vars, either
__all__ = ["get_geopt", "get_height"] __all__ = ["get_geopt", "get_height"]
def _get_geoht(wrfnc, timeidx, height=True, msl=True, def _get_geoht(wrfnc, timeidx, method="cat", squeeze=True,
method="cat", squeeze=True, cache=None): cache=None, meta=True,
height=True, msl=True):
"""Return the geopotential in units of m2 s-2 if height is False, """Return the geopotential in units of m2 s-2 if height is False,
otherwise return the geopotential height in meters. If height is True, otherwise return the geopotential height in meters. If height is True,
then if msl is True the result will be in MSL, otherwise AGL (the terrain then if msl is True the result will be in MSL, otherwise AGL (the terrain
@ -21,7 +22,7 @@ def _get_geoht(wrfnc, timeidx, height=True, msl=True,
varname = either("PH", "GHT")(wrfnc) varname = either("PH", "GHT")(wrfnc)
if varname == "PH": if varname == "PH":
ph_vars = extract_vars(wrfnc, timeidx, ("PH", "PHB", "HGT"), ph_vars = extract_vars(wrfnc, timeidx, ("PH", "PHB", "HGT"),
method, squeeze, cache, nometa=True) method, squeeze, cache, meta=False)
ph = ph_vars["PH"] ph = ph_vars["PH"]
phb = ph_vars["PHB"] phb = ph_vars["PHB"]
hgt = ph_vars["HGT"] hgt = ph_vars["HGT"]
@ -29,7 +30,7 @@ def _get_geoht(wrfnc, timeidx, height=True, msl=True,
geopt_unstag = destagger(geopt, -3) geopt_unstag = destagger(geopt, -3)
else: else:
ght_vars = extract_vars(wrfnc, timeidx, ("GHT", "HGT_M"), ght_vars = extract_vars(wrfnc, timeidx, ("GHT", "HGT_M"),
method, squeeze, cache, nometa=True) method, squeeze, cache, meta=False)
geopt_unstag = ght_vars["GHT"] * Constants.G geopt_unstag = ght_vars["GHT"] * Constants.G
hgt = ght_vars["HGT_M"] hgt = ght_vars["HGT_M"]
@ -48,14 +49,19 @@ def _get_geoht(wrfnc, timeidx, height=True, msl=True,
else: else:
return geopt_unstag return geopt_unstag
@set_height_metadata(geopt=True) @set_height_metadata(geopt=True)
def get_geopt(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None): def get_geopt(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None,
return _get_geoht(wrfnc, timeidx, False, True, method, squeeze, cache) meta=True):
return _get_geoht(wrfnc, timeidx, method, squeeze, cache, meta,
False, True,)
@set_height_metadata(geopt=False) @set_height_metadata(geopt=False)
@convert_units("height", "m") @convert_units("height", "m")
def get_height(wrfnc, timeidx=0, msl=True, units="m", def get_height(wrfnc, timeidx=0, method="cat", squeeze=True,
method="cat", squeeze=True, cache=None): cache=None, meta=True,
msl=True, units="m"):
return _get_geoht(wrfnc, timeidx, True, msl, method, squeeze, cache) return _get_geoht(wrfnc, timeidx, method, squeeze, cache, meta, True, msl)

20
wrf_open/var/src/python/wrf/var/helicity.py

@ -13,12 +13,13 @@ __all__ = ["get_srh", "get_uh"]
@copy_and_set_metadata(copy_varname="HGT", name="srh", @copy_and_set_metadata(copy_varname="HGT", name="srh",
description="storm relative helicity", description="storm relative helicity",
units="m-2/s-2") units="m-2/s-2")
def get_srh(wrfnc, timeidx=0, top=3000.0, def get_srh(wrfnc, timeidx=0, method="cat", squeeze=True,
method="cat", squeeze=True, cache=None): cache=None, meta=True,
top=3000.0):
# Top can either be 3000 or 1000 (for 0-1 srh or 0-3 srh) # Top can either be 3000 or 1000 (for 0-1 srh or 0-3 srh)
ncvars = extract_vars(wrfnc, timeidx, ("HGT", "PH", "PHB"), ncvars = extract_vars(wrfnc, timeidx, ("HGT", "PH", "PHB"),
method, squeeze, cache, nometa=True) method, squeeze, cache, meta=False)
ter = ncvars["HGT"] ter = ncvars["HGT"]
ph = ncvars["PH"] ph = ncvars["PH"]
@ -27,12 +28,12 @@ def get_srh(wrfnc, timeidx=0, top=3000.0,
# As coded in NCL, but not sure this is possible # As coded in NCL, but not sure this is possible
varname = either("U", "UU")(wrfnc) varname = either("U", "UU")(wrfnc)
u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache, u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True) meta=False)
u = destagger(u_vars[varname], -1) u = destagger(u_vars[varname], -1)
varname = either("V", "VV")(wrfnc) varname = either("V", "VV")(wrfnc)
v_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache, v_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True) meta=False)
v = destagger(v_vars[varname], -2) v = destagger(v_vars[varname], -2)
geopt = ph + phb geopt = ph + phb
@ -52,8 +53,9 @@ def get_srh(wrfnc, timeidx=0, top=3000.0,
@copy_and_set_metadata(copy_varname="MAPFAC_M", name="updraft_helicity", @copy_and_set_metadata(copy_varname="MAPFAC_M", name="updraft_helicity",
description="updraft helicity", description="updraft helicity",
units="m-2/s-2") units="m-2/s-2")
def get_uh(wrfnc, timeidx=0, bottom=2000.0, top=5000.0, def get_uh(wrfnc, timeidx=0, method="cat", squeeze=True,
method="cat", squeeze=True, cache=None): cache=None, meta=True,
bottom=2000.0, top=5000.0):
ncvars = extract_vars(wrfnc, timeidx, ("W", "PH", "PHB", "MAPFAC_M"), ncvars = extract_vars(wrfnc, timeidx, ("W", "PH", "PHB", "MAPFAC_M"),
method, squeeze, cache) method, squeeze, cache)
@ -70,12 +72,12 @@ def get_uh(wrfnc, timeidx=0, bottom=2000.0, top=5000.0,
# As coded in NCL, but not sure this is possible # As coded in NCL, but not sure this is possible
varname = either("U", "UU")(wrfnc) varname = either("U", "UU")(wrfnc)
u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache, u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True) meta=False)
u = destagger(u_vars[varname], -1) u = destagger(u_vars[varname], -1)
varname = either("V", "VV")(wrfnc) varname = either("V", "VV")(wrfnc)
v_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache, v_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True) meta=False)
v = destagger(v_vars[varname], -2) v = destagger(v_vars[varname], -2)
zp = ph + phb zp = ph + phb

17
wrf_open/var/src/python/wrf/var/interp.py

@ -21,7 +21,8 @@ __all__ = ["interplevel", "vertcross", "interpline", "vinterp"]
# Note: Extension decorator is good enough to handle left dims # Note: Extension decorator is good enough to handle left dims
@set_interp_metadata("horiz") @set_interp_metadata("horiz")
def interplevel(field3d, z, desiredloc, missingval=Constants.DEFAULT_FILL): def interplevel(field3d, z, desiredloc, missingval=Constants.DEFAULT_FILL,
meta=True):
"""Return the horizontally interpolated data at the provided level """Return the horizontally interpolated data at the provided level
field3d - the 3D field to interpolate field3d - the 3D field to interpolate
@ -40,7 +41,7 @@ def interplevel(field3d, z, desiredloc, missingval=Constants.DEFAULT_FILL):
def vertcross(field3d, z, missingval=Constants.DEFAULT_FILL, def vertcross(field3d, z, missingval=Constants.DEFAULT_FILL,
pivot_point=None, angle=None, pivot_point=None, angle=None,
start_point=None, end_point=None, start_point=None, end_point=None,
cache=None): cache=None, meta=True):
"""Return the vertical cross section for a 3D field, interpolated """Return the vertical cross section for a 3D field, interpolated
to a verical plane defined by a horizontal line. to a verical plane defined by a horizontal line.
@ -71,7 +72,7 @@ def vertcross(field3d, z, missingval=Constants.DEFAULT_FILL,
@set_interp_metadata("line") @set_interp_metadata("line")
def interpline(field2d, pivot_point=None, def interpline(field2d, pivot_point=None,
angle=None, start_point=None, angle=None, start_point=None,
end_point=None, cache=None): end_point=None, cache=None, meta=True):
"""Return the 2D field interpolated along a line. """Return the 2D field interpolated along a line.
Arguments: Arguments:
@ -94,7 +95,7 @@ def interpline(field2d, pivot_point=None,
@set_interp_metadata("vinterp") @set_interp_metadata("vinterp")
def vinterp(wrfnc, field, vert_coord, interp_levels, extrapolate=False, def vinterp(wrfnc, field, vert_coord, interp_levels, extrapolate=False,
field_type=None, log_p=False, timeidx=-1, method="cat", field_type=None, log_p=False, timeidx=-1, method="cat",
squeeze=True, cache=None): squeeze=True, cache=None, meta=True):
# Remove case sensitivity # Remove case sensitivity
field_type = field_type.lower() if field_type is not None else "none" field_type = field_type.lower() if field_type is not None else "none"
vert_coord = vert_coord.lower() if vert_coord is not None else "none" vert_coord = vert_coord.lower() if vert_coord is not None else "none"
@ -154,7 +155,7 @@ def vinterp(wrfnc, field, vert_coord, interp_levels, extrapolate=False,
# Extract vriables # Extract vriables
#timeidx = -1 # Should this be an argument? #timeidx = -1 # Should this be an argument?
ncvars = extract_vars(wrfnc, timeidx, ("PSFC", "QVAPOR", "F"), ncvars = extract_vars(wrfnc, timeidx, ("PSFC", "QVAPOR", "F"),
method, squeeze, cache, nometa=True) method, squeeze, cache, meta=False)
sfp = ncvars["PSFC"] * ConversionFactors.PA_TO_HPA sfp = ncvars["PSFC"] * ConversionFactors.PA_TO_HPA
qv = ncvars["QVAPOR"] qv = ncvars["QVAPOR"]
@ -236,17 +237,17 @@ def vinterp(wrfnc, field, vert_coord, interp_levels, extrapolate=False,
# Move to the new routines module # Move to the new routines module
# TODO: Rename after the extensions are renamed # TODO: Rename after the extensions are renamed
@set_interp_metadata("horiz") @set_interp_metadata("horiz")
def wrap_interpz3d(field3d, z, desiredloc, missingval): def wrap_interpz3d(field3d, z, desiredloc, missingval, meta=True):
return interpz3d(field3d, z, desiredloc, missingval) return interpz3d(field3d, z, desiredloc, missingval)
@set_interp_metadata("2dxy") @set_interp_metadata("2dxy")
def wrap_interp2dxy(field3d, xy): def wrap_interp2dxy(field3d, xy, meta=True):
return interp2dxy(field3d, xy) return interp2dxy(field3d, xy)
@set_interp_metadata("1d") @set_interp_metadata("1d")
def wrap_interp1d(v_in, z_in, z_out, missingval): def wrap_interp1d(v_in, z_in, z_out, missingval, meta=True):
return interp1d(v_in, z_in, z_out, missingval) return interp1d(v_in, z_in, z_out, missingval)

3
wrf_open/var/src/python/wrf/var/interputils.py

@ -158,7 +158,8 @@ def get_xy_z_params(z, pivot_point=None, angle=None,
return xy, var2dz, z_var2d return xy, var2dz, z_var2d
def get_xy(var, pivot_point=None, angle=None, start_point=None, end_point=None): def get_xy(var, pivot_point=None, angle=None,
start_point=None, end_point=None):
if pivot_point is not None: if pivot_point is not None:
pos_pivot = to_positive_idxs(var.shape[-2:], pivot_point) pos_pivot = to_positive_idxs(var.shape[-2:], pivot_point)
else: else:

18
wrf_open/var/src/python/wrf/var/latlon.py

@ -9,36 +9,38 @@ from .metadecorators import set_latlon_metadata
__all__ = ["get_lat", "get_lon", "get_ij", "get_ll"] __all__ = ["get_lat", "get_lon", "get_ij", "get_ll"]
def get_lat(wrfnc, timeidx=0, stagger=None, def get_lat(wrfnc, timeidx=0, method="cat", squeeze=True,
method="cat", squeeze=True, cache=None): cache=None, meta=True,
stagger=None):
varname = _lat_varname(wrfnc, stagger) varname = _lat_varname(wrfnc, stagger)
lat_var = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache, lat_var = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=False) meta)
return lat_var[varname] return lat_var[varname]
def get_lon(wrfnc, timeidx=0, stagger=None, def get_lon(wrfnc, timeidx=0, method="cat", squeeze=True,
method="cat", squeeze=True, cache=None): cache=None, meta=True,
stagger=None):
varname = _lon_varname(wrfnc, stagger) varname = _lon_varname(wrfnc, stagger)
lon_var = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache, lon_var = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=False) meta)
return lon_var[varname] return lon_var[varname]
@set_latlon_metadata(ij=True) @set_latlon_metadata(ij=True)
def get_ij(wrfnc, latitude, longitude, timeidx=0, def get_ij(wrfnc, latitude, longitude, timeidx=0,
stagger=None, method="cat", squeeze=True, cache=None): stagger=None, method="cat", squeeze=True, cache=None, meta=True):
return ll_to_ij(wrfnc, latitude, longitude, timeidx, stagger, return ll_to_ij(wrfnc, latitude, longitude, timeidx, stagger,
method, squeeze, cache) method, squeeze, cache)
@set_latlon_metadata(ij=False) @set_latlon_metadata(ij=False)
def get_ll(wrfnc, i, j, timeidx=0, def get_ll(wrfnc, i, j, timeidx=0,
stagger=None, method="cat", squeeze=True, cache=None): stagger=None, method="cat", squeeze=True, cache=None, meta=True):
return ij_to_ll(wrfnc, i, j, timeidx, stagger, return ij_to_ll(wrfnc, i, j, timeidx, stagger,
method, squeeze, cache) method, squeeze, cache)

4
wrf_open/var/src/python/wrf/var/latlonutils.py

@ -80,9 +80,9 @@ def _get_proj_params(wrfnc, timeidx, stagger, method, squeeze, cache):
method, squeeze, cache) method, squeeze, cache)
xlat = extract_vars(wrfnc, lat_timeidx, (latvar,), method, squeeze, cache, xlat = extract_vars(wrfnc, lat_timeidx, (latvar,), method, squeeze, cache,
nometa=True)[latvar] meta=False)[latvar]
xlon = extract_vars(wrfnc, lat_timeidx, (lonvar,), method, squeeze, cache, xlon = extract_vars(wrfnc, lat_timeidx, (lonvar,), method, squeeze, cache,
nometa=True)[lonvar] meta=False)[lonvar]
ref_lat = np.ravel(xlat[...,0,0]) ref_lat = np.ravel(xlat[...,0,0])
ref_lon = np.ravel(xlon[...,0,0]) ref_lon = np.ravel(xlon[...,0,0])

47
wrf_open/var/src/python/wrf/var/metadecorators.py

@ -33,12 +33,18 @@ def copy_and_set_metadata(copy_varname=None, delete_attrs=None, name=None,
""" """
@wrapt.decorator @wrapt.decorator
def func_wrapper(wrapped, instance, args, kwargs): def func_wrapper(wrapped, instance, args, kwargs):
if not xarray_enabled(): do_meta = from_args(wrapped, ("meta",), *args, **kwargs)["meta"]
if do_meta is None:
do_meta = True
if not xarray_enabled() or not do_meta:
return wrapped(*args, **kwargs) return wrapped(*args, **kwargs)
argvars = from_args(wrapped, ("wrfnc", "timeidx", "method", argvars = from_args(wrapped, ("wrfnc", "timeidx", "method",
"squeeze", "cache", "units"), "squeeze", "cache", "units", "meta"),
*args, **kwargs) *args, **kwargs)
wrfnc = argvars["wrfnc"] wrfnc = argvars["wrfnc"]
timeidx = argvars["timeidx"] timeidx = argvars["timeidx"]
units = argvars["units"] units = argvars["units"]
@ -62,7 +68,7 @@ def copy_and_set_metadata(copy_varname=None, delete_attrs=None, name=None,
if var_to_copy is None: if var_to_copy is None:
var_to_copy = extract_vars(wrfnc, timeidx, (_copy_varname,), var_to_copy = extract_vars(wrfnc, timeidx, (_copy_varname,),
method, squeeze, cache, method, squeeze, cache,
nometa=False)[_copy_varname] meta=True)[_copy_varname]
# Make a copy so we don't modify a user supplied cache # Make a copy so we don't modify a user supplied cache
new_cache = dict(cache) new_cache = dict(cache)
@ -136,7 +142,12 @@ def set_wind_metadata(copy_varname, name, description,
two_d=False, wspd_wdir=False): two_d=False, wspd_wdir=False):
@wrapt.decorator @wrapt.decorator
def func_wrapper(wrapped, instance, args, kwargs): def func_wrapper(wrapped, instance, args, kwargs):
if not xarray_enabled(): do_meta = from_args(wrapped, ("meta",), *args, **kwargs)["meta"]
if do_meta is None:
do_meta = True
if not xarray_enabled() or not do_meta:
return wrapped(*args, **kwargs) return wrapped(*args, **kwargs)
argvars = from_args(wrapped, ("wrfnc", "timeidx", "units", argvars = from_args(wrapped, ("wrfnc", "timeidx", "units",
@ -159,7 +170,7 @@ def set_wind_metadata(copy_varname, name, description,
copy_var = extract_vars(wrfnc, timeidx, _copy_varname, copy_var = extract_vars(wrfnc, timeidx, _copy_varname,
method, squeeze, cache, method, squeeze, cache,
nometa=False)[_copy_varname] meta=True)[_copy_varname]
# Make a copy so we don't modify a user supplied cache # Make a copy so we don't modify a user supplied cache
new_cache = dict(cache) new_cache = dict(cache)
@ -213,7 +224,12 @@ def set_latlon_metadata(ij=False):
@wrapt.decorator @wrapt.decorator
def func_wrapper(wrapped, instance, args, kwargs): def func_wrapper(wrapped, instance, args, kwargs):
if not xarray_enabled(): do_meta = from_args(wrapped, ("meta",), *args, **kwargs)["meta"]
if do_meta is None:
do_meta = True
if not xarray_enabled() or not do_meta:
return wrapped(*args, **kwargs) return wrapped(*args, **kwargs)
res = wrapped(*args, **kwargs) res = wrapped(*args, **kwargs)
@ -264,7 +280,12 @@ def set_latlon_metadata(ij=False):
def set_height_metadata(geopt=False): def set_height_metadata(geopt=False):
@wrapt.decorator @wrapt.decorator
def func_wrapper(wrapped, instance, args, kwargs): def func_wrapper(wrapped, instance, args, kwargs):
if not xarray_enabled(): do_meta = from_args(wrapped, ("meta",), *args, **kwargs)["meta"]
if do_meta is None:
do_meta = True
if not xarray_enabled() or not do_meta:
return wrapped(*args, **kwargs) return wrapped(*args, **kwargs)
argvars = from_args(wrapped, ("wrfnc", "timeidx", "method", argvars = from_args(wrapped, ("wrfnc", "timeidx", "method",
@ -285,7 +306,7 @@ def set_height_metadata(geopt=False):
# pressure (which has the same dims as destaggered height) # pressure (which has the same dims as destaggered height)
ht_metadata_varname = either("P", "GHT")(wrfnc) ht_metadata_varname = either("P", "GHT")(wrfnc)
ht_var = extract_vars(wrfnc, timeidx, ht_metadata_varname, ht_var = extract_vars(wrfnc, timeidx, ht_metadata_varname,
method, squeeze, cache, nometa=False) method, squeeze, cache, meta=True)
ht_metadata_var = ht_var[ht_metadata_varname] ht_metadata_var = ht_var[ht_metadata_varname]
# Make a copy so we don't modify a user supplied cache # Make a copy so we don't modify a user supplied cache
@ -695,12 +716,15 @@ def _set_1d_meta(wrapped, instance, args, kwargs):
coords=outcoords, attrs=outattrs) coords=outcoords, attrs=outattrs)
def set_interp_metadata(interp_type): def set_interp_metadata(interp_type):
@wrapt.decorator @wrapt.decorator
def func_wrapper(wrapped, instance, args, kwargs): def func_wrapper(wrapped, instance, args, kwargs):
if not xarray_enabled(): do_meta = from_args(wrapped, ("meta",), *args, **kwargs)["meta"]
if do_meta is None:
do_meta = True
if not xarray_enabled() or not do_meta:
return wrapped(*args, **kwargs) return wrapped(*args, **kwargs)
if interp_type == "horiz": if interp_type == "horiz":
@ -715,4 +739,5 @@ def set_interp_metadata(interp_type):
return _set_2dxy_meta(wrapped, instance, args, kwargs) return _set_2dxy_meta(wrapped, instance, args, kwargs)
elif interp_type == "1d": elif interp_type == "1d":
return _set_1d_meta(wrapped, instance, args, kwargs) return _set_1d_meta(wrapped, instance, args, kwargs)
return func_wrapper return func_wrapper

5
wrf_open/var/src/python/wrf/var/omega.py

@ -12,10 +12,11 @@ __all__ = ["get_omega"]
@copy_and_set_metadata(copy_varname="T", name="omega", @copy_and_set_metadata(copy_varname="T", name="omega",
description="omega", description="omega",
units="Pa/s") units="Pa/s")
def get_omega(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None): def get_omega(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None,
meta=True):
varnames=("T", "P", "W", "PB", "QVAPOR") varnames=("T", "P", "W", "PB", "QVAPOR")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache, ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True) meta=False)
t = ncvars["T"] t = ncvars["T"]
p = ncvars["P"] p = ncvars["P"]
w = ncvars["W"] w = ncvars["W"]

16
wrf_open/var/src/python/wrf/var/pressure.py

@ -10,25 +10,27 @@ __all__ = ["get_pressure", "get_pressure_hpa"]
@copy_and_set_metadata(copy_varname=either("P", "PRES"), name="pressure", @copy_and_set_metadata(copy_varname=either("P", "PRES"), name="pressure",
description="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, method="cat", squeeze=True,
method="cat", squeeze=True, cache=None): cache=None, meta=True,
units="pa"):
varname = either("P", "PRES")(wrfnc) varname = either("P", "PRES")(wrfnc)
if varname == "P": if varname == "P":
p_vars = extract_vars(wrfnc, timeidx, ("P", "PB"), p_vars = extract_vars(wrfnc, timeidx, ("P", "PB"),
method, squeeze, cache, nometa=True) method, squeeze, cache, meta=False)
p = p_vars["P"] p = p_vars["P"]
pb = p_vars["PB"] pb = p_vars["PB"]
pres = p + pb pres = p + pb
else: else:
pres = extract_vars(wrfnc, timeidx, "PRES", pres = extract_vars(wrfnc, timeidx, "PRES",
method, squeeze, cache, nometa=True)["PRES"] method, squeeze, cache, meta=False)["PRES"]
return pres return pres
def get_pressure_hpa(wrfnc, timeidx=0, units="hpa", def get_pressure_hpa(wrfnc, timeidx=0, method="cat", squeeze=True,
method="cat", squeeze=True, cache=None): cache=None, meta=True,
return get_pressure(wrfnc, timeidx, units, method, squeeze, cache) units="hpa"):
return get_pressure(wrfnc, timeidx, method, squeeze, cache, meta, units)

5
wrf_open/var/src/python/wrf/var/pw.py

@ -13,10 +13,11 @@ __all__ = ["get_pw"]
description="precipitable water", description="precipitable water",
MemoryOrder="XY", MemoryOrder="XY",
units="kg m-2") units="kg m-2")
def get_pw(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None): def get_pw(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None,
meta=True):
varnames=("T", "P", "PB", "PH", "PHB", "QVAPOR") varnames=("T", "P", "PB", "PH", "PHB", "QVAPOR")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache, ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True) meta=False)
t = ncvars["T"] t = ncvars["T"]
p = ncvars["P"] p = ncvars["P"]

10
wrf_open/var/src/python/wrf/var/rh.py

@ -11,10 +11,11 @@ __all__ = ["get_rh", "get_rh_2m"]
@copy_and_set_metadata(copy_varname="T", name="rh", @copy_and_set_metadata(copy_varname="T", name="rh",
description="relative humidity", description="relative humidity",
delete_attrs=("units",)) delete_attrs=("units",))
def get_rh(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None): def get_rh(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None,
meta=True):
varnames=("T", "P", "PB", "QVAPOR") varnames=("T", "P", "PB", "QVAPOR")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache, ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True) meta=False)
t = ncvars["T"] t = ncvars["T"]
p = ncvars["P"] p = ncvars["P"]
pb = ncvars["PB"] pb = ncvars["PB"]
@ -31,10 +32,11 @@ def get_rh(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None):
@copy_and_set_metadata(copy_varname="T2", name="rh2", @copy_and_set_metadata(copy_varname="T2", name="rh2",
description="2m relative humidity", description="2m relative humidity",
delete_attrs=("units",)) delete_attrs=("units",))
def get_rh_2m(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None): def get_rh_2m(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None,
meta=True):
varnames=("T2", "PSFC", "Q2") varnames=("T2", "PSFC", "Q2")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache, ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True) meta=False)
t2 = ncvars["T2"] t2 = ncvars["T2"]
psfc = ncvars["PSFC"] psfc = ncvars["PSFC"]
q2 = ncvars["Q2"] q2 = ncvars["Q2"]

8
wrf_open/var/src/python/wrf/var/routines.py

@ -150,17 +150,19 @@ def _check_kargs(var, kargs):
def getvar(wrfnc, var, timeidx=0, def getvar(wrfnc, var, timeidx=0,
method="cat", squeeze=True, cache=None, method="cat", squeeze=True, cache=None, meta=True,
**kargs): **kargs):
wrfnc = _unpack_sequence(wrfnc) wrfnc = _unpack_sequence(wrfnc)
if is_standard_wrf_var(wrfnc, var): if is_standard_wrf_var(wrfnc, var):
return extract_vars(wrfnc, timeidx, var, method, squeeze, cache)[var] return extract_vars(wrfnc, timeidx, var,
method, squeeze, cache, meta)[var]
actual_var = _undo_alias(var) actual_var = _undo_alias(var)
if actual_var not in _VALID_KARGS: if actual_var not in _VALID_KARGS:
raise ArgumentError("'%s' is not a valid variable name" % (var)) raise ArgumentError("'%s' is not a valid variable name" % (var))
_check_kargs(actual_var, kargs) _check_kargs(actual_var, kargs)
return _FUNC_MAP[actual_var](wrfnc,timeidx,**kargs) return _FUNC_MAP[actual_var](wrfnc, timeidx,
method, squeeze, cache, meta, **kargs)

7
wrf_open/var/src/python/wrf/var/slp.py

@ -15,11 +15,12 @@ __all__ = ["get_slp"]
description="sea level pressure", description="sea level pressure",
MemoryOrder="XY") MemoryOrder="XY")
@convert_units("pressure", "hpa") @convert_units("pressure", "hpa")
def get_slp(wrfnc, timeidx=0, units="hpa", def get_slp(wrfnc, timeidx=0, method="cat", squeeze=True,
method="cat", squeeze=True, cache=None): cache=None, meta=True,
units="hpa"):
varnames=("T", "P", "PB", "QVAPOR", "PH", "PHB") varnames=("T", "P", "PB", "QVAPOR", "PH", "PHB")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache, ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True) meta=False)
t = ncvars["T"] t = ncvars["T"]
p = ncvars["P"] p = ncvars["P"]

47
wrf_open/var/src/python/wrf/var/temp.py

@ -13,12 +13,13 @@ __all__ = ["get_theta", "get_temp", "get_eth", "get_tv", "get_tw",
@copy_and_set_metadata(copy_varname="T", name="theta", @copy_and_set_metadata(copy_varname="T", name="theta",
description="potential temperature") description="potential temperature")
@convert_units("temp", "k") @convert_units("temp", "k")
def get_theta(wrfnc, timeidx=0, units="k", def get_theta(wrfnc, timeidx=0, method="cat", squeeze=True,
method="cat", squeeze=True, cache=None): cache=None, meta=True,
units="k"):
varnames = ("T",) varnames = ("T",)
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache, ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True) meta=False)
t = ncvars["T"] t = ncvars["T"]
full_t = t + Constants.T_BASE full_t = t + Constants.T_BASE
@ -27,13 +28,14 @@ def get_theta(wrfnc, timeidx=0, units="k",
@copy_and_set_metadata(copy_varname="T", name="temp", @copy_and_set_metadata(copy_varname="T", name="temp",
description="temperature") description="temperature")
@convert_units("temp", "k") @convert_units("temp", "k")
def get_temp(wrfnc, timeidx=0, units="k", method="cat", squeeze=True, def get_temp(wrfnc, timeidx=0, method="cat", squeeze=True,
cache=None): cache=None, meta=True,
units="k"):
"""Return the temperature in Kelvin or Celsius""" """Return the temperature in Kelvin or Celsius"""
varnames=("T", "P", "PB") varnames=("T", "P", "PB")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache, ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True) meta=False)
t = ncvars["T"] t = ncvars["T"]
p = ncvars["P"] p = ncvars["P"]
pb = ncvars["PB"] pb = ncvars["PB"]
@ -47,13 +49,14 @@ def get_temp(wrfnc, timeidx=0, units="k", method="cat", squeeze=True,
@copy_and_set_metadata(copy_varname="T", name="theta_e", @copy_and_set_metadata(copy_varname="T", name="theta_e",
description="equivalent potential temperature") description="equivalent potential temperature")
@convert_units("temp", "k") @convert_units("temp", "k")
def get_eth(wrfnc, timeidx=0, units="k", method="cat", squeeze=True, def get_eth(wrfnc, timeidx=0, method="cat", squeeze=True,
cache=None): cache=None, meta=True,
units="k"):
"Return equivalent potential temperature (Theta-e) in Kelvin" "Return equivalent potential temperature (Theta-e) in Kelvin"
varnames=("T", "P", "PB", "QVAPOR") varnames=("T", "P", "PB", "QVAPOR")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache, ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True) meta=False)
t = ncvars["T"] t = ncvars["T"]
p = ncvars["P"] p = ncvars["P"]
pb = ncvars["PB"] pb = ncvars["PB"]
@ -70,13 +73,14 @@ def get_eth(wrfnc, timeidx=0, units="k", method="cat", squeeze=True,
@copy_and_set_metadata(copy_varname="T", name="tv", @copy_and_set_metadata(copy_varname="T", name="tv",
description="virtual temperature") description="virtual temperature")
@convert_units("temp", "k") @convert_units("temp", "k")
def get_tv(wrfnc, timeidx=0, units="k", method="cat", squeeze=True, def get_tv(wrfnc, timeidx=0, method="cat", squeeze=True,
cache=None): cache=None, meta=True,
units="k"):
"Return the virtual temperature (tv) in Kelvin or Celsius" "Return the virtual temperature (tv) in Kelvin or Celsius"
varnames=("T", "P", "PB", "QVAPOR") varnames=("T", "P", "PB", "QVAPOR")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache, ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True) meta=False)
t = ncvars["T"] t = ncvars["T"]
p = ncvars["P"] p = ncvars["P"]
@ -94,13 +98,14 @@ def get_tv(wrfnc, timeidx=0, units="k", method="cat", squeeze=True,
@copy_and_set_metadata(copy_varname="T", name="twb", @copy_and_set_metadata(copy_varname="T", name="twb",
description="wetbulb temperature") description="wetbulb temperature")
@convert_units("temp", "k") @convert_units("temp", "k")
def get_tw(wrfnc, timeidx=0, units="k", method="cat", squeeze=True, def get_tw(wrfnc, timeidx=0, method="cat", squeeze=True,
cache=None): cache=None, meta=True,
units="k"):
"Return the wetbulb temperature (tw)" "Return the wetbulb temperature (tw)"
varnames=("T", "P", "PB", "QVAPOR") varnames=("T", "P", "PB", "QVAPOR")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache, ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True) meta=False)
t = ncvars["T"] t = ncvars["T"]
p = ncvars["P"] p = ncvars["P"]
pb = ncvars["PB"] pb = ncvars["PB"]
@ -114,13 +119,13 @@ def get_tw(wrfnc, timeidx=0, units="k", method="cat", squeeze=True,
return tw return tw
def get_tk(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None): def get_tk(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None,
return get_temp(wrfnc, timeidx, units="k", meta=True):
method=method, squeeze=squeeze, cache=cache) return get_temp(wrfnc, timeidx, method, squeeze, cache, meta, units="k")
def get_tc(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None): def get_tc(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None,
return get_temp(wrfnc, timeidx, units="c", meta=True):
method=method, squeeze=squeeze, cache=cache) return get_temp(wrfnc, timeidx, method, squeeze, cache, meta, units="c")

7
wrf_open/var/src/python/wrf/var/terrain.py

@ -11,11 +11,12 @@ __all__ = ["get_terrain"]
@copy_and_set_metadata(copy_varname=either("HGT", "HGT_M"), name="terrain", @copy_and_set_metadata(copy_varname=either("HGT", "HGT_M"), name="terrain",
description="terrain height") description="terrain height")
@convert_units("height", "m") @convert_units("height", "m")
def get_terrain(wrfnc, timeidx=0, units="m", method="cat", squeeze=True, def get_terrain(wrfnc, timeidx=0, method="cat", squeeze=True,
cache=None): cache=None, meta=False, units="m"):
varname = either("HGT", "HGT_M")(wrfnc) varname = either("HGT", "HGT_M")(wrfnc)
return extract_vars(wrfnc, timeidx, varname, return extract_vars(wrfnc, timeidx, varname,
method, squeeze, cache, nometa=True)[varname] method, squeeze, cache, meta=False)[varname]

4
wrf_open/var/src/python/wrf/var/times.py

@ -5,5 +5,5 @@ from .util import extract_times
__all__ = ["get_times"] __all__ = ["get_times"]
def get_times(wrfnc,timeidx=0): def get_times(wrfnc, timeidx=0):
return extract_times(wrfnc,timeidx) return extract_times(wrfnc, timeidx)

40
wrf_open/var/src/python/wrf/var/util.py

@ -306,7 +306,7 @@ def extract_dim(wrfnc, dim):
return len(d) #netCDF4 return len(d) #netCDF4
return d # PyNIO return d # PyNIO
def _combine_dict(wrfdict, varname, timeidx, method, nometa): def _combine_dict(wrfdict, varname, timeidx, method, meta):
"""Dictionary combination creates a new left index for each key, then """Dictionary combination creates a new left index for each key, then
does a cat or join for the list of files for that key""" does a cat or join for the list of files for that key"""
keynames = [] keynames = []
@ -320,7 +320,7 @@ def _combine_dict(wrfdict, varname, timeidx, method, nometa):
first_array = _extract_var(wrfdict[first_key], varname, first_array = _extract_var(wrfdict[first_key], varname,
timeidx, is_moving=is_moving, method=method, timeidx, is_moving=is_moving, method=method,
squeeze=False, cache=None, nometa=nometa) squeeze=False, cache=None, meta=meta)
# Create the output data numpy array based on the first array # Create the output data numpy array based on the first array
@ -339,7 +339,7 @@ def _combine_dict(wrfdict, varname, timeidx, method, nometa):
keynames.append(key) keynames.append(key)
vardata = _extract_var(wrfdict[key], varname, timeidx, vardata = _extract_var(wrfdict[key], varname, timeidx,
is_moving=is_moving, method=method, is_moving=is_moving, method=method,
squeeze=False, cache=None, nometa=nometa) squeeze=False, cache=None, meta=meta)
if outdata.shape[1:] != vardata.shape: if outdata.shape[1:] != vardata.shape:
raise ValueError("data sequences must have the " raise ValueError("data sequences must have the "
@ -347,7 +347,7 @@ def _combine_dict(wrfdict, varname, timeidx, method, nometa):
outdata[idx,:] = npvalues(vardata)[:] outdata[idx,:] = npvalues(vardata)[:]
idx += 1 idx += 1
if xarray_enabled() and not nometa: if xarray_enabled() and meta:
outname = unicode(first_array.name) outname = unicode(first_array.name)
# Note: assumes that all entries in dict have same coords # Note: assumes that all entries in dict have same coords
outcoords = OrderedDict(first_array.coords) outcoords = OrderedDict(first_array.coords)
@ -364,7 +364,7 @@ def _combine_dict(wrfdict, varname, timeidx, method, nometa):
# TODO: implement in C # TODO: implement in C
# Note: is moving argument needed for dictionary combination # Note: is moving argument needed for dictionary combination
def _cat_files(wrfseq, varname, timeidx, is_moving, squeeze, nometa): def _cat_files(wrfseq, varname, timeidx, is_moving, squeeze, meta):
if is_moving is None: if is_moving is None:
is_moving = _is_moving_domain(wrfseq, varname) is_moving = _is_moving_domain(wrfseq, varname)
@ -377,7 +377,7 @@ def _cat_files(wrfseq, varname, timeidx, is_moving, squeeze, nometa):
# wrfseq might be a generator # wrfseq might be a generator
wrf_iter = iter(wrfseq) wrf_iter = iter(wrfseq)
if xarray_enabled() and not nometa: if xarray_enabled() and meta:
first_var = _build_data_array(next(wrf_iter), varname, first_var = _build_data_array(next(wrf_iter), varname,
timeidx, is_moving) timeidx, is_moving)
else: else:
@ -418,7 +418,7 @@ def _cat_files(wrfseq, varname, timeidx, is_moving, squeeze, nometa):
startidx = endidx startidx = endidx
if xarray_enabled() and not nometa: if xarray_enabled() and meta:
# FIXME: If it's a moving nest, then the coord arrays need to have same # FIXME: If it's a moving nest, then the coord arrays need to have same
# time indexes as the whole data set # time indexes as the whole data set
outname = unicode(first_var.name) outname = unicode(first_var.name)
@ -439,7 +439,7 @@ def _cat_files(wrfseq, varname, timeidx, is_moving, squeeze, nometa):
return outarr return outarr
# TODO: implement in C # TODO: implement in C
def _join_files(wrfseq, varname, timeidx, is_moving, nometa): def _join_files(wrfseq, varname, timeidx, is_moving, meta):
if is_moving is None: if is_moving is None:
is_moving = _is_moving_domain(wrfseq, varname) is_moving = _is_moving_domain(wrfseq, varname)
multitime = _is_multi_time_req(timeidx) multitime = _is_multi_time_req(timeidx)
@ -450,7 +450,7 @@ def _join_files(wrfseq, varname, timeidx, is_moving, nometa):
# wrfseq might be a generator # wrfseq might be a generator
wrf_iter = iter(wrfseq) wrf_iter = iter(wrfseq)
if xarray_enabled() and not nometa: if xarray_enabled() and meta:
first_var = _build_data_array(next(wrf_iter), varname, first_var = _build_data_array(next(wrf_iter), varname,
timeidx, is_moving) timeidx, is_moving)
else: else:
@ -478,7 +478,7 @@ def _join_files(wrfseq, varname, timeidx, is_moving, nometa):
outdata[idx,:] = outvar[:] outdata[idx,:] = outvar[:]
idx += 1 idx += 1
if xarray_enabled() and not nometa: if xarray_enabled() and meta:
outname = unicode(first_var.name) outname = unicode(first_var.name)
outcoords = OrderedDict(first_var.coords) outcoords = OrderedDict(first_var.coords)
outattrs = OrderedDict(first_var.attrs) outattrs = OrderedDict(first_var.attrs)
@ -495,19 +495,19 @@ def _join_files(wrfseq, varname, timeidx, is_moving, nometa):
return outarr return outarr
def combine_files(wrfseq, varname, timeidx, is_moving=None, def combine_files(wrfseq, varname, timeidx, is_moving=None,
method="cat", squeeze=True, nometa=False): method="cat", squeeze=True, meta=True):
# Handles generators, single files, lists, tuples, custom classes # Handles generators, single files, lists, tuples, custom classes
wrfseq = _unpack_sequence(wrfseq) wrfseq = _unpack_sequence(wrfseq)
# Dictionary is unique # Dictionary is unique
if _is_mapping(wrfseq): if _is_mapping(wrfseq):
outarr = _combine_dict(wrfseq, varname, timeidx, method, nometa) outarr = _combine_dict(wrfseq, varname, timeidx, method, meta)
elif method.lower() == "cat": elif method.lower() == "cat":
outarr = _cat_files(wrfseq, varname, timeidx, is_moving, outarr = _cat_files(wrfseq, varname, timeidx, is_moving,
squeeze, nometa) squeeze, meta)
elif method.lower() == "join": elif method.lower() == "join":
outarr = _join_files(wrfseq, varname, timeidx, is_moving, nometa) outarr = _join_files(wrfseq, varname, timeidx, is_moving, meta)
else: else:
raise ValueError("method must be 'cat' or 'join'") raise ValueError("method must be 'cat' or 'join'")
@ -606,7 +606,7 @@ def _build_data_array(wrfnc, varname, timeidx, is_moving_domain):
# Cache is a dictionary of already extracted variables # Cache is a dictionary of already extracted variables
def _extract_var(wrfnc, varname, timeidx, is_moving, def _extract_var(wrfnc, varname, timeidx, is_moving,
method, squeeze, cache, nometa): method, squeeze, cache, meta):
# Mainly used internally so variables don't get extracted multiple times, # Mainly used internally so variables don't get extracted multiple times,
# particularly to copy metadata. This can be slow. # particularly to copy metadata. This can be slow.
if cache is not None: if cache is not None:
@ -615,7 +615,7 @@ def _extract_var(wrfnc, varname, timeidx, is_moving,
except KeyError: except KeyError:
pass pass
else: else:
if nometa: if not meta:
if isinstance(cache_var, DataArray): if isinstance(cache_var, DataArray):
return cache_var.values return cache_var.values
@ -625,7 +625,7 @@ def _extract_var(wrfnc, varname, timeidx, is_moving,
multifile = _is_multi_file(wrfnc) multifile = _is_multi_file(wrfnc)
if not multifile: if not multifile:
if xarray_enabled() and not nometa: if xarray_enabled() and meta:
if is_moving is None: if is_moving is None:
is_moving = _is_moving_domain(wrfnc, varname) is_moving = _is_moving_domain(wrfnc, varname)
result = _build_data_array(wrfnc, varname, timeidx, is_moving) result = _build_data_array(wrfnc, varname, timeidx, is_moving)
@ -638,20 +638,20 @@ def _extract_var(wrfnc, varname, timeidx, is_moving,
else: else:
# Squeeze handled in this routine, so just return it # Squeeze handled in this routine, so just return it
return combine_files(wrfnc, varname, timeidx, is_moving, return combine_files(wrfnc, varname, timeidx, is_moving,
method, squeeze, nometa) method, squeeze, meta)
return result.squeeze() if squeeze else result return result.squeeze() if squeeze else result
def extract_vars(wrfnc, timeidx, varnames, method="cat", squeeze=True, def extract_vars(wrfnc, timeidx, varnames, method="cat", squeeze=True,
cache=None, nometa=False): cache=None, meta=True):
if isstr(varnames): if isstr(varnames):
varlist = [varnames] varlist = [varnames]
else: else:
varlist = varnames varlist = varnames
return {var:_extract_var(wrfnc, var, timeidx, None, return {var:_extract_var(wrfnc, var, timeidx, None,
method, squeeze, cache, nometa) method, squeeze, cache, meta)
for var in varlist} for var in varlist}
def _make_time(timearr): def _make_time(timearr):

49
wrf_open/var/src/python/wrf/var/uvmet.py

@ -18,31 +18,32 @@ __all__=["get_uvmet", "get_uvmet10", "get_uvmet_wspd_wdir",
@convert_units("wind", "mps") @convert_units("wind", "mps")
def _get_uvmet(wrfnc, timeidx=0, ten_m=False, units ="mps", def _get_uvmet(wrfnc, timeidx=0, method="cat", squeeze=True,
method="cat", squeeze=True, cache=None): cache=None, meta=True,
ten_m=False, units ="mps"):
""" Return a tuple of u,v with the winds rotated in to earth space""" """ Return a tuple of u,v with the winds rotated in to earth space"""
if not ten_m: if not ten_m:
varname = either("U", "UU")(wrfnc) varname = either("U", "UU")(wrfnc)
u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache, u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True) meta=False)
u = destagger(u_vars[varname], -1) u = destagger(u_vars[varname], -1)
varname = either("V", "VV")(wrfnc) varname = either("V", "VV")(wrfnc)
v_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache, v_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True) meta=False)
v = destagger(v_vars[varname], -2) v = destagger(v_vars[varname], -2)
else: else:
varname = either("U10", "UU")(wrfnc) varname = either("U10", "UU")(wrfnc)
u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache, u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True) meta=False)
u = (u_vars[varname] if varname == "U10" else u = (u_vars[varname] if varname == "U10" else
destagger(u_vars[varname][...,0,:,:], -1)) destagger(u_vars[varname][...,0,:,:], -1))
varname = either("V10", "VV")(wrfnc) varname = either("V10", "VV")(wrfnc)
v_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache, v_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True) meta=False)
v = (v_vars[varname] if varname == "V10" else v = (v_vars[varname] if varname == "V10" else
destagger(v_vars[varname][...,0,:,:], -2)) destagger(v_vars[varname][...,0,:,:], -2))
@ -98,12 +99,12 @@ def _get_uvmet(wrfnc, timeidx=0, ten_m=False, units ="mps",
varname = either("XLAT_M", "XLAT")(wrfnc) varname = either("XLAT_M", "XLAT")(wrfnc)
xlat_var = extract_vars(wrfnc, timeidx, varname, xlat_var = extract_vars(wrfnc, timeidx, varname,
method, squeeze, cache, nometa=True) method, squeeze, cache, meta=False)
lat = xlat_var[varname] lat = xlat_var[varname]
varname = either("XLONG_M", "XLONG")(wrfnc) varname = either("XLONG_M", "XLONG")(wrfnc)
xlon_var = extract_vars(wrfnc, timeidx, varname, xlon_var = extract_vars(wrfnc, timeidx, varname,
method, squeeze, cache, nometa=True) method, squeeze, cache, meta=False)
lon = xlon_var[varname] lon = xlon_var[varname]
if map_proj == 1: if map_proj == 1:
@ -129,10 +130,12 @@ def _get_uvmet(wrfnc, timeidx=0, ten_m=False, units ="mps",
description="earth rotated u,v", description="earth rotated u,v",
two_d=False, two_d=False,
wspd_wdir=False) wspd_wdir=False)
def get_uvmet(wrfnc, timeidx=0, units="mps", def get_uvmet(wrfnc, timeidx=0, method="cat", squeeze=True,
method="cat", squeeze=True, cache=None): cache=None, meta=True,
units="mps"):
return _get_uvmet(wrfnc, timeidx, False, units, method, squeeze, cache) return _get_uvmet(wrfnc, timeidx, method, squeeze, cache, meta,
False, units)
@set_wind_metadata(copy_varname=either("PSFC", "F"), @set_wind_metadata(copy_varname=either("PSFC", "F"),
@ -140,10 +143,12 @@ def get_uvmet(wrfnc, timeidx=0, units="mps",
description="10m earth rotated u,v", description="10m earth rotated u,v",
two_d=True, two_d=True,
wspd_wdir=False) wspd_wdir=False)
def get_uvmet10(wrfnc, timeidx=0, units="mps", def get_uvmet10(wrfnc, timeidx=0, method="cat", squeeze=True,
method="cat", squeeze=True, cache=None): cache=None, meta=True,
units="mps"):
return _get_uvmet(wrfnc, timeidx, True, units, method, squeeze, cache) return _get_uvmet(wrfnc, timeidx, method, squeeze, cache, meta,
True, units)
@set_wind_metadata(copy_varname=either("P", "PRES"), @set_wind_metadata(copy_varname=either("P", "PRES"),
@ -151,10 +156,12 @@ def get_uvmet10(wrfnc, timeidx=0, units="mps",
description="earth rotated wspd,wdir", description="earth rotated wspd,wdir",
two_d=False, two_d=False,
wspd_wdir=True) wspd_wdir=True)
def get_uvmet_wspd_wdir(wrfnc, timeidx=0, units="mps", def get_uvmet_wspd_wdir(wrfnc, timeidx=0, method="cat", squeeze=True,
method="cat", squeeze=True, cache=None): cache=None, meta=True,
units="mps"):
uvmet = _get_uvmet(wrfnc, timeidx, False, units, method, squeeze, cache) uvmet = _get_uvmet(wrfnc, timeidx, False, units, method, squeeze, cache,
meta)
return _calc_wspd_wdir(uvmet[...,0,:,:,:], uvmet[...,1,:,:,:], False, units) return _calc_wspd_wdir(uvmet[...,0,:,:,:], uvmet[...,1,:,:,:], False, units)
@ -164,10 +171,12 @@ def get_uvmet_wspd_wdir(wrfnc, timeidx=0, units="mps",
description="10m earth rotated wspd,wdir", description="10m earth rotated wspd,wdir",
two_d=True, two_d=True,
wspd_wdir=True) wspd_wdir=True)
def get_uvmet10_wspd_wdir(wrfnc, timeidx=0, units="mps", def get_uvmet10_wspd_wdir(wrfnc, timeidx=0, method="cat", squeeze=True,
method="cat", squeeze=True, cache=None): cache=None, meta=True,
units="mps"):
uvmet10 = _get_uvmet(wrfnc, timeidx, True, units, method, squeeze, cache) uvmet10 = _get_uvmet(wrfnc, timeidx, method, squeeze, cache, meta,
True, units)
return _calc_wspd_wdir(uvmet10[...,0,:,:], uvmet10[...,1,:,:], True, units) return _calc_wspd_wdir(uvmet10[...,0,:,:], uvmet10[...,1,:,:], True, units)

10
wrf_open/var/src/python/wrf/var/vorticity.py

@ -10,11 +10,12 @@ __all__ = ["get_avo", "get_pvo"]
@copy_and_set_metadata(copy_varname="T", name="avo", @copy_and_set_metadata(copy_varname="T", name="avo",
description="absolute vorticity", description="absolute vorticity",
units="10-5 s-1") units="10-5 s-1")
def get_avo(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None): def get_avo(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None,
meta=True):
ncvars = extract_vars(wrfnc, timeidx, ("U", "V", "MAPFAC_U", ncvars = extract_vars(wrfnc, timeidx, ("U", "V", "MAPFAC_U",
"MAPFAC_V", "MAPFAC_M", "MAPFAC_V", "MAPFAC_M",
"F"), "F"),
method, squeeze, cache, nometa=True) method, squeeze, cache, meta=False)
attrs = extract_global_attrs(wrfnc, attrs=("DX", "DY")) attrs = extract_global_attrs(wrfnc, attrs=("DX", "DY"))
u = ncvars["U"] u = ncvars["U"]
@ -33,12 +34,13 @@ def get_avo(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None):
@copy_and_set_metadata(copy_varname="T", name="pvo", @copy_and_set_metadata(copy_varname="T", name="pvo",
description="potential vorticity", description="potential vorticity",
units="PVU") units="PVU")
def get_pvo(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None): def get_pvo(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None,
meta=True):
ncvars = extract_vars(wrfnc, timeidx, ("U", "V", "T", "P", ncvars = extract_vars(wrfnc, timeidx, ("U", "V", "T", "P",
"PB", "MAPFAC_U", "PB", "MAPFAC_U",
"MAPFAC_V", "MAPFAC_M", "MAPFAC_V", "MAPFAC_M",
"F"), "F"),
method, squeeze, cache, nometa=True) method, squeeze, cache, meta=False)
attrs = extract_global_attrs(wrfnc, attrs=("DX", "DY")) attrs = extract_global_attrs(wrfnc, attrs=("DX", "DY"))
u = ncvars["U"] u = ncvars["U"]

47
wrf_open/var/src/python/wrf/var/wind.py

@ -12,14 +12,17 @@ from .metadecorators import 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_wdir10"] "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 np.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 - np.arctan2(v,u) * (180.0/Constants.PI) wdir = 270.0 - np.arctan2(v,u) * (180.0/Constants.PI)
return np.remainder(wdir, 360.0) return np.remainder(wdir, 360.0)
def _calc_wspd_wdir(u, v, two_d, units): def _calc_wspd_wdir(u, v, two_d, units):
wspd = _calc_wspd(u, v, units) wspd = _calc_wspd(u, v, units)
wdir = _calc_wdir(u, v) wdir = _calc_wdir(u, v)
@ -43,6 +46,7 @@ def _calc_wspd_wdir(u, v, two_d, units):
return res return res
@set_wind_metadata(copy_varname=either("P", "PRES"), @set_wind_metadata(copy_varname=either("P", "PRES"),
name="ua", name="ua",
description="destaggered u-wind component", description="destaggered u-wind component",
@ -50,15 +54,17 @@ def _calc_wspd_wdir(u, v, two_d, units):
two_d=False, two_d=False,
wspd_wdir=False) 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, method="cat", squeeze=True,
method="cat", squeeze=True, cache=None): cache=None, meta=True,
units="mps"):
varname = either("U", "UU")(wrfnc) varname = either("U", "UU")(wrfnc)
u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache, u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True) meta=False)
u = destagger(u_vars[varname], -1) u = destagger(u_vars[varname], -1)
return u return u
@set_wind_metadata(copy_varname=either("P", "PRES"), @set_wind_metadata(copy_varname=either("P", "PRES"),
name="va", name="va",
description="destaggered v-wind component", description="destaggered v-wind component",
@ -66,14 +72,16 @@ def get_u_destag(wrfnc, timeidx=0, units="mps",
wind_ncvar=True, wind_ncvar=True,
wspd_wdir=False) 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, method="cat", squeeze=True,
method="cat", squeeze=True, cache=None): cache=None, meta=True,
units="mps"):
varname = either("V", "VV")(wrfnc) varname = either("V", "VV")(wrfnc)
v_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache, v_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True) meta=False)
v = destagger(v_vars[varname], -2) v = destagger(v_vars[varname], -2)
return v return v
@set_wind_metadata(copy_varname=either("P", "PRES"), @set_wind_metadata(copy_varname=either("P", "PRES"),
name="wa", name="wa",
description="destaggered w-wind component", description="destaggered w-wind component",
@ -81,49 +89,54 @@ def get_v_destag(wrfnc, timeidx=0, units="mps",
wind_ncvar=True, wind_ncvar=True,
wspd_wdir=False) 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, method="cat", squeeze=True,
method="cat", squeeze=True, cache=None): cache=None, meta=True,
units="mps"):
w_vars = extract_vars(wrfnc, timeidx, "W", method, squeeze, cache, w_vars = extract_vars(wrfnc, timeidx, "W", method, squeeze, cache,
nometa=True) meta=False)
w = destagger(w_vars["W"], -3) w = destagger(w_vars["W"], -3)
return w return w
@set_wind_metadata(copy_varname=either("P", "PRES"), @set_wind_metadata(copy_varname=either("P", "PRES"),
name="wspd_wdir", name="wspd_wdir",
description="wspd,wdir in projection space", description="wspd,wdir in projection space",
two_d=False, two_d=False,
wspd_wdir=True) wspd_wdir=True)
def get_destag_wspd_wdir(wrfnc, timeidx=0, units="mps", def get_destag_wspd_wdir(wrfnc, timeidx=0, method="cat",
method="cat", squeeze=True, cache=None): squeeze=True, cache=None, meta=True,
units="mps"):
varname = either("U", "UU")(wrfnc) varname = either("U", "UU")(wrfnc)
u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache, u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True) meta=False)
u = destagger(u_vars[varname], -1) u = destagger(u_vars[varname], -1)
varname = either("V", "VV")(wrfnc) varname = either("V", "VV")(wrfnc)
v_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache, v_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True) meta=False)
v = destagger(v_vars[varname], -2) v = destagger(v_vars[varname], -2)
return _calc_wspd_wdir(u, v, False, units) return _calc_wspd_wdir(u, v, False, units)
@set_wind_metadata(copy_varname=either("PSFC", "F"), @set_wind_metadata(copy_varname=either("PSFC", "F"),
name="wspd_wdir10", name="wspd_wdir10",
description="10m wspd,wdir in projection space", description="10m wspd,wdir in projection space",
two_d=False, two_d=False,
wspd_wdir=True) wspd_wdir=True)
def get_destag_wspd_wdir10(wrfnc, timeidx=0, units="mps", def get_destag_wspd_wdir10(wrfnc, timeidx=0, method="cat",
method="cat", squeeze=True, cache=None): squeeze=True, cache=None, meta=True,
units="mps"):
varname = either("U10", "UU")(wrfnc) varname = either("U10", "UU")(wrfnc)
u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache, u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True) meta=False)
u = (u_vars[varname] if varname == "U10" else u = (u_vars[varname] if varname == "U10" else
destagger(u_vars[varname][...,0,:,:], -1)) destagger(u_vars[varname][...,0,:,:], -1))
varname = either("V10", "VV")(wrfnc) varname = either("V10", "VV")(wrfnc)
v_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache, v_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True) meta=False)
v = (v_vars[varname] if varname == "V10" else v = (v_vars[varname] if varname == "V10" else
destagger(v_vars[varname][...,0,:,:], -2)) destagger(v_vars[varname][...,0,:,:], -2))

Loading…
Cancel
Save