From be6bbb5eb3ab4f5a4527724005ad1902ede242ef Mon Sep 17 00:00:00 2001
From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de>
Date: Fri, 6 Oct 2017 17:54:29 +0200
Subject: [PATCH] Implement volumes through jacobian determinants for
 axiparallel grids

---
 python/dune/perftool/pdelab/__init__.py  | 12 ++++++------
 python/dune/perftool/pdelab/geometry.py  | 22 ++++++++++++++--------
 python/dune/perftool/sumfact/__init__.py |  4 ++++
 python/dune/perftool/sumfact/geometry.py |  8 ++++++++
 python/dune/perftool/ufl/visitor.py      |  4 ++--
 5 files changed, 34 insertions(+), 16 deletions(-)

diff --git a/python/dune/perftool/pdelab/__init__.py b/python/dune/perftool/pdelab/__init__.py
index 9a6e6ae4..2450b8a6 100644
--- a/python/dune/perftool/pdelab/__init__.py
+++ b/python/dune/perftool/pdelab/__init__.py
@@ -14,8 +14,8 @@ from dune.perftool.pdelab.basis import (pymbolic_basis,
                                         pymbolic_reference_gradient,
                                         )
 from dune.perftool.pdelab.geometry import (component_iname,
-                                           name_cell_volume,
-                                           name_facet_area,
+                                           pymbolic_cell_volume,
+                                           pymbolic_facet_area,
                                            pymbolic_facet_jacobian_determinant,
                                            pymbolic_jacobian_determinant,
                                            pymbolic_jacobian_inverse_transposed,
@@ -143,11 +143,11 @@ class PDELabInterface(object):
     def pymbolic_unit_outer_normal(self):
         return pymbolic_unit_outer_normal()
 
-    def name_cell_volume(self, restriction):
-        return name_cell_volume(restriction)
+    def pymbolic_cell_volume(self, restriction):
+        return pymbolic_cell_volume(restriction)
 
-    def name_facet_area(self):
-        return name_facet_area()
+    def pymbolic_facet_area(self):
+        return pymbolic_facet_area()
 
     #
     # Quadrature related generator functions
diff --git a/python/dune/perftool/pdelab/geometry.py b/python/dune/perftool/pdelab/geometry.py
index bb590f98..03af2447 100644
--- a/python/dune/perftool/pdelab/geometry.py
+++ b/python/dune/perftool/pdelab/geometry.py
@@ -472,10 +472,13 @@ def define_cell_volume(name, restriction):
     return "auto {} = {}.volume();".format(name, geo)
 
 
-def name_cell_volume(restriction):
-    name = restricted_name("volume", restriction)
-    define_cell_volume(name, restriction)
-    return name
+def pymbolic_cell_volume(restriction):
+    if get_option("constant_transformation_matrix"):
+        return pymbolic_jacobian_determinant()
+    else:
+        name = restricted_name("volume", restriction)
+        define_cell_volume(name, restriction)
+        return prim.Variable(name)
 
 
 @preamble
@@ -485,7 +488,10 @@ def define_facet_area(name):
     return "auto {} = {}.volume();".format(name, geo)
 
 
-def name_facet_area():
-    name = "area"
-    define_facet_area(name)
-    return name
+def pymbolic_facet_area():
+    if get_option("constant_transformation_matrix"):
+        return pymbolic_facet_jacobian_determinant()
+    else:
+        name = "area"
+        define_facet_area(name)
+        return prim.Variable(name)
diff --git a/python/dune/perftool/sumfact/__init__.py b/python/dune/perftool/sumfact/__init__.py
index 3a96f275..fa28b0f4 100644
--- a/python/dune/perftool/sumfact/__init__.py
+++ b/python/dune/perftool/sumfact/__init__.py
@@ -91,3 +91,7 @@ class SumFactInterface(PDELabInterface):
     def pymbolic_facet_jacobian_determinant(self):
         from dune.perftool.sumfact.geometry import pymbolic_facet_jacobian_determinant
         return pymbolic_facet_jacobian_determinant()
+
+    def pymbolic_facet_area(self):
+        from dune.perftool.sumfact.geometry import pymbolic_facet_area
+        return pymbolic_facet_area()
diff --git a/python/dune/perftool/sumfact/geometry.py b/python/dune/perftool/sumfact/geometry.py
index e0f4a85b..95f38380 100644
--- a/python/dune/perftool/sumfact/geometry.py
+++ b/python/dune/perftool/sumfact/geometry.py
@@ -253,3 +253,11 @@ def define_constant_facet_jacobian_determinant_eval(name):
     instruction(code="\n".join(code),
                 kernel="operator",
                 )
+
+
+def pymbolic_facet_area():
+    if get_option("constant_transformation_matrix"):
+        return pymbolic_facet_jacobian_determinant()
+    else:
+        from dune.perftool.pdelab.geometry import pymbolic_facet_area as _norm
+        return _norm()
diff --git a/python/dune/perftool/ufl/visitor.py b/python/dune/perftool/ufl/visitor.py
index ae1ccdae..972a4bb7 100644
--- a/python/dune/perftool/ufl/visitor.py
+++ b/python/dune/perftool/ufl/visitor.py
@@ -452,10 +452,10 @@ class UFL2LoopyVisitor(ModifiedTerminalTracker):
         if self.measure == 'exterior_facet':
             restriction = Restriction.NEGATIVE
 
-        return prim.Variable(self.interface.name_cell_volume(restriction))
+        return self.interface.pymbolic_cell_volume(restriction)
 
     def facet_area(self, o):
-        return prim.Variable(self.interface.name_facet_area())
+        return self.interface.pymbolic_facet_area()
 
     #
     # Equality/Hashability of the visitor
-- 
GitLab