From 275517e48a47f0dd7394461d1ca7ad8c84976227 Mon Sep 17 00:00:00 2001
From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de>
Date: Mon, 5 Feb 2018 10:34:27 +0100
Subject: [PATCH] Fix coefficient evaluation for facet integrals

In that case you need two GridFunctions, which can be
bound to the two cells.
---
 python/dune/perftool/pdelab/function.py      |  2 +-
 python/dune/perftool/pdelab/localoperator.py | 13 +++++++------
 2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/python/dune/perftool/pdelab/function.py b/python/dune/perftool/pdelab/function.py
index 2f2e0292..c1032400 100644
--- a/python/dune/perftool/pdelab/function.py
+++ b/python/dune/perftool/pdelab/function.py
@@ -29,7 +29,7 @@ def declare_grid_function_range(gridfunction):
 def pymbolic_evaluate_gridfunction(name, coeff, restriction, grad):
     diffOrder = 1 if grad else 0
 
-    gridfunction = name_gridfunction_member(coeff, diffOrder)
+    gridfunction = name_gridfunction_member(coeff, restriction, diffOrder)
     bind_gridfunction_to_element(gridfunction, restriction)
 
     temporary_variable(name,
diff --git a/python/dune/perftool/pdelab/localoperator.py b/python/dune/perftool/pdelab/localoperator.py
index 948356b4..244a1cae 100644
--- a/python/dune/perftool/pdelab/localoperator.py
+++ b/python/dune/perftool/pdelab/localoperator.py
@@ -157,9 +157,10 @@ def localoperator_basename(form_ident):
     return get_form_option("classname", form_ident)
 
 
-def name_gridfunction_member(coeff, diffOrder=0):
-    name = "local_gridfunction_coeff{}_diff{}".format(coeff.count(), diffOrder)
-    define_gridfunction_member(name, coeff, diffOrder)
+def name_gridfunction_member(coeff, restriction, diffOrder=0):
+    restr = "_n" if restriction == Restriction.POSITIVE else ""
+    name = "local_gridfunction_coeff{}_diff{}{}".format(coeff.count(), diffOrder, restr)
+    define_gridfunction_member(name, coeff, restriction, diffOrder)
     return name
 
 
@@ -171,11 +172,11 @@ def name_gridfunction_constructor_argument(coeff):
 
 
 @class_member(classtag="operator")
-def define_gridfunction_member(name, coeff, diffOrder):
+def define_gridfunction_member(name, coeff, restriction, diffOrder):
     _type = type_gridfunction_template_parameter(coeff)
     param = name_gridfunction_constructor_argument(coeff)
     if diffOrder > 0:
-        other = name_gridfunction_member(coeff, diffOrder - 1)
+        other = name_gridfunction_member(coeff, restriction, diffOrder - 1)
         init = "derivative({})".format(other)
         initializer_list(name, [init], classtag="operator")
         return "mutable decltype({}) {};".format(init, name)
@@ -741,7 +742,7 @@ def generate_localoperator_kernels(operator):
 
     # Iterate over the needed grid functions in correct order
     for c in sorted(filter(lambda c: c.count() > 2, form.coefficients()), key=lambda c: c.count()):
-        name_gridfunction_member(c)
+        name_gridfunction_constructor_argument(c)
 
     # Set some options!
     from dune.perftool.pdelab.driver import isQuadrilateral
-- 
GitLab