def test_pde_spatial_args(backend): """test PDE with spatial dependence""" field = ScalarField(grids.UnitGrid([2])) eq = PDE({"a": "x"}) rhs = eq.make_pde_rhs(field, backend=backend) np.testing.assert_allclose(rhs(field.data, 0.0), np.array([0.5, 1.5])) # test combination of spatial dependence and differential oeprators eq = PDE({"a": "dot(gradient(x), gradient(a))"}) rhs = eq.make_pde_rhs(field, backend=backend) np.testing.assert_allclose(rhs(field.data, 0.0), np.array([0.0, 0.0])) # test invalid spatial dependence eq = PDE({"a": "x + y"}) with pytest.raises(RuntimeError): rhs = eq.make_pde_rhs(field, backend=backend) rhs(field.data, 0.0)
def test_pde_spatial_args(): """ test ScalarFieldExpression without extra dependence """ eq = PDE({"a": "x"}) field = ScalarField(grids.UnitGrid([2])) rhs = eq.evolution_rate(field) assert rhs == field.copy(data=[0.5, 1.5]) rhs = eq.make_pde_rhs(field, backend="numba") np.testing.assert_allclose(rhs(field.data, 0.0), np.array([0.5, 1.5])) eq = PDE({"a": "x + y"}) with pytest.raises(RuntimeError): eq.evolution_rate(field)
def test_pde_integral(backend): """test PDE with integral""" grid = grids.UnitGrid([16]) field = ScalarField.random_uniform(grid) eq = PDE({"c": "-integral(c)"}) # test rhs rhs = eq.make_pde_rhs(field, backend=backend) np.testing.assert_allclose(rhs(field.data, 0), -field.integral) # test evolution for method in ["scipy", "explicit"]: res = eq.solve(field, t_range=1000, method=method, tracker=None) assert res.integral == pytest.approx(0, abs=1e-2) np.testing.assert_allclose(res.data, field.data - field.magnitude, atol=1e-3)