示例#1
0
def test_grib_get_data():
    gid = eccodes.codes_grib_new_from_samples("GRIB1")
    ggd = eccodes.codes_grib_get_data(gid)
    assert len(ggd) == 65160
    eccodes.codes_release(gid)
    gid = eccodes.codes_grib_new_from_samples("reduced_gg_pl_32_grib2")
    ggd = eccodes.codes_grib_get_data(gid)
    assert len(ggd) == 6114
    elem1 = ggd[0]  # This is a 'Bunch' derived off dict
    assert "lat" in elem1.keys()
    assert "lon" in elem1.keys()
    assert "value" in elem1.keys()
    eccodes.codes_release(gid)
示例#2
0
def test_grib_read():
    gid = eccodes.codes_grib_new_from_samples("regular_ll_sfc_grib1")
    assert eccodes.codes_get(gid, "Ni") == 16
    assert eccodes.codes_get(gid, "Nj") == 31
    assert eccodes.codes_get(gid, "const") == 1
    assert eccodes.codes_get(gid, "centre", str) == "ecmf"
    assert eccodes.codes_get(gid, "packingType", str) == "grid_simple"
    assert eccodes.codes_get(gid, "gridType", str) == "regular_ll"
    eccodes.codes_release(gid)
    gid = eccodes.codes_grib_new_from_samples("sh_ml_grib2")
    assert eccodes.codes_get(gid, "const") == 0
    assert eccodes.codes_get(gid, "gridType", str) == "sh"
    assert eccodes.codes_get(gid, "typeOfLevel", str) == "hybrid"
    assert eccodes.codes_get_long(gid, "avg") == 185
    eccodes.codes_release(gid)
示例#3
0
def test_grib_ecc_1042():
    # Issue ECC-1042: Python3 interface writes integer arrays incorrectly
    gid = eccodes.codes_grib_new_from_samples("regular_ll_sfc_grib2")

    # Trying write with inferred dtype
    write_vals = np.array([1, 2, 3])
    eccodes.codes_set_values(gid, write_vals)
    read_vals = eccodes.codes_get_values(gid)
    length = len(read_vals)
    assert read_vals[0] == 1
    assert read_vals[length - 1] == 3

    # Trying write with explicit dtype
    write_vals = np.array(
        [
            1,
            2,
            3,
        ],
        dtype=float,
    )
    eccodes.codes_set_values(gid, write_vals)
    read_vals = eccodes.codes_get_values(gid)
    assert read_vals[0] == 1
    assert read_vals[length - 1] == 3

    eccodes.codes_release(gid)
示例#4
0
def test_grib_keys_iterator_skip():
    gid = eccodes.codes_grib_new_from_samples("reduced_gg_pl_1280_grib1")
    iterid = eccodes.codes_keys_iterator_new(gid, "ls")
    count = 0
    eccodes.codes_skip_computed(iterid)
    # codes_skip_coded(iterid)
    eccodes.codes_skip_edition_specific(iterid)
    eccodes.codes_skip_duplicates(iterid)
    eccodes.codes_skip_read_only(iterid)
    eccodes.codes_skip_function(iterid)
    while eccodes.codes_keys_iterator_next(iterid):
        keyname = eccodes.codes_keys_iterator_get_name(iterid)
        keyval = eccodes.codes_get_string(gid, keyname)
        assert len(keyval) > 0
        count += 1
    # centre, level and dataType
    assert count == 3
    eccodes.codes_keys_iterator_delete(iterid)

    iterid = eccodes.codes_keys_iterator_new(gid)
    count = 0
    eccodes.codes_skip_coded(iterid)
    while eccodes.codes_keys_iterator_next(iterid):
        count += 1
    assert count == 141
    eccodes.codes_keys_iterator_delete(iterid)
    eccodes.codes_release(gid)
示例#5
0
def test_grib_dump(tmp_path):
    gid = eccodes.codes_grib_new_from_samples("GRIB2")
    p = tmp_path / "dump.txt"
    with open(p, "w") as fout:
        eccodes.codes_dump(gid, fout)
        eccodes.codes_dump(gid, fout, "debug")
    eccodes.codes_release(gid)
