From cb8fbdacfcbc889ad1006c3e991d80261780f135 Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Fri, 8 Jan 2016 16:09:12 -0600
Subject: [PATCH] Fix computing vector norms

---
 grudge/symbolic/operators.py | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/grudge/symbolic/operators.py b/grudge/symbolic/operators.py
index 49cc8fa1..fbfdb0f6 100644
--- a/grudge/symbolic/operators.py
+++ b/grudge/symbolic/operators.py
@@ -485,24 +485,33 @@ def norm(p, arg, dd=None):
     """
     :arg arg: is assumed to be a vector, i.e. have shape ``(n,)``.
     """
-    import grudge.symbolic as sym
+    sym = _sym()
 
     if dd is None:
         dd = _sym().DD_VOLUME
 
     if p == 2:
-        comp_norm_squared = sym.NodalSum(dd_in=dd)(
+        norm_squared = sym.NodalSum(dd_in=dd)(
                 sym.CFunction("fabs")(
                     arg * sym.MassOperator()(arg)))
-        return sym.CFunction("sqrt")(sum(comp_norm_squared))
+
+        if isinstance(norm_squared, np.ndarray):
+            norm_squared = norm_squared.sum()
+
+        return sym.CFunction("sqrt")(norm_squared)
 
     elif p == np.Inf:
-        comp_norm = sym.NodalMax()(sym.CFunction("fabs")(arg))
+        result = sym.NodalMax()(sym.CFunction("fabs")(arg))
         from pymbolic.primitives import Max
-        return reduce(Max, comp_norm)
+
+        if isinstance(norm_squared, np.ndarray):
+            from functools import reduce
+            result = reduce(Max, result)
+
+        return result
 
     else:
-        return sum(sym.NodalSum(dd_in=dd)(sym.CFunction("fabs")(arg)**p))**(1/p)
+        raise ValueError("unsupported value of p")
 
 # }}}
 
-- 
GitLab