From d7fde2f64ce4af0c3045fee164701f0fc1e8351e Mon Sep 17 00:00:00 2001
From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de>
Date: Tue, 23 Feb 2016 12:05:04 +0100
Subject: [PATCH] introduce an include_file function that adds the tags

---
 python/dune/perftool/generation/generators.py |  7 ++++
 python/dune/perftool/pdelab/driver.py         | 41 +++++++++----------
 python/dune/perftool/pdelab/localoperator.py  | 21 ++++------
 3 files changed, 35 insertions(+), 34 deletions(-)

diff --git a/python/dune/perftool/generation/generators.py b/python/dune/perftool/generation/generators.py
index debe8a1a..5da34171 100644
--- a/python/dune/perftool/generation/generators.py
+++ b/python/dune/perftool/generation/generators.py
@@ -3,3 +3,10 @@ Define some generators based on the caching mechanism that
 are commonly needed for code generation
 """
 
+from dune.perftool.generation import generator_factory
+
+
+def include_file(include, filetag="operator"):
+    from cgen import Include
+    gen = generator_factory(on_store=lambda i: Include(i), item_tags=(filetag, "include"), no_deco=True)
+    return gen(include)
\ No newline at end of file
diff --git a/python/dune/perftool/pdelab/driver.py b/python/dune/perftool/pdelab/driver.py
index d3fa4b8c..7069b30d 100644
--- a/python/dune/perftool/pdelab/driver.py
+++ b/python/dune/perftool/pdelab/driver.py
@@ -6,12 +6,9 @@ Currently, these are hardcoded as strings. It would be possible
 to switch these to cgen expression. OTOH, there is not much to be
 gained there.
 """
-from dune.perftool.generation import generator_factory
+from dune.perftool.generation import generator_factory, include_file
 from dune.perftool.pdelab import dune_symbol
 
-from cgen import Include
-
-driver_include = generator_factory(on_store=lambda i: Include(i), item_tags=("driver", "include"), no_deco=True)
 driver_preamble = generator_factory(item_tags=("driver", "preamble"), counted=True)
 
 # Have a global variable with the entire form data. This allows functions that depend
@@ -73,8 +70,8 @@ def name_inifile():
 
 @driver_preamble
 def parse_initree(varname):
-    driver_include("dune/common/parametertree.hh")
-    driver_include("dune/common/parametertreeparser.hh")
+    include_file("dune/common/parametertree.hh", filetag="driver")
+    include_file("dune/common/parametertreeparser.hh", filetag="driver")
     filename = name_inifile()
     return ["Dune::ParameterTree initree;", "Dune::ParameterTreeParser::readINITree({}, {});".format(filename, varname)]
 
@@ -102,11 +99,11 @@ def typedef_grid(name):
     dim = name_dimension()
     if any(_form.cell().cellname() in x for x in ["vertex", "interval", "quadrilateral", "hexalateral"]):
         gridt = "Dune::YaspGrid<{}>".format(dim)
-        driver_include("dune/grid/yaspgrid.hh")
+        include_file("dune/grid/yaspgrid.hh", filetag="driver")
     else:
         if any(_form.cell().cellname() in x for x in ["triangle", "tetrahedron"]):
             gridt = "Dune::UGGrid<{}>".format(dim)
-            driver_include("dune/grid/uggrid.hh")
+            include_file("dune/grid/uggrid.hh", filetag="driver")
         else:
             raise ValueError("Cant match your geometry with a DUNE grid. Please report bug.")
     return "typedef {} {};".format(gridt, name)
@@ -120,7 +117,7 @@ def type_grid():
 
 @driver_preamble
 def define_grid(name):