示例#6
0
def test_grib_codes_set_missing():
    gid = eccodes.codes_grib_new_from_samples("reduced_rotated_gg_ml_grib2")
    eccodes.codes_set(gid, "typeOfFirstFixedSurface", "sfc")
    eccodes.codes_set_missing(gid, "scaleFactorOfFirstFixedSurface")
    eccodes.codes_set_missing(gid, "scaledValueOfFirstFixedSurface")
    assert eccodes.eccodes.codes_is_missing(gid,
                                            "scaleFactorOfFirstFixedSurface")
示例#7
0
def test_grib_write(tmpdir):
    gid = eccodes.codes_grib_new_from_samples("GRIB2")
    eccodes.codes_set(gid, "backgroundProcess", 44)
    output = tmpdir.join("test_grib_write.grib")
    with open(str(output), "wb") as fout:
        eccodes.codes_write(gid, fout)
    eccodes.codes_release(gid)
示例#8
0
def test_grib_float_array():
    gid = eccodes.codes_grib_new_from_samples("regular_ll_sfc_grib2")
    for ftype in (float, np.float16, np.float32, np.float64):
        values = np.ones((100000, ), ftype)
        eccodes.codes_set_array(gid, "values", values)
        assert (eccodes.codes_get_values(gid) == 1.0).all()
        eccodes.codes_set_values(gid, values)
        assert (eccodes.codes_get_values(gid) == 1.0).all()
示例#9
0
def test_grib_set_error():
    gid = eccodes.codes_grib_new_from_samples("regular_ll_sfc_grib1")
    with pytest.raises(TypeError):
        eccodes.codes_set_long(gid, "centre", "kwbc")
    with pytest.raises(TypeError):
        eccodes.codes_set_double(gid, "centre", "kwbc")
    with pytest.raises(eccodes.CodesInternalError):
        eccodes.codes_set(gid, "centre", [])
示例#10
0
def test_codes_get_native_type():
    gid = eccodes.codes_grib_new_from_samples("GRIB2")
    assert eccodes.codes_get_native_type(gid, "date") is int
    assert eccodes.codes_get_native_type(gid, "referenceValue") is float
    assert eccodes.codes_get_native_type(gid, "stepType") is str
    assert eccodes.codes_get_native_type(gid, "section_1") is None
    with pytest.raises(eccodes.InvalidGribError):
        eccodes.codes_get_native_type(0, "aKey")
示例#11
0
def test_grib_clone():
    gid = eccodes.codes_grib_new_from_samples("GRIB2")
    clone = eccodes.codes_clone(gid)
    assert gid
    assert clone
    assert eccodes.codes_get(clone, "identifier") == "GRIB"
    assert eccodes.codes_get(clone, "totalLength") == 179
    eccodes.codes_release(gid)
    eccodes.codes_release(clone)
示例#12
0
def test_grib_get_array():
    gid = eccodes.codes_grib_new_from_samples("reduced_gg_pl_160_grib1")
    pl = eccodes.codes_get_array(gid, "pl")
    assert pl[0] == 18
    pli = eccodes.codes_get_array(gid, "pl", int)
    assert np.array_equal(pl, pli)
    pls = eccodes.codes_get_array(gid, "centre", str)
    assert pls == ["ecmf"]
    eccodes.codes_release(gid)
示例#13
0
def test_grib_uuid_get_set():
    # ECC-1167
    gid = eccodes.codes_grib_new_from_samples("GRIB2")
    eccodes.codes_set(gid, "gridType", "unstructured_grid")
    uuid = eccodes.codes_get_string(gid, "uuidOfHGrid")
    assert uuid == "00000000000000000000000000000000"
    eccodes.codes_set_string(gid, "uuidOfHGrid",
                             "DEfdBEef10203040b00b1e50001100FF")
    uuid = eccodes.codes_get_string(gid, "uuidOfHGrid")
    assert uuid == "defdbeef10203040b00b1e50001100ff"
    eccodes.codes_release(gid)
示例#14
0
def test_grib_get_double_elements():
    gid = eccodes.codes_grib_new_from_samples("gg_sfc_grib1")
    values = eccodes.codes_get_values(gid)
    num_vals = len(values)
    indexes = [0, int(num_vals / 2), num_vals - 1]
    elems = eccodes.codes_get_double_elements(gid, "values", indexes)
    assert math.isclose(elems[0], 259.6935, abs_tol=0.001)
    assert math.isclose(elems[1], 299.9064, abs_tol=0.001)
    assert math.isclose(elems[2], 218.8146, abs_tol=0.001)
    elems2 = eccodes.codes_get_elements(gid, "values", indexes)
    assert elems == elems2
