From c9980807c8b9d5a4a4bd42afaea0281bcffc2c15 Mon Sep 17 00:00:00 2001
From: Marcel Koch <marcel.koch@uni-muenster.de>
Date: Tue, 22 Jan 2019 12:03:47 +0100
Subject: [PATCH] move `name_point_in_macro` to tools

---
 .../codegen/blockstructured/quadrature.py     | 23 ++-----------
 python/dune/codegen/blockstructured/tools.py  | 34 +++++++++++++++++++
 2 files changed, 36 insertions(+), 21 deletions(-)

diff --git a/python/dune/codegen/blockstructured/quadrature.py b/python/dune/codegen/blockstructured/quadrature.py
index 7effba47..18479030 100644
--- a/python/dune/codegen/blockstructured/quadrature.py
+++ b/python/dune/codegen/blockstructured/quadrature.py
@@ -1,10 +1,7 @@
 from dune.codegen.error import CodegenError
-
-from dune.codegen.generation import (backend,
-                                     quadrature_mixin,
-                                     )
+from dune.codegen.generation import quadrature_mixin
 from dune.codegen.pdelab.quadrature import GenericQuadratureMixin
-from dune.codegen.blockstructured.geometry import name_point_in_macro
+from dune.codegen.blockstructured.tools import name_point_in_macro
 import pymbolic.primitives as prim
 
 
@@ -23,19 +20,3 @@ class BlockstructuredQuadratureMixin(GenericQuadratureMixin):
 
     def quadrature_position(self, index=None):
         raise CodegenError('Decide if the quadrature point is in the macro or micro element')
-#
-# @backend(interface="quad_pos", name='blockstructured')
-# def pymbolic_quadrature_position():
-#     quad_points = name_quadrature_points()
-#     quad_iname = quadrature_iname()
-#
-#     qp_in_micro = prim.Subscript(prim.Variable(quad_points), (prim.Variable(quad_iname),))
-#
-#     return prim.Variable(name_point_in_macro(qp_in_micro))
-#
-#
-# @backend(interface="qp_in_cell", name="blockstructured")
-# def pymbolic_quadrature_position_in_cell(restriction):
-#     from dune.codegen.pdelab.geometry import to_cell_coordinates
-#     quad_pos = pymbolic_quadrature_position()
-#     return to_cell_coordinates(quad_pos, restriction)
diff --git a/python/dune/codegen/blockstructured/tools.py b/python/dune/codegen/blockstructured/tools.py
index e3150804..adf2b7ff 100644
--- a/python/dune/codegen/blockstructured/tools.py
+++ b/python/dune/codegen/blockstructured/tools.py
@@ -1,4 +1,5 @@
 from dune.codegen.ufl.modified_terminals import Restriction
+from dune.codegen.tools import get_pymbolic_basename
 from dune.codegen.generation import (iname,
                                      domain,
                                      get_global_context_value,
@@ -115,3 +116,36 @@ def micro_index_to_macro_index(element, inames):
     p = element.degree()
     return prim.Sum(tuple((p * prim.Variable(si) + prim.Variable(bi)) * (p * k + 1) ** i
                           for i, (si, bi) in enumerate(zip(subelem_inames, inames))))
+
+
+# translate a point in the micro element into macro coordinates
+def define_point_in_macro(name, point_in_micro, visitor):
+    dim = local_dimension()
+    if get_form_option('vectorization_blockstructured'):
+        temporary_variable(name, shape=(dim,), managed=True)
+    else:
+        temporary_variable(name, shape=(dim,), shape_impl=('fv',))
+
+    # point_macro = (point_micro + index_micro) / number_of_blocks
+    # where index_micro = tensor index of the micro element
+    subelem_inames = sub_element_inames()
+    for i in range(dim):
+        if isinstance(point_in_micro, prim.Subscript):
+            expr = prim.Subscript(point_in_micro.aggregate, point_in_micro.index + (i,))
+        else:
+            expr = prim.Subscript(point_in_micro, (i,))
+        expr = prim.Sum((expr, prim.Variable(subelem_inames[i]),))
+        expr = prim.Quotient(expr, get_form_option('number_of_blocks'))
+        # TODO relax within inames
+        instruction(assignee=prim.Subscript(prim.Variable(name), (i,)),
+                    expression=expr,
+                    within_inames=frozenset(subelem_inames + visitor.quadrature_inames()),
+                    tags=frozenset({subelem_inames[i]})
+                    )
+
+
+def name_point_in_macro(point_in_micro, visitor):
+    assert isinstance(point_in_micro, prim.Expression)
+    name = get_pymbolic_basename(point_in_micro) + "_macro"
+    define_point_in_macro(name, point_in_micro, visitor)
+    return name
\ No newline at end of file
-- 
GitLab