def check_cf_grib2(standard_name, long_name, discipline, category, number, units, expect_none=False): a_cf_unit = cf_units.Unit(units) gribdata = gptx.cf_phenom_to_grib2_info(standard_name, long_name) if expect_none: self.assertIsNone(gribdata) else: self.assertEqual(gribdata.discipline, discipline) self.assertEqual(gribdata.category, category) self.assertEqual(gribdata.number, number) self.assertEqual(gribdata.units, a_cf_unit)
def set_discipline_and_parameter(cube, grib): # NOTE: for now, can match by *either* standard_name or long_name. # This allows workarounds for data with no identified standard_name. grib2_info = gptx.cf_phenom_to_grib2_info(cube.standard_name, cube.long_name) if grib2_info is not None: gribapi.grib_set(grib, "discipline", grib2_info.discipline) gribapi.grib_set(grib, "parameterCategory", grib2_info.category) gribapi.grib_set(grib, "parameterNumber", grib2_info.number) else: gribapi.grib_set(grib, "discipline", 255) gribapi.grib_set(grib, "parameterCategory", 255) gribapi.grib_set(grib, "parameterNumber", 255) warnings.warn('Unable to determine Grib2 parameter code for cube.\n' 'discipline, parameterCategory and parameterNumber ' 'have been set to "missing".')
def data_section(cube, grib): # Masked data? if isinstance(cube.data, ma.core.MaskedArray): # What missing value shall we use? if not np.isnan(cube.data.fill_value): # Use the data's fill value. fill_value = float(cube.data.fill_value) else: # We can't use the data's fill value if it's NaN, # the GRIB API doesn't like it. # Calculate an MDI outside the data range. min, max = cube.data.min(), cube.data.max() fill_value = min - (max - min) * 0.1 # Prepare the unmaksed data array, using fill_value as the MDI. data = cube.data.filled(fill_value) else: fill_value = None data = cube.data # units scaling grib2_info = gptx.cf_phenom_to_grib2_info(cube.standard_name, cube.long_name) if grib2_info is None: # for now, just allow this warnings.warn('Unable to determine Grib2 parameter code for cube.\n' 'Message data may not be correctly scaled.') else: if cube.units != grib2_info.units: data = cube.units.convert(data, grib2_info.units) if fill_value is not None: fill_value = cube.units.convert(fill_value, grib2_info.units) if fill_value is None: # Disable missing values in the grib message. gribapi.grib_set(grib, "bitmapPresent", 0) else: # Enable missing values in the grib message. gribapi.grib_set(grib, "bitmapPresent", 1) gribapi.grib_set_double(grib, "missingValue", fill_value) gribapi.grib_set_double_array(grib, "values", data.flatten())
def data(cube, grib): # mdi if isinstance(cube.data, ma.core.MaskedArray): gribapi.grib_set(grib, "bitmapPresent", 1) gribapi.grib_set_double(grib, "missingValue", float(cube.data.fill_value)) data = cube.data.filled() else: gribapi.grib_set_double(grib, "missingValue", float(-1e9)) data = cube.data # units scaling grib2_info = gptx.cf_phenom_to_grib2_info(cube.standard_name, cube.long_name) if grib2_info is None: # for now, just allow this warnings.warn('Unable to determine Grib2 parameter code for cube.\n' 'Message data may not be correctly scaled.') else: if cube.units != grib2_info.units: data = cube.units.convert(data, grib2_info.units) # values gribapi.grib_set_double_array(grib, "values", data.flatten())