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