From f8b3442e5352d7c61c72fc0171f54708ab2fd8d6 Mon Sep 17 00:00:00 2001
From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de>
Date: Thu, 21 Apr 2016 14:45:40 +0200
Subject: [PATCH] Finally, parameter class generation!

---
 dune/perftool/localbasiscache.hh             |  6 +++---
 python/dune/perftool/cgen/clazz.py           |  8 ++++++--
 python/dune/perftool/file.py                 |  1 +
 python/dune/perftool/generation/__init__.py  |  1 -
 python/dune/perftool/generation/context.py   |  3 ---
 python/dune/perftool/generation/cpp.py       |  2 +-
 python/dune/perftool/pdelab/driver.py        | 15 ++++-----------
 python/dune/perftool/pdelab/geometry.py      | 10 +++++-----
 python/dune/perftool/pdelab/localoperator.py | 11 +++++++----
 9 files changed, 27 insertions(+), 30 deletions(-)

diff --git a/dune/perftool/localbasiscache.hh b/dune/perftool/localbasiscache.hh
index cf301870..e39fd2a8 100644
--- a/dune/perftool/localbasiscache.hh
+++ b/dune/perftool/localbasiscache.hh
@@ -35,12 +35,12 @@ class LocalBasisCacheWithoutReferences
   typedef typename LocalBasisType::Traits::JacobianType JacobianType;
 
   public:
-  typedef CacheReturnProxy<RangeType> RangeReturnType;
+  typedef CacheReturnProxy<RangeType> FunctionReturnType;
   typedef CacheReturnProxy<JacobianType> JacobianReturnType;
 
-  RangeReturnType evaluateFunction(const DomainType& position, const LocalBasisType& localbasis) const
+  FunctionReturnType evaluateFunction(const DomainType& position, const LocalBasisType& localbasis) const
   {
-    return RangeReturnType(&c.evaluateFunction(position, localbasis));
+    return FunctionReturnType(&c.evaluateFunction(position, localbasis));
   }
 
   JacobianReturnType evaluateJacobian(const DomainType& position, const LocalBasisType& localbasis) const
diff --git a/python/dune/perftool/cgen/clazz.py b/python/dune/perftool/cgen/clazz.py
index 76a86ad0..7bcd5e8b 100644
--- a/python/dune/perftool/cgen/clazz.py
+++ b/python/dune/perftool/cgen/clazz.py
@@ -73,9 +73,13 @@ class Constructor(Generable):
         yield '\n'
         yield "{}:\n".format(access_modifier_string(self.access))
         yield self.clsname + "("
-        for ad in self.arg_decls:
-            for content in ad.generate(with_semicolon=False):
+        if self.arg_decls:
+            for content in self.arg_decls[0].generate(with_semicolon=False):
                 yield content
+            for ad in self.arg_decls[1:]:
+                yield ", "
+                for content in ad.generate(with_semicolon=False):
+                    yield content
         yield ")\n"
 
         # add the initializer list
diff --git a/python/dune/perftool/file.py b/python/dune/perftool/file.py
index c49439ef..e5abbaed 100644
--- a/python/dune/perftool/file.py
+++ b/python/dune/perftool/file.py
@@ -42,6 +42,7 @@ def generate_file(filename, tag, content, headerguard=True):
             assert isinstance(c, Generable)
             for line in c.generate():
                 f.write(line)
+            f.write('\n\n')
 
         if headerguard:
             f.write("\n\n#endif //{}\n".format(macro))
