From 5500ecfeb38878bf0a093c9ba1ab498d0add9821 Mon Sep 17 00:00:00 2001
From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de>
Date: Tue, 5 Feb 2019 15:05:55 +0100
Subject: [PATCH] Provide fallback for sum factorized geometry mixins if not
 using sum factorization

We can disable sum factorization on boundary integrals.
This commit allows us to use a different mixin for those integrals.
---
 python/dune/codegen/sumfact/geometry.py |  9 +++++++++
 python/dune/codegen/sumfact/switch.py   | 13 ++++++++++++-
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/python/dune/codegen/sumfact/geometry.py b/python/dune/codegen/sumfact/geometry.py
index cef07354..3a9a5a5a 100644
--- a/python/dune/codegen/sumfact/geometry.py
+++ b/python/dune/codegen/sumfact/geometry.py
@@ -56,6 +56,9 @@ import loopy as lp
 
 @geometry_mixin("sumfact_multilinear")
 class SumfactMultiLinearGeometryMixin(GenericPDELabGeometryMixin):
+    def nonsumfact_fallback(self):
+        return "generic"
+
     def _jacobian_inverse(self):
         return "jit"
 
@@ -243,6 +246,9 @@ class SumfactMultiLinearGeometryMixin(GenericPDELabGeometryMixin):
 
 @geometry_mixin("sumfact_axiparallel")
 class SumfactAxiParallelGeometryMixin(AxiparallelGeometryMixin):
+    def nonsumfact_fallback(self):
+        return "axiparallel"
+
     def facet_normal(self, o):
         i, = self.indices
         self.indices = None
@@ -260,6 +266,9 @@ class SumfactAxiParallelGeometryMixin(AxiparallelGeometryMixin):
 
 @geometry_mixin("sumfact_equidistant")
 class SumfactEqudistantGeometryMixin(EquidistantGeometryMixin, SumfactAxiParallelGeometryMixin):
+    def nonsumfact_fallback(self):
+        return "equidistant"
+
     def facet_jacobian_determinant(self, o):
         name = "fdetjac"
         self.define_facet_jacobian_determinant(name)
diff --git a/python/dune/codegen/sumfact/switch.py b/python/dune/codegen/sumfact/switch.py
index 67cb9df3..a031790d 100644
--- a/python/dune/codegen/sumfact/switch.py
+++ b/python/dune/codegen/sumfact/switch.py
@@ -2,7 +2,8 @@
 
 import csv
 
-from dune.codegen.generation import (get_global_context_value,
+from dune.codegen.generation import (construct_from_mixins,
+                                     get_global_context_value,
                                      global_context,
                                      )
 from dune.codegen.pdelab.geometry import world_dimension
@@ -26,8 +27,18 @@ def sumfact_generate_kernels_per_integral(integrals):
         # Maybe skip sum factorization on boundary integrals
         if not get_form_option("sumfact_on_boundary"):
             set_form_option("sumfact", False)
+
+            # Try to find a fallback for sum factorized geometry mixins
+            geometry_backup = get_form_option("geometry_mixins")
+            mixin = construct_from_mixins(mixins=[geometry_backup])()
+            if hasattr(mixin, "nonsumfact_fallback"):
+                set_form_option("geometry_mixins", mixin.nonsumfact_fallback())
+
             for k in generate_kernels_per_integral(integrals):
                 yield k
+
+            # Reset state
+            set_form_option("geometry_mixins", geometry_backup)
             set_form_option("sumfact", True)
             return
 
-- 
GitLab