From 0d6f9230dac244c6c1f7e87f816a593a8980f45c Mon Sep 17 00:00:00 2001 From: Bill Ladwig Date: Mon, 22 Jan 2018 13:42:33 -0700 Subject: [PATCH] Fixed metadata bugs related to interpolation. Unit tests were also updated to test for this situation. --- src/wrf/metadecorators.py | 32 +++++++++++--------------------- test/ci_tests/ci_test_file.nc | Bin 3026450 -> 3030723 bytes test/ci_tests/make_test_file.py | 6 +++--- test/ci_tests/utests.py | 23 +++++++++++++++++++++++ test/utests.py | 23 +++++++++++++++++++++-- 5 files changed, 58 insertions(+), 26 deletions(-) diff --git a/src/wrf/metadecorators.py b/src/wrf/metadecorators.py index 0549220..228c857 100644 --- a/src/wrf/metadecorators.py +++ b/src/wrf/metadecorators.py @@ -805,7 +805,7 @@ def _set_horiz_meta(wrapped, instance, args, kwargs): outname = None outdimnames = None outcoords = None - outattrs = None + outattrs = OrderedDict() # Get the vertical level units vert_units = None @@ -823,7 +823,6 @@ def _set_horiz_meta(wrapped, instance, args, kwargs): if isinstance(field3d, DataArray): outcoords = OrderedDict() - outattrs = OrderedDict() outdimnames = list(field3d.dims) outcoords.update(field3d.coords) outdimnames.remove(field3d.dims[-3]) @@ -836,7 +835,6 @@ def _set_horiz_meta(wrapped, instance, args, kwargs): else: outname = "field3d_{0}".format(name_levelstr) - outattrs = OrderedDict() outattrs["level"] = levelstr outattrs["missing_value"] = missingval @@ -959,7 +957,7 @@ def _set_cross_meta(wrapped, instance, args, kwargs): outname = None outdimnames = None outcoords = None - outattrs = None + outattrs = OrderedDict() # Use XY to set the cross-section metadata st_x = xy[0,0] @@ -974,7 +972,6 @@ def _set_cross_meta(wrapped, instance, args, kwargs): if isinstance(field3d, DataArray): outcoords = OrderedDict() - outattrs = OrderedDict() outdimnames = list(field3d.dims) outcoords.update(field3d.coords) for i in py3range(-3,0,1): @@ -1062,7 +1059,6 @@ def _set_cross_meta(wrapped, instance, args, kwargs): "not of type xarray.DataArray and contains no " "coordinate information") outname = "field3d_cross" - outattrs = OrderedDict() outattrs["orientation"] = cross_str outattrs["missing_value"] = missingval @@ -1173,7 +1169,7 @@ def _set_line_meta(wrapped, instance, args, kwargs): outname = None outdimnames = None outcoords = None - outattrs = None + outattrs = OrderedDict() # Use XY to set the cross-section metadata st_x = xy[0,0] @@ -1188,7 +1184,6 @@ def _set_line_meta(wrapped, instance, args, kwargs): if isinstance(field2d, DataArray): outcoords = OrderedDict() - outattrs = OrderedDict() outdimnames = list(field2d.dims) outcoords.update(field2d.coords) for i in py3range(-2,0,1): @@ -1273,7 +1268,6 @@ def _set_line_meta(wrapped, instance, args, kwargs): "not of type xarray.DataArray and contains no " "coordinate information") outname = "field2d_line" - outattrs = OrderedDict() outattrs["orientation"] = cross_str @@ -1334,12 +1328,11 @@ def _set_vinterp_meta(wrapped, instance, args, kwargs): outname = None outdimnames = None outcoords = None - outattrs = None + outattrs = OrderedDict() if isinstance(field, DataArray): outcoords = OrderedDict() - outattrs = OrderedDict() outdimnames = list(field.dims) outcoords.update(field.coords) @@ -1352,13 +1345,14 @@ def _set_vinterp_meta(wrapped, instance, args, kwargs): outdimnames.insert(-2, "interp_level") outcoords["interp_level"] = interp_levels outattrs.update(field.attrs) - outattrs["vert_interp_type"] = vert_coord + outname = field.name else: outname = field_type + outattrs["vert_interp_type"] = vert_coord return DataArray(result, name=outname, dims=outdimnames, coords=outcoords, attrs=outattrs) @@ -1402,8 +1396,7 @@ def _set_2dxy_meta(wrapped, instance, args, kwargs): argvars = from_args(wrapped, ("field3d", "xy"), *args, **kwargs) field3d = argvars["field3d"] - xy = argvars["xy"] - xy = to_np(xy) + xy = to_np(argvars["xy"]) result = wrapped(*args, **kwargs) @@ -1419,12 +1412,11 @@ def _set_2dxy_meta(wrapped, instance, args, kwargs): outname = None outdimnames = None outcoords = None - outattrs = None + outattrs = OrderedDict() # Dims are (...,xy,z) if isinstance(field3d, DataArray): outcoords = OrderedDict() - outattrs = OrderedDict() outdimnames = list(field3d.dims) outcoords.update(field3d.coords) @@ -1520,12 +1512,11 @@ def _set_1d_meta(wrapped, instance, args, kwargs): outname = None outdimnames = None outcoords = None - outattrs = None + outattrs = OrderedDict() # Dims are (...,xy,z) if isinstance(field, DataArray): outcoords = OrderedDict() - outattrs = OrderedDict() outdimnames = list(field.dims) outdimnames.pop(-1) @@ -1540,9 +1531,6 @@ def _set_1d_meta(wrapped, instance, args, kwargs): outname = "{0}_z".format(field.name) outcoords["z"] = z_out - outattrs["_FillValue"] = missingval - outattrs["missing_value"] = missingval - desc = field.attrs.get("description", None) if desc is not None: outattrs["description"] = desc @@ -1554,6 +1542,8 @@ def _set_1d_meta(wrapped, instance, args, kwargs): else: outname = "field_z" + outattrs["_FillValue"] = missingval + outattrs["missing_value"] = missingval return DataArray(result, name=outname, dims=outdimnames, coords=outcoords, attrs=outattrs) diff --git a/test/ci_tests/ci_test_file.nc b/test/ci_tests/ci_test_file.nc index ad5a3f62a6597f3491b7fb5bc771ffedc00699aa..b0f89455468774ee3342a9c096b70aafc8d9465f 100644 GIT binary patch delta 12439 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