From 2293c748969e8b7746bec052910c0bd51adb6f15 Mon Sep 17 00:00:00 2001
From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de>
Date: Tue, 30 Jan 2018 13:11:27 +0100
Subject: [PATCH] Fixup the set_option mechanism

---
 python/dune/perftool/options.py                       | 11 ++++++++++-
 python/dune/perftool/pdelab/driver/__init__.py        |  3 ++-
 .../dune/perftool/pdelab/driver/gridfunctionspace.py  |  4 ----
 python/dune/perftool/pdelab/driver/timings.py         |  5 +----
 python/dune/perftool/pdelab/localoperator.py          |  8 ++++++++
 5 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/python/dune/perftool/options.py b/python/dune/perftool/options.py
index 9376c6b3..c3fffbc5 100644
--- a/python/dune/perftool/options.py
+++ b/python/dune/perftool/options.py
@@ -192,7 +192,16 @@ def set_option(key, value):
     any other options.
     """
     global _global_options
-    _global_options = process_options(_global_options).copy(**{key: value})
+    _global_options = process_global_options(_global_options).copy(**{key: value})
+
+
+def set_form_option(key, value, form=None):
+    if form is None:
+        from dune.perftool.generation import get_global_context_value
+        form = get_global_context_value("form_identifier", 0)
+    if isinstance(form, int):
+        form = get_option("operators").split(",")[form].strip()
+    _form_options[form] = _form_options[form].copy(**{key: value})
 
 
 def get_option(key):
diff --git a/python/dune/perftool/pdelab/driver/__init__.py b/python/dune/perftool/pdelab/driver/__init__.py
index d0241f53..b26af235 100644
--- a/python/dune/perftool/pdelab/driver/__init__.py
+++ b/python/dune/perftool/pdelab/driver/__init__.py
@@ -248,7 +248,8 @@ def generate_driver():
         from dune.perftool.loopy.target import type_floatingpoint
         pre_include("#define HP_TIMER_OPCOUNTER {}".format(type_floatingpoint()), filetag="driver")
         evaluate_residual_timer()
-        apply_jacobian_timer()
+        if get_form_option("matrix_free"):
+            apply_jacobian_timer()
     elif is_stationary():
         from dune.perftool.pdelab.driver.solve import dune_solve
         vec = dune_solve()
diff --git a/python/dune/perftool/pdelab/driver/gridfunctionspace.py b/python/dune/perftool/pdelab/driver/gridfunctionspace.py
index 410036b9..f95cbefe 100644
--- a/python/dune/perftool/pdelab/driver/gridfunctionspace.py
+++ b/python/dune/perftool/pdelab/driver/gridfunctionspace.py
@@ -50,10 +50,6 @@ def type_range():
 def typedef_grid(name):
     dim = get_dimension()
     if isQuadrilateral(get_trial_element().cell()):
-        # For Yasp Grids the jacobian of the transformation is diagonal and constant on each cell
-        set_option('diagonal_transformation_matrix', True)
-        set_option('constant_transformation_matrix', True)
-
         range_type = type_range()
         if get_option("yaspgrid_offset"):
             gridt = "Dune::YaspGrid<{0}, Dune::EquidistantOffsetCoordinates<{1}, {0}>>".format(dim, range_type)
diff --git a/python/dune/perftool/pdelab/driver/timings.py b/python/dune/perftool/pdelab/driver/timings.py
index d003c1c6..1adba1a1 100644
--- a/python/dune/perftool/pdelab/driver/timings.py
+++ b/python/dune/perftool/pdelab/driver/timings.py
@@ -1,6 +1,6 @@
 """ Timing related generator functions """
 
-from dune.perftool.options import get_option, set_option
+from dune.perftool.options import get_option
 from dune.perftool.generation import (cached,
                                       include_file,
                                       pre_include,
@@ -119,9 +119,6 @@ def evaluate_residual_timer():
 
 @preamble
 def apply_jacobian_timer():
-    # Set the matrix_free option to True!
-    set_option("matrix_free", True)
-
     formdata = get_formdata()
     n_go = name_gridoperator(formdata)
     v = name_vector(formdata)
diff --git a/python/dune/perftool/pdelab/localoperator.py b/python/dune/perftool/pdelab/localoperator.py
index 253917ba..f038e484 100644
--- a/python/dune/perftool/pdelab/localoperator.py
+++ b/python/dune/perftool/pdelab/localoperator.py
@@ -718,6 +718,14 @@ def generate_localoperator_kernels(operator):
     from dune.perftool.pdelab.parameter import name_paramclass
     name_paramclass()
 
+    # Set some options!
+    from dune.perftool.pdelab.driver import isQuadrilateral
+    if isQuadrilateral(form.coefficients()[0].ufl_element().cell()):
+        from dune.perftool.options import set_form_option
+        # For Yasp Grids the jacobian of the transformation is diagonal and constant on each cell
+        set_form_option('diagonal_transformation_matrix', True)
+        set_form_option('constant_transformation_matrix', True)
+
     # Add right base classes for stationary/instationary operators
     base_class('Dune::PDELab::LocalOperatorDefaultFlags', classtag="operator")
     from dune.perftool.pdelab.driver import is_stationary
-- 
GitLab