diff --git a/wrf_open/var/src/python/wrf/var/cape.py b/wrf_open/var/src/python/wrf/var/cape.py index 1330a00..31e8292 100755 --- a/wrf_open/var/src/python/wrf/var/cape.py +++ b/wrf_open/var/src/python/wrf/var/cape.py @@ -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, 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"] diff --git a/wrf_open/var/src/python/wrf/var/ctt.py b/wrf_open/var/src/python/wrf/var/ctt.py index 0976d2a..7fb5534 100644 --- a/wrf_open/var/src/python/wrf/var/ctt.py +++ b/wrf_open/var/src/python/wrf/var/ctt.py @@ -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, 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, 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: diff --git a/wrf_open/var/src/python/wrf/var/dbz.py b/wrf_open/var/src/python/wrf/var/dbz.py index 8f77955..4cd4aa2 100755 --- a/wrf_open/var/src/python/wrf/var/dbz.py +++ b/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", 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, """ 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, 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, 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, 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) diff --git a/wrf_open/var/src/python/wrf/var/dewpoint.py b/wrf_open/var/src/python/wrf/var/dewpoint.py index 2d7f2ae..cc6c317 100755 --- a/wrf_open/var/src/python/wrf/var/dewpoint.py +++ b/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", 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", @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"]) diff --git a/wrf_open/var/src/python/wrf/var/extension.py b/wrf_open/var/src/python/wrf/var/extension.py index 765961a..c324d38 100755 --- a/wrf_open/var/src/python/wrf/var/extension.py +++ b/wrf_open/var/src/python/wrf/var/extension.py @@ -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): # 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, 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, 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 diff --git a/wrf_open/var/src/python/wrf/var/geoht.py b/wrf_open/var/src/python/wrf/var/geoht.py index e2095b8..d56303c 100755 --- a/wrf_open/var/src/python/wrf/var/geoht.py +++ b/wrf_open/var/src/python/wrf/var/geoht.py @@ -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, 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, 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, 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) diff --git a/wrf_open/var/src/python/wrf/var/helicity.py b/wrf_open/var/src/python/wrf/var/helicity.py index ef6cced..d623d33 100755 --- a/wrf_open/var/src/python/wrf/var/helicity.py +++ b/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", 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, # 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, @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, # 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 diff --git a/wrf_open/var/src/python/wrf/var/interp.py b/wrf_open/var/src/python/wrf/var/interp.py index ebeb7d0..f6b6645 100755 --- a/wrf_open/var/src/python/wrf/var/interp.py +++ b/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 @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): 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, @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, @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, # 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, # 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) diff --git a/wrf_open/var/src/python/wrf/var/interputils.py b/wrf_open/var/src/python/wrf/var/interputils.py index 67255de..afddc73 100644 --- a/wrf_open/var/src/python/wrf/var/interputils.py +++ b/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 -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: diff --git a/wrf_open/var/src/python/wrf/var/latlon.py b/wrf_open/var/src/python/wrf/var/latlon.py index 1072f9c..cca4473 100755 --- a/wrf_open/var/src/python/wrf/var/latlon.py +++ b/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"] -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) diff --git a/wrf_open/var/src/python/wrf/var/latlonutils.py b/wrf_open/var/src/python/wrf/var/latlonutils.py index 281d9b5..2950000 100644 --- a/wrf_open/var/src/python/wrf/var/latlonutils.py +++ b/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) 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]) diff --git a/wrf_open/var/src/python/wrf/var/metadecorators.py b/wrf_open/var/src/python/wrf/var/metadecorators.py index 678a5c2..5499358 100644 --- a/wrf_open/var/src/python/wrf/var/metadecorators.py +++ b/wrf_open/var/src/python/wrf/var/metadecorators.py @@ -32,13 +32,19 @@ 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(): + def func_wrapper(wrapped, instance, args, kwargs): + 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, 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, 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, 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): @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): 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): # 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): 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): return _set_2dxy_meta(wrapped, instance, args, kwargs) elif interp_type == "1d": return _set_1d_meta(wrapped, instance, args, kwargs) + return func_wrapper diff --git a/wrf_open/var/src/python/wrf/var/omega.py b/wrf_open/var/src/python/wrf/var/omega.py index 7e545c0..ae463e9 100755 --- a/wrf_open/var/src/python/wrf/var/omega.py +++ b/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", 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"] diff --git a/wrf_open/var/src/python/wrf/var/pressure.py b/wrf_open/var/src/python/wrf/var/pressure.py index 5b0b204..fdf6b39 100755 --- a/wrf_open/var/src/python/wrf/var/pressure.py +++ b/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", 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) diff --git a/wrf_open/var/src/python/wrf/var/pw.py b/wrf_open/var/src/python/wrf/var/pw.py index 79249b9..cd7388e 100755 --- a/wrf_open/var/src/python/wrf/var/pw.py +++ b/wrf_open/var/src/python/wrf/var/pw.py @@ -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"] diff --git a/wrf_open/var/src/python/wrf/var/rh.py b/wrf_open/var/src/python/wrf/var/rh.py index 2514262..1629a19 100755 --- a/wrf_open/var/src/python/wrf/var/rh.py +++ b/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", 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): @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"] diff --git a/wrf_open/var/src/python/wrf/var/routines.py b/wrf_open/var/src/python/wrf/var/routines.py index 858bf12..a854e07 100644 --- a/wrf_open/var/src/python/wrf/var/routines.py +++ b/wrf_open/var/src/python/wrf/var/routines.py @@ -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) diff --git a/wrf_open/var/src/python/wrf/var/slp.py b/wrf_open/var/src/python/wrf/var/slp.py index cc45ef8..cea61a9 100755 --- a/wrf_open/var/src/python/wrf/var/slp.py +++ b/wrf_open/var/src/python/wrf/var/slp.py @@ -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"] diff --git a/wrf_open/var/src/python/wrf/var/temp.py b/wrf_open/var/src/python/wrf/var/temp.py index 5c4c8d1..f513c7f 100755 --- a/wrf_open/var/src/python/wrf/var/temp.py +++ b/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", 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", @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, @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, @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, @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, 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") diff --git a/wrf_open/var/src/python/wrf/var/terrain.py b/wrf_open/var/src/python/wrf/var/terrain.py index 8fc4dca..972b6cb 100755 --- a/wrf_open/var/src/python/wrf/var/terrain.py +++ b/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", 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] \ No newline at end of file diff --git a/wrf_open/var/src/python/wrf/var/times.py b/wrf_open/var/src/python/wrf/var/times.py index 61af303..3045213 100755 --- a/wrf_open/var/src/python/wrf/var/times.py +++ b/wrf_open/var/src/python/wrf/var/times.py @@ -5,5 +5,5 @@ from .util import extract_times __all__ = ["get_times"] -def get_times(wrfnc,timeidx=0): - return extract_times(wrfnc,timeidx) +def get_times(wrfnc, timeidx=0): + return extract_times(wrfnc, timeidx) diff --git a/wrf_open/var/src/python/wrf/var/util.py b/wrf_open/var/src/python/wrf/var/util.py index c03bb7c..f9ae1f3 100644 --- a/wrf_open/var/src/python/wrf/var/util.py +++ b/wrf_open/var/src/python/wrf/var/util.py @@ -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): 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): 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): 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): # 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): # 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): 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): 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): # 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): 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): 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): # 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, 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, 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, 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): diff --git a/wrf_open/var/src/python/wrf/var/uvmet.py b/wrf_open/var/src/python/wrf/var/uvmet.py index 3c16a6e..d9d7e31 100755 --- a/wrf_open/var/src/python/wrf/var/uvmet.py +++ b/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") -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", 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", 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", 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", 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", 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) diff --git a/wrf_open/var/src/python/wrf/var/vorticity.py b/wrf_open/var/src/python/wrf/var/vorticity.py index 6931951..e1324e8 100755 --- a/wrf_open/var/src/python/wrf/var/vorticity.py +++ b/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", 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): @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"] diff --git a/wrf_open/var/src/python/wrf/var/wind.py b/wrf_open/var/src/python/wrf/var/wind.py index 071ce76..c5d9b63 100755 --- a/wrf_open/var/src/python/wrf/var/wind.py +++ b/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", "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): 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): 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", 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", 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))