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