Exemplo n.º 1
0
def test_subset_with_lat_lon_single_values(load_esgf_test_data):
    """Creates subset where lat and lon only have one value. Then
    subsets that. This tests that the `lat_bnds` and `lon_bnds`
    are not being reversed by the `_check_desc_coords` function in
    `clisops.core.subset`.
    """
    area = (20.0, 10.0, 250.0, 90.0)

    outputs = subset(
        ds=CMIP6_RLDS,
        time=("2001-01-01T00:00:00", "2002-12-30T00:00:00"),
        area=area,
        output_type="xarray",
    )

    ds = outputs[0]

    outputs2 = subset(
        ds=ds,
        time=("2001-01-01T00:00:00", "2002-12-30T00:00:00"),
        area=area,
        output_type="xarray",
    )

    ds2 = outputs2[0]
    assert len(ds2.lat) == 1
    assert len(ds2.lon) == 1
Exemplo n.º 2
0
def test_subset_invalid_area(tmpdir):
    """ Tests subset with invalid area param."""
    with pytest.raises(InvalidParameterValue):
        subset(
            ds=CMIP5_TAS_FILE,
            area=("zero", 49.0, 10.0, 65.0),
            output_dir=tmpdir,
        )
Exemplo n.º 3
0
def test_subset_no_ds(tmpdir):
    """ Tests subset with no dataset provided."""
    with pytest.raises(TypeError):
        subset(
            time=("2020-01-01T00:00:00", "2020-12-30T00:00:00"),
            area=(0, -90.0, 360.0, 90.0),
            output_dir=tmpdir,
        )
Exemplo n.º 4
0
def test_subset_invalid_area(cmip5_tas_file, tmpdir):
    """Tests subset with invalid area param."""
    with pytest.raises(InvalidParameterValue):
        subset(
            ds=cmip5_tas_file,
            area=("zero", 49.0, 10.0, 65.0),
            output_dir=tmpdir,
        )
Exemplo n.º 5
0
def test_subset_invalid_time(tmpdir):
    """ Tests subset with invalid time param."""
    with pytest.raises(InvalidParameterValue):
        subset(
            dset=CMIP5_TAS_FILE,
            time=("yesterday", "2020-12-30T00:00:00"),
            output_dir=tmpdir,
        )
Exemplo n.º 6
0
def test_subset_ds_is_none(tmpdir):
    """ Tests subset with ds=None."""
    with pytest.raises(MissingParameterValue):
        subset(
            ds=None,
            time=("2020-01-01T00:00:00", "2020-12-30T00:00:00"),
            area=(0, -90.0, 360.0, 90.0),
            output_dir=tmpdir,
        )
Exemplo n.º 7
0
def test_time_invariant_subset_with_time(load_esgf_test_data):

    with pytest.raises(AttributeError) as exc:
        subset(
            ds=CMIP6_MRSOFC,
            time=("2005-01-01T00:00:00", "2020-12-30T00:00:00"),
            area=(5.0, 10.0, 360.0, 90.0),
            output_type="xarray",
        )
    assert str(exc.value) == "'Dataset' object has no attribute 'time'"
Exemplo n.º 8
0
def test_subset_invalid_time(tmpdir):
    """ Tests subset with invalid time param."""
    with pytest.raises(InvalidParameterValue):
        subset(
            ds=CMIP5_TAS_FILE,
            time=("yesterday", "2020-12-30T00:00:00"),
            area=(0, -90.0, 360.0, 90.0),
            output_dir=tmpdir,
            output_type="nc",
            file_namer="simple",
        )
Exemplo n.º 9
0
def test_0_360_cross(tmpdir):
    ds = _load_ds(
        "/badc/cmip6/data/CMIP6/CMIP/IPSL/IPSL-CM6A-LR/historical/r1i1p1f1/Amon/rlds/gr/v20180803/"
        "rlds_Amon_IPSL-CM6A-LR_historical_r1i1p1f1_gr_185001-201412.nc")

    with pytest.raises(NotImplementedError):
        subset(
            ds=ds,
            area=(-50.0, -90.0, 100.0, 90.0),
            output_dir=tmpdir,
            output_type="nc",
            file_namer="simple",
        )
