From 15b8a14f3b492518c3da001549a798ea71593dd8 Mon Sep 17 00:00:00 2001 From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de> Date: Fri, 2 Feb 2018 10:32:21 +0100 Subject: [PATCH] Move grid function evaluation to its own module --- python/dune/perftool/pdelab/__init__.py | 2 +- python/dune/perftool/pdelab/basis.py | 52 -------------------- python/dune/perftool/pdelab/function.py | 63 +++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 53 deletions(-) create mode 100644 python/dune/perftool/pdelab/function.py diff --git a/python/dune/perftool/pdelab/__init__.py b/python/dune/perftool/pdelab/__init__.py index 0cb1ef2f..d3153ca0 100644 --- a/python/dune/perftool/pdelab/__init__.py +++ b/python/dune/perftool/pdelab/__init__.py @@ -12,8 +12,8 @@ from dune.perftool.pdelab.argument import (pymbolic_apply_function, ) from dune.perftool.pdelab.basis import (pymbolic_basis, pymbolic_reference_gradient, - pymbolic_gridfunction, ) +from dune.perftool.pdelab.function import pymbolic_gridfunction from dune.perftool.pdelab.geometry import (component_iname, pymbolic_cell_volume, pymbolic_facet_area, diff --git a/python/dune/perftool/pdelab/basis.py b/python/dune/perftool/pdelab/basis.py index b786c3be..d4db8834 100644 --- a/python/dune/perftool/pdelab/basis.py +++ b/python/dune/perftool/pdelab/basis.py @@ -229,55 +229,3 @@ def evaluate_coefficient_gradient(visitor, element, name, container, restriction forced_iname_deps=frozenset(get_backend("quad_inames")()).union(frozenset({dimindex})), forced_iname_deps_is_final=True, ) - - -def local_gridfunction(coeff, restriction, diffOrder): - from dune.perftool.pdelab.localoperator import name_gridfunction_member - gf = name_gridfunction_member(coeff, diffOrder) - name = "{}_local".format(gf) - define_local_gridfunction(name, gf) - bind_gridfunction_to_element(name, restriction) - return name - - -@preamble -def define_local_gridfunction(name, gf): - return "auto {} = localFunction({});".format(name, gf) - - -@preamble -def bind_gridfunction_to_element(gf, restriction): - element = name_cell(restriction) - return "{}.bind({});".format(gf, element) - - -def declare_grid_function_range(gridfunction): - def _decl(name, *args): - return "typename decltype({})::Range {};".format(gridfunction, name) - - return _decl - -@kernel_cached -def pymbolic_evaluate_gridfunction(name, coeff, restriction, grad): - diffOrder = 1 if grad else 0 - - gridfunction = local_gridfunction(coeff, restriction, diffOrder) - - temporary_variable(name, - shape=(1,) + (world_dimension(),) * diffOrder, - decl_method=declare_grid_function_range(gridfunction), - managed=False, - ) - - quadpos = get_backend(interface="qp_in_cell")(restriction) - instruction(code="{} = {}({});".format(name, gridfunction, quadpos), - assignees=frozenset({name}), - within_inames=frozenset(get_backend(interface="quad_inames")()), - within_inames_is_final=True, - ) - - -def pymbolic_gridfunction(coeff, restriction, grad): - name = "coeff{}{}".format(coeff.count(), "_grad" if grad else "") - pymbolic_evaluate_gridfunction(name, coeff, restriction, grad) - return Subscript(Variable(name), (0,)) diff --git a/python/dune/perftool/pdelab/function.py b/python/dune/perftool/pdelab/function.py new file mode 100644 index 00000000..d5949988 --- /dev/null +++ b/python/dune/perftool/pdelab/function.py @@ -0,0 +1,63 @@ +from dune.perftool.generation import (get_backend, + instruction, + kernel_cached, + preamble, + temporary_variable, + ) +from dune.perftool.pdelab.geometry import (name_cell, + world_dimension, + ) +from dune.perftool.pdelab.localoperator import name_gridfunction_member + +import pymbolic.primitives as prim + + +def local_gridfunction(coeff, restriction, diffOrder): + gf = name_gridfunction_member(coeff, diffOrder) + name = "{}_local".format(gf) + define_local_gridfunction(name, gf) + bind_gridfunction_to_element(name, restriction) + return name + + +@preamble +def define_local_gridfunction(name, gf): + return "auto {} = localFunction({});".format(name, gf) + + +@preamble +def bind_gridfunction_to_element(gf, restriction): + element = name_cell(restriction) + return "{}.bind({});".format(gf, element) + + +def declare_grid_function_range(gridfunction): + def _decl(name, *args): + return "typename decltype({})::Range {};".format(gridfunction, name) + + return _decl + +@kernel_cached +def pymbolic_evaluate_gridfunction(name, coeff, restriction, grad): + diffOrder = 1 if grad else 0 + + gridfunction = local_gridfunction(coeff, restriction, diffOrder) + + temporary_variable(name, + shape=(1,) + (world_dimension(),) * diffOrder, + decl_method=declare_grid_function_range(gridfunction), + managed=False, + ) + + quadpos = get_backend(interface="qp_in_cell")(restriction) + instruction(code="{} = {}({});".format(name, gridfunction, quadpos), + assignees=frozenset({name}), + within_inames=frozenset(get_backend(interface="quad_inames")()), + within_inames_is_final=True, + ) + + +def pymbolic_gridfunction(coeff, restriction, grad): + name = "coeff{}{}".format(coeff.count(), "_grad" if grad else "") + pymbolic_evaluate_gridfunction(name, coeff, restriction, grad) + return prim.Subscript(prim.Variable(name), (0,)) -- GitLab