示例#15
0
def test_grib_ecc_1007():
    # Issue ECC-1007: Python3 interface cannot write large arrays
    gid = eccodes.codes_grib_new_from_samples("regular_ll_sfc_grib2")
    numvals = 1501 * 1501
    values = np.zeros((numvals, ))
    values[0] = 12  # Make sure it's not a constant field
    eccodes.codes_set_values(gid, values)
    maxv = eccodes.eccodes.codes_get(gid, "max")
    minv = eccodes.eccodes.codes_get(gid, "min")
    assert minv == 0
    assert maxv == 12
    eccodes.codes_release(gid)
示例#16
0
def test_grib_keys_iterator():
    gid = eccodes.codes_grib_new_from_samples("reduced_gg_pl_1280_grib1")
    iterid = eccodes.eccodes.codes_keys_iterator_new(gid, "ls")
    count = 0
    while eccodes.codes_keys_iterator_next(iterid):
        keyname = eccodes.codes_keys_iterator_get_name(iterid)
        keyval = eccodes.codes_get_string(gid, keyname)
        assert len(keyval) > 0
        count += 1
    assert count == 10
    eccodes.codes_keys_iterator_rewind(iterid)
    eccodes.eccodes.codes_keys_iterator_delete(iterid)
    eccodes.codes_release(gid)
示例#17
0
def cli(output_file_path):
    handle = eccodes.codes_grib_new_from_samples('regular_ll_pl_grib2')

    value_size = eccodes.codes_get_size(handle, 'values')
    values = []
    for i in range(0, value_size):
        values.append(i)
    eccodes.codes_set_values(handle, values)

    with open(output_file_path, 'wb') as output_file:
        eccodes.codes_write(handle, output_file)

    eccodes.codes_release(handle)
示例#18
0
def test_grib_set_key_vals():
    gid = eccodes.codes_grib_new_from_samples("GRIB2")
    # String
    eccodes.codes_set_key_vals(gid, "shortName=z,dataDate=20201112")
    assert eccodes.codes_get(gid, "shortName", str) == "z"
    assert eccodes.codes_get(gid, "date", int) == 20201112
    # List
    eccodes.codes_set_key_vals(gid, ["shortName=2t", "dataDate=20191010"])
    assert eccodes.codes_get(gid, "shortName", str) == "2t"
    assert eccodes.codes_get(gid, "date", int) == 20191010
    # Dictionary
    eccodes.codes_set_key_vals(gid, {"shortName": "msl", "dataDate": 20181010})
    assert eccodes.codes_get(gid, "shortName", str) == "msl"
    assert eccodes.codes_get(gid, "date", int) == 20181010
    eccodes.codes_release(gid)
示例#19
0
def test_new_from_message():
    gid = eccodes.codes_grib_new_from_samples("sh_sfc_grib1")
    message = eccodes.codes_get_message(gid)
    eccodes.codes_release(gid)
    assert len(message) == 9358
    newgid = eccodes.codes_new_from_message(message)
    assert eccodes.codes_get(newgid, "packingType") == "spectral_complex"
    assert eccodes.codes_get(newgid, "gridType") == "sh"
    eccodes.codes_release(newgid)

    # This time read from a string rather than a file
    metar_str = "METAR LQMO 022350Z 09003KT 6000 FEW010 SCT035 BKN060 08/08 Q1003="
    newgid = eccodes.codes_new_from_message(metar_str)
    cccc = eccodes.codes_get(newgid, "CCCC")
    assert cccc == "LQMO"
    eccodes.codes_release(newgid)
示例#20
0
def test_grib_geoiterator():
    gid = eccodes.codes_grib_new_from_samples("reduced_gg_pl_256_grib2")
    iterid = eccodes.codes_grib_iterator_new(gid, 0)
    i = 0
    while 1:
        result = eccodes.codes_grib_iterator_next(iterid)
        if not result:
            break
        [lat, lon, value] = result
        assert -90.0 < lat < 90.00
        assert 0.0 <= lon < 360.0
        assert math.isclose(value, 1.0, abs_tol=0.001)
        i += 1
    assert i == 348528
    eccodes.codes_grib_iterator_delete(iterid)
    eccodes.codes_release(gid)
