def test_interpolation_mutable(): """test interpolation on mutable fields""" grid = UnitGrid([2], periodic=True) field = ScalarField(grid) for backend in ["numba", "scipy"]: field.data = 1 np.testing.assert_allclose(field.interpolate([0.5], backend=backend), 1) field.data = 2 np.testing.assert_allclose(field.interpolate([0.5], backend=backend), 2) # test overwriting field values data = np.full_like(field.data, 3) intp = field.make_interpolator(backend="numba") np.testing.assert_allclose(intp(np.array([0.5]), data), 3)
def test_poisson_solver_1d(): """ test the poisson solver on 1d grids """ # solve Laplace's equation grid = UnitGrid([4]) field = ScalarField(grid) res = field.solve_poisson([{"value": -1}, {"value": 3}]) np.testing.assert_allclose(res.data, grid.axes_coords[0] - 1) res = field.solve_poisson([{"value": -1}, {"derivative": 1}]) np.testing.assert_allclose(res.data, grid.axes_coords[0] - 1) # test Poisson equation with 2nd Order BC res = field.solve_poisson([{"value": -1}, "extrapolate"]) # solve Poisson's equation grid = CartesianGrid([[0, 1]], 4) field = ScalarField(grid, data=1) res = field.copy() field.solve_poisson([{"value": 1}, {"derivative": 1}], out=res) xs = grid.axes_coords[0] np.testing.assert_allclose(res.data, 1 + 0.5 * xs**2, rtol=1e-2) # test inconsistent problem field.data = 1 with pytest.raises(RuntimeError, match="Neumann"): field.solve_poisson({"derivative": 0})
def test_insert_scalar(example_grid): """test the `insert` method""" f = ScalarField(example_grid) a = np.random.random() c = tuple(example_grid.point_to_cell(example_grid.get_random_point())) p = example_grid.cell_to_point(c, cartesian=False) f.insert(p, a) assert f.data[c] == pytest.approx(a / example_grid.cell_volumes[c]) f.insert(example_grid.get_random_point(cartesian=False), a) assert f.integral == pytest.approx(2 * a) f.data = 0 # reset insert = example_grid.make_inserter_compiled() c = tuple(example_grid.point_to_cell(example_grid.get_random_point())) p = example_grid.cell_to_point(c, cartesian=False) insert(f.data, p, a) assert f.data[c] == pytest.approx(a / example_grid.cell_volumes[c]) insert(f.data, example_grid.get_random_point(cartesian=False), a) assert f.integral == pytest.approx(2 * a)
def test_insert_scalar(grid): """test the `insert` method""" f = ScalarField(grid) a = np.random.random() c = tuple(grid.get_random_point(coords="cell")) p = grid.transform(c, "cell", "grid") f.insert(p, a) assert f.data[c] == pytest.approx(a / grid.cell_volumes[c]) f.insert(grid.get_random_point(coords="grid"), a) assert f.integral == pytest.approx(2 * a) f.data = 0 # reset insert = grid.make_inserter_compiled() c = tuple(grid.get_random_point(coords="cell")) p = grid.transform(c, "cell", "grid") insert(f.data, p, a) assert f.data[c] == pytest.approx(a / grid.cell_volumes[c]) insert(f.data, grid.get_random_point(coords="grid"), a) assert f.integral == pytest.approx(2 * a)