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