示例#21
0
def test_grib_multi_field_write(tmpdir):
    # Note: eccodes.codes_grib_multi_new() calls codes_grib_multi_support_on()
    #       hence the 'finally' block
    try:
        gid = eccodes.codes_grib_new_from_samples("GRIB2")
        mgid = eccodes.codes_grib_multi_new()
        section_num = 4
        for step in range(12, 132, 12):
            eccodes.codes_set(gid, "step", step)
            eccodes.codes_grib_multi_append(gid, section_num, mgid)
        output = tmpdir.join("test_grib_multi_field_write.grib2")
        with open(str(output), "wb") as fout:
            eccodes.codes_grib_multi_write(mgid, fout)
        eccodes.codes_grib_multi_release(mgid)
        eccodes.codes_release(gid)
    finally:
        eccodes.codes_grib_multi_support_off()
示例#22
0
def test_grib_nearest2():
    if "codes_grib_nearest_new" not in dir(eccodes):
        return
    gid = eccodes.codes_grib_new_from_samples("gg_sfc_grib2")
    lat, lon = 40, 20
    flags = eccodes.CODES_GRIB_NEAREST_SAME_GRID | eccodes.CODES_GRIB_NEAREST_SAME_POINT
    nid = eccodes.codes_grib_nearest_new(gid)
    assert nid > 0
    nearest = eccodes.codes_grib_nearest_find(nid, gid, lat, lon, flags)
    assert len(nearest) == 4
    expected_indexes = (2679, 2678, 2517, 2516)
    returned_indexes = (
        nearest[0].index,
        nearest[1].index,
        nearest[2].index,
        nearest[3].index,
    )
    assert sorted(expected_indexes) == sorted(returned_indexes)
    assert math.isclose(nearest[0].value, 295.22085, abs_tol=0.0001)
    assert math.isclose(nearest[2].distance, 24.16520, abs_tol=0.0001)
    eccodes.codes_release(gid)
    eccodes.codes_grib_nearest_delete(nid)
示例#23
0
def test_grib_nearest():
    gid = eccodes.codes_grib_new_from_samples("reduced_gg_ml_grib2")
    lat, lon = 30, -20
    nearest = eccodes.codes_grib_find_nearest(gid, lat, lon)[0]
    assert nearest.index == 1770
    lat, lon = 10, 0
    nearest = eccodes.codes_grib_find_nearest(gid, lat, lon)[0]
    assert nearest.index == 2545
    lat, lon = 10, 20
    nearest = eccodes.codes_grib_find_nearest(gid, lat, lon, False, 4)
    expected_indexes = (2553, 2552, 2425, 2424)
    returned_indexes = (
        nearest[0].index,
        nearest[1].index,
        nearest[2].index,
        nearest[3].index,
    )
    assert sorted(expected_indexes) == sorted(returned_indexes)
    # Cannot do more than 4 nearest neighbours
    with pytest.raises(ValueError):
        eccodes.codes_grib_find_nearest(gid, lat, lon, False, 5)
    eccodes.codes_release(gid)
示例#24
0
def test_grib_set_string():
    gid = eccodes.codes_grib_new_from_samples("regular_gg_sfc_grib2")
    eccodes.codes_set(gid, "gridType", "reduced_gg")
    eccodes.codes_release(gid)
示例#25
0
def test_codes_is_defined():
    gid = eccodes.codes_grib_new_from_samples("sh_sfc_grib1")
    assert eccodes.codes_is_defined(gid, "JS")
示例#26
0
def test_grib_get_error():
    gid = eccodes.codes_grib_new_from_samples("regular_ll_sfc_grib2")
    # Note: AssertionError can be raised when type checks are enabled
    with pytest.raises((ValueError, AssertionError)):
        eccodes.codes_get(gid, None)
示例#27
0
def test_grib_get_message_size():
    gid = eccodes.codes_grib_new_from_samples("GRIB2")
    assert eccodes.codes_get_message_size(gid) == 179
示例#28
0
def test_grib_get_message_offset():
    gid = eccodes.codes_grib_new_from_samples("GRIB2")
    assert eccodes.codes_get_message_offset(gid) == 0
示例#29
0
def test_grib_get_double_element():
    gid = eccodes.codes_grib_new_from_samples("gg_sfc_grib2")
    elem = eccodes.codes_get_double_element(gid, "values", 1)
    assert math.isclose(elem, 259.9865, abs_tol=0.001)
    eccodes.codes_release(gid)