Exemplo n.º 10
0
def test_curvilinear_ds_no_data_in_bbox():

    with pytest.raises(ValueError) as exc:
        subset(
            ds=CMIP6_TOS_ONE_TIME_STEP,
            area="1,5,1.2,4",
            time="2021-01-01/2050-12-31",
            output_type="xarray",
        )
    assert (
        str(exc.value) ==
        "There were no valid data points found in the requested subset. Please expand the area covered by the bounding box."
    )
Exemplo n.º 11
0
    def test_reverse_level(self, cmip6_o3):
        result = subset(
            ds=cmip6_o3,
            level="100000/100",
            output_type="xarray",
        )

        result_rev = subset(
            ds=cmip6_o3,
            level="100/100000",
            output_type="xarray",
        )

        np.testing.assert_array_equal(result[0].o3, result_rev[0].o3)
Exemplo n.º 12
0
    def test_reverse_lat_and_lon_curvilinear(self, load_esgf_test_data):
        result = subset(
            ds=CMIP6_TOS_ONE_TIME_STEP,
            area=(20, -45, 240, 45),
            output_type="xarray",
        )

        result_rev = subset(
            ds=CMIP6_TOS_ONE_TIME_STEP,
            area=(20, 45, 240, -45),
            output_type="xarray",
        )

        np.testing.assert_array_equal(result[0].tos, result_rev[0].tos)
Exemplo n.º 13
0
    def test_reverse_lat_and_lon_regular(self, load_esgf_test_data):
        result = subset(
            ds=CMIP6_RLDS_ONE_TIME_STEP,
            area=(-70, -45, 240, 45),
            output_type="xarray",
        )

        result_rev = subset(
            ds=CMIP6_RLDS_ONE_TIME_STEP,
            area=(240, 45, -70, -45),
            output_type="xarray",
        )

        np.testing.assert_array_equal(result[0].rlds, result_rev[0].rlds)
Exemplo n.º 14
0
def test_no_lon_in_range():

    with pytest.raises(Exception) as exc:
        subset(
            ds=CMIP6_RLDS_ONE_TIME_STEP,
            area=(8.37, -90, 8.56, 90),
            time=("2006-01-01T00:00:00", "2099-12-30T00:00:00"),
            output_type="xarray",
        )

    assert (
        str(exc.value) ==
        "There were no valid data points found in the requested subset. Please expand "
        "the area covered by the bounding box, the time period or the level range you have selected."
    )
Exemplo n.º 15
0
def test_curvilinear_ds_no_data_in_bbox_real_data_swap_lat():
    ds = _load_ds(
        "/badc/cmip6/data/CMIP6/ScenarioMIP/CNRM-CERFACS/CNRM-CM6-1/ssp245/r1i1p1f2/Omon/tos/gn/v20190219/tos_Omon_CNRM-CM6-1_ssp245_r1i1p1f2_gn_201501-210012.nc"
    )
    with pytest.raises(ValueError) as exc:
        subset(
            ds=ds,
            area="1,4,2,40",
            time="2021-01-01/2050-12-31",
            output_type="xarray",
        )
    assert (
        str(exc.value) ==
        "There were no valid data points found in the requested subset. Please expand the area covered by the bounding box."
    )
Exemplo n.º 16
0
def test_general_subset_dset(tmpdir):
    """ Tests clisops subset function with only a dataset"""
    result = subset(
        dset=TAS_NC,
        output_dir=tmpdir,
    )
    assert "output.nc" in result
