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