def test_findiff_cyl(): """test operator for a simple cylindrical grid. Note that we only really test the polar symmetry""" grid = CylindricalGrid(1.5, [0, 1], (3, 2), periodic_z=True) _, r1, r2 = grid.axes_coords[0] np.testing.assert_array_equal(grid.discretization, np.full(2, 0.5)) s = ScalarField(grid, [[1, 1], [2, 2], [4, 4]]) v = VectorField(grid, [[[1, 1], [2, 2], [4, 4]], [[0, 0]] * 3, [[0, 0]] * 3]) # test gradient grad = s.gradient(bc=["value", "periodic"]) np.testing.assert_allclose(grad.data[0], [[1, 1], [3, 3], [-6, -6]]) grad = s.gradient(bc=["derivative", "periodic"]) np.testing.assert_allclose(grad.data[0], [[1, 1], [3, 3], [2, 2]]) # test divergence div = v.divergence(bc=["value", "periodic"]) y1 = 3 + 2 / r1 y2 = -6 + 4 / r2 np.testing.assert_allclose(div.data, [[5, 5], [y1, y1], [y2, y2]]) div = v.divergence(bc=["derivative", "periodic"]) y2 = 2 + 4 / r2 np.testing.assert_allclose(div.data, [[5, 5], [y1, y1], [y2, y2]]) # test laplace lap = s.laplace(bc=[{"type": "value", "value": 3}, "periodic"]) y1 = 4 + 3 / r1 y2 = -16 np.testing.assert_allclose(lap.data, [[8, 8], [y1, y1], [y2, y2]]) lap = s.laplace(bc=[{"type": "derivative", "value": 3}, "periodic"]) y2 = -2 + 3.5 / r2 np.testing.assert_allclose(lap.data, [[8, 8], [y1, y1], [y2, y2]])
def test_divergence(): """test the divergence operator""" grid = CartesianGrid([[0, 2 * np.pi], [0, 2 * np.pi]], [16, 16], periodic=True) x, y = grid.cell_coords[..., 0], grid.cell_coords[..., 1] data = [np.cos(x) + y, np.sin(y) - x] v = VectorField(grid, data) s1 = v.divergence("auto_periodic_neumann") assert s1.data.shape == (16, 16) div = np.cos(y) - np.sin(x) np.testing.assert_allclose(s1.data, div, rtol=0.1, atol=0.1) v.divergence("auto_periodic_neumann", out=s1) assert s1.data.shape == (16, 16) np.testing.assert_allclose(s1.data, div, rtol=0.1, atol=0.1)
def test_findiff_sph(): """test operator for a simple spherical grid""" grid = SphericalSymGrid(1.5, 3) _, r1, r2 = grid.axes_coords[0] assert grid.discretization == (0.5, ) s = ScalarField(grid, [1, 2, 4]) v = VectorField(grid, [[1, 2, 4], [0] * 3, [0] * 3]) # test gradient grad = s.gradient(bc="value") np.testing.assert_allclose(grad.data[0, :], [1, 3, -6]) grad = s.gradient(bc="derivative") np.testing.assert_allclose(grad.data[0, :], [1, 3, 2]) # test divergence div = v.divergence(bc="value", conservative=False) np.testing.assert_allclose(div.data, [9, 3 + 4 / r1, -6 + 8 / r2]) div = v.divergence(bc="derivative", conservative=False) np.testing.assert_allclose(div.data, [9, 3 + 4 / r1, 2 + 8 / r2])
def test_findiff(): """ test operator for a simple polar grid """ grid = PolarGrid(1.5, 3) _, _, r2 = grid.axes_coords[0] assert grid.discretization == (0.5, ) s = ScalarField(grid, [1, 2, 4]) v = VectorField(grid, [[1, 2, 4], [0] * 3]) # test gradient grad = s.gradient(bc="value") np.testing.assert_allclose(grad.data[0, :], [1, 3, -6]) grad = s.gradient(bc="derivative") np.testing.assert_allclose(grad.data[0, :], [1, 3, 2]) # test divergence div = v.divergence(bc="value") np.testing.assert_allclose(div.data, [5, 17 / 3, -6 + 4 / r2]) div = v.divergence(bc="derivative") np.testing.assert_allclose(div.data, [5, 17 / 3, 2 + 4 / r2])
def test_divergence_field_cyl(): """ test the divergence operator """ grid = CylindricalGrid(2 * np.pi, [0, 2 * np.pi], [8, 16], periodic_z=True) r, z = grid.cell_coords[..., 0], grid.cell_coords[..., 1] data = [ np.cos(r) + np.sin(z)**2, np.cos(r)**2 + np.sin(z), np.zeros_like(r) ] v = VectorField(grid, data=data) s = v.divergence(bc="natural") assert s.data.shape == (8, 16) res = np.cos(z) - np.sin(r) + (np.cos(r) + np.sin(z)**2) / r np.testing.assert_allclose(s.data, res, rtol=0.1, atol=0.1)