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