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