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
示例#3
0
 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
示例#6
0
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)
示例#7
0
 def time_save(self, _, n):
     save_regridder(self.rg, self.destination_file)