From db2e297703c236cce34186b0c93b81d9ca1eeec1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ren=C3=A9=20He=C3=9F?= <rene.hess@iwr.uni-heidelberg.de>
Date: Wed, 14 Nov 2018 14:29:24 +0100
Subject: [PATCH] Add direct_is_possible and the quadrature size to the
 parallel key

Note:

- direct_is_possible true/false could probably be handled in an upper/lower
  vectorization way.

- Vectorization of SF kernels should be based on cost permuted matrix sequence.
---
 python/dune/codegen/sumfact/symbolic.py       |  8 +++--
 test/sumfact/poisson/CMakeLists.txt           |  5 +++
 .../poisson/poisson_fastdg_2d_gmsh.mini       | 32 +++++++++++++++++++
 .../poisson/poisson_fastdg_3d_gmsh.mini       |  2 +-
 4 files changed, 44 insertions(+), 3 deletions(-)
 create mode 100644 test/sumfact/poisson/poisson_fastdg_2d_gmsh.mini

diff --git a/python/dune/codegen/sumfact/symbolic.py b/python/dune/codegen/sumfact/symbolic.py
index 8b28f8f3..a0868a5c 100644
--- a/python/dune/codegen/sumfact/symbolic.py
+++ b/python/dune/codegen/sumfact/symbolic.py
@@ -130,7 +130,7 @@ class VectorSumfactKernelInput(SumfactKernelInterfaceBase):
 
     @property
     def signature_args(self):
-        if get_form_option("fastdg"):
+        if self.interfaces[0].direct_is_possible:
             return tuple("const {}* fastdg{}".format(type_floatingpoint(), i) for i, _ in enumerate(remove_duplicates(self.interfaces)))
         else:
             return ()
@@ -385,7 +385,9 @@ class SumfactKernel(SumfactKernelBase, ImmutableRecord, prim.Variable):
         # TODO: For now we do not vectorize SumfactKernels with different
         # quadrature_permutation. This should be handled like upper/lower
         # vectorization
-        return tuple(m.basis_size for m in self.matrix_sequence_quadrature_permuted) + (self.stage, self.buffer, self.interface.within_inames)
+        return tuple(m.quadrature_size for m in self.matrix_sequence_quadrature_permuted) + tuple(m.basis_size for m in self.matrix_sequence_quadrature_permuted) + (self.stage, self.buffer, self.interface.within_inames) + (self.interface.direct_is_possible,)
+        # return tuple(m.quadrature_size for m in self.matrix_sequence_quadrature_permuted) + tuple(m.basis_size for m in self.matrix_sequence_quadrature_permuted) + (self.stage, self.buffer, self.interface.within_inames)
+        # return tuple(m.basis_size for m in self.matrix_sequence_quadrature_permuted) + (self.stage, self.buffer, self.interface.within_inames)
 
     @property
     def cache_key(self):
@@ -631,6 +633,8 @@ class VectorizedSumfactKernel(SumfactKernelBase, ImmutableRecord, prim.Variable)
         assert len(set(k.predicates for k in kernels)) == 1
 
         # Assert properties of the matrix sequence of the underlying kernels
+        # For now we don't mix direct and non_direct input. Could be done in an upper/lower way.
+        assert len(set(tuple(k.interface.direct_is_possible for k in kernels))) == 1
         for i in range(kernels[0].length):
             assert len(set(tuple(k.matrix_sequence_quadrature_permuted[i].rows for k in kernels))) == 1
             assert len(set(tuple(k.matrix_sequence_quadrature_permuted[i].cols for k in kernels))) == 1
diff --git a/test/sumfact/poisson/CMakeLists.txt b/test/sumfact/poisson/CMakeLists.txt
index fb5c4ac3..3adde632 100644
--- a/test/sumfact/poisson/CMakeLists.txt
+++ b/test/sumfact/poisson/CMakeLists.txt
@@ -71,6 +71,11 @@ if(consistent-edge-orientation_FOUND)
                                     INIFILE poisson_dg_3d_gmsh.mini
                                     ANALYZE_GRID
                                     )
+  dune_add_formcompiler_system_test(UFLFILE poisson_dg_2d.ufl
+                                    BASENAME sumfact_poisson_fastdg_2d_gmsh
+                                    INIFILE poisson_fastdg_2d_gmsh.mini
+                                    ANALYZE_GRID
+                                    )
   dune_add_formcompiler_system_test(UFLFILE poisson_dg_3d.ufl
                                     BASENAME sumfact_poisson_fastdg_3d_gmsh
                                     INIFILE poisson_fastdg_3d_gmsh.mini
diff --git a/test/sumfact/poisson/poisson_fastdg_2d_gmsh.mini b/test/sumfact/poisson/poisson_fastdg_2d_gmsh.mini
new file mode 100644
index 00000000..56b69c77
--- /dev/null
+++ b/test/sumfact/poisson/poisson_fastdg_2d_gmsh.mini
@@ -0,0 +1,32 @@
+__name = sumfact_poisson_fastdg_2d_gmsh_{__exec_suffix}
+__exec_suffix = {deg_suffix}_{quadvec_suffix}_{gradvec_suffix}
+
+quadvec_suffix = quadvec, nonquadvec | expand quad
+gradvec_suffix = gradvec, nongradvec | expand grad
+deg_suffix = deg{formcompiler.ufl_variants.degree}
+
+# {deg_suffix} == deg1 | exclude
+{quadvec_suffix} == quadvec | exclude
+# {gradvec_suffix} == gradvec | exclude
+
+gmshFile = square_quad.msh
+
+[wrapper.vtkcompare]
+name = {__name}
+extension = vtu
+
+[formcompiler]
+compare_l2errorsquared = 5e-5, 5e-7 | expand deg
+grid_unstructured = 1
+debug_interpolate_input = 1
+
+[formcompiler.r]
+numerical_jacobian = 0
+sumfact = 1
+fastdg = 1
+sumfact_regular_jacobians = 1
+vectorization_quadloop = 1, 0 | expand quad
+vectorization_strategy = model, none | expand grad
+
+[formcompiler.ufl_variants]
+degree = 1, 2 | expand deg
diff --git a/test/sumfact/poisson/poisson_fastdg_3d_gmsh.mini b/test/sumfact/poisson/poisson_fastdg_3d_gmsh.mini
index 7e669e5d..438b8d00 100644
--- a/test/sumfact/poisson/poisson_fastdg_3d_gmsh.mini
+++ b/test/sumfact/poisson/poisson_fastdg_3d_gmsh.mini
@@ -7,7 +7,7 @@ deg_suffix = deg{formcompiler.ufl_variants.degree}
 
 {deg_suffix} == deg1 | exclude
 {quadvec_suffix} == quadvec | exclude
-{gradvec_suffix} == gradvec | exclude
+# {gradvec_suffix} == gradvec | exclude
 
 gmshFile = cube_hexa.msh
 
-- 
GitLab