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