diff --git a/python/dune/perftool/blockstructured/geometry.py b/python/dune/perftool/blockstructured/geometry.py index 3211d051badb600050f264b1ec4553ff6497e3db..ae8e06710afe6feb456d98827f7ed10ca6ade102 100644 --- a/python/dune/perftool/blockstructured/geometry.py +++ b/python/dune/perftool/blockstructured/geometry.py @@ -8,7 +8,6 @@ from dune.perftool.options import (get_form_option, option_switch, get_option) from dune.perftool.pdelab.geometry import (world_dimension, local_dimension, - apply_to_global_transformation, name_facet_jacobian_determinant, name_element_corners, component_iname) @@ -267,7 +266,6 @@ def pymbolic_jacobian_inverse(i, j, restriction): from dune.perftool.pdelab.geometry import name_constant_jacobian_inverse_transposed name_jit = name_constant_jacobian_inverse_transposed(restriction) else: - from dune.perftool.blockstructured.geometry import name_jacobian_inverse_transposed name_jit = name_jacobian_inverse_transposed(restriction) return prim.Product((get_form_option("number_of_blocks"), prim.Subscript(prim.Variable(name_jit), (j, i)))) @@ -314,8 +312,37 @@ def name_point_in_macro(point_in_micro): return name +def apply_constant_to_global_transformation(name, local): + temporary_variable(name, shape=(world_dimension(),), managed=True) + corners = name_element_corners() + + if isinstance(local, str): + local = prim.Variable(local) + + d = component_iname('to_global') + + # global[d] = lower_left[d] + local[d] * (upper_right[d] - lower_left[d]) + expr = prim.Sum((prim.Subscript(prim.Variable(corners), (0,prim.Variable(d))), + prim.Product((prim.Subscript(local, (prim.Variable(d),)), + prim.Sum((prim.Subscript(prim.Variable(corners), (3, prim.Variable(d))), + -1 * prim.Subscript(prim.Variable(corners), (0, prim.Variable(d))))) + )) + )) + assignee = prim.Subscript(prim.Variable(name), (prim.Variable(d),)) + + instruction(assignee=assignee, expression=expr, + within_inames=frozenset(sub_element_inames() + get_backend(interface="quad_inames")() + (d,)), + within_inames_is_final=True, + depends_on=frozenset({Writes(local.name), Writes(corners)}) + ) + + def to_global(local): macro = name_point_in_macro(local) name = macro + "_global" - apply_to_global_transformation(name, prim.Variable(macro)) + if get_form_option("constant_transformation_matrix"): + apply_constant_to_global_transformation(name, prim.Variable(macro)) + else: + from dune.perftool.pdelab.geometry import apply_to_global_transformation + apply_to_global_transformation(name, prim.Variable(macro)) return prim.Variable(name) diff --git a/test/blockstructured/poisson/poisson_tensor.mini b/test/blockstructured/poisson/poisson_tensor.mini index ff6426b9129d3d0028047f7d1413a4f17761d6df..9eb55a9a1fdafcfc2e862d51b08365700e552b28 100644 --- a/test/blockstructured/poisson/poisson_tensor.mini +++ b/test/blockstructured/poisson/poisson_tensor.mini @@ -1,7 +1,7 @@ __name = blockstructured_poisson_tensor_{__exec_suffix} -__exec_suffix = numdiff, symdiff | expand num +__exec_suffix = nonvec, vec | expand vectorized -cells = 20 20 +cells = 10 10 extension = 1. 1. [wrapper.vtkcompare] @@ -13,6 +13,8 @@ extension = vtu compare_l2errorsquared = 1e-7 [formcompiler.r] -numerical_jacobian = 1, 0 | expand num +matrix_free = 1 +vectorization_blockstructured = 0, 1 | expand vectorized +generate_jacobians = 0 blockstructured = 1 -number_of_blocks = 4 +number_of_blocks = 8