def test_already_collocated_in_col_gridded_to_ungridded_in_2d(self): from cis.collocation.col_implementations import GeneralUngriddedCollocator, nn_gridded cube = gridded_data.make_from_cube(mock.make_square_5x3_2d_cube()) # This point already exists on the cube with value 5 - which shouldn't be a problem sample_points = UngriddedData.from_points_array([HyperPoint(0.0, 0.0)]) col = GeneralUngriddedCollocator() new_data = col.collocate(sample_points, cube, None, nn_gridded())[0] eq_(new_data.data[0], 8.0)
def test_coordinates_outside_grid_in_col_gridded_to_ungridded_in_2d(self): from cis.collocation.col_implementations import GeneralUngriddedCollocator, nn_gridded cube = gridded_data.make_from_cube(mock.make_square_5x3_2d_cube()) sample_points = UngriddedData.from_points_array( [HyperPoint(5.5, 5.5), HyperPoint(-5.5, 5.5), HyperPoint(5.5, -5.5), HyperPoint(-5.5, -5.5)]) col = GeneralUngriddedCollocator() new_data = col.collocate(sample_points, cube, None, nn_gridded())[0] eq_(new_data.data[0], 12.0) eq_(new_data.data[1], 6.0) eq_(new_data.data[2], 10.0) eq_(new_data.data[3], 4.0)
def test_basic_col_gridded_to_ungridded_in_2d(self): from cis.collocation.col_implementations import GeneralUngriddedCollocator, nn_gridded cube = gridded_data.make_from_cube(mock.make_square_5x3_2d_cube()) sample_points = UngriddedData.from_points_array( [HyperPoint(lat=1.0, lon=1.0), HyperPoint(lat=4.0, lon=4.0), HyperPoint(lat=-4.0, lon=-4.0)]) col = GeneralUngriddedCollocator() new_data = col.collocate(sample_points, cube, None, nn_gridded())[0] eq_(new_data.data[0], 8.0) # float(cube[2,1].data)) eq_(new_data.data[1], 12.0) # float(cube[3,2].data)) eq_(new_data.data[2], 4.0) # float(cube[1,0].data))
def test_collocation_of_pres_points_on_hybrid_altitude_coordinates(self): from cis.collocation.col_implementations import GeneralUngriddedCollocator, nn_gridded import datetime as dt cube = gridded_data.make_from_cube(mock.make_mock_cube(time_dim_length=3, hybrid_ht_len=10)) sample_points = UngriddedData.from_points_array( [HyperPoint(lat=1.0, lon=1.0, pres=5000.0, t=dt.datetime(1984, 8, 28, 8, 34))]) col = GeneralUngriddedCollocator() new_data = col.collocate(sample_points, cube, None, nn_gridded())[0] # There is no pressure coordinate on the cube so no single value could be returned by the kernel eq_(new_data.data[0], np.inf)
def test_collocation_of_alt_points_on_hybrid_altitude_coordinates_on_0_360_grid(self): from cis.collocation.col_implementations import GeneralUngriddedCollocator, nn_gridded import datetime as dt cube = gridded_data.make_from_cube(mock.make_mock_cube(time_dim_length=3, hybrid_ht_len=10, lon_dim_length=36, lon_range=(0., 350.))) sample_points = UngriddedData.from_points_array( [HyperPoint(lat=1.0, lon=111.0, alt=5000.0, t=dt.datetime(1984, 8, 28, 8, 34)), HyperPoint(lat=4.0, lon=141.0, alt=12000.0, t=dt.datetime(1984, 8, 28, 8, 34))]) col = GeneralUngriddedCollocator() new_data = col.collocate(sample_points, cube, None, nn_gridded())[0] eq_(new_data.data[0], 2501.0) # float(cube[2,11,1,0].data)) eq_(new_data.data[1], 3675.0) # float(cube[3,14,1,4].data))
def test_negative_lon_points_dont_matter_with_0_360_grid_in_2d(self): from cis.collocation.col_implementations import GeneralUngriddedCollocator, nn_gridded # This cube is defined over a 0-360 longitude grid cube = gridded_data.make_from_cube(mock.make_dummy_2d_cube()) sample_points = UngriddedData.from_points_array( [HyperPoint(lat=1.0, lon=1.0), HyperPoint(lat=19.0, lon=44.0), HyperPoint(lat=-4.0, lon=-14.0), HyperPoint(lat=-4.0, lon=-44.0)]) col = GeneralUngriddedCollocator() new_data = col.collocate(sample_points, cube, None, nn_gridded())[0] eq_(new_data.data[0], 325.0) # float(cube[9,0].data) eq_(new_data.data[1], 365.0) # float(cube[10,4].data)) eq_(new_data.data[2], 324.0) # float(cube[8,35].data)) eq_(new_data.data[3], 321.0) # float(cube[8,32].data))
def test_basic_col_gridded_to_ungridded_in_2d_with_time(self): from cis.collocation.col_implementations import GeneralUngriddedCollocator, nn_gridded import datetime as dt cube = gridded_data.make_from_cube(mock.make_square_5x3_2d_cube_with_time()) sample_points = HyperPointList() sample_points.append(HyperPoint(lat=1.0, lon=1.0, t=dt.datetime(1984, 8, 28, 8, 34))) sample_points.append(HyperPoint(lat=4.0, lon=4.0, t=dt.datetime(1984, 8, 31, 1, 23))) sample_points.append(HyperPoint(lat=-4.0, lon=-4.0, t=dt.datetime(1984, 9, 2, 15, 54))) sample_points = UngriddedData.from_points_array(sample_points) col = GeneralUngriddedCollocator() new_data = col.collocate(sample_points, cube, None, nn_gridded())[0] eq_(new_data.data[0], 51.0) eq_(new_data.data[1], 82.0) eq_(new_data.data[2], 28.0)
def test_negative_lon_points_on_hybrid_altitude_coordinates_dont_matter(self): """This should give the same results as above""" from cis.collocation.col_implementations import GeneralUngriddedCollocator, nn_gridded import datetime as dt cube = gridded_data.make_from_cube(mock.make_mock_cube(time_dim_length=3, hybrid_ht_len=10)) sample_points = UngriddedData.from_points_array( # This point actually lies outside the lower bounds for altitude at this point in space [HyperPoint(lat=1.0, lon=1.0, alt=5000.0, t=dt.datetime(1984, 8, 28, 8, 34)), # This point lies in the middle of the altitude bounds at this point HyperPoint(lat=4.0, lon=4.0, alt=6000.0, t=dt.datetime(1984, 8, 28, 8, 34))]) col = GeneralUngriddedCollocator() new_data = col.collocate(sample_points, cube, None, nn_gridded())[0] eq_(new_data.data[0], 221.0) # float(cube[2,1,1,0].data)) eq_(new_data.data[1], 345.0) # float(cube[3,2,1,4].data))
def test_guessing_the_bounds_on_a_cube_doesnt_matter_for_negative_lon_points_on_a_0_360_grid_in_2d(self): """This should be identical to above but there was an issue in iris where this caused a problem""" from cis.collocation.col_implementations import GeneralUngriddedCollocator, nn_gridded # This cube is defined over a 0-360 longitude grid cube = gridded_data.make_from_cube(mock.make_dummy_2d_cube()) cube.coord(standard_name='longitude').guess_bounds() sample_points = UngriddedData.from_points_array( [HyperPoint(lat=1.0, lon=1.0), HyperPoint(lat=19.0, lon=44.0), HyperPoint(lat=-4.0, lon=-14.0), HyperPoint(lat=-4.0, lon=-44.0)]) col = GeneralUngriddedCollocator() new_data = col.collocate(sample_points, cube, None, nn_gridded())[0] eq_(new_data.data[0], 325.0) # float(cube[9,0].data) eq_(new_data.data[1], 365.0) # float(cube[10,4].data)) eq_(new_data.data[2], 324.0) # float(cube[8,35].data)) eq_(new_data.data[3], 321.0) # float(cube[8,32].data))
def test_coordinates_exactly_between_points_in_col_gridded_to_ungridded_in_2d(self): """ This works out the edge case where the points are exactly in the middle or two or more datapoints. Iris seems to count a point as 'belonging' to a datapoint if it is greater than a datapoint cell's lower bound and less than or equal to it's upper bound. Where a cell is an imaginary boundary around a datapoint which divides the grid. """ from cis.collocation.col_implementations import GeneralUngriddedCollocator, nn_gridded cube = gridded_data.make_from_cube(mock.make_square_5x3_2d_cube()) sample_points = UngriddedData.from_points_array( [HyperPoint(2.5, 2.5), HyperPoint(-2.5, 2.5), HyperPoint(2.5, -2.5), HyperPoint(-2.5, -2.5)]) col = GeneralUngriddedCollocator() new_data = col.collocate(sample_points, cube, None, nn_gridded())[0] eq_(new_data.data[0], 8.0) eq_(new_data.data[1], 5.0) eq_(new_data.data[2], 7.0) eq_(new_data.data[3], 4.0)
def test_gridded_ungridded_nn(self): data = make_from_cube(mock.make_mock_cube()) data.name = lambda: 'Name' data.var_name = 'var_name' data._standard_name = 'y_wind' sample = UngriddedData.from_points_array( [HyperPoint(lat=1.0, lon=1.0, alt=12.0, t=dt.datetime(1984, 8, 29, 8, 34)), HyperPoint(lat=3.0, lon=3.0, alt=7.0, t=dt.datetime(1984, 8, 29, 8, 34)), HyperPoint(lat=-1.0, lon=-1.0, alt=5.0, t=dt.datetime(1984, 8, 29, 8, 34))]) constraint = None kernel = nn_gridded() col = GeneralUngriddedCollocator() output = col.collocate(sample, data, constraint, kernel) expected_result = np.array([8, 12, 8]) assert len(output) == 1 assert isinstance(output, UngriddedDataList) assert np.allclose(output[0].data, expected_result)
def test_collocation_of_alt_points_on_hybrid_pressure_and_altitude_coordinates(self): """ Kernel should use the auxilliary altitude dimension when altitude is present in the coordinates """ from cis.collocation.col_implementations import GeneralUngriddedCollocator, nn_gridded import datetime as dt cube = gridded_data.make_from_cube(mock.make_mock_cube(time_dim_length=3, hybrid_pr_len=10)) sample_points = UngriddedData.from_points_array( # This point actually lies outside the lower bounds for altitude at this point in space [HyperPoint(lat=1.0, lon=1.0, alt=10, t=dt.datetime(1984, 8, 28, 8, 34)), # This point lies in the middle of the altitude bounds at this point HyperPoint(lat=4.0, lon=4.0, alt=354, t=dt.datetime(1984, 8, 28, 8, 34)), # This point lies outside the upper bounds for altitude at this point HyperPoint(lat=-4.0, lon=-4.0, alt=1000, t=dt.datetime(1984, 8, 27, 2, 18, 52))]) col = GeneralUngriddedCollocator() new_data = col.collocate(sample_points, cube, None, nn_gridded())[0] eq_(new_data.data[0], float(cube[2, 1, 1, 0].data)) eq_(new_data.data[1], float(cube[3, 2, 1, 4].data)) eq_(new_data.data[2], float(cube[1, 0, 0, 9].data))