Skip to content
Snippets Groups Projects
Commit 5500ecfe authored by Dominic Kempf's avatar Dominic Kempf
Browse files

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.
parent a5d3e142
No related branches found
No related tags found
No related merge requests found
......@@ -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)
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment