From 76bc7bfc2c7d08a3cf50fb728c4c2c547e6933a4 Mon Sep 17 00:00:00 2001
From: Marcel Koch <marcel.koch@uni-muenster.de>
Date: Tue, 22 Jan 2019 11:21:38 +0100
Subject: [PATCH] adds to_global

---
 .../dune/codegen/blockstructured/geometry.py  | 71 +++++++++----------
 1 file changed, 34 insertions(+), 37 deletions(-)

diff --git a/python/dune/codegen/blockstructured/geometry.py b/python/dune/codegen/blockstructured/geometry.py
index 36317274..3bf5acc4 100644
--- a/python/dune/codegen/blockstructured/geometry.py
+++ b/python/dune/codegen/blockstructured/geometry.py
@@ -27,6 +27,20 @@ class BlockStructuredGeometryMixin(GenericPDELabGeometryMixin):
     def spatial_coordinate(self, o):
         return self.to_global(self.quadrature_position_in_macro())
 
+    def to_global(self, local):
+        assert isinstance(local, prim.Expression)
+        name = get_pymbolic_basename(local) + "_global"
+
+        it = get_global_context_value("integral_type")
+
+        if it == 'cell':
+            compute_multilinear_to_global_transformation(name, local, self)
+            return prim.Variable(name)
+        elif it == 'exterior_facet' or it == 'interior_facet':
+            return GenericPDELabGeometryMixin.to_global(self, local)
+        else:
+            raise NotImplementedError
+
     def facet_jacobian_determinant(self, o):
         raise NotImplementedError("I think this case was never really implemented")
 
@@ -71,6 +85,20 @@ class BlockStructuredGeometryMixin(GenericPDELabGeometryMixin):
 
 @geometry_mixin("blockstructured_axiparallel")
 class AxiparallelBlockStructuredGeometryMixin(AxiparallelGeometryMixin, BlockStructuredGeometryMixin):
+    def to_global(self, local):
+        assert isinstance(local, prim.Expression)
+        name = get_pymbolic_basename(local) + "_global"
+
+        it = get_global_context_value("integral_type")
+
+        if it == 'cell':
+            compute_axiparallel_to_global_transformation(name, local, self)
+            return prim.Variable(name)
+        elif it == 'exterior_facet' or it == 'interior_facet':
+            return AxiparallelGeometryMixin.to_global(self, local)
+        else:
+            raise NotImplementedError
+
     def facet_jacobian_determinant(self, o):
         raise NotImplementedError("I think this case was never really implemented")
 
@@ -241,17 +269,6 @@ def name_jacobian_determinant_inverse(visitor):
     return name
 
 
-# scale determinant according to the order of the blockstructuring
-def pymbolic_jacobian_determinant():
-    if get_form_option("constant_transformation_matrix"):
-        from dune.codegen.pdelab.geometry import name_jacobian_determinant
-        n_det = name_jacobian_determinant()
-    else:
-        n_det = name_jacobian_determinant_abs()
-    return prim.Quotient(prim.Variable(n_det),
-                         prim.Power(get_form_option("number_of_blocks"), local_dimension()))
-
-
 def compute_inverse_transposed(name, det_inv, matrix, visitor):
     dim = world_dimension()
     matrix_entry = [[prim.Subscript(prim.Variable(matrix), (i, j)) for j in range(dim)] for i in range(dim)]
@@ -369,7 +386,7 @@ def name_point_in_macro(point_in_micro, visitor):
     return name
 
 
-def apply_default_to_global_transformation(name, local):
+def compute_multilinear_to_global_transformation(name, local, visitor):
     dim = world_dimension()
     temporary_variable(name, shape=(dim,), managed=True)
     corners = name_element_corners()
@@ -400,13 +417,13 @@ def apply_default_to_global_transformation(name, local):
     assignee = prim.Subscript(prim.Variable(name), (dim_pym,))
 
     instruction(assignee=assignee, expression=expr,
-                within_inames=frozenset(sub_element_inames() + get_backend(interface="quad_inames")() + (dim_pym.name,)),
+                within_inames=frozenset(sub_element_inames() + visitor.quadrature_inames() + (dim_pym.name,)),
                 within_inames_is_final=True,
-                depends_on=frozenset({Writes(local.name), Writes(corners)})
+                depends_on=frozenset({Writes(get_pymbolic_basename(local)), Writes(corners)})
                 )
 
 
-def apply_constant_to_global_transformation(name, local):
+def compute_axiparallel_to_global_transformation(name, local, visitor):
     dim = world_dimension()
     temporary_variable(name, shape=(dim,), managed=True)
     corners = name_element_corners()
@@ -423,32 +440,12 @@ def apply_constant_to_global_transformation(name, local):
     assignee = prim.Subscript(prim.Variable(name), (dim_pym,))
 
     instruction(assignee=assignee, expression=expr,
-                within_inames=frozenset(sub_element_inames() + get_backend(interface="quad_inames")() + (dim_pym.name,)),
+                within_inames=frozenset(sub_element_inames() + visitor.quadrature_inames() + (dim_pym.name,)),
                 within_inames_is_final=True,
-                depends_on=frozenset({Writes(local.name), Writes(corners)})
+                depends_on=frozenset({Writes(get_pymbolic_basename(local)), Writes(corners)})
                 )
 
 
-def to_global(local, visitor):
-    macro = name_point_in_macro(local, visitor)
-    name = macro + "_global"
-
-    it = get_global_context_value("integral_type")
-
-    if it == 'cell':
-        if get_form_option("constant_transformation_matrix"):
-            apply_constant_to_global_transformation(name, prim.Variable(macro))
-        else:
-            apply_default_to_global_transformation(name, prim.Variable(macro))
-    elif it == 'exterior_facet' or it == 'interior_facet':
-        from dune.codegen.pdelab.geometry import apply_to_global_transformation
-        apply_to_global_transformation(name, prim.Variable(macro))
-    else:
-        raise NotImplementedError
-
-    return prim.Variable(name)
-
-
 def define_element_corners(name):
     from dune.codegen.pdelab.driver import get_form
     n_corners = get_form().ufl_cell().num_vertices()
-- 
GitLab