From f17a92644df0431e7a2f32225824321b666266cc Mon Sep 17 00:00:00 2001
From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de>
Date: Fri, 21 Sep 2018 13:50:25 +0200
Subject: [PATCH] Treat integrals that vanish due to unfulfillable boundary
 predicates

---
 python/dune/perftool/pdelab/localoperator.py | 22 +++++++++++++-------
 python/dune/perftool/sumfact/realization.py  |  3 +++
 2 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/python/dune/perftool/pdelab/localoperator.py b/python/dune/perftool/pdelab/localoperator.py
index 4fb63710..4daeb45a 100644
--- a/python/dune/perftool/pdelab/localoperator.py
+++ b/python/dune/perftool/pdelab/localoperator.py
@@ -766,14 +766,17 @@ def generate_residual_kernels(form, original_form):
         for measure in set(i.integral_type() for i in form.integrals()):
             logger.info("generate_residual_kernels: measure {}".format(measure))
             with global_context(integral_type=measure):
-                enum_pattern()
-                pattern_baseclass()
-                enum_alpha()
-
                 from dune.perftool.pdelab.signatures import assembler_routine_name
                 with global_context(kernel=assembler_routine_name()):
                     kernel = [k for k in get_backend(interface="generate_kernels_per_integral")(form.integrals_by_type(measure))]
 
+                # The integrals might vanish due to unfulfillable boundary conditions.
+                # We only generate the local operator enums/base classes if they did not.
+                if kernel:
+                    enum_pattern()
+                    pattern_baseclass()
+                    enum_alpha()
+
                 # Maybe add numerical differentiation
                 if get_form_option("numerical_jacobian"):
                     # Include headers for numerical methods
@@ -908,10 +911,6 @@ def generate_control_kernels(forms):
         for measure in set(i.integral_type() for form in forms for i in form.integrals()):
             logger.info("generate_control_kernels: measure {}".format(measure))
             with global_context(integral_type=measure):
-                enum_pattern()
-                pattern_baseclass()
-                enum_alpha()
-
                 from dune.perftool.pdelab.signatures import assembler_routine_name
                 with global_context(kernel=assembler_routine_name()):
                     # TODO: Sumfactorization not yet implemented
@@ -921,6 +920,13 @@ def generate_control_kernels(forms):
                     forms_measure = [form.integrals_by_type(measure) for form in forms]
                     kernel = [k for k in control_generate_kernels_per_integral(forms_measure)]
 
+                    # The integrals might vanish due to unfulfillable boundary conditions.
+                    # We only generate the local operator enums/base classes if they did not.
+                    if kernel:
+                        enum_pattern()
+                        pattern_baseclass()
+                        enum_alpha()
+
             operator_kernels[(measure, 'residual')] = kernel
 
         return operator_kernels
diff --git a/python/dune/perftool/sumfact/realization.py b/python/dune/perftool/sumfact/realization.py
index 2c5f8a3c..12f71156 100644
--- a/python/dune/perftool/sumfact/realization.py
+++ b/python/dune/perftool/sumfact/realization.py
@@ -137,6 +137,9 @@ class BufferSwitcher(object):
 
 
 def realize_sumfact_kernel_function(sf):
+    # Remove anything kernel related from caches
+    delete_cache_items("kernel_default")
+
     # Get a buffer switcher instance
     buffer = BufferSwitcher()
     insn_dep = frozenset()
-- 
GitLab