From cbb9a6849c63a3e42df026b67784f6a539987446 Mon Sep 17 00:00:00 2001
From: Marcel Koch <marcel.koch@uni-muenster.de>
Date: Wed, 26 Jul 2017 11:29:17 +0200
Subject: [PATCH] Adds support for mixed elements, not thoroughly tested

---
 .../dune/perftool/blockstructured/__init__.py  |  1 -
 python/dune/perftool/blockstructured/basis.py  | 18 +++---------------
 python/dune/perftool/blockstructured/spaces.py |  7 +++++--
 python/dune/perftool/pdelab/driver.py          |  5 ++---
 4 files changed, 10 insertions(+), 21 deletions(-)

diff --git a/python/dune/perftool/blockstructured/__init__.py b/python/dune/perftool/blockstructured/__init__.py
index 1c82f0a1..0185e2cb 100644
--- a/python/dune/perftool/blockstructured/__init__.py
+++ b/python/dune/perftool/blockstructured/__init__.py
@@ -11,7 +11,6 @@ from dune.perftool.blockstructured.geometry import (pymbolic_jacobian_inverse_tr
                                                     pymbolic_jacobian_determinant,
                                                     pymbolic_facet_jacobian_determinant,
                                                     to_global)
-from dune.perftool.blockstructured.basis import pymbolic_reference_gradient
 from dune.perftool.blockstructured.tools import sub_element_inames
 
 from dune.perftool.pdelab import PDELabInterface
diff --git a/python/dune/perftool/blockstructured/basis.py b/python/dune/perftool/blockstructured/basis.py
index efbe0915..84353a33 100644
--- a/python/dune/perftool/blockstructured/basis.py
+++ b/python/dune/perftool/blockstructured/basis.py
@@ -8,7 +8,6 @@ from dune.perftool.generation import (backend,
                                       initializer_list,
                                       include_file,)
 from dune.perftool.tools import get_pymbolic_basename
-# TODO clean up some imports
 from dune.perftool.pdelab.basis import (declare_cache_temporary,
                                         name_localbasis_cache,
                                         type_localbasis,
@@ -60,7 +59,7 @@ def define_localbasis(leaf_element, name):
 
 
 def name_localbasis(leaf_element):
-    name = "microElementBasis"
+    name = "{}_microElementBasis".format(FEM_name_mangling(leaf_element))
     globalarg(name)
     define_localbasis(leaf_element, name)
     return name
@@ -69,7 +68,7 @@ def name_localbasis(leaf_element):
 @backend(interface="evaluate_basis", name="blockstructured")
 @kernel_cached
 def evaluate_basis(leaf_element, name, restriction):
-    temporary_variable(name, shape=(4,), decl_method=declare_cache_temporary(leaf_element, restriction, 'Function'))
+    temporary_variable(name, shape=(leaf_element.degree(),), decl_method=declare_cache_temporary(leaf_element, restriction, 'Function'))
     cache = name_localbasis_cache(leaf_element)
     qp = pymbolic_quadrature_position_in_cell(restriction)
     localbasis = name_localbasis(leaf_element)
@@ -83,7 +82,7 @@ def evaluate_basis(leaf_element, name, restriction):
 @backend(interface="evaluate_grad", name="blockstructured")
 @kernel_cached
 def evaluate_reference_gradient(leaf_element, name, restriction):
-    temporary_variable(name, shape=(4, 1, world_dimension()), decl_method=declare_cache_temporary(leaf_element, restriction, 'Jacobian'))
+    temporary_variable(name, shape=(leaf_element.degree(), 1, world_dimension()), decl_method=declare_cache_temporary(leaf_element, restriction, 'Jacobian'))
     cache = name_localbasis_cache(leaf_element)
     qp = pymbolic_quadrature_position_in_cell(restriction)
     localbasis = name_localbasis(leaf_element)
@@ -92,14 +91,3 @@ def evaluate_reference_gradient(leaf_element, name, restriction):
                 assignees=frozenset({name}),
                 read_variables=frozenset({get_pymbolic_basename(qp)}),
                 )
-
-
-@backend(interface="pymbolic_reference_gradient", name="blockstructured")
-def pymbolic_reference_gradient(leaf_element, restriction, number, context=''):
-    assert leaf_element.num_sub_elements() == 0
-    name = "js_{}".format(FEM_name_mangling(leaf_element))
-    name = restricted_name(name, restriction)
-    evaluate_reference_gradient(leaf_element, name, restriction)
-    inames = lfs_inames(leaf_element, restriction, number, context=context)
-
-    return prim.Subscript(prim.Variable(name), (tensor_index_to_sequential_index(inames,2), 0))
\ No newline at end of file
diff --git a/python/dune/perftool/blockstructured/spaces.py b/python/dune/perftool/blockstructured/spaces.py
index 97a6f027..95eb919f 100644
--- a/python/dune/perftool/blockstructured/spaces.py
+++ b/python/dune/perftool/blockstructured/spaces.py
@@ -1,6 +1,7 @@
 from dune.perftool.generation import (backend,
                                       domain)
 from dune.perftool.pdelab.geometry import world_dimension
+from dune.perftool.pdelab.spaces import name_leaf_lfs
 
 
 @backend(interface="lfs_inames", name="blockstructured")
@@ -12,7 +13,9 @@ def lfs_inames(element, restriction, count=None, context=''):
         else:
             context = str(count)
 
-    name = "micro_{}_index".format(context)
-    domain(name, pow(2,world_dimension()))
+    lfs = name_leaf_lfs(element, restriction)
+
+    name = "micro_{}_{}_index".format(lfs, context)
+    domain(name, pow(element._degree+1,world_dimension()))
 
     return (name, )
diff --git a/python/dune/perftool/pdelab/driver.py b/python/dune/perftool/pdelab/driver.py
index 7c8a9255..1e92e67c 100644
--- a/python/dune/perftool/pdelab/driver.py
+++ b/python/dune/perftool/pdelab/driver.py
@@ -1791,8 +1791,7 @@ def generate_driver(formdatas, data):
 
     #TODO find a better solution ...
     if get_option("blockstructured"):
-        degree = _driver_data["form"].coefficients()[0].ufl_element()._degree
-        _driver_data["form"].coefficients()[0].ufl_element()._degree = get_option("number_of_blocks")
+        set_blockstructured_degree()
 
     # Entrypoint for driver generation
     if get_option("opcounter") or get_option("time_opcounter"):
@@ -1844,4 +1843,4 @@ def generate_driver(formdatas, data):
 
     #TODO find a better solution ...
     if get_option("blockstructured"):
-        _driver_data["form"].coefficients()[0].ufl_element()._degree = degree
+        unset_blockstructured_degree()
-- 
GitLab