-    driver_include("dune/testtools/gridconstruction.hh")
+    include_file("dune/testtools/gridconstruction.hh", filetag="driver")
     ini = name_initree()
     _type = type_grid()
     return ["IniGridFactory<{}> factory({});".format(_type, ini),
@@ -160,7 +157,7 @@ def name_leafview():
 
 @driver_preamble
 def typedef_vtkwriter(name):
-    driver_include("dune/grid/io/file/vtk/subsamplingvtkwriter.hh")
+    include_file("dune/grid/io/file/vtk/subsamplingvtkwriter.hh", filetag="driver")
     gv = type_leafview()
     return "typedef Dune::SubsamplingVTKWriter<{}> {};".format(gv, name)
 
@@ -226,10 +223,10 @@ def typedef_fem(expr, name):
     df = type_domainfield()
     r = type_range()
     if isPk(expr):
-        driver_include("dune/pdelab/finiteelementmap/pkfem.hh")
+        include_file("dune/pdelab/finiteelementmap/pkfem.hh", filetag="driver")
         return "typedef Dune::PDELab::PkLocalFiniteElementMap<{}, {}, {}, {}> {};".format(gv, df, r, expr._degree, name)
     if isQk(generator._kwargs['expr']):
-        driver_include("dune/pdelab/finiteelementmap/qkfem.hh")
+        include_file("dune/pdelab/finiteelementmap/qkfem.hh", filetag="driver")
         return "typedef Dune::PDELab::QkLocalFiniteElementMap<{}, {}, {}, {}> {};".format(gv, df, r, expr._degree, name)
     raise NotImplementedError("FEM not implemented in dune-perftool")
 
@@ -257,7 +254,7 @@ def name_fem(expr):
 
 @driver_preamble
 def typedef_vectorbackend(name):
-    driver_include("dune/pdelab/backend/istlvectorbackend.hh")
+    include_file("dune/pdelab/backend/istlvectorbackend.hh", filetag="driver")
     return "typedef Dune::PDELab::ISTLVectorBackend<Dune::PDELab::ISTLParameters::no_blocking, 1> {};".format(name)
 
 
@@ -274,7 +271,7 @@ def type_orderingtag():
 
 @driver_preamble
 def typedef_constraintsassembler(name):
-    driver_include("dune/pdelab/constraints/conforming.hh")
+    include_file("dune/pdelab/constraints/conforming.hh", filetag="driver")
     return "typedef Dune::PDELab::ConformingDirichletConstraints {};".format(name)
 
 
@@ -325,7 +322,7 @@ def typedef_gfs(expr, name):
         args = ", ".join(type_gfs(e) for e in expr._sub_elements)
         return "typedef Dune::PDELab::CompositeGridFunctionSpace<{}, {}, {}> {}".format(vb, ot, args, name)
     if isinstance(expr, VectorElement):
-        driver_include("dune/pdelab/gridfunctionspace/vectorgridfunctionspace.hh")
+        include_file("dune/pdelab/gridfunctionspace/vectorgridfunctionspace.hh", filetag="driver")
         gv = type_leafview()
         fem = type_fem(expr._sub_elements[0])
         dim = name_dimension()
@@ -393,7 +390,7 @@ def name_dofestimate():
 
 @driver_preamble
 def typedef_matrixbackend(name):
-    driver_include("dune/pdelab/backend/istl/bcrsmatrixbackend.hh")
+    include_file("dune/pdelab/backend/istl/bcrsmatrixbackend.hh", filetag="driver")
     return "typedef Dune::PDELab::istl::BCRSMatrixBackend<> {};".format(name)
 
 
@@ -445,7 +442,7 @@ def typedef_localoperator(name):
     # params = type_parameters()
     # return "typedef LocalOperator<{}> {};".format(params, name)
     from dune.perftool.options import get_option
-    driver_include(get_option('operator_file'))
+    include_file(get_option('operator_file'), filetag="driver")
     return "// Here in the future: typedef for the local operator with parameter class as template parameter"
 
 
@@ -479,7 +476,7 @@ def typedef_gridoperator(name):
     mb = type_matrixbackend()
     df = type_domainfield()
     r = type_range()
-    driver_include("dune/pdelab/gridoperator/gridoperator.hh")
+    include_file("dune/pdelab/gridoperator/gridoperator.hh", filetag="driver")
     return "typedef Dune::PDELab::GridOperator<{}, {}, {}, {}, {}, {}, {}, {}, {}> {};".format(ugfs, vgfs, lop, mb, df, r, r, ucc, vcc, name)
 
 
@@ -534,7 +531,7 @@ def name_vector():
 
 @driver_preamble
 def typedef_linearsolver(name):
-    driver_include("dune/pdelab/backend/istlsolverbackend.hh")
+    include_file("dune/pdelab/backend/istlsolverbackend.hh", filetag="driver")
     return "typedef Dune::PDELab::ISTLBackend_SEQ_UMFPack {};".format(name)
 
 
@@ -570,7 +567,7 @@ def name_reduction():
 
 @dune_symbol
 def typedef_stationarylinearproblemsolver(name):
-    driver_include("dune/pdelab/stationary/linearproblem.hh")
+    include_file("dune/pdelab/stationary/linearproblem.hh", filetag="driver")
     gotype = type_gridoperator()
     lstype = type_linearsolver()
     xtype = type_vector()
@@ -614,7 +611,7 @@ def dune_solve():
 @driver_preamble
 def define_vtkfile(name):
     ini = name_initree()
-    driver_include("string")
+    include_file("string", filetag="driver")
     return "std::string {} = {}.get<std::string>(\"vtk.filename\", \"output\");".format(name, ini)
 
 
@@ -626,7 +623,7 @@ def name_vtkfile():
 
 @driver_preamble
 def vtkoutput():
-    driver_include("dune/pdelab/gridfunctionspace/vtk.hh")
+    include_file("dune/pdelab/gridfunctionspace/vtk.hh", filetag="driver")
     vtkwriter = name_vtkwriter()
     gfs = name_gfs(_form.coefficients()[0].element())
     vec = name_vector()
diff --git a/python/dune/perftool/pdelab/localoperator.py b/python/dune/perftool/pdelab/localoperator.py
index 444d9381..49d5eda0 100644
--- a/python/dune/perftool/pdelab/localoperator.py
+++ b/python/dune/perftool/pdelab/localoperator.py
@@ -1,16 +1,13 @@
 from __future__ import absolute_import
 
 from dune.perftool.options import get_option
-from dune.perftool.generation import generator_factory
+from dune.perftool.generation import generator_factory, include_file
 from dune.perftool.pdelab import dune_symbol
 from dune.perftool.cgen.clazz import BaseClass, ClassMember
 
-from cgen import Include
-
 from pytools import memoize
 
 # Define the generators used in-here
-operator_include = generator_factory(item_tags=("include", "operator"), on_store=lambda i: Include(i), no_deco=True)
 public_base_class = generator_factory(item_tags=("baseclass", "operator"), on_store=lambda n: BaseClass(n), counted=True, no_deco=True)
 
 
@@ -34,14 +31,14 @@ def constructor_parameter(_type, name):
 
 @dune_symbol
 def name_initree_constructor():
-    operator_include('dune/common/parametertree.hh')
+    include_file('dune/common/parametertree.hh', filetag="operator")
     constructor_parameter("const Dune::ParameterTree&", "iniParams")
     return "iniParams"
 
 
 @dune_symbol
 def name_initree_member():
-    operator_include('dune/common/parametertree.hh')
+    include_file('dune/common/parametertree.hh', filetag="operator")
     define_private_member("const Dune::ParameterTree&", "_iniParams")
     in_constructor = name_initree_constructor()
     initializer_list("_iniParams", [in_constructor])
@@ -173,11 +170,11 @@ def generate_localoperator_kernels(form):
     delete_cache()
 
     # Manage includes and base classes that we always need
-    operator_include('dune/pdelab/gridfunctionspace/gridfunctionspaceutilities.hh')
-    operator_include('dune/pdelab/localoperator/idefault.hh')
-    operator_include('dune/pdelab/localoperator/flags.hh')
-    operator_include('dune/pdelab/localoperator/pattern.hh')
-    operator_include('dune/geometry/quadraturerules.hh')
+    include_file('dune/pdelab/gridfunctionspace/gridfunctionspaceutilities.hh', filetag="operator")
+    include_file('dune/pdelab/localoperator/idefault.hh', filetag="operator")
+    include_file('dune/pdelab/localoperator/flags.hh', filetag="operator")
+    include_file('dune/pdelab/localoperator/pattern.hh', filetag="operator")
+    include_file('dune/geometry/quadraturerules.hh', filetag="operator")
 
     public_base_class('Dune::PDELab::LocalOperatorDefaultFlags')
 
@@ -192,7 +189,7 @@ def generate_localoperator_kernels(form):
     # Generate the necessary jacobian methods
     from dune.perftool.options import get_option
     if get_option("numerical_jacobian"):
-        operator_include("dune/pdelab/localoperator/defaultimp.hh")
+        include_file("dune/pdelab/localoperator/defaultimp.hh", filetag="operator")
     else:
         from ufl import derivative
         from ufl.algorithms import expand_derivatives
-- 
GitLab