From 6404ec429608c148046afbb2b5f6b398dc3bc571 Mon Sep 17 00:00:00 2001 From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de> Date: Fri, 14 Sep 2018 09:34:27 +0200 Subject: [PATCH] Fix constraints assembly bug We previously used bool() on the constraints expression to find out whether we need to use the DIrichletConstraintsAssembler. However, UFL does the stupid thing of evaulating bool(eq(x[0], 0)) to False, because x[0] and 0 are obvioulsy not the same. Veeeery bad behaviour for a symbolic language. --- python/dune/perftool/pdelab/driver/constraints.py | 8 ++++++-- python/dune/perftool/pdelab/driver/gridfunctionspace.py | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/python/dune/perftool/pdelab/driver/constraints.py b/python/dune/perftool/pdelab/driver/constraints.py index e3a96df4..ddb880ee 100644 --- a/python/dune/perftool/pdelab/driver/constraints.py +++ b/python/dune/perftool/pdelab/driver/constraints.py @@ -13,6 +13,7 @@ from dune.perftool.pdelab.driver.gridfunctionspace import (name_gfs, preprocess_leaf_data, ) +from ufl.classes import Expr from ufl import FiniteElement, MixedElement, TensorElement, VectorElement, TensorProductElement @@ -24,8 +25,11 @@ def name_assembled_constraints(): def has_dirichlet_constraints(is_dirichlet): - if isinstance(is_dirichlet, (list, tuple)): - return any(bool(d) for d in is_dirichlet) + if isinstance(is_dirichlet, (tuple, list)): + return any(has_dirichlet_constraints(d) for d in is_dirichlet) + + if isinstance(is_dirichlet, Expr): + return True else: return bool(is_dirichlet) diff --git a/python/dune/perftool/pdelab/driver/gridfunctionspace.py b/python/dune/perftool/pdelab/driver/gridfunctionspace.py index a4ae3604..eb8688e0 100644 --- a/python/dune/perftool/pdelab/driver/gridfunctionspace.py +++ b/python/dune/perftool/pdelab/driver/gridfunctionspace.py @@ -324,7 +324,8 @@ def typedef_gfs(element, is_dirichlet, name, root): vb = type_vectorbackend(element, root) gv = type_leafview() fem = type_fem(element) - cass = type_constraintsassembler(bool(is_dirichlet[0])) + from dune.perftool.pdelab.driver.constraints import has_dirichlet_constraints + cass = type_constraintsassembler(has_dirichlet_constraints(is_dirichlet)) return "using {} = Dune::PDELab::GridFunctionSpace<{}, {}, {}, {}>;".format(name, gv, fem, cass, vb) -- GitLab