def test_MeshToGridESMFRegridder_bilinear_round_trip(tmp_path): """Test save/load round tripping for `MeshToGridESMFRegridder`.""" original_rg, src = _make_mesh_to_grid_regridder(method="bilinear") filename = tmp_path / "regridder.nc" save_regridder(original_rg, filename) loaded_rg = load_regridder(str(filename)) assert original_rg.location == loaded_rg.location assert original_rg.method == loaded_rg.method assert original_rg.mdtol == loaded_rg.mdtol assert original_rg.grid_x == loaded_rg.grid_x assert original_rg.grid_y == loaded_rg.grid_y # TODO: uncomment when iris mesh comparison becomes available. # assert original_rg.mesh == loaded_rg.mesh # Compare the weight matrices. original_matrix = original_rg.regridder.weight_matrix loaded_matrix = loaded_rg.regridder.weight_matrix # Ensure the original and loaded weight matrix have identical type. assert type(original_matrix) is type(loaded_matrix) # noqa E721 assert np.array_equal(original_matrix.todense(), loaded_matrix.todense()) # Demonstrate regridding still gives the same results. src_data = ma.arange(np.product(src.data.shape)).reshape(src.data.shape) src_data[0] = ma.masked src.data = src_data original_result = original_rg(src).data loaded_result = loaded_rg(src).data assert np.array_equal(original_result, loaded_result) assert np.array_equal(original_result.mask, loaded_result.mask) # Ensure version data is equal. assert original_rg.regridder.esmf_version == loaded_rg.regridder.esmf_version assert (original_rg.regridder.esmf_regrid_version == loaded_rg.regridder.esmf_regrid_version)
def setup_cache(self): from esmf_regrid.experimental.io import save_regridder SYNTH_DATA_DIR = Path().cwd() / "tmp_data" SYNTH_DATA_DIR.mkdir(exist_ok=True) destination_file = str(SYNTH_DATA_DIR.joinpath("destination.nc")) file_dict = {"destination": destination_file} for tp in self.params[0]: ( lon_bounds, lat_bounds, n_lons_src, n_lats_src, n_lons_tgt, n_lats_tgt, _, alt_coord_system, ) = self.get_args(tp) src_grid = _grid_cube( n_lons_src, n_lats_src, lon_bounds, lat_bounds, alt_coord_system=alt_coord_system, ) tgt_grid = _grid_cube( n_lons_tgt, n_lats_tgt, lon_bounds, lat_bounds, alt_coord_system=alt_coord_system, ) src_mesh_cube = _gridlike_mesh_cube( n_lons_src, n_lats_src, ) tgt_mesh_cube = _gridlike_mesh_cube( n_lons_tgt, n_lats_tgt, ) rg_dict = {} rg_dict["mesh_to_grid"] = MeshToGridESMFRegridder( src_mesh_cube, tgt_grid) rg_dict["grid_to_mesh"] = GridToMeshESMFRegridder( src_grid, tgt_mesh_cube) for rgt in self.params[1]: regridder = rg_dict[rgt] source_file = str( SYNTH_DATA_DIR.joinpath(f"source_{tp}_{rgt}.nc")) save_regridder(regridder, source_file) file_dict[(tp, rgt)] = source_file return file_dict
def setup_cache(self): SYNTH_DATA_DIR = Path().cwd() / "tmp_data" SYNTH_DATA_DIR.mkdir(exist_ok=True) destination_file = str(SYNTH_DATA_DIR.joinpath("dest_rg.nc")) file_dict = {"destination": destination_file} for n in self.params: super().setup(n) rg = self.regridder(self.src, self.tgt) source_file = str(SYNTH_DATA_DIR.joinpath(f"source_rg_{n}.nc")) save_regridder(rg, source_file) file_dict[n] = source_file return file_dict
def test_MeshToGridESMFRegridder_curvilinear_round_trip(tmp_path): """Test save/load round tripping for `MeshToGridESMFRegridder`.""" original_rg, src = _make_mesh_to_grid_regridder(grid_dims=2) filename = tmp_path / "regridder.nc" save_regridder(original_rg, filename) loaded_rg = load_regridder(str(filename)) assert original_rg.grid_x == loaded_rg.grid_x assert original_rg.grid_y == loaded_rg.grid_y # Demonstrate regridding still gives the same results. src_data = ma.arange(np.product(src.data.shape)).reshape(src.data.shape) src_data[0] = ma.masked src.data = src_data original_result = original_rg(src).data loaded_result = loaded_rg(src).data assert np.array_equal(original_result, loaded_result) assert np.array_equal(original_result.mask, loaded_result.mask)
def test_GridToMeshESMFRegridder_round_trip(tmp_path): """Test save/load round tripping for `GridToMeshESMFRegridder`.""" original_rg, src = _make_grid_to_mesh_regridder(circular=True) filename = tmp_path / "regridder.nc" save_regridder(original_rg, filename) loaded_rg = load_regridder(str(filename)) assert original_rg.location == loaded_rg.location assert original_rg.method == loaded_rg.method assert original_rg.mdtol == loaded_rg.mdtol assert original_rg.grid_x == loaded_rg.grid_x assert original_rg.grid_y == loaded_rg.grid_y # TODO: uncomment when iris mesh comparison becomes available. # assert original_rg.mesh == loaded_rg.mesh # Compare the weight matrices. original_matrix = original_rg.regridder.weight_matrix loaded_matrix = loaded_rg.regridder.weight_matrix # Ensure the original and loaded weight matrix have identical type. assert type(original_matrix) is type(loaded_matrix) # noqa E721 assert np.array_equal(original_matrix.todense(), loaded_matrix.todense()) # Demonstrate regridding still gives the same results. src_data = ma.arange(np.product(src.data.shape)).reshape(src.data.shape) src_data[0, 0] = ma.masked src.data = src_data # TODO: make this a cube comparison when mesh comparison becomes available. original_result = original_rg(src).data loaded_result = loaded_rg(src).data assert np.array_equal(original_result, loaded_result) assert np.array_equal(original_result.mask, loaded_result.mask) # Ensure version data is equal. assert original_rg.regridder.esmf_version == loaded_rg.regridder.esmf_version assert (original_rg.regridder.esmf_regrid_version == loaded_rg.regridder.esmf_regrid_version) # Ensure resolution is equal. assert original_rg.resolution == loaded_rg.resolution original_res_rg, _ = _make_grid_to_mesh_regridder(resolution=8) res_filename = tmp_path / "regridder_res.nc" save_regridder(original_res_rg, res_filename) loaded_res_rg = load_regridder(str(res_filename)) assert original_res_rg.resolution == loaded_res_rg.resolution assert (original_res_rg.regridder.src.resolution == loaded_res_rg.regridder.src.resolution) # Ensure grid equality for non-circular coords. original_nc_rg, _ = _make_grid_to_mesh_regridder(circular=False) nc_filename = tmp_path / "non_circular_regridder.nc" save_regridder(original_nc_rg, nc_filename) loaded_nc_rg = load_regridder(str(nc_filename)) assert original_nc_rg.grid_x == loaded_nc_rg.grid_x assert original_nc_rg.grid_y == loaded_nc_rg.grid_y
def test_invalid_type(tmp_path): """Test that `save_regridder` raises a TypeError where appropriate.""" invalid_obj = None filename = tmp_path / "regridder.nc" with pytest.raises(TypeError): save_regridder(invalid_obj, filename)
def time_save(self, _, n): save_regridder(self.rg, self.destination_file)