From 6a2fe0820b3a4ae93df516fcb76bc45e85f73878 Mon Sep 17 00:00:00 2001
From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de>
Date: Fri, 22 Apr 2016 13:52:15 +0200
Subject: [PATCH] Add previously forgotten new module on parameter functions

---
 python/dune/perftool/pdelab/parameter.py | 77 ++++++++++++++++++++++++
 1 file changed, 77 insertions(+)
 create mode 100644 python/dune/perftool/pdelab/parameter.py

diff --git a/python/dune/perftool/pdelab/parameter.py b/python/dune/perftool/pdelab/parameter.py
new file mode 100644
index 00000000..de1d5d29
--- /dev/null
+++ b/python/dune/perftool/pdelab/parameter.py
@@ -0,0 +1,77 @@
+""" Generators for parameter functions """
+
+from dune.perftool.generation import (class_basename,
+                                      class_member,
+                                      constructor_parameter,
+                                      generator_factory,
+                                      initializer_list,
+                                      symbol,
+                                      temporary_variable
+                                      )
+from dune.perftool.pdelab.geometry import name_entity
+from dune.perftool.pdelab.quadrature import (name_quadrature_position,
+                                             quadrature_preamble,
+                                             )
+from dune.perftool.cgen.clazz import AccessModifier
+from dune.perftool.pdelab.localoperator import (class_type_from_cache,
+                                                localoperator_basename,
+                                                )
+
+
+@class_basename("parameterclass")
+def parameterclass_basename():
+    lopbase = localoperator_basename()
+    return "{}Params".format(lopbase)
+
+
+@class_member("operator")
+def define_parameterclass(name):
+    _, t = class_type_from_cache("parameterclass")
+    constructor_parameter("const {}&".format(t), name + "_", classtag="operator")
+    initializer_list(name, [name + "_"], classtag="operator")
+    return "const {}& {};".format(t, name)
+
+
+@symbol
+def name_paramclass():
+    define_parameterclass("param")
+    return "param"
+
+
+@class_member("parameterclass", access=AccessModifier.PUBLIC)
+def define_parameter_function_class_member(name, expr):
+    result = ["template<typename E, typename X>",
+              "double {}(const E& e, const X& x) const".format(name),
+              "{",
+              ]
+
+    if expr.is_global:
+        result.append("  auto xg = e.geometry().global(x);")
+        e = expr.c_expr.replace('x', 'xg')
+    else:
+        e = expr.c_expr
+
+    result.append("  return {};".format(e))
+    result.append("}")
+
+    return result
+
+
+def evaluate_parameter_function(name):
+    param = name_paramclass()
+    entity = name_entity()
+    pos = name_quadrature_position()
+    return quadrature_preamble('{} = {}.{}({}, {});'.format(name,
+                                                            name_paramclass(),
+                                                            name,
+                                                            entity,
+                                                            pos,
+                                                            ),
+                               assignees=frozenset({name})
+                               )
+
+
+def parameter_function(name, expr):
+    temporary_variable(name, shape=())
+    define_parameter_function_class_member(name, expr)
+    evaluate_parameter_function(name)
-- 
GitLab