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. 40
      wrf_open/var/src/python/wrf/var/util.py
  22. 49
      wrf_open/var/src/python/wrf/var/uvmet.py
  23. 10
      wrf_open/var/src/python/wrf/var/vorticity.py
  24. 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"] @@ -20,12 +20,13 @@ __all__ = ["get_2dcape", "get_3dcape"]
description="mcape ; mcin ; lcl ; lfc",
units="J/kg ; J/kg ; m ; m",
MemoryOrder="XY")
def get_2dcape(wrfnc, timeidx=0, missing=Constants.DEFAULT_FILL,
method="cat", squeeze=True, cache=None):
def get_2dcape(wrfnc, timeidx=0, method="cat",
squeeze=True, cache=None, meta=True,
missing=Constants.DEFAULT_FILL):
"""Return the 2d fields of cape, cin, lcl, and lfc"""
varnames = ("T", "P", "PB", "QVAPOR", "PH","PHB", "HGT", "PSFC")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True)
meta=False)
t = ncvars["T"]
p = ncvars["P"]
@ -82,12 +83,13 @@ def get_2dcape(wrfnc, timeidx=0, missing=Constants.DEFAULT_FILL, @@ -82,12 +83,13 @@ def get_2dcape(wrfnc, timeidx=0, missing=Constants.DEFAULT_FILL,
description="cape ; cin",
units="J kg-1 ; J kg-1",
MemoryOrder="XY")
def get_3dcape(wrfnc, timeidx=0, missing=Constants.DEFAULT_FILL,
method="cat", squeeze=True, cache=None):
def get_3dcape(wrfnc, timeidx=0, method="cat",
squeeze=True, cache=None, meta=True,
missing=Constants.DEFAULT_FILL):
"""Return the 3d fields of cape and cin"""
varnames = ("T", "P", "PB", "QVAPOR", "PH", "PHB", "HGT", "PSFC")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True)
meta=False)
t = ncvars["T"]
p = ncvars["P"]
pb = ncvars["PB"]

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

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

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

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

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

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

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

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

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

