From 101422c7abd23017227d75ab426ac26f74d0cfc7 Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Wed, 8 Jul 2020 15:37:42 -0500
Subject: [PATCH] Expose nodal reductions in eager interface

---
 examples/wave/wave-eager.py |  3 ++-
 grudge/eager.py             | 13 +++++++++++++
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/examples/wave/wave-eager.py b/examples/wave/wave-eager.py
index e7821431..7450f435 100644
--- a/examples/wave/wave-eager.py
+++ b/examples/wave/wave-eager.py
@@ -163,7 +163,8 @@ def main():
         fields = rk4_step(fields, t, dt, rhs)
 
         if istep % 10 == 0:
-            print(istep, t, discr.norm(fields[0]))
+            print(f"step: {istep} t: {t} L2: {discr.norm(fields[0])} "
+                    f"sol max: {discr.nodal_max('vol', fields[0])}")
             vis.write_vtk_file("fld-wave-eager-%04d.vtu" % istep,
                     [
                         ("u", fields[0]),
diff --git a/grudge/eager.py b/grudge/eager.py
index 07cb0f04..71a01873 100644
--- a/grudge/eager.py
+++ b/grudge/eager.py
@@ -166,6 +166,19 @@ class EagerDGDiscretization(DGDiscretizationWithBoundaries):
     def norm(self, vec, p=2):
         return self._norm(p)(arg=vec)
 
+    @memoize_method
+    def _nodal_reduction(self, operator, dd):
+        return bind(self, operator(dd)(sym.var("arg")), local_only=True)
+
+    def nodal_sum(self, dd, vec):
+        return self._nodal_reduction(sym.NodalSum, dd)(arg=vec)
+
+    def nodal_min(self, dd, vec):
+        return self._nodal_reduction(sym.NodalMin, dd)(arg=vec)
+
+    def nodal_max(self, dd, vec):
+        return self._nodal_reduction(sym.NodalMax, dd)(arg=vec)
+
     @memoize_method
     def connected_ranks(self):
         from meshmode.distributed import get_connected_partitions
-- 
GitLab