diff --git a/python/dune/perftool/sumfact/switch.py b/python/dune/perftool/sumfact/switch.py index d46d5d7599cf05df323112464f35a66e5a39b781..4fa630646510532ac1956db6fff82085911d310e 100644 --- a/python/dune/perftool/sumfact/switch.py +++ b/python/dune/perftool/sumfact/switch.py @@ -10,6 +10,7 @@ from dune.perftool.pdelab.signatures import (assembly_routine_args, assembly_routine_signature, kernel_name, ) +from dune.perftool.options import get_option from dune.perftool.cgen.clazz import ClassMember @@ -37,8 +38,9 @@ def generate_kernels_per_integral(integrals): for facemod_s in range(2): for facedir_n in range(dim): for facemod_n in range(2): - with global_context(facedir_s=facedir_s, facemod_s=facemod_s, facedir_n=facedir_n, facemod_n=facemod_n): - yield generate_kernel(integrals) + if decide_if_kernel_is_necessary(facedir_s, facemod_s, facedir_n, facemod_n): + with global_context(facedir_s=facedir_s, facemod_s=facemod_s, facedir_n=facedir_n, facemod_n=facemod_n): + yield generate_kernel(integrals) # Generate switch statement yield generate_interior_facet_switch() @@ -49,6 +51,24 @@ def get_kernel_name(facedir_s=None, facemod_s=None, facedir_n=None, facemod_n=No return kernel_name() +def decide_if_kernel_is_necessary(facedir_s, facemod_s, facedir_n, facemod_n): + # If we are not using YaspGrid, all variants need to be realized + if not get_option("diagonal_transformation_matrix"): + return True + + # A codim1 entity is can never be on the upper resp. lower side of the ref element + # in both inside and outside cell in a YaspGrid + if facemod_n == facemod_s: + return False + + # A codim1 entity has the same orientation in both the embedding in the inside + # and outside cell for a YaspGrid + if facedir_n != facedir_s: + return False + + return True + + def generate_exterior_facet_switch(): # Extract the signature signature = assembly_routine_signature() @@ -85,7 +105,7 @@ def generate_interior_facet_switch(): # Construct the switch statement block = [] block.append("{") - block.append(" size_t variant = ig.indexInOutside() + 6 * ig.indexInInside();") + block.append(" size_t variant = ig.indexInOutside() + {} * ig.indexInInside();".format(2 * dim)) block.append(" switch(variant)") block.append(" {") @@ -93,13 +113,14 @@ def generate_interior_facet_switch(): for facemod_s in range(2): for facedir_n in range(dim): for facemod_n in range(2): - block.append(" case {}: {}({}); break;".format((dim * facedir_s + facemod_s) * (2 * dim) + dim * facedir_n + facemod_n, - get_kernel_name(facedir_s=facedir_s, - facemod_s=facemod_s, - facedir_n=facedir_n, - facemod_n=facemod_n, - ), - args)) + if decide_if_kernel_is_necessary(facedir_s, facemod_s, facedir_n, facemod_n): + block.append(" case {}: {}({}); break;".format((dim * facedir_s + facemod_s) * (2 * dim) + dim * facedir_n + facemod_n, + get_kernel_name(facedir_s=facedir_s, + facemod_s=facemod_s, + facedir_n=facedir_n, + facemod_n=facemod_n, + ), + args)) block.append(" }") block.append("}")