From 5233c4d1e65525f9962d95208982373252ce2ccc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ren=C3=A9=20He=C3=9F?= <rene.hess@iwr.uni-heidelberg.de>
Date: Thu, 15 Dec 2016 15:40:06 +0100
Subject: [PATCH] FastDGGridOperator in driver

---
 python/dune/perftool/options.py            |  1 +
 python/dune/perftool/pdelab/driver.py      | 40 +++++++++++++++++-----
 test/poisson/CMakeLists.txt                |  2 +-
 test/poisson/poisson_dg_quadrilateral.mini |  5 ++-
 4 files changed, 38 insertions(+), 10 deletions(-)

diff --git a/python/dune/perftool/options.py b/python/dune/perftool/options.py
index d1ed4850..4cb6e8e8 100644
--- a/python/dune/perftool/options.py
+++ b/python/dune/perftool/options.py
@@ -42,6 +42,7 @@ def get_form_compiler_arguments():
     parser.add_argument("--timer", action="store_true", help="measure times")
     parser.add_argument("--opcounter", action="store_true", default=False, help="Count operations. Should only be used with yaspgrid. Timer should be set.")
     parser.add_argument("--project-basedir", type=str, help="The base (build) directory of the dune-perftool project")
+    parser.add_argument("--fasfdg", action="store_false", help="Use FastDGGridOperator from PDELab.")
     # TODO at some point this help description should be updated
     parser.add_argument("--sumfact", action="store_true", help="Use sumfactorization")
     parser.add_argument("--vectorize-quad", action="store_true", help="whether to generate code with explicit vectorization")
diff --git a/python/dune/perftool/pdelab/driver.py b/python/dune/perftool/pdelab/driver.py
index 336eb60c..a2d8aa35 100644
--- a/python/dune/perftool/pdelab/driver.py
+++ b/python/dune/perftool/pdelab/driver.py
@@ -346,14 +346,34 @@ def name_fem(expr):
 
 
 @preamble
-def typedef_vectorbackend(name):
+def define_blocksize(name, expr):
+    assert isDG(expr)
+    assert isQuadrilateral(expr)
+    dimension = name_dimension()
+    degree = expr._degree
+    return "static const int {} = Dune::QkStuff::QkSize<{}, {}>::value;".format(name, degree, dimension)
+
+
+def name_blocksize(expr):
+    name = "blocksize"
+    define_blocksize(name, expr)
+    return name
+
+
+@preamble
+def typedef_vectorbackend(name, expr):
     include_file("dune/pdelab/backend/istl.hh", filetag="driver")
-    return "using {} = Dune::PDELab::istl::VectorBackend<Dune::PDELab::istl::Blocking::none, 1>;".format(name)
+    if get_option("fastdg"):
+        blocksize = name_blocksize(expr)
+        return "using {} = Dune::PDELab::istl::VectorBackend<Dune::PDELab::istl::Blocking::fixed, {}>;".format(name, blocksize)
+    else:
+        return "using {} = Dune::PDELab::istl::VectorBackend<Dune::PDELab::istl::Blocking::none, 1>;".format(name)
 
 
-def type_vectorbackend():
-    typedef_vectorbackend("VectorBackend")
-    return "VectorBackend"
+def type_vectorbackend(expr):
+    name = "VectorBackend"
+    typedef_vectorbackend(name, expr)
+    return name
 
 
 def type_orderingtag():
@@ -497,7 +517,7 @@ def name_assembled_constraints(expr):
 
 @preamble
 def typedef_gfs(element, dirichlet, name):
-    vb = type_vectorbackend()
+    vb = type_vectorbackend(element)
     from ufl import FiniteElement, MixedElement, VectorElement, EnrichedElement, RestrictedElement, TensorElement
     if isinstance(element, FiniteElement):
         gv = type_leafview()
@@ -670,8 +690,12 @@ def typedef_gridoperator(name, formdata):
     mb = type_matrixbackend()
     df = type_domainfield()
     r = type_range()
-    include_file("dune/pdelab/gridoperator/gridoperator.hh", filetag="driver")
-    return "using {} = Dune::PDELab::GridOperator<{}, {}, {}, {}, {}, {}, {}, {}, {}>;".format(name, ugfs, vgfs, lop, mb, df, r, r, ucc, vcc)
+    if get_option("fastdg"):
+        include_file("dune/pdelab/gridoperator/fastdg.hh", filetag="driver")
+        return "using {} = Dune::PDELab::FastDGGridOperator<{}, {}, {}, {}, {}, {}, {}, {}, {}>;".format(name, ugfs, vgfs, lop, mb, df, r, r, ucc, vcc)
+    else:
+        include_file("dune/pdelab/gridoperator/gridoperator.hh", filetag="driver")
+        return "using {} = Dune::PDELab::GridOperator<{}, {}, {}, {}, {}, {}, {}, {}, {}>;".format(name, ugfs, vgfs, lop, mb, df, r, r, ucc, vcc)
 
 
 def type_gridoperator(formdata):
diff --git a/test/poisson/CMakeLists.txt b/test/poisson/CMakeLists.txt
index 932fdafb..844fdce8 100644
--- a/test/poisson/CMakeLists.txt
+++ b/test/poisson/CMakeLists.txt
@@ -54,7 +54,7 @@ dune_add_formcompiler_system_test(UFLFILE opcount_poisson_dg.ufl
                                   INIFILE opcount_poisson_dg_symdiff.mini
                                   )
 
-# 3. Poisson Test Case: DG, f + pure dirichlet
+# 9. Poisson Test Case: DG quadrilaterals
 dune_add_formcompiler_system_test(UFLFILE poisson_dg_quadrilateral.ufl
                                   BASENAME poisson_dg_quadrilateral
                                   INIFILE poisson_dg_quadrilateral.mini
diff --git a/test/poisson/poisson_dg_quadrilateral.mini b/test/poisson/poisson_dg_quadrilateral.mini
index 2cb4d1d2..39905846 100644
--- a/test/poisson/poisson_dg_quadrilateral.mini
+++ b/test/poisson/poisson_dg_quadrilateral.mini
@@ -1,5 +1,7 @@
 __name = poisson_dg_quadrilateral_{__exec_suffix}
-__exec_suffix = numdiff, symdiff | expand num
+__exec_suffix = {__exec_symdiff}_{__exec_fastdg}
+__exec_symdiff = numdiff, symdiff |expand num
+__exec_fastdg = fastdg, standarddg | expand fastdg
 
 extension = 1.0 1.0
 cells = 32 32
@@ -12,3 +14,4 @@ extension = vtu
 numerical_jacobian = 1, 0 | expand num
 exact_solution_expression = g
 compare_l2errorsquared = 2e-5
+fastdg = 1, 0 | expand fastdg
-- 
GitLab