diff --git a/python/dune/perftool/generation/__init__.py b/python/dune/perftool/generation/__init__.py
index a65fa989..a51143e6 100644
--- a/python/dune/perftool/generation/__init__.py
+++ b/python/dune/perftool/generation/__init__.py
@@ -29,5 +29,4 @@ from dune.perftool.generation.loopy import (domain,
 from dune.perftool.generation.context import (cache_context,
                                               generic_context,
                                               get_generic_context_value,
-                                              namedata_context,
                                               )
diff --git a/python/dune/perftool/generation/context.py b/python/dune/perftool/generation/context.py
index 10abd4f4..13099e01 100644
--- a/python/dune/perftool/generation/context.py
+++ b/python/dune/perftool/generation/context.py
@@ -53,6 +53,3 @@ def generic_context(key, value):
 
 def get_generic_context_value(key):
     return _generic_context_cache[key]
-
-import functools
-namedata_context=functools.partial(generic_context, "namedata")
diff --git a/python/dune/perftool/generation/cpp.py b/python/dune/perftool/generation/cpp.py
index 539a5a60..5affeabf 100644
--- a/python/dune/perftool/generation/cpp.py
+++ b/python/dune/perftool/generation/cpp.py
@@ -43,7 +43,7 @@ def class_member(classtag=None, access=AccessModifier.PRIVATE):
     return generator_factory(item_tags=(classtag, "member"), on_store=lambda m: ClassMember(m, access=access), counted=True)
 
 
-def constructor_parameter(_type, name, classtag=None, constructortag=None):
+def constructor_parameter(_type, name, classtag=None, constructortag="default"):
     assert classtag
     assert constructortag
     from cgen import Value
diff --git a/python/dune/perftool/pdelab/driver.py b/python/dune/perftool/pdelab/driver.py
index 4a286b3f..27a0b245 100644
--- a/python/dune/perftool/pdelab/driver.py
+++ b/python/dune/perftool/pdelab/driver.py
@@ -410,21 +410,15 @@ def name_matrixbackend():
     return "mb"
 
 
-@preamble
-def typedef_parameters(name):
-    return "typedef LocalOperatorParameters {};".format(name)
-
-
 @symbol
 def type_parameters():
-    typedef_parameters("Params")
-    return "Params"
+    return "LocalOperatorParams"
 
 
 @preamble
 def define_parameters(name):
     partype = type_parameters()
-    return "{} {}();".format(partype, name)
+    return "{} {};".format(partype, name)
 
 
 @symbol
@@ -455,9 +449,8 @@ def type_localoperator():
 def define_localoperator(name):
     loptype = type_localoperator()
     ini = name_initree()
-#     params = name_parameters()
-#     return "{} {}({}, {});".format(loptype, name, ini, params)
-    return "{} {}({});".format(loptype, name, ini)
+    params = name_parameters()
+    return "{} {}({}, {});".format(loptype, name, ini, params)
 
 
 @symbol
diff --git a/python/dune/perftool/pdelab/geometry.py b/python/dune/perftool/pdelab/geometry.py
index 1cf85c4e..d6c54214 100644
--- a/python/dune/perftool/pdelab/geometry.py
+++ b/python/dune/perftool/pdelab/geometry.py
@@ -8,19 +8,19 @@ from dune.perftool.pdelab.quadrature import (name_quadrature_position,
 
 
 @symbol
-def name_elementgeometry():
+def name_entitygeometry():
     return 'eg'
 
 
 @symbol
-def name_element():
-    eg = name_elementgeometry()
-    return "{}.element()".format(eg)
+def name_entity():
+    eg = name_entitygeometry()
+    return "{}.entity()".format(eg)
 
 
 @preamble
 def define_geometry(name):
-    eg = name_elementgeometry()
+    eg = name_entitygeometry()
     return "auto {} = {}.geometry();".format(name,
                                              eg
                                              )
diff --git a/python/dune/perftool/pdelab/localoperator.py b/python/dune/perftool/pdelab/localoperator.py
index 56f8fe23..12162fbe 100644
--- a/python/dune/perftool/pdelab/localoperator.py
+++ b/python/dune/perftool/pdelab/localoperator.py
@@ -37,7 +37,7 @@ def name_initree_constructor_param():
 def define_initree(name):
     param_name = name_initree_constructor_param()
     include_file('dune/common/parametertree.hh', filetag="operatorfile")
-    constructor_parameter("const Dune::ParameterTree&", param_name, classtag="operator", constructortag="iniconstructor")
+    constructor_parameter("const Dune::ParameterTree&", param_name, classtag="operator")
     initializer_list(name, [param_name], classtag="operator")
 
     return "const Dune::ParameterTree& {};".format(name)
@@ -189,7 +189,7 @@ def cgen_class_from_cache(tag, members=[]):
     from dune.perftool.generation import retrieve_cache_items
 
     # Generate the name by concatenating basename and template parameters
-    basename, fullname = class_type_from_cache("operator")
+    basename, fullname = class_type_from_cache(tag)
 
     base_classes = [bc for bc in retrieve_cache_items('{} and baseclass'.format(tag))]
     constructor_params = [bc for bc in retrieve_cache_items('{} and constructor_param'.format(tag))]
@@ -231,7 +231,9 @@ def generate_localoperator_kernels(form, namedata):
     # Have a data structure collect the generated kernels
     operator_kernels = {}
 
-    from dune.perftool.generation import namedata_context
+    import functools
+    from dune.perftool.generation import generic_context
+    namedata_context = functools.partial(generic_context, "namedata")
 
     # Generate the necessary residual methods
     for integral in form.integrals():
@@ -270,6 +272,7 @@ def generate_localoperator_file(kernels):
     # Write the file!
     from dune.perftool.file import generate_file
 
+    param = cgen_class_from_cache("parameterclass")
     # TODO take the name of this thing from the UFL file
     lop = cgen_class_from_cache("operator", members=operator_methods)
-    generate_file(get_option("operator_file"), "operatorfile", [lop])
+    generate_file(get_option("operator_file"), "operatorfile", [param, lop])
-- 
GitLab