Exemplo n.º 17
0
def test_roll_convert_lon_coords(load_esgf_test_data):
    ds, lon = setup_test()
    # work out how much to roll by
    offset = calculate_offset(180)

    ds_roll = ds.roll(shifts={f"{lon.name}": offset}, roll_coords=False)

    # check roll with roll_coords=False actually does something
    np.testing.assert_raises(
        AssertionError,
        np.testing.assert_array_equal,
        ds_roll.rlds.values,
        ds.rlds.values,
    )

    ds_roll.coords[lon.name] = ds_roll.coords[lon.name] - 180

    assert isclose(ds_roll.lon.values.min(), -180, abs_tol=10**2)
    assert isclose(ds_roll.lon.values.max(), 180, abs_tol=10**2)

    result = subset(
        ds=ds_roll,
        area=(-50.0, -90.0, 100.0, 90.0),
        output_type="xarray",
    )

    assert result
Exemplo n.º 18
0
def test_subset_with_time_and_area(cmip5_tas_file, tmpdir):
    """Tests clisops subset function with time and area subsets.

    On completion:
    - assert all dimensions have been reduced.

    """
    start_time, end_time = ("2019-01-16", "2020-12-16")
    bbox = (0.0, -80, 170.0, 65.0)

    outputs = subset(
        ds=cmip5_tas_file,
        time=(start_time, end_time),
        area=bbox,
        output_dir=tmpdir,
        output_type="xarray",
    )

    ds = outputs[0]

    assert _format_time(ds.time.values.min()) == start_time
    assert _format_time(ds.time.values.max()) == end_time

    assert ds.lon.values.tolist() == [0]
    assert ds.lat.values.tolist() == [35]
Exemplo n.º 19
0
def test_cross_prime_meridian(tmpdir):
    ds = _load_ds(
        "/badc/cmip6/data/CMIP6/ScenarioMIP/MIROC/MIROC6/ssp119/r1i1p1f1/day/tas/gn/v20191016"
        "/tas_day_MIROC6_ssp119_r1i1p1f1_gn_20150101-20241231.nc")

    with pytest.raises(NotImplementedError) as exc:
        subset(
            ds=ds,
            area=(-5, 50, 30, 65),
            output_dir=tmpdir,
            output_type="nc",
            file_namer="simple",
        )
    assert (str(exc.value) ==
            "Input longitude bounds ([-5. 30.]) cross the 0 degree meridian "
            "but dataset longitudes are all positive.")
Exemplo n.º 20
0
def test_time_slices_in_subset_rh():
    start_time, end_time = "2001-01-01T00:00:00", "2200-12-30T00:00:00"

    time_slices = [
        ("2001-01-16", "2002-09-16"),
        ("2002-10-16", "2004-06-16"),
        ("2004-07-16", "2005-11-16"),
    ]

    config_max_file_size = CONFIG["clisops:write"]["file_size_limit"]
    temp_max_file_size = "10KB"
    CONFIG["clisops:write"]["file_size_limit"] = temp_max_file_size
    outputs = subset(
        ds=CMIP5_RH,
        time=(start_time, end_time),
        area=(0.0, 5.0, 50.0, 90.0),
        output_type="xarray",
        file_namer="simple",
    )
    CONFIG["clisops:write"]["file_size_limit"] = config_max_file_size

    assert _format_time(outputs[0].time.values.min()) >= start_time
    assert _format_time(outputs[-1].time.values.max()) <= end_time

    count = 0
    for _ in outputs:
        assert _format_time(
            outputs[count].time.values.min()) >= time_slices[count][0]
        assert _format_time(
            outputs[count].time.values.max()) >= time_slices[count][1]
        count += 1