@ -9,8 +9,9 @@ from .util import extract_vars, either @@ -9,8 +9,9 @@ from .util import extract_vars, either
__all__ = ["get_geopt", "get_height"]
def _get_geoht(wrfnc, timeidx, height=True, msl=True,
method="cat", squeeze=True, cache=None):
def _get_geoht(wrfnc, timeidx, method="cat", squeeze=True,
cache=None, meta=True,
height=True, msl=True):
"""Return the geopotential in units of m2 s-2 if height is False,
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
@ -21,7 +22,7 @@ def _get_geoht(wrfnc, timeidx, height=True, msl=True, @@ -21,7 +22,7 @@ def _get_geoht(wrfnc, timeidx, height=True, msl=True,
varname = either("PH", "GHT")(wrfnc)
if varname == "PH":
ph_vars = extract_vars(wrfnc, timeidx, ("PH", "PHB", "HGT"),
method, squeeze, cache, nometa=True)
method, squeeze, cache, meta=False)
ph = ph_vars["PH"]
phb = ph_vars["PHB"]
hgt = ph_vars["HGT"]
@ -29,7 +30,7 @@ def _get_geoht(wrfnc, timeidx, height=True, msl=True, @@ -29,7 +30,7 @@ def _get_geoht(wrfnc, timeidx, height=True, msl=True,
geopt_unstag = destagger(geopt, -3)
else:
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
hgt = ght_vars["HGT_M"]
@ -48,14 +49,19 @@ def _get_geoht(wrfnc, timeidx, height=True, msl=True, @@ -48,14 +49,19 @@ def _get_geoht(wrfnc, timeidx, height=True, msl=True,
else:
return geopt_unstag
@set_height_metadata(geopt=True)
def get_geopt(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None):
return _get_geoht(wrfnc, timeidx, False, True, method, squeeze, cache)
def get_geopt(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None,
meta=True):
return _get_geoht(wrfnc, timeidx, method, squeeze, cache, meta,
False, True,)
@set_height_metadata(geopt=False)
@convert_units("height", "m")
def get_height(wrfnc, timeidx=0, msl=True, units="m",
method="cat", squeeze=True, cache=None):
def get_height(wrfnc, timeidx=0, method="cat", squeeze=True,
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"] @@ -13,12 +13,13 @@ __all__ = ["get_srh", "get_uh"]
@copy_and_set_metadata(copy_varname="HGT", name="srh",
description="storm relative helicity",
units="m-2/s-2")
def get_srh(wrfnc, timeidx=0, top=3000.0,
method="cat", squeeze=True, cache=None):
def get_srh(wrfnc, timeidx=0, method="cat", squeeze=True,
cache=None, meta=True,
top=3000.0):
# Top can either be 3000 or 1000 (for 0-1 srh or 0-3 srh)
ncvars = extract_vars(wrfnc, timeidx, ("HGT", "PH", "PHB"),
method, squeeze, cache, nometa=True)
method, squeeze, cache, meta=False)
ter = ncvars["HGT"]
ph = ncvars["PH"]
@ -27,12 +28,12 @@ def get_srh(wrfnc, timeidx=0, top=3000.0, @@ -27,12 +28,12 @@ def get_srh(wrfnc, timeidx=0, top=3000.0,
# As coded in NCL, but not sure this is possible
varname = either("U", "UU")(wrfnc)
u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True)
meta=False)
u = destagger(u_vars[varname], -1)
varname = either("V", "VV")(wrfnc)
v_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True)
meta=False)
v = destagger(v_vars[varname], -2)
geopt = ph + phb
@ -52,8 +53,9 @@ def get_srh(wrfnc, timeidx=0, top=3000.0, @@ -52,8 +53,9 @@ def get_srh(wrfnc, timeidx=0, top=3000.0,
@copy_and_set_metadata(copy_varname="MAPFAC_M", name="updraft_helicity",
description="updraft helicity",
units="m-2/s-2")
def get_uh(wrfnc, timeidx=0, bottom=2000.0, top=5000.0,
method="cat", squeeze=True, cache=None):
def get_uh(wrfnc, timeidx=0, method="cat", squeeze=True,
cache=None, meta=True,
bottom=2000.0, top=5000.0):
ncvars = extract_vars(wrfnc, timeidx, ("W", "PH", "PHB", "MAPFAC_M"),
method, squeeze, cache)
@ -70,12 +72,12 @@ def get_uh(wrfnc, timeidx=0, bottom=2000.0, top=5000.0, @@ -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
varname = either("U", "UU")(wrfnc)
u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True)
meta=False)
u = destagger(u_vars[varname], -1)
varname = either("V", "VV")(wrfnc)
v_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True)
meta=False)
v = destagger(v_vars[varname], -2)
zp = ph + phb

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

@ -21,7 +21,8 @@ __all__ = ["interplevel", "vertcross", "interpline", "vinterp"] @@ -21,7 +21,8 @@ __all__ = ["interplevel", "vertcross", "interpline", "vinterp"]
# Note: Extension decorator is good enough to handle left dims
@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
field3d - the 3D field to interpolate
@ -40,7 +41,7 @@ def interplevel(field3d, z, desiredloc, missingval=Constants.DEFAULT_FILL): @@ -40,7 +41,7 @@ def interplevel(field3d, z, desiredloc, missingval=Constants.DEFAULT_FILL):
def vertcross(field3d, z, missingval=Constants.DEFAULT_FILL,
pivot_point=None, angle=None,
start_point=None, end_point=None,
cache=None):
cache=None, meta=True):
"""Return the vertical cross section for a 3D field, interpolated
to a verical plane defined by a horizontal line.
@ -71,7 +72,7 @@ def vertcross(field3d, z, missingval=Constants.DEFAULT_FILL, @@ -71,7 +72,7 @@ def vertcross(field3d, z, missingval=Constants.DEFAULT_FILL,
@set_interp_metadata("line")
def interpline(field2d, pivot_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.
Arguments:
@ -94,7 +95,7 @@ def interpline(field2d, pivot_point=None, @@ -94,7 +95,7 @@ def interpline(field2d, pivot_point=None,
@set_interp_metadata("vinterp")
def vinterp(wrfnc, field, vert_coord, interp_levels, extrapolate=False,
field_type=None, log_p=False, timeidx=-1, method="cat",
squeeze=True, cache=None):
squeeze=True, cache=None, meta=True):
# Remove case sensitivity
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"
@ -154,7 +155,7 @@ def vinterp(wrfnc, field, vert_coord, interp_levels, extrapolate=False, @@ -154,7 +155,7 @@ def vinterp(wrfnc, field, vert_coord, interp_levels, extrapolate=False,
# Extract vriables
#timeidx = -1 # Should this be an argument?
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
qv = ncvars["QVAPOR"]
@ -236,17 +237,17 @@ def vinterp(wrfnc, field, vert_coord, interp_levels, extrapolate=False, @@ -236,17 +237,17 @@ def vinterp(wrfnc, field, vert_coord, interp_levels, extrapolate=False,
# Move to the new routines module
# TODO: Rename after the extensions are renamed
@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)
@set_interp_metadata("2dxy")
def wrap_interp2dxy(field3d, xy):
def wrap_interp2dxy(field3d, xy, meta=True):
return interp2dxy(field3d, xy)
@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)

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, @@ -158,7 +158,8 @@ def get_xy_z_params(z, pivot_point=None, angle=None,
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:
pos_pivot = to_positive_idxs(var.shape[-2:], pivot_point)
else:

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

@ -9,36 +9,38 @@ from .metadecorators import set_latlon_metadata @@ -9,36 +9,38 @@ from .metadecorators import set_latlon_metadata
__all__ = ["get_lat", "get_lon", "get_ij", "get_ll"]
def get_lat(wrfnc, timeidx=0, stagger=None,
method="cat", squeeze=True, cache=None):
def get_lat(wrfnc, timeidx=0, method="cat", squeeze=True,
cache=None, meta=True,
stagger=None):
varname = _lat_varname(wrfnc, stagger)
lat_var = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=False)
meta)
return lat_var[varname]
def get_lon(wrfnc, timeidx=0, stagger=None,
method="cat", squeeze=True, cache=None):
def get_lon(wrfnc, timeidx=0, method="cat", squeeze=True,
cache=None, meta=True,
stagger=None):
varname = _lon_varname(wrfnc, stagger)
lon_var = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=False)
meta)
return lon_var[varname]
@set_latlon_metadata(ij=True)
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,
method, squeeze, cache)
@set_latlon_metadata(ij=False)
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,
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): @@ -80,9 +80,9 @@ def _get_proj_params(wrfnc, timeidx, stagger, method, squeeze, cache):
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,
nometa=True)[lonvar]
meta=False)[lonvar]
ref_lat = np.ravel(xlat[...,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, @@ -33,12 +33,18 @@ def copy_and_set_metadata(copy_varname=None, delete_attrs=None, name=None,
"""
@wrapt.decorator
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)
argvars = from_args(wrapped, ("wrfnc", "timeidx", "method",
"squeeze", "cache", "units"),
"squeeze", "cache", "units", "meta"),
*args, **kwargs)
wrfnc = argvars["wrfnc"]
timeidx = argvars["timeidx"]
units = argvars["units"]
@ -62,7 +68,7 @@ def copy_and_set_metadata(copy_varname=None, delete_attrs=None, name=None, @@ -62,7 +68,7 @@ def copy_and_set_metadata(copy_varname=None, delete_attrs=None, name=None,
if var_to_copy is None:
var_to_copy = extract_vars(wrfnc, timeidx, (_copy_varname,),
method, squeeze, cache,
nometa=False)[_copy_varname]
meta=True)[_copy_varname]
# Make a copy so we don't modify a user supplied cache
new_cache = dict(cache)
@ -136,7 +142,12 @@ def set_wind_metadata(copy_varname, name, description, @@ -136,7 +142,12 @@ def set_wind_metadata(copy_varname, name, description,
two_d=False, wspd_wdir=False):
@wrapt.decorator
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)
argvars = from_args(wrapped, ("wrfnc", "timeidx", "units",
@ -159,7 +170,7 @@ def set_wind_metadata(copy_varname, name, description, @@ -159,7 +170,7 @@ def set_wind_metadata(copy_varname, name, description,
copy_var = extract_vars(wrfnc, timeidx, _copy_varname,
method, squeeze, cache,
nometa=False)[_copy_varname]
meta=True)[_copy_varname]
# Make a copy so we don't modify a user supplied cache
new_cache = dict(cache)
@ -213,7 +224,12 @@ def set_latlon_metadata(ij=False): @@ -213,7 +224,12 @@ def set_latlon_metadata(ij=False):
@wrapt.decorator
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)
res = wrapped(*args, **kwargs)
@ -264,7 +280,12 @@ def set_latlon_metadata(ij=False): @@ -264,7 +280,12 @@ def set_latlon_metadata(ij=False):
def set_height_metadata(geopt=False):
@wrapt.decorator
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)
argvars = from_args(wrapped, ("wrfnc", "timeidx", "method",
@ -285,7 +306,7 @@ def set_height_metadata(geopt=False): @@ -285,7 +306,7 @@ def set_height_metadata(geopt=False):
# pressure (which has the same dims as destaggered height)
ht_metadata_varname = either("P", "GHT")(wrfnc)
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]
# Make a copy so we don't modify a user supplied cache
@ -695,12 +716,15 @@ def _set_1d_meta(wrapped, instance, args, kwargs): @@ -695,12 +716,15 @@ def _set_1d_meta(wrapped, instance, args, kwargs):
coords=outcoords, attrs=outattrs)
def set_interp_metadata(interp_type):
@wrapt.decorator
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)
if interp_type == "horiz":
@ -715,4 +739,5 @@ def set_interp_metadata(interp_type): @@ -715,4 +739,5 @@ def set_interp_metadata(interp_type):
return _set_2dxy_meta(wrapped, instance, args, kwargs)
elif interp_type == "1d":
return _set_1d_meta(wrapped, instance, args, kwargs)
return func_wrapper

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

@ -12,10 +12,11 @@ __all__ = ["get_omega"] @@ -12,10 +12,11 @@ __all__ = ["get_omega"]
@copy_and_set_metadata(copy_varname="T", name="omega",
description="omega",
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")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True)
meta=False)
t = ncvars["T"]
p = ncvars["P"]
w = ncvars["W"]

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

@ -10,25 +10,27 @@ __all__ = ["get_pressure", "get_pressure_hpa"] @@ -10,25 +10,27 @@ __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",
method="cat", squeeze=True, cache=None):
def get_pressure(wrfnc, timeidx=0, method="cat", squeeze=True,
cache=None, meta=True,
units="pa"):
varname = either("P", "PRES")(wrfnc)
if varname == "P":
p_vars = extract_vars(wrfnc, timeidx, ("P", "PB"),
method, squeeze, cache, nometa=True)
method, squeeze, cache, meta=False)
p = p_vars["P"]
pb = p_vars["PB"]
pres = p + pb
else:
pres = extract_vars(wrfnc, timeidx, "PRES",
method, squeeze, cache, nometa=True)["PRES"]
method, squeeze, cache, meta=False)["PRES"]
return pres
def get_pressure_hpa(wrfnc, timeidx=0, units="hpa",
method="cat", squeeze=True, cache=None):
return get_pressure(wrfnc, timeidx, units, method, squeeze, cache)
def get_pressure_hpa(wrfnc, timeidx=0, method="cat", squeeze=True,
cache=None, meta=True,
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"] @@ -13,10 +13,11 @@ __all__ = ["get_pw"]
description="precipitable water",
MemoryOrder="XY",
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")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True)
meta=False)
t = ncvars["T"]
p = ncvars["P"]

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

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

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

@ -150,17 +150,19 @@ def _check_kargs(var, kargs): @@ -150,17 +150,19 @@ def _check_kargs(var, kargs):
def getvar(wrfnc, var, timeidx=0,
method="cat", squeeze=True, cache=None,
method="cat", squeeze=True, cache=None, meta=True,
**kargs):
wrfnc = _unpack_sequence(wrfnc)
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)
if actual_var not in _VALID_KARGS:
raise ArgumentError("'%s' is not a valid variable name" % (var))
_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"] @@ -15,11 +15,12 @@ __all__ = ["get_slp"]
description="sea level pressure",
MemoryOrder="XY")
@convert_units("pressure", "hpa")
def get_slp(wrfnc, timeidx=0, units="hpa",
method="cat", squeeze=True, cache=None):
def get_slp(wrfnc, timeidx=0, method="cat", squeeze=True,
cache=None, meta=True,
units="hpa"):
varnames=("T", "P", "PB", "QVAPOR", "PH", "PHB")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True)
meta=False)
t = ncvars["T"]
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", @@ -13,12 +13,13 @@ __all__ = ["get_theta", "get_temp", "get_eth", "get_tv", "get_tw",
@copy_and_set_metadata(copy_varname="T", name="theta",
description="potential temperature")
@convert_units("temp", "k")
def get_theta(wrfnc, timeidx=0, units="k",
method="cat", squeeze=True, cache=None):
def get_theta(wrfnc, timeidx=0, method="cat", squeeze=True,
cache=None, meta=True,
units="k"):
varnames = ("T",)
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True)
meta=False)
t = ncvars["T"]
full_t = t + Constants.T_BASE
@ -27,13 +28,14 @@ def get_theta(wrfnc, timeidx=0, units="k", @@ -27,13 +28,14 @@ def get_theta(wrfnc, timeidx=0, units="k",
@copy_and_set_metadata(copy_varname="T", name="temp",
description="temperature")
@convert_units("temp", "k")
def get_temp(wrfnc, timeidx=0, units="k", method="cat", squeeze=True,
cache=None):
def get_temp(wrfnc, timeidx=0, method="cat", squeeze=True,
cache=None, meta=True,
units="k"):
"""Return the temperature in Kelvin or Celsius"""
varnames=("T", "P", "PB")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True)
meta=False)
t = ncvars["T"]
p = ncvars["P"]
pb = ncvars["PB"]
@ -47,13 +49,14 @@ def get_temp(wrfnc, timeidx=0, units="k", method="cat", squeeze=True, @@ -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",
description="equivalent potential temperature")
@convert_units("temp", "k")
def get_eth(wrfnc, timeidx=0, units="k", method="cat", squeeze=True,
cache=None):
def get_eth(wrfnc, timeidx=0, method="cat", squeeze=True,
cache=None, meta=True,
units="k"):
"Return equivalent potential temperature (Theta-e) in Kelvin"
varnames=("T", "P", "PB", "QVAPOR")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True)
meta=False)
t = ncvars["T"]
p = ncvars["P"]
pb = ncvars["PB"]
@ -70,13 +73,14 @@ def get_eth(wrfnc, timeidx=0, units="k", method="cat", squeeze=True, @@ -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",
description="virtual temperature")
@convert_units("temp", "k")
def get_tv(wrfnc, timeidx=0, units="k", method="cat", squeeze=True,
cache=None):
def get_tv(wrfnc, timeidx=0, method="cat", squeeze=True,
cache=None, meta=True,
units="k"):
"Return the virtual temperature (tv) in Kelvin or Celsius"
varnames=("T", "P", "PB", "QVAPOR")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True)
meta=False)
t = ncvars["T"]
p = ncvars["P"]
@ -94,13 +98,14 @@ def get_tv(wrfnc, timeidx=0, units="k", method="cat", squeeze=True, @@ -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",
description="wetbulb temperature")
@convert_units("temp", "k")
def get_tw(wrfnc, timeidx=0, units="k", method="cat", squeeze=True,
cache=None):
def get_tw(wrfnc, timeidx=0, method="cat", squeeze=True,
cache=None, meta=True,
units="k"):
"Return the wetbulb temperature (tw)"
varnames=("T", "P", "PB", "QVAPOR")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze, cache,
nometa=True)
meta=False)
t = ncvars["T"]
p = ncvars["P"]
pb = ncvars["PB"]
@ -114,13 +119,13 @@ def get_tw(wrfnc, timeidx=0, units="k", method="cat", squeeze=True, @@ -114,13 +119,13 @@ def get_tw(wrfnc, timeidx=0, units="k", method="cat", squeeze=True,
return tw
def get_tk(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None):
return get_temp(wrfnc, timeidx, units="k",
method=method, squeeze=squeeze, cache=cache)
def get_tk(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None,
meta=True):
return get_temp(wrfnc, timeidx, method, squeeze, cache, meta, units="k")
def get_tc(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None):
return get_temp(wrfnc, timeidx, units="c",
method=method, squeeze=squeeze, cache=cache)
def get_tc(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None,
meta=True):
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"] @@ -11,11 +11,12 @@ __all__ = ["get_terrain"]
@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", method="cat", squeeze=True,
cache=None):
def get_terrain(wrfnc, timeidx=0, method="cat", squeeze=True,
cache=None, meta=False, units="m"):
varname = either("HGT", "HGT_M")(wrfnc)
return extract_vars(wrfnc, timeidx, varname,
method, squeeze, cache, nometa=True)[varname]
method, squeeze, cache, meta=False)[varname]

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

@ -306,7 +306,7 @@ def extract_dim(wrfnc, dim): @@ -306,7 +306,7 @@ def extract_dim(wrfnc, dim):
return len(d) #netCDF4
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
does a cat or join for the list of files for that key"""
keynames = []
@ -320,7 +320,7 @@ def _combine_dict(wrfdict, varname, timeidx, method, nometa): @@ -320,7 +320,7 @@ def _combine_dict(wrfdict, varname, timeidx, method, nometa):
first_array = _extract_var(wrfdict[first_key], varname,
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
@ -339,7 +339,7 @@ def _combine_dict(wrfdict, varname, timeidx, method, nometa): @@ -339,7 +339,7 @@ def _combine_dict(wrfdict, varname, timeidx, method, nometa):
keynames.append(key)
vardata = _extract_var(wrfdict[key], varname, timeidx,
is_moving=is_moving, method=method,
squeeze=False, cache=None, nometa=nometa)
squeeze=False, cache=None, meta=meta)
if outdata.shape[1:] != vardata.shape:
raise ValueError("data sequences must have the "
@ -347,7 +347,7 @@ def _combine_dict(wrfdict, varname, timeidx, method, nometa): @@ -347,7 +347,7 @@ def _combine_dict(wrfdict, varname, timeidx, method, nometa):
outdata[idx,:] = npvalues(vardata)[:]
idx += 1
if xarray_enabled() and not nometa:
if xarray_enabled() and meta:
outname = unicode(first_array.name)
# Note: assumes that all entries in dict have same coords
outcoords = OrderedDict(first_array.coords)
@ -364,7 +364,7 @@ def _combine_dict(wrfdict, varname, timeidx, method, nometa): @@ -364,7 +364,7 @@ def _combine_dict(wrfdict, varname, timeidx, method, nometa):
# TODO: implement in C
# 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:
is_moving = _is_moving_domain(wrfseq, varname)
@ -377,7 +377,7 @@ def _cat_files(wrfseq, varname, timeidx, is_moving, squeeze, nometa): @@ -377,7 +377,7 @@ def _cat_files(wrfseq, varname, timeidx, is_moving, squeeze, nometa):
# wrfseq might be a generator
wrf_iter = iter(wrfseq)
if xarray_enabled() and not nometa:
if xarray_enabled() and meta:
first_var = _build_data_array(next(wrf_iter), varname,
timeidx, is_moving)
else:
@ -418,7 +418,7 @@ def _cat_files(wrfseq, varname, timeidx, is_moving, squeeze, nometa): @@ -418,7 +418,7 @@ def _cat_files(wrfseq, varname, timeidx, is_moving, squeeze, nometa):
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
# time indexes as the whole data set
outname = unicode(first_var.name)
@ -439,7 +439,7 @@ def _cat_files(wrfseq, varname, timeidx, is_moving, squeeze, nometa): @@ -439,7 +439,7 @@ def _cat_files(wrfseq, varname, timeidx, is_moving, squeeze, nometa):
return outarr
# 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:
is_moving = _is_moving_domain(wrfseq, varname)
multitime = _is_multi_time_req(timeidx)
@ -450,7 +450,7 @@ def _join_files(wrfseq, varname, timeidx, is_moving, nometa): @@ -450,7 +450,7 @@ def _join_files(wrfseq, varname, timeidx, is_moving, nometa):
# wrfseq might be a generator
wrf_iter = iter(wrfseq)
if xarray_enabled() and not nometa:
if xarray_enabled() and meta:
first_var = _build_data_array(next(wrf_iter), varname,
timeidx, is_moving)
else:
@ -478,7 +478,7 @@ def _join_files(wrfseq, varname, timeidx, is_moving, nometa): @@ -478,7 +478,7 @@ def _join_files(wrfseq, varname, timeidx, is_moving, nometa):
outdata[idx,:] = outvar[:]
idx += 1
if xarray_enabled() and not nometa:
if xarray_enabled() and meta:
outname = unicode(first_var.name)
outcoords = OrderedDict(first_var.coords)
outattrs = OrderedDict(first_var.attrs)
@ -495,19 +495,19 @@ def _join_files(wrfseq, varname, timeidx, is_moving, nometa): @@ -495,19 +495,19 @@ def _join_files(wrfseq, varname, timeidx, is_moving, nometa):
return outarr
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
wrfseq = _unpack_sequence(wrfseq)
# Dictionary is unique
if _is_mapping(wrfseq):
outarr = _combine_dict(wrfseq, varname, timeidx, method, nometa)
outarr = _combine_dict(wrfseq, varname, timeidx, method, meta)
elif method.lower() == "cat":
outarr = _cat_files(wrfseq, varname, timeidx, is_moving,
squeeze, nometa)
squeeze, meta)
elif method.lower() == "join":
outarr = _join_files(wrfseq, varname, timeidx, is_moving, nometa)
outarr = _join_files(wrfseq, varname, timeidx, is_moving, meta)
else:
raise ValueError("method must be 'cat' or 'join'")
@ -606,7 +606,7 @@ def _build_data_array(wrfnc, varname, timeidx, is_moving_domain): @@ -606,7 +606,7 @@ def _build_data_array(wrfnc, varname, timeidx, is_moving_domain):
# Cache is a dictionary of already extracted variables
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,
# particularly to copy metadata. This can be slow.
if cache is not None:
@ -615,7 +615,7 @@ def _extract_var(wrfnc, varname, timeidx, is_moving, @@ -615,7 +615,7 @@ def _extract_var(wrfnc, varname, timeidx, is_moving,
except KeyError:
pass
else:
if nometa:
if not meta:
if isinstance(cache_var, DataArray):
return cache_var.values
@ -625,7 +625,7 @@ def _extract_var(wrfnc, varname, timeidx, is_moving, @@ -625,7 +625,7 @@ def _extract_var(wrfnc, varname, timeidx, is_moving,
multifile = _is_multi_file(wrfnc)
if not multifile:
if xarray_enabled() and not nometa:
if xarray_enabled() and meta:
if is_moving is None:
is_moving = _is_moving_domain(wrfnc, varname)
result = _build_data_array(wrfnc, varname, timeidx, is_moving)
@ -638,20 +638,20 @@ def _extract_var(wrfnc, varname, timeidx, is_moving, @@ -638,20 +638,20 @@ def _extract_var(wrfnc, varname, timeidx, is_moving,
else:
# Squeeze handled in this routine, so just return it
return combine_files(wrfnc, varname, timeidx, is_moving,
method, squeeze, nometa)
method, squeeze, meta)
return result.squeeze() if squeeze else result
def extract_vars(wrfnc, timeidx, varnames, method="cat", squeeze=True,
cache=None, nometa=False):
cache=None, meta=True):
if isstr(varnames):
varlist = [varnames]
else:
varlist = varnames
return {var:_extract_var(wrfnc, var, timeidx, None,
method, squeeze, cache, nometa)
method, squeeze, cache, meta)
for var in varlist}
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", @@ -18,31 +18,32 @@ __all__=["get_uvmet", "get_uvmet10", "get_uvmet_wspd_wdir",
@convert_units("wind", "mps")
def _get_uvmet(wrfnc, timeidx=0, ten_m=False, units ="mps",
method="cat", squeeze=True, cache=None):
def _get_uvmet(wrfnc, timeidx=0, method="cat", squeeze=True,
cache=None, meta=True,
ten_m=False, units ="mps"):
""" Return a tuple of u,v with the winds rotated in to earth space"""
if not ten_m:
varname = either("U", "UU")(wrfnc)
u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True)
meta=False)
u = destagger(u_vars[varname], -1)
varname = either("V", "VV")(wrfnc)
v_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True)
meta=False)
v = destagger(v_vars[varname], -2)
else:
varname = either("U10", "UU")(wrfnc)
u_vars = extract_vars(wrfnc, timeidx, varname, method, squeeze, cache,
nometa=True)
meta=False)
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,
nometa=True)
meta=False)
v = (v_vars[varname] if varname == "V10" else
destagger(v_vars[varname][...,0,:,:], -2))
@ -98,12 +99,12 @@ def _get_uvmet(wrfnc, timeidx=0, ten_m=False, units ="mps", @@ -98,12 +99,12 @@ def _get_uvmet(wrfnc, timeidx=0, ten_m=False, units ="mps",
varname = either("XLAT_M", "XLAT")(wrfnc)
xlat_var = extract_vars(wrfnc, timeidx, varname,
method, squeeze, cache, nometa=True)
method, squeeze, cache, meta=False)
lat = xlat_var[varname]
varname = either("XLONG_M", "XLONG")(wrfnc)
xlon_var = extract_vars(wrfnc, timeidx, varname,
method, squeeze, cache, nometa=True)
method, squeeze, cache, meta=False)
lon = xlon_var[varname]
if map_proj == 1:
@ -129,10 +130,12 @@ def _get_uvmet(wrfnc, timeidx=0, ten_m=False, units ="mps", @@ -129,10 +130,12 @@ def _get_uvmet(wrfnc, timeidx=0, ten_m=False, units ="mps",
description="earth rotated u,v",
two_d=False,
wspd_wdir=False)
def get_uvmet(wrfnc, timeidx=0, units="mps",
method="cat", squeeze=True, cache=None):
def get_uvmet(wrfnc, timeidx=0, method="cat", squeeze=True,
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"),
@ -140,10 +143,12 @@ def get_uvmet(wrfnc, timeidx=0, units="mps", @@ -140,10 +143,12 @@ def get_uvmet(wrfnc, timeidx=0, units="mps",
description="10m earth rotated u,v",
two_d=True,
wspd_wdir=False)
def get_uvmet10(wrfnc, timeidx=0, units="mps",
method="cat", squeeze=True, cache=None):
def get_uvmet10(wrfnc, timeidx=0, method="cat", squeeze=True,
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"),
@ -151,10 +156,12 @@ def get_uvmet10(wrfnc, timeidx=0, units="mps", @@ -151,10 +156,12 @@ def get_uvmet10(wrfnc, timeidx=0, units="mps",
description="earth rotated wspd,wdir",
two_d=False,
wspd_wdir=True)
def get_uvmet_wspd_wdir(wrfnc, timeidx=0, units="mps",
method="cat", squeeze=True, cache=None):
def get_uvmet_wspd_wdir(wrfnc, timeidx=0, method="cat", squeeze=True,
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)
@ -164,10 +171,12 @@ def get_uvmet_wspd_wdir(wrfnc, timeidx=0, units="mps", @@ -164,10 +171,12 @@ def get_uvmet_wspd_wdir(wrfnc, timeidx=0, units="mps",
description="10m earth rotated wspd,wdir",
two_d=True,
wspd_wdir=True)
def get_uvmet10_wspd_wdir(wrfnc, timeidx=0, units="mps",
method="cat", squeeze=True, cache=None):
def get_uvmet10_wspd_wdir(wrfnc, timeidx=0, method="cat", squeeze=True,
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)

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

@ -10,11 +10,12 @@ __all__ = ["get_avo", "get_pvo"] @@ -10,11 +10,12 @@ __all__ = ["get_avo", "get_pvo"]
@copy_and_set_metadata(copy_varname="T", name="avo",
description="absolute vorticity",
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",
"MAPFAC_V", "MAPFAC_M",
"F"),
method, squeeze, cache, nometa=True)
method, squeeze, cache, meta=False)
attrs = extract_global_attrs(wrfnc, attrs=("DX", "DY"))
u = ncvars["U"]
@ -33,12 +34,13 @@ def get_avo(wrfnc, timeidx=0, method="cat", squeeze=True, cache=None): @@ -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",
description="potential vorticity",
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",
"PB", "MAPFAC_U",
"MAPFAC_V", "MAPFAC_M",
"F"),
method, squeeze, cache, nometa=True)
method, squeeze, cache, meta=False)
attrs = extract_global_attrs(wrfnc, attrs=("DX", "DY"))
u = ncvars["U"]

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

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

Loading…
Cancel
Save