From dba33e37e3260d6c586a8578e07e38b980057ef3 Mon Sep 17 00:00:00 2001
From: Kaushik Kulkarni <kaushikcfd@gmail.com>
Date: Thu, 20 May 2021 15:39:59 -0500
Subject: [PATCH] avoid actx.np.stack, instead use reduce to avoid memory
 explosion

---
 grudge/execution.py | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/grudge/execution.py b/grudge/execution.py
index cd136758..4f62a1d3 100644
--- a/grudge/execution.py
+++ b/grudge/execution.py
@@ -158,18 +158,22 @@ class ExecutionMapper(mappers.Evaluator,
 
     def map_nodal_sum(self, op, field_expr):
         actx = self.array_context
-        return actx.np.sum(actx.np.stack([actx.np.sum(grp_ary)
-                                          for grp_ary in self.rec(field_expr)]))
+        return sum([actx.np.sum(grp_ary)
+                    for grp_ary in self.rec(field_expr)])
 
     def map_nodal_max(self, op, field_expr):
+        from functools import reduce
         actx = self.array_context
-        return actx.np.max(actx.np.stack([actx.np.max(grp_ary)
-                                          for grp_ary in self.rec(field_expr)]))
+        return reduce(lambda acc, grp_ary: actx.np.maximum(acc,
+                                                           actx.np.max(grp_ary)),
+                      self.rec(field_expr), -np.inf)
 
     def map_nodal_min(self, op, field_expr):
+        from functools import reduce
         actx = self.array_context
-        return actx.np.min(actx.np.stack([actx.np.min(grp_ary)
-                                          for grp_ary in self.rec(field_expr)]))
+        return reduce(lambda acc, grp_ary: actx.np.minimum(acc,
+                                                           actx.np.min(grp_ary)),
+                      self.rec(field_expr), np.inf)
 
     # }}}
 
-- 
GitLab