def test_pde_vector(): """test PDE with a single vector field""" eq = PDE({"u": "vector_laplace(u) + exp(-t)"}) assert eq.explicit_time_dependence assert not eq.complex_valued grid = grids.UnitGrid([8, 8]) field = VectorField.random_normal(grid) res_a = eq.solve(field, t_range=1, dt=0.01, backend="numpy", tracker=None) res_b = eq.solve(field, t_range=1, dt=0.01, backend="numba", tracker=None) res_a.assert_field_compatible(res_b) np.testing.assert_allclose(res_a.data, res_b.data)
def test_random_normal_types(): """test whether random normal fields behave correctly for different types""" grid = UnitGrid([8]) for dtype in [bool, int, float, complex]: field = VectorField.random_normal(grid, dtype=dtype) assert field.dtype == np.dtype(dtype) assert isinstance(field.data.flat[0].item(), dtype) assert ScalarField.random_normal(grid, 0, 1).dtype == np.dtype(float) assert ScalarField.random_normal(grid, mean=0 + 0j).dtype == np.dtype(complex) assert ScalarField.random_normal(grid, std=1 + 0j).dtype == np.dtype(complex) assert ScalarField.random_normal(grid, 0 + 0j, 1 + 0j).dtype == np.dtype(complex) m = complex(np.random.random(), np.random.random()) s = complex(1 + np.random.random(), 1 + np.random.random()) grid = UnitGrid([256, 256]) field = field.random_normal(grid, m, s) assert np.mean(field.average) == pytest.approx(m, rel=0.1, abs=0.1) assert np.std(field.data.real) == pytest.approx(s.real, rel=0.1, abs=0.1) assert np.std(field.data.imag) == pytest.approx(s.imag, rel=0.1, abs=0.1)
def test_dot_product(): """test dot products between vectors and tensors""" g = UnitGrid([3, 2]) vf = VectorField.random_normal(g) tf = Tensor2Field.random_normal(g) v_dot = vf.make_dot_operator() t_dot = tf.make_dot_operator() expected = np.einsum("i...,i...->...", vf.data, vf.data) np.testing.assert_allclose((vf @ vf).data, expected) np.testing.assert_allclose(v_dot(vf.data, vf.data), expected) expected = np.einsum("i...,i...->...", vf.data, tf.data) np.testing.assert_allclose((vf @ tf).data, expected) np.testing.assert_allclose(v_dot(vf.data, tf.data), expected) expected = np.einsum("ji...,i...->j...", tf.data, vf.data) np.testing.assert_allclose((tf @ vf).data, expected) np.testing.assert_allclose(t_dot(tf.data, vf.data), expected) expected = np.einsum("ij...,jk...->ik...", tf.data, tf.data) np.testing.assert_allclose((tf @ tf).data, expected) np.testing.assert_allclose(t_dot(tf.data, tf.data), expected)