From 81fc7bcddeff5bc203b322f72d3f5a4a7b6ba81c Mon Sep 17 00:00:00 2001 From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de> Date: Fri, 6 Oct 2017 13:21:08 +0200 Subject: [PATCH] Evaluate JIT on axiparallel grids in operator constructor --- .../perftool/pdelab/driver/gridoperator.py | 4 +- python/dune/perftool/pdelab/geometry.py | 45 +++++++++++-------- python/dune/perftool/pdelab/localoperator.py | 16 ++++++- 3 files changed, 43 insertions(+), 22 deletions(-) diff --git a/python/dune/perftool/pdelab/driver/gridoperator.py b/python/dune/perftool/pdelab/driver/gridoperator.py index 39071cc8..4727f4f2 100644 --- a/python/dune/perftool/pdelab/driver/gridoperator.py +++ b/python/dune/perftool/pdelab/driver/gridoperator.py @@ -92,10 +92,12 @@ def type_localoperator(formdata): @preamble def define_localoperator(name, formdata): + trial_gfs = name_trial_gfs() + test_gfs = name_test_gfs() loptype = type_localoperator(formdata) ini = name_initree() params = name_parameters(formdata) - return "{} {}({}, {});".format(loptype, name, ini, params) + return "{} {}({}, {}, {}, {});".format(loptype, name, trial_gfs, test_gfs, ini, params) def name_localoperator(formdata): diff --git a/python/dune/perftool/pdelab/geometry.py b/python/dune/perftool/pdelab/geometry.py index e9a98163..74a60a46 100644 --- a/python/dune/perftool/pdelab/geometry.py +++ b/python/dune/perftool/pdelab/geometry.py @@ -1,6 +1,7 @@ from dune.perftool.ufl.modified_terminals import Restriction from dune.perftool.pdelab.restriction import restricted_name from dune.perftool.generation import (backend, + class_member, domain, get_backend, get_global_context_value, @@ -308,28 +309,32 @@ def define_jacobian_inverse_transposed_temporary(restriction): return _define_jacobian_inverse_transposed_temporary -@preamble -@backend(interface="define_jit", name="constant_transformation_matrix") -def define_constant_jacobian_inveser_transposed(name, restriction): - geo = name_cell_geometry(restriction) - pos = name_localcenter() - dim = world_dimension() +@preamble(kernel="operator") +def define_constant_jacobian_inverse_transposed_eval(name): + from dune.perftool.pdelab.localoperator import name_ansatz_gfs_constructor_param, lop_template_range_field + gfs = name_ansatz_gfs_constructor_param() + rft = lop_template_range_field() - if restriction: - geo_in = name_in_cell_geometry(restriction) - pos = "{}.global({})".format(geo_in, pos) + return "{} = {}.gridView().template begin<0>()->geometry().jacobianInverseTransposed(Dune::FieldVector<{}, {}>());".format(name, gfs, rft, world_dimension()) - globalarg(name, dtype=np.float64, shape=(dim, dim), managed=False) - jit_type = type_jacobian_inverse_transposed(restriction) - return '{} {} = {}.jacobianInverseTransposed({});'.format(jit_type, - name, - geo, - pos, - ) +@class_member(classtag="operator") +def define_constant_jacobian_inverse_transposed(name): + define_constant_jacobian_inverse_transposed_eval(name) + from dune.perftool.pdelab.localoperator import lop_template_ansatz_gfs + gfst = lop_template_ansatz_gfs() + return "typename {}::Traits::GridView::template Codim<0>::Geometry::JacobianInverseTransposed {};".format(gfst, name) + + +@backend(interface="name_jit", name="constant_transformation_matrix") +def name_constant_jacobian_inverse_transposed(restriction): + name = "jit" + dim = world_dimension() + globalarg(name, dtype=np.float64, shape=(dim, dim), managed=False) + define_constant_jacobian_inverse_transposed(name) + return name -@backend(interface="define_jit", name="default") def define_jacobian_inverse_transposed(name, restriction): dim = world_dimension() temporary_variable(name, decl_method=define_jacobian_inverse_transposed_temporary(restriction), shape=(dim, dim)) @@ -345,16 +350,18 @@ def define_jacobian_inverse_transposed(name, restriction): ) +@backend(interface="define_jit", name="default") def name_jacobian_inverse_transposed(restriction): name = restricted_name("jit", restriction) - get_backend(interface="define_jit", selector=option_switch("constant_transformation_matrix"))(name, restriction) + define_jacobian_inverse_transposed(name, restriction) return name def pymbolic_jacobian_inverse_transposed(i, j, restriction): + name = get_backend(interface="name_jit", selector=option_switch("constant_transformation_matrix"))(restriction) # Dune only has JacobianInverseTransposed as a first class citizen, # so we need to switch the indices around! - return prim.Subscript(prim.Variable(name_jacobian_inverse_transposed(restriction)), (j, i)) + return prim.Subscript(prim.Variable(name), (j, i)) @backend(interface="detjac", name="constant_transformation_matrix") diff --git a/python/dune/perftool/pdelab/localoperator.py b/python/dune/perftool/pdelab/localoperator.py index d4ed5699..853ca80c 100644 --- a/python/dune/perftool/pdelab/localoperator.py +++ b/python/dune/perftool/pdelab/localoperator.py @@ -69,12 +69,24 @@ def name_localoperator_file(formdata, data): @template_parameter(classtag="operator") def lop_template_ansatz_gfs(): - return "GFSU" + name = "GFSU" + constructor_parameter("const {}&".format(name), name_ansatz_gfs_constructor_param(), classtag="operator") + return name + + +def name_ansatz_gfs_constructor_param(): + return "gfsu" @template_parameter(classtag="operator") def lop_template_test_gfs(): - return "GFSV" + name = "GFSV" + constructor_parameter("const {}&".format(name), name_test_gfs_constructor_param(), classtag="operator") + return name + + +def name_test_gfs_constructor_param(): + return "gfsv" @template_parameter(classtag="operator") -- GitLab