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