From 1a78e5aaff3998869c559e99bb3e1bd357402a1f Mon Sep 17 00:00:00 2001 From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de> Date: Fri, 14 Sep 2018 15:32:11 +0200 Subject: [PATCH] Implement FacetNormals in constraints and Powerconstraints with varying implementation --- .../perftool/pdelab/driver/constraints.py | 21 +++++++------------ python/dune/perftool/pdelab/driver/visitor.py | 4 ++++ 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/python/dune/perftool/pdelab/driver/constraints.py b/python/dune/perftool/pdelab/driver/constraints.py index d6c021f2..dc65354a 100644 --- a/python/dune/perftool/pdelab/driver/constraints.py +++ b/python/dune/perftool/pdelab/driver/constraints.py @@ -1,4 +1,5 @@ -from dune.perftool.generation import (global_context, +from dune.perftool.generation import (get_counted_variable, + global_context, include_file, preamble, ) @@ -52,12 +53,10 @@ def assemble_constraints(name): def name_bctype_function(element, is_dirichlet): - if isinstance(element, (VectorElement, TensorElement)): - subel = element.sub_elements()[0] - child = name_bctype_function(subel, is_dirichlet[:subel.value_size()]) - name = "{}_pow{}bctype".format(child, element.num_sub_elements()) - define_power_bctype_function(element, name, child) - return name + # Note: Previously, there was a separate code branch for VectorElement here, + # which was implemented through PDELabs Power constraints concept. + # However this completely fails if you have different constraints for + # the children of a VectorElement. We therefore omit this branch completely. if isinstance(element, MixedElement): k = 0 childs = [] @@ -69,7 +68,7 @@ def name_bctype_function(element, is_dirichlet): return name else: assert isinstance(element, (FiniteElement, TensorProductElement)) - name = "{}_bctype".format(FEM_name_mangling(element).lower()) + name = get_counted_variable("bctype") define_bctype_function(element, is_dirichlet[0], name) return name @@ -85,12 +84,6 @@ def define_bctype_function(element, is_dirichlet, name): ) -@preamble(section="constraints") -def define_power_bctype_function(element, name, subgfs): - include_file('dune/pdelab/constraints/common/constraintsparameters.hh', filetag='driver') - return "Dune::PDELab::PowerConstraintsParameters<decltype({}), {}> {}({});".format(subgfs, element.num_sub_elements(), name, subgfs) - - @preamble(section="constraints") def define_composite_bctype_function(element, is_dirichlet, name, subgfs): include_file('dune/pdelab/constraints/common/constraintsparameters.hh', filetag='driver') diff --git a/python/dune/perftool/pdelab/driver/visitor.py b/python/dune/perftool/pdelab/driver/visitor.py index 447f3d53..c126e40d 100644 --- a/python/dune/perftool/pdelab/driver/visitor.py +++ b/python/dune/perftool/pdelab/driver/visitor.py @@ -22,6 +22,10 @@ class DriverUFL2PymbolicVisitor(UFL2LoopyVisitor): ret = self._call(expr, False) return set(self.preambles), ret + def facet_normal(self, o): + self.preambles.append("auto n=is.unitOuterNormal(xl);") + return prim.Variable("n") + def spatial_coordinate(self, o): self.preambles.append("auto x=is.geometry().global(xl);") return prim.Variable("x") -- GitLab