def test_bounded_level(self): cube = iris.load_cube( tests.get_data_path(("GRIB", "uk_t", "uk_t.grib2"))) # Changing pressure to altitude due to grib api bug: # https://github.com/SciTools/iris/pull/715#discussion_r5901538 cube.remove_coord("pressure") cube.add_aux_coord( iris.coords.AuxCoord( 1030.0, long_name="altitude", units="m", bounds=np.array([111.0, 1949.0]), )) with self.temp_filename(".grib2") as testfile: iris.save(cube, testfile) with open(testfile, "rb") as saved_file: g = gribapi.grib_new_from_file(saved_file) self.assertEqual( gribapi.grib_get_double(g, "scaledValueOfFirstFixedSurface"), 111.0, ) self.assertEqual( gribapi.grib_get_double(g, "scaledValueOfSecondFixedSurface"), 1949.0, )
def system_test_grib_patch(self): import gribapi gm = gribapi.grib_new_from_samples("GRIB2") result = gribapi.grib_get_double(gm, "missingValue") new_missing_value = 123456.0 gribapi.grib_set_double(gm, "missingValue", new_missing_value) new_result = gribapi.grib_get_double(gm, "missingValue") self.assertEqual(new_result, new_missing_value)
def test_bounded_altitude_feet(self): cube = iris.cube.Cube([0]) cube.add_aux_coord(iris.coords.AuxCoord( 1500.0, long_name='altitude', units='ft', bounds=np.array([1000.0, 2000.0]))) grib = gribapi.grib_new_from_samples("GRIB2") grib_save_rules.non_hybrid_surfaces(cube, grib) self.assertEqual( gribapi.grib_get_double(grib, "scaledValueOfFirstFixedSurface"), 304.0) self.assertEqual( gribapi.grib_get_double(grib, "scaledValueOfSecondFixedSurface"), 609.0)
def test_bounded_level(self): cube = iris.load_cube(tests.get_data_path(("GRIB", "uk_t", "uk_t.grib2"))) # Changing pressure to altitude due to grib api bug: # https://github.com/SciTools/iris/pull/715#discussion_r5901538 cube.remove_coord("pressure") cube.add_aux_coord( iris.coords.AuxCoord(1030.0, long_name="altitude", units="m", bounds=np.array([111.0, 1949.0])) ) with self.temp_filename(".grib2") as testfile: iris.save(cube, testfile) with open(testfile, "rb") as saved_file: g = gribapi.grib_new_from_file(saved_file) self.assertEqual(gribapi.grib_get_double(g, "scaledValueOfFirstFixedSurface"), 111.0) self.assertEqual(gribapi.grib_get_double(g, "scaledValueOfSecondFixedSurface"), 1949.0)
def test_bounded_altitude_feet(self): cube = iris.cube.Cube([0]) cube.add_aux_coord( iris.coords.AuxCoord(1500.0, long_name='altitude', units='ft', bounds=np.array([1000.0, 2000.0]))) grib = gribapi.grib_new_from_samples("GRIB2") grib_save_rules.non_hybrid_surfaces(cube, grib) self.assertEqual( gribapi.grib_get_double(grib, "scaledValueOfFirstFixedSurface"), 304.0) self.assertEqual( gribapi.grib_get_double(grib, "scaledValueOfSecondFixedSurface"), 609.0)
def __getattr__(self, key): """Return a grib key, or one of our extra keys.""" # is it in the grib message? try: # we just get <type 'float'> as the type of the "values" array...special case here... if key in ["values", "pv", "latitudes", "longitudes"]: res = gribapi.grib_get_double_array(self.grib_message, key) elif key in ('typeOfFirstFixedSurface', 'typeOfSecondFixedSurface'): res = np.int32(gribapi.grib_get_long(self.grib_message, key)) else: key_type = gribapi.grib_get_native_type(self.grib_message, key) if key_type == int: res = np.int32(gribapi.grib_get_long(self.grib_message, key)) elif key_type == float: # Because some computer keys are floats, like # longitudeOfFirstGridPointInDegrees, a float32 is not always enough... res = np.float64(gribapi.grib_get_double(self.grib_message, key)) elif key_type == str: res = gribapi.grib_get_string(self.grib_message, key) else: raise ValueError("Unknown type for %s : %s" % (key, str(key_type))) except gribapi.GribInternalError: res = None #...or is it in our list of extras? if res is None: if key in self.extra_keys: res = self.extra_keys[key] else: #must raise an exception for the hasattr() mechanism to work raise AttributeError("Cannot find GRIB key %s" % key) return res
def get_grib_info(self, select_args): _gribs_for_utils = self._get_gids(**select_args) if len(_gribs_for_utils) > 0: type_of_step = grib_get(_gribs_for_utils[1], 'stepType') # instant, avg, cumul # FIXME this is not correct: GRIB missing values needs bitmap self._mv = grib_get_double(_gribs_for_utils[0], 'missingValue') start_grib, end_grib, self._step_grib, self._step_grib2, self._change_step_at = self._find_start_end_steps( _gribs_for_utils) for g in _gribs_for_utils: grib_release(g) _gribs_for_utils = None del _gribs_for_utils import gc gc.collect() info = GRIBInfo(input_step=self._step_grib, input_step2=self._step_grib2, change_step_at=self._change_step_at, type_of_param=type_of_step, start=start_grib, end=end_grib, mv=self._mv) return info # no messages found else: raise ValueError('No messages found in grib file')
def test_bounded_level(self): cube = iris.load_cube( tests.get_data_path(("GRIB", "uk_t", "uk_t.grib2"))) with self.temp_filename(".grib2") as testfile: iris.save(cube, testfile) with open(testfile, "rb") as saved_file: g = gribapi.grib_new_from_file(saved_file) self.assertEqual( gribapi.grib_get_double(g, "scaledValueOfFirstFixedSurface"), 0.0, ) self.assertEqual( gribapi.grib_get_double(g, "scaledValueOfSecondFixedSurface"), 2147483647.0, )
def test_bounded_altitude_feet(self): cube = iris.cube.Cube([0]) cube.add_aux_coord( iris.coords.AuxCoord(1500.0, long_name='altitude', units='ft', bounds=np.array([1000.0, 2000.0]))) grib = gribapi.grib_new_from_samples("GRIB2") set_fixed_surfaces(cube, grib) self.assertEqual( gribapi.grib_get_double(grib, "scaledValueOfFirstFixedSurface"), 305.0) # precise ~304.8 self.assertEqual( gribapi.grib_get_double(grib, "scaledValueOfSecondFixedSurface"), 610.0) # precise ~609.6 self.assertEqual( gribapi.grib_get_long(grib, "typeOfFirstFixedSurface"), 102) self.assertEqual( gribapi.grib_get_long(grib, "typeOfSecondFixedSurface"), 102)
def test_theta_level(self): cube = iris.cube.Cube([0]) cube.add_aux_coord( iris.coords.AuxCoord(230.0, standard_name='air_potential_temperature', units='K', attributes={'positive': 'up'}, bounds=np.array([220.0, 240.0]))) grib = gribapi.grib_new_from_samples("GRIB2") set_fixed_surfaces(cube, grib) self.assertEqual( gribapi.grib_get_double(grib, "scaledValueOfFirstFixedSurface"), 220.0) self.assertEqual( gribapi.grib_get_double(grib, "scaledValueOfSecondFixedSurface"), 240.0) self.assertEqual( gribapi.grib_get_long(grib, "typeOfFirstFixedSurface"), 107) self.assertEqual( gribapi.grib_get_long(grib, "typeOfSecondFixedSurface"), 107)
def test_depth(self): cube = iris.cube.Cube([0]) cube.add_aux_coord( iris.coords.AuxCoord(1, long_name='depth', units='m', bounds=np.array([0., 2]), attributes={'positive': 'down'})) grib = gribapi.grib_new_from_samples("GRIB2") set_fixed_surfaces(cube, grib) self.assertEqual( gribapi.grib_get_double(grib, "scaledValueOfFirstFixedSurface"), 0.) self.assertEqual( gribapi.grib_get_double(grib, "scaledValueOfSecondFixedSurface"), 2) self.assertEqual( gribapi.grib_get_long(grib, "typeOfFirstFixedSurface"), 106) self.assertEqual( gribapi.grib_get_long(grib, "typeOfSecondFixedSurface"), 106)
def test_theta_level(self): cube = iris.cube.Cube([0]) cube.add_aux_coord(iris.coords.AuxCoord( 230.0, standard_name='air_potential_temperature', units='K', attributes={'positive': 'up'}, bounds=np.array([220.0, 240.0]))) grib = gribapi.grib_new_from_samples("GRIB2") set_fixed_surfaces(cube, grib) self.assertEqual( gribapi.grib_get_double(grib, "scaledValueOfFirstFixedSurface"), 220.0) self.assertEqual( gribapi.grib_get_double(grib, "scaledValueOfSecondFixedSurface"), 240.0) self.assertEqual( gribapi.grib_get_long(grib, "typeOfFirstFixedSurface"), 107) self.assertEqual( gribapi.grib_get_long(grib, "typeOfSecondFixedSurface"), 107)