diff --git a/arraycontext/impl/pyopencl.py b/arraycontext/impl/pyopencl.py index 3cbf9856dfe0c3a20d513487460e099208752eed..9b02343812df3450455f5a45ac054e15e961f3b3 100644 --- a/arraycontext/impl/pyopencl.py +++ b/arraycontext/impl/pyopencl.py @@ -187,6 +187,19 @@ def _flatten_array(ary): class _PyOpenCLFakeNumpyLinalgNamespace(BaseFakeNumpyLinalgNamespace): def norm(self, ary, ord=None): + from numbers import Number + import pyopencl.array as cla + + if isinstance(ary, Number): + return abs(ary) + + if ord is None and isinstance(ary, cla.Array): + if ary.ndim == 1: + ord = 2 + else: + # mimics numpy's norm computation + return self.norm(_flatten_array(ary), ord=2) + try: from meshmode.dof_array import DOFArray except ImportError: diff --git a/test/test_arraycontext.py b/test/test_arraycontext.py index 76a169d760d0ac2395605b1e560a053909174b33..b632e208d0af7edc79baccda5cdaf87a2354f94b 100644 --- a/test/test_arraycontext.py +++ b/test/test_arraycontext.py @@ -734,6 +734,23 @@ def test_norm_complex(actx_factory, norm_ord): assert abs(norm_a_ref - norm_a)/norm_a < 1e-13 +@pytest.mark.parametrize("ndim", [1, 2, 3, 4, 5]) +def test_norm_ord_none(actx_factory, ndim): + from numpy.random import default_rng + + actx = actx_factory() + + rng = default_rng() + shape = tuple(rng.integers(2, 7, ndim)) + + a = rng.random(shape) + + norm_a_ref = np.linalg.norm(a, ord=None) + norm_a = actx.np.linalg.norm(actx.from_numpy(a), ord=None) + + np.testing.assert_allclose(norm_a, norm_a_ref) + + if __name__ == "__main__": import sys if len(sys.argv) > 1: