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
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, )
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, )
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, )
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, )
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, )
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'"
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", )
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", )
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." )
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)
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)
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)
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." )
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." )
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
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
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]
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.")
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
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)
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", )
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
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
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
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
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
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
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
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