Exemplo n.º 21
0
def test_subset_level(tmpdir):
    """ Tests clisops subset function with a level subset."""
    # Levels are: 100000, ..., 100
    ds = _load_ds(CMIP6_O3)

    result1 = subset(ds=CMIP6_O3, level="100000/100", output_type="xarray")

    np.testing.assert_array_equal(result1[0].o3.values, ds.o3.values)

    result2 = subset(ds=CMIP6_O3, level="100/100", output_type="xarray")

    np.testing.assert_array_equal(result2[0].o3.shape, (1200, 1, 2, 3))

    result3 = subset(ds=CMIP6_O3, level="101/-23.234", output_type="xarray")

    np.testing.assert_array_equal(result3[0].o3.values, result2[0].o3.values)
Exemplo n.º 22
0
def test_xarray_roll_lon(tmpdir, load_esgf_test_data):
    ds, lon = setup_test()

    # work out how much to roll by
    offset = calculate_offset(180)

    ds_roll = ds.roll(shifts={f"{lon.name}": offset}, roll_coords=True)

    # testing after rolling still raises an error
    with pytest.raises(NotImplementedError):
        subset(
            ds=ds_roll,
            area=(-50.0, -90.0, 100.0, 90.0),
            output_dir=tmpdir,
            output_type="nc",
            file_namer="simple",
        )
Exemplo n.º 23
0
def test_general_subset_space(tmpdir):
    """ Tests clisops subset function with a space subset."""
    result = subset(
        dset=TAS_NC,
        space=(0.0, 49.0, 10.0, 65.0),
        output_dir=tmpdir,
    )
    assert "output.nc" in result
Exemplo n.º 24
0
def test_general_subset_time(tmpdir):
    """ Tests clisops subset function with a time subset."""
    result = subset(
        dset=TAS_NC,
        time=("2020-01-01T00:00:00", "2020-12-30T00:00:00"),
        output_dir=tmpdir,
    )
    assert "output.nc" in result
Exemplo n.º 25
0
def test_subset_with_multiple_files_rh(tmpdir):
    """ Tests with multiple rh files"""
    result = subset(
        dset=CMIP5_RH,
        time=("2020-01-01T00:00:00", "2020-12-30T00:00:00"),
        output_dir=tmpdir,
    )
    assert "output.nc" in result
Exemplo n.º 26
0
def test_subset_with_multiple_files_zostoga(tmpdir):
    """ Tests with multiple tas files"""
    result = subset(
        dset=CMIP5_ZOSTOGA,
        time=("2020-01-01T00:00:00", "2020-12-30T00:00:00"),
        output_dir=tmpdir,
    )
    assert "output.nc" in result
Exemplo n.º 27
0
def test_subset_with_tas_series(tmpdir, tas_series):
    """ Test with tas_series fixture"""
    result = subset(
        dset=tas_series(["20", "22", "25"]),
        time=("2020-01-01T00:00:00", "2020-12-30T00:00:00"),
        output_dir=tmpdir,
    )
    assert "output.nc" in result
Exemplo n.º 28
0
def test_general_subset_all(tmpdir):
    """ Tests clisops subset function with time, space, level subsets."""
    result = subset(
        dset=TAS_NC,
        time=("2020-01-01T00:00:00", "2020-12-30T00:00:00"),
        space=(0.0, 49.0, 10.0, 65.0),
        output_dir=tmpdir,
    )
    assert "output.nc" in result
Exemplo n.º 29
0
def test_subset_with_multiple_files_tas(tmpdir):
    """ Tests with multiple tas files"""
    result = subset(
        dset=CMIP5_TAS,
        time=("2020-01-01T00:00:00", "2020-12-30T00:00:00"),
        space=(0.0, 49.0, 10.0, 65.0),
        output_dir=tmpdir,
    )
    assert "output.nc" in result
Exemplo n.º 30
0
def test_subset_with_time_and_space(tmpdir):
    """ Tests clisops subset function with time, space, level subsets."""
    result = subset(
        dset=CMIP5_TAS_FILE,
        time=("2020-01-01T00:00:00", "2020-12-30T00:00:00"),
        space=(0.0, 49.0, 10.0, 65.0),
        output_dir=tmpdir,
    )
    assert "output.nc" in result