diff --git a/python/dune/perftool/options.py b/python/dune/perftool/options.py index d1ed485043989dbae7e0225ace2eb0e8e22a1aea..4cb6e8e8466eeea6cbe5d55e8f1039c223869246 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 336eb60cbd221d72b3337833e63cdd183a14a178..a2d8aa35af5b209a012dcebeea89c7e0bb6d18f0 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 932fdafb5a939c10b4b1825bfcf9055b456c2f96..844fdce8d338ebfcb59b916d21d97d87829f0d60 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 2cb4d1d2a909290f725f026fbf5e8d062470057e..399058462084326bef74c4bf82acc2df76cdcc48 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