From c98480fdaf87221c20e96d48d6a90a8e9f1e07ae Mon Sep 17 00:00:00 2001
From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de>
Date: Tue, 30 Jan 2018 10:54:00 +0100
Subject: [PATCH] Fixup generation for instationary stuff as well

---
 cmake/modules/DunePerftoolMacros.cmake        | 19 ++++++++++---
 cmake/modules/deplist.py                      | 21 +++++++++++++++
 python/dune/perftool/compile.py               | 16 +++++++----
 python/dune/perftool/options.py               | 15 ++++++-----
 .../dune/perftool/pdelab/driver/__init__.py   | 27 +++++++------------
 .../perftool/pdelab/driver/gridoperator.py    |  2 +-
 .../perftool/pdelab/driver/instationary.py    | 22 +++++++--------
 .../perftool/pdelab/driver/interpolate.py     |  3 ++-
 python/dune/perftool/pdelab/driver/solve.py   |  2 +-
 python/dune/perftool/pdelab/driver/vtk.py     |  2 +-
 python/dune/perftool/pdelab/localoperator.py  | 11 ++++----
 python/dune/perftool/pdelab/quadrature.py     |  7 ++---
 python/setup.py                               |  4 +--
 test/heatequation/heatequation.mini           |  1 +
 test/heatequation/heatequation.ufl            |  1 -
 test/heatequation/heatequation_dg.mini        |  1 +
 test/heatequation/heatequation_dg.ufl         |  1 -
 .../heatequation_time_dependent_bc.mini       |  1 +
 .../heatequation_time_dependent_bc.ufl        |  1 -
 test/hyperbolic/linearacoustics.mini          |  8 +++++-
 test/hyperbolic/linearacoustics.ufl           |  1 -
 test/hyperbolic/lineartransport.mini          | 10 +++++--
 test/hyperbolic/lineartransport.ufl           |  1 -
 test/hyperbolic/shallowwater.mini             |  8 +++++-
 test/hyperbolic/shallowwater.ufl              |  1 -
 test/laplace/laplace.mini                     |  2 +-
 test/laplace/laplace_dg.mini                  |  2 +-
 .../navierstokes_2d_dg_quadrilateral.mini     |  8 +++++-
 .../navierstokes_2d_dg_quadrilateral.ufl      |  1 -
 .../navierstokes_3d_dg_quadrilateral.mini     |  7 ++++-
 .../navierstokes_3d_dg_quadrilateral.ufl      |  1 -
 test/nonlinear/diffusivewave.mini             |  9 ++++++-
 test/nonlinear/nonlinear_dg_matrix_free.mini  |  2 +-
 test/nonlinear/nonlinear_matrix_free.mini     |  2 +-
 test/poisson/poisson.mini                     |  2 +-
 test/poisson/poisson_dg.mini                  |  2 +-
 test/poisson/poisson_dg_matrix_free.mini      |  2 +-
 test/poisson/poisson_dg_neumann.mini          |  2 +-
 test/poisson/poisson_dg_quadrilateral.mini    |  2 +-
 test/poisson/poisson_dg_tensor.mini           |  2 +-
 test/poisson/poisson_matrix_free.mini         |  2 +-
 test/poisson/poisson_neumann.mini             |  2 +-
 test/poisson/poisson_tensor.mini              |  2 +-
 test/stokes/stokes.mini                       |  2 +-
 test/stokes/stokes_3d_dg_quadrilateral.mini   |  2 +-
 test/stokes/stokes_3d_quadrilateral.mini      |  2 +-
 test/stokes/stokes_dg.mini                    |  2 +-
 test/stokes/stokes_dg_quadrilateral.mini      |  2 +-
 test/stokes/stokes_quadrilateral.mini         |  2 +-
 test/stokes/stokes_stress.mini                |  2 +-
 test/stokes/stokes_stress_sym.mini            |  2 +-
 test/stokes/stokes_sym.mini                   |  2 +-
 test/sumfact/mass/mass.mini                   |  2 +-
 test/sumfact/mass/mass_3d.mini                |  2 +-
 test/sumfact/mass/sliced.mini                 |  2 +-
 test/sumfact/poisson/diagonal.mini            |  2 +-
 .../poisson/opcount_poisson_2d_order2.mini    |  2 +-
 .../opcount_sumfact_poisson_dg_2d_vec.mini    |  2 +-
 test/sumfact/poisson/poisson_2d.mini          |  2 +-
 test/sumfact/poisson/poisson_3d.mini          |  2 +-
 test/sumfact/poisson/poisson_dg_2d.mini       |  2 +-
 test/sumfact/poisson/poisson_dg_3d.mini       |  2 +-
 test/sumfact/poisson/poisson_dg_tensor.mini   |  2 +-
 test/sumfact/poisson/poisson_fastdg_2d.mini   |  2 +-
 test/sumfact/poisson/poisson_fastdg_3d.mini   |  2 +-
 test/sumfact/poisson/sliced.mini              |  2 +-
 test/sumfact/stokes/stokes.mini               |  2 +-
 test/sumfact/stokes/stokes_dg.mini            |  4 +--
 68 files changed, 178 insertions(+), 112 deletions(-)
 create mode 100755 cmake/modules/deplist.py

diff --git a/cmake/modules/DunePerftoolMacros.cmake b/cmake/modules/DunePerftoolMacros.cmake
index c9b67421..b4178518 100644
--- a/cmake/modules/DunePerftoolMacros.cmake
+++ b/cmake/modules/DunePerftoolMacros.cmake
@@ -89,8 +89,19 @@ function(add_generated_executable)
     set(GEN_INIFILE ${CMAKE_CURRENT_SOURCE_DIR}/${GEN_INIFILE})
   endif()
   if(NOT GEN_SOURCE)
+    # Generate a driver file
     set(GEN_DRIVER ${GEN_TARGET}_driver.hh)
-    set(GEN_FORM_COMPILER_ARGS ${GEN_FORM_COMPILER_ARGS} --driver-file ${GEN_DRIVER})
+    add_custom_command(OUTPUT ${GEN_DRIVER}
+                       COMMAND ${CMAKE_BINARY_DIR}/run-in-dune-env generate_driver
+                               --uflfile ${GEN_UFLFILE}
+                               --ini-file ${GEN_INIFILE}
+                               --target-name ${GEN_TARGET}
+                               --driver-file ${GEN_DRIVER}
+                               --project-basedir ${CMAKE_BINARY_DIR}
+                               ${GEN_FORM_COMPILER_ARGS}
+                       DEPENDS ${GEN_UFLFILE} ${UFL2PDELAB_SOURCES} ${GEN_DEPENDS} ${DUNE_PERFTOOL_ADDITIONAL_PYTHON_SOURCES}
+                       COMMENT "Generating driver for the target ${GEN_TARGET}"
+                       )
     set(GEN_SOURCE ${GEN_TARGET}_main.cc)
     dune_module_path(MODULE dune-perftool
                      RESULT perftool_path
@@ -103,15 +114,15 @@ function(add_generated_executable)
                        OUTPUT_VARIABLE header_deps
                        )
 
-  add_custom_command(OUTPUT ${GEN_DRIVER} ${header_deps}
-                     COMMAND ${CMAKE_BINARY_DIR}/run-in-dune-env ufl2pdelab
+  add_custom_command(OUTPUT ${header_deps}
+                     COMMAND ${CMAKE_BINARY_DIR}/run-in-dune-env generate_operators
                              --project-basedir ${CMAKE_BINARY_DIR}
                              ${GEN_FORM_COMPILER_ARGS}
                              --uflfile ${GEN_UFLFILE}
                              --ini-file ${GEN_INIFILE}
                              --target-name ${GEN_TARGET}
                      DEPENDS ${GEN_UFLFILE} ${UFL2PDELAB_SOURCES} ${GEN_DEPENDS} ${DUNE_PERFTOOL_ADDITIONAL_PYTHON_SOURCES}
-                     COMMENT "Running ufl2pdelab for the target ${GEN_TARGET}"
+                     COMMENT "Generating operators for the target ${GEN_TARGET}"
                     )
 
   add_executable(${GEN_TARGET} ${GEN_SOURCE} ${GEN_DRIVER} ${header_deps})
diff --git a/cmake/modules/deplist.py b/cmake/modules/deplist.py
new file mode 100755
index 00000000..d65ad4af
--- /dev/null
+++ b/cmake/modules/deplist.py
@@ -0,0 +1,21 @@
+# Return the list of generated files for a given ini file 
+# This is used by the build system, do not use this yourself!
+
+from dune.testtools.parser import parse_ini_file
+
+import sys
+
+ini = parse_ini_file(sys.argv[1])
+section = ini["formcompiler"]
+operators = section.get("operators", "operator")
+
+result = []
+for operator in [i.strip() for i in operators.split(",")]:
+    ssection = ini.get("formcompiler.{}".format(operator), {})
+    if ssection.get("filename", None):
+        result.append(ssection["filename"])
+    else:
+        classname = ssection.get("classname", "{}Operator".format(ssection.get("form", operator)))
+        result.append("{}_{}_file.hh".format(sys.argv[2], classname))
+
+sys.stdout.write(" ".join(result))
diff --git a/python/dune/perftool/compile.py b/python/dune/perftool/compile.py
index 8886a4d8..3bb356bb 100644
--- a/python/dune/perftool/compile.py
+++ b/python/dune/perftool/compile.py
@@ -103,17 +103,23 @@ def read_ufl(uflfile):
     return data
 
 
-# This function is the entrypoint of the ufl2pdelab executable
-def compile_form():
+def entry_generate_driver():
+    """ This is the entry point for driver generation """
     initialize_options()
     data = read_ufl(get_option("uflfile"))
 
     with global_context(data=data):
-        # Generate driver file
-        if get_option("driver_file"):
-            generate_driver()
+        generate_driver()
 
+
+def entry_generate_operators():
+    """ This is the entry point for operator generation """
+    initialize_options()
+    data = read_ufl(get_option("uflfile"))
+
+    with global_context(data=data):
         for operator in get_option("operators").split(","):
+            operator = operator.strip()
             with global_context(form_identifier=operator):
                 # Make sure cache is empty
                 delete_cache_items()
diff --git a/python/dune/perftool/options.py b/python/dune/perftool/options.py
index aeb6baef..f186a324 100644
--- a/python/dune/perftool/options.py
+++ b/python/dune/perftool/options.py
@@ -49,7 +49,7 @@ class PerftoolGlobalOptionsArray(ImmutableRecord):
     yaspgrid_offset = PerftoolOption(default=False, helpstr="Set to true if you want a yasp grid where the lower left corner is not in the origin.")
     precision_bits = PerftoolOption(default=64, helpstr="The number of bits for the floating point type")
     overlapping = PerftoolOption(default=False, helpstr="Use an overlapping solver and constraints. You still need to make sure to construct a grid with overlap! The parallel option will be set automatically.")
-    operators = PerftoolOption(default="operator", helpstr="A comma separated list of operators, each name will be interpreted as a subsection name within the formcompiler section")
+    operators = PerftoolOption(default="r", helpstr="A comma separated list of operators, each name will be interpreted as a subsection name within the formcompiler section")
     target_name = PerftoolOption(default=None, helpstr="The target name from CMake")
 
     # Arguments that are mainly to be set by logic depending on other options
@@ -68,7 +68,7 @@ class PerftoolFormOptionsArray(ImmutableRecord):
         ImmutableRecord.__init__(self, **opts)
 
     # Form specific options
-    form = PerftoolOption(default="r", helpstr="The name of the UFL object representing the form in the UFL file")
+    form = PerftoolOption(default=None, helpstr="The name of the UFL object representing the form in the UFL file")
     filename = PerftoolOption(default=None, helpstr="The filename to use for this LocalOperator")
     classname = PerftoolOption(default=None, helpstr="The name of the C++ class to generate")
     numerical_jacobian = PerftoolOption(default=False, helpstr="use numerical jacobians (only makes sense, if uflpdelab for some reason fails to generate analytic jacobians)")
@@ -139,7 +139,7 @@ def update_options_from_inifile(opt):
         opt = opt.copy(**parse_ini("formcompiler"))
 
         # Also parse form-specific options
-        for form in opt.operators.split(","):
+        for form in [i.strip() for i in opt.operators.split(",")]:
             _form_options[form] = PerftoolFormOptionsArray(**parse_ini("formcompiler.{}".format(form)))
 
     return opt
@@ -157,13 +157,16 @@ def process_global_options(opt):
 
 
 @memoize
-def process_form_options(opt):
+def process_form_options(opt, form):
     if opt.sumfact:
         opt = opt.copy(unroll_dimension_loops=True)
 
     if opt.numerical_jacobian:
         opt = opt.copy(generate_jacobians=False)
 
+    if opt.form is None:
+        opt = opt.copy(form=form)
+
     if opt.classname is None:
         opt = opt.copy(classname="{}Operator".format(opt.form))
 
@@ -205,8 +208,8 @@ def get_form_option(key, form=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]
-    processed_form_opts = process_form_options(_form_options[form])
+        form = get_option("operators").split(",")[form].strip()
+    processed_form_opts = process_form_options(_form_options[form], form)
     return getattr(processed_form_opts, key)
 
 
diff --git a/python/dune/perftool/pdelab/driver/__init__.py b/python/dune/perftool/pdelab/driver/__init__.py
index f11875d0..f8ec2059 100644
--- a/python/dune/perftool/pdelab/driver/__init__.py
+++ b/python/dune/perftool/pdelab/driver/__init__.py
@@ -28,23 +28,17 @@ from dune.perftool.options import (get_form_option,
 # to quantities that are needed throughout the process of generating the driver! 
 #
 
-def get_form_ident(index=0):
-    return get_option("operators").split(",")[index]
+def get_form_ident():
+    idents = [i.strip() for i in get_option("operators").split(",")]
+    if len(idents) == 2:
+        idents.remove("mass")
+    assert(len(idents) == 1)
+    return idents[0]
 
 
-def get_form(what=None):
-    """ Return the ith form specified """
-    if what is None:
-        what = get_global_context_value("form_identifier", 0)
-    if isinstance(what, int):
-        what = get_form_ident(what)
+def get_form():
     data = get_global_context_value("data")
-    return data.object_by_name[get_form_option("form", what)]
-
-
-def get_preprocessed_form(what=None):
-    from dune.perftool.ufl.preprocess import preprocess_form
-    return preprocess_form(get_form(what)).preprocessed_form
+    return data.object_by_name[get_form_option("form", get_form_ident())]
 
 
 def get_dimension():
@@ -64,10 +58,7 @@ def get_trial_element():
 
 
 def is_stationary():
-    # TODO I am completely unsure how this should work in the future
-    # This only fixes instationary stuff, it will break Renes adjoint stuff
-    return len(get_option("operators").split(",")) == 1
-#     return 'mass_form' not in _driver_data
+    return "mass" not in [i.strip() for i in get_option("operators").split(",")]
 
 
 def is_linear(form=None):
diff --git a/python/dune/perftool/pdelab/driver/gridoperator.py b/python/dune/perftool/pdelab/driver/gridoperator.py
index 64a61777..c1e22873 100644
--- a/python/dune/perftool/pdelab/driver/gridoperator.py
+++ b/python/dune/perftool/pdelab/driver/gridoperator.py
@@ -77,7 +77,7 @@ def name_gridoperator(form_ident):
 def typedef_localoperator(name, form_ident):
     ugfs = type_trial_gfs()
     vgfs = type_test_gfs()
-    filename = get_form_option("filename")
+    filename = get_form_option("filename", form_ident)
     include_file(filename, filetag="driver")
     lopname = localoperator_basename(form_ident)
     range_type = type_range()
diff --git a/python/dune/perftool/pdelab/driver/instationary.py b/python/dune/perftool/pdelab/driver/instationary.py
index 11390040..becb79b0 100644
--- a/python/dune/perftool/pdelab/driver/instationary.py
+++ b/python/dune/perftool/pdelab/driver/instationary.py
@@ -1,7 +1,8 @@
 from dune.perftool.generation import (include_file,
                                       preamble,
                                       )
-from dune.perftool.pdelab.driver import (get_trial_element,
+from dune.perftool.pdelab.driver import (get_form_ident,
+                                         get_trial_element,
                                          is_linear,
                                          name_initree,
                                          preprocess_leaf_data,
@@ -50,12 +51,11 @@ def solve_instationary():
 @preamble
 def time_loop():
     ini = name_initree()
-    formdata = get_formdata()
-    params = name_parameters(formdata)
+    params = name_parameters(get_form_ident())
     time = name_time()
     element = get_trial_element()
-    vector_type = type_vector(formdata)
-    vector = name_vector(formdata)
+    vector_type = type_vector(get_form_ident())
+    vector = name_vector(get_form_ident())
     interpolate_dirichlet_data(vector)
 
     is_dirichlet = preprocess_leaf_data(element, "is_dirichlet")
@@ -156,8 +156,8 @@ def name_timesteppingmethod():
 @preamble
 def typedef_instationarygridoperator(name):
     include_file("dune/pdelab/gridoperator/onestep.hh", filetag="driver")
-    go_type = type_gridoperator(get_formdata())
-    mass_go_type = type_gridoperator(get_mass_formdata())
+    go_type = type_gridoperator(get_form_ident())
+    mass_go_type = type_gridoperator("mass")
     explicit = get_option('explicit_time_stepping')
     if explicit:
         return "using {} = Dune::PDELab::OneStepGridOperator<{},{},false>;".format(name, go_type, mass_go_type)
@@ -173,8 +173,8 @@ def type_instationarygridoperator():
 @preamble
 def define_instationarygridoperator(name):
     igo_type = type_instationarygridoperator()
-    go = name_gridoperator(get_formdata())
-    mass_go = name_gridoperator(get_mass_formdata())
+    go = name_gridoperator(get_form_ident())
+    mass_go = name_gridoperator("mass")
     return "{} {}({}, {});".format(igo_type, name, go, mass_go)
 
 
@@ -188,7 +188,7 @@ def typedef_onestepmethod(name):
     r_type = type_range()
     igo_type = type_instationarygridoperator()
     snp_type = type_stationarynonlinearproblemssolver(igo_type)
-    vector_type = type_vector(get_formdata())
+    vector_type = type_vector(get_form_ident())
     return "using {} = Dune::PDELab::OneStepMethod<{}, {}, {}, {}, {}>;".format(name, r_type, igo_type, snp_type, vector_type, vector_type)
 
 
@@ -217,7 +217,7 @@ def typedef_explicitonestepmethod(name):
     r_type = type_range()
     igo_type = type_instationarygridoperator()
     ls_type = type_linearsolver()
-    vector_type = type_vector(get_formdata())
+    vector_type = type_vector(get_form_ident())
     return "using {} = Dune::PDELab::ExplicitOneStepMethod<{}, {}, {}, {}>;".format(name, r_type, igo_type, ls_type, vector_type)
 
 
diff --git a/python/dune/perftool/pdelab/driver/interpolate.py b/python/dune/perftool/pdelab/driver/interpolate.py
index 73d44a56..4985f8c8 100644
--- a/python/dune/perftool/pdelab/driver/interpolate.py
+++ b/python/dune/perftool/pdelab/driver/interpolate.py
@@ -5,6 +5,7 @@ from dune.perftool.generation import (cached,
                                       preamble,
                                       )
 from dune.perftool.pdelab.driver import (FEM_name_mangling,
+                                         get_form_ident,
                                          get_trial_element,
                                          is_stationary,
                                          preprocess_leaf_data,
@@ -72,7 +73,7 @@ def define_boundary_function(name, dirichlet):
                                                                                       lambdaname,
                                                                                       )
     else:
-        params = name_parameters(get_formdata())
+        params = name_parameters(get_form_ident())
         return "auto {} = Dune::PDELab::makeInstationaryGridFunctionFromCallable({}, {}, {});".format(name,
                                                                                                       gv,
                                                                                                       lambdaname,
diff --git a/python/dune/perftool/pdelab/driver/solve.py b/python/dune/perftool/pdelab/driver/solve.py
index 44b4cd7e..2e9b3ee1 100644
--- a/python/dune/perftool/pdelab/driver/solve.py
+++ b/python/dune/perftool/pdelab/driver/solve.py
@@ -178,7 +178,7 @@ def name_stationarylinearproblemsolver():
 def typedef_stationarynonlinearproblemsolver(name, go_type):
     include_file("dune/pdelab/newton/newton.hh", filetag="driver")
     ls_type = type_linearsolver()
-    x_type = type_vector(form_ident)
+    x_type = type_vector(get_form_ident())
     return "using {} = Dune::PDELab::Newton<{}, {}, {}>;".format(name, go_type, ls_type, x_type)
 
 
diff --git a/python/dune/perftool/pdelab/driver/vtk.py b/python/dune/perftool/pdelab/driver/vtk.py
index b131040e..a9096628 100644
--- a/python/dune/perftool/pdelab/driver/vtk.py
+++ b/python/dune/perftool/pdelab/driver/vtk.py
@@ -131,7 +131,7 @@ def visualize_initial_condition():
     vtkwriter = name_vtk_sequence_writer()
     element = get_trial_element()
     gfs = name_trial_gfs()
-    vector = name_vector(get_formdata())
+    vector = name_vector(get_form_ident())
     predicate = name_predicate()
     from dune.perftool.pdelab.driver.instationary import name_time
     time = name_time()
diff --git a/python/dune/perftool/pdelab/localoperator.py b/python/dune/perftool/pdelab/localoperator.py
index 05c2adc3..253917ba 100644
--- a/python/dune/perftool/pdelab/localoperator.py
+++ b/python/dune/perftool/pdelab/localoperator.py
@@ -250,7 +250,8 @@ def boundary_predicates(expr, measure, subdomain_id):
 
         # Get the original form and inspect the present measures
         from dune.perftool.generation import get_global_context_value
-        original_form = get_global_context_value("formdata").original_form
+        data = get_global_context_value("data")
+        original_form = data.object_by_name[get_form_option("form")]
 
         sd = original_form.subdomain_data()
         assert len(sd) == 1
@@ -681,10 +682,10 @@ def generate_localoperator_kernels(operator):
     logger = logging.getLogger(__name__)
 
     data = get_global_context_value("data")
-    form = data.object_by_name[get_form_option("form")]
+    original_form = data.object_by_name[get_form_option("form")]
 
     from dune.perftool.ufl.preprocess import preprocess_form
-    form = preprocess_form(form).preprocessed_form
+    form = preprocess_form(original_form).preprocessed_form
 
     # Reset the generation cache
     from dune.perftool.generation import delete_cache_items
@@ -768,7 +769,7 @@ def generate_localoperator_kernels(operator):
                     # In the case of matrix free operator evaluation we need jacobian apply methods
                     if get_form_option("matrix_free"):
                         from dune.perftool.pdelab.driver import is_linear
-                        if is_linear(formdata.original_form):
+                        if is_linear(original_form):
                             # Numeical jacobian apply base class
                             base_class("Dune::PDELab::NumericalJacobianApply{}<{}>".format(which, loptype), classtag="operator")
 
@@ -793,7 +794,7 @@ def generate_localoperator_kernels(operator):
     if not get_form_option("numerical_jacobian"):
         logger.info("generate_localoperator_kernels: create jacobian methods")
         from ufl import derivative
-        jacform = derivative(formdata.original_form, formdata.original_form.coefficients()[0])
+        jacform = derivative(original_form, original_form.coefficients()[0])
 
         from dune.perftool.ufl.preprocess import preprocess_form
         jacform = preprocess_form(jacform).preprocessed_form
diff --git a/python/dune/perftool/pdelab/quadrature.py b/python/dune/perftool/pdelab/quadrature.py
index bf798fc8..d0350d4b 100644
--- a/python/dune/perftool/pdelab/quadrature.py
+++ b/python/dune/perftool/pdelab/quadrature.py
@@ -179,13 +179,14 @@ def name_quadrature_weights():
 
     return name
 
-
 def _estimate_quadrature_order():
     """Estimate quadrature order using polynomial degree estimation from UFL"""
     # According to UFL documentation estimate_total_polynomial_degree
     # should only be called on preprocessed forms.
-    from dune.perftool.pdelab.driver import get_preprocessed_form
-    form = get_preprocessed_form()
+    data = get_global_context_value("data")
+    form = data.object_by_name[get_form_option("form")]
+    from dune.perftool.ufl.preprocess import preprocess_form
+    form = preprocess_form(form).preprocessed_form
 
     # Estimate polynomial degree of integrals of current type (eg 'Cell')
     integral_type = get_global_context_value("integral_type")
diff --git a/python/setup.py b/python/setup.py
index c7e80ce1..f193748a 100644
--- a/python/setup.py
+++ b/python/setup.py
@@ -44,7 +44,7 @@ setup(name='dune.perftool',
       cmdclass={'test': PyTest},
       entry_points = {
         "console_scripts": [
-            "ufl2pdelab = dune.perftool.compile:compile_form",
-            "picklevecstrats = dune.perftool.sumfact.vectorization:pickle_vectorization_strategies",
+            "generate_operators = dune.perftool.compile:entry_generate_operators",
+            "generate_driver = dune.perftool.compile:entry_generate_driver",
         ]
     })
diff --git a/test/heatequation/heatequation.mini b/test/heatequation/heatequation.mini
index 6059854e..24a69967 100644
--- a/test/heatequation/heatequation.mini
+++ b/test/heatequation/heatequation.mini
@@ -14,6 +14,7 @@ extension = vtu
 [formcompiler]
 explicit_time_stepping = 0, 1 | expand scheme
 compare_l2errorsquared = 1e-7
+operators = mass, poisson
 
 # Disable explicit tests for now
 {__exec_suffix} == explicit | exclude
diff --git a/test/heatequation/heatequation.ufl b/test/heatequation/heatequation.ufl
index 726b84a3..8a4ef977 100644
--- a/test/heatequation/heatequation.ufl
+++ b/test/heatequation/heatequation.ufl
@@ -13,7 +13,6 @@ v = TestFunction(V)
 mass = (u*v)*dx
 poisson = (inner(grad(u), grad(v)) - f*v)*dx
 
-forms = [mass, poisson]
 interpolate_expression = g
 is_dirichlet = 1
 exact_solution = g
\ No newline at end of file
diff --git a/test/heatequation/heatequation_dg.mini b/test/heatequation/heatequation_dg.mini
index 3c21abe6..169be57b 100644
--- a/test/heatequation/heatequation_dg.mini
+++ b/test/heatequation/heatequation_dg.mini
@@ -14,6 +14,7 @@ extension = vtu
 [formcompiler]
 explicit_time_stepping = 0, 1 | expand scheme
 compare_l2errorsquared = 1e-7
+operators = mass, poisson
 
 # Disable explicit tests for now
 {__exec_suffix} == explicit | exclude
diff --git a/test/heatequation/heatequation_dg.ufl b/test/heatequation/heatequation_dg.ufl
index 288d1e67..4f5c2da5 100644
--- a/test/heatequation/heatequation_dg.ufl
+++ b/test/heatequation/heatequation_dg.ufl
@@ -32,7 +32,6 @@ poisson = inner(grad(u), grad(v))*dx \
 
 mass = (u*v)*dx
 
-forms = [mass, poisson]
 interpolate_expression = g
 is_dirichlet = 1
 exact_solution = g
\ No newline at end of file
diff --git a/test/heatequation/heatequation_time_dependent_bc.mini b/test/heatequation/heatequation_time_dependent_bc.mini
index 191cc52f..762951ac 100644
--- a/test/heatequation/heatequation_time_dependent_bc.mini
+++ b/test/heatequation/heatequation_time_dependent_bc.mini
@@ -14,6 +14,7 @@ extension = vtu
 [formcompiler]
 explicit_time_stepping = 0, 1 | expand scheme
 compare_l2errorsquared = 2e-4
+operators = mass, poisson
 
 [instat]
 T = 1.0
diff --git a/test/heatequation/heatequation_time_dependent_bc.ufl b/test/heatequation/heatequation_time_dependent_bc.ufl
index 8bf2a2d8..6b8443c5 100644
--- a/test/heatequation/heatequation_time_dependent_bc.ufl
+++ b/test/heatequation/heatequation_time_dependent_bc.ufl
@@ -16,7 +16,6 @@ v = TestFunction(V)
 mass = (u*v)*dx
 poisson = (inner(grad(u), grad(v)) - f*v)*dx
 
-forms = [mass, poisson]
 interpolate_expression = g
 is_dirichlet = 1
 exact_solution = g
diff --git a/test/hyperbolic/linearacoustics.mini b/test/hyperbolic/linearacoustics.mini
index 5ccd6038..ad1cc95b 100644
--- a/test/hyperbolic/linearacoustics.mini
+++ b/test/hyperbolic/linearacoustics.mini
@@ -13,5 +13,11 @@ name = {__name}
 extension = vtu
 
 [formcompiler]
+explicit_time_stepping = 1
+operators = mass, r
+
+[formcompiler.mass]
+numerical_jacobian = 1
+
+[formcompiler.r]
 numerical_jacobian = 1
-explicit_time_stepping = 1
\ No newline at end of file
diff --git a/test/hyperbolic/linearacoustics.ufl b/test/hyperbolic/linearacoustics.ufl
index d72476cc..844a3078 100644
--- a/test/hyperbolic/linearacoustics.ufl
+++ b/test/hyperbolic/linearacoustics.ufl
@@ -28,5 +28,4 @@ r = -1. * inner(flux, grad(v))*dx \
   - inner(numerical_flux, jump(v))*dS \
   + inner(u, v)*ds
 
-forms = [mass, r]
 interpolate_expression = f, 0.0, 0.0
diff --git a/test/hyperbolic/lineartransport.mini b/test/hyperbolic/lineartransport.mini
index 1ca4dede..60a465d6 100644
--- a/test/hyperbolic/lineartransport.mini
+++ b/test/hyperbolic/lineartransport.mini
@@ -18,6 +18,12 @@ name = {__name}
 extension = vtu
 
 [formcompiler]
-numerical_jacobian = 1, 0 | expand diff
 explicit_time_stepping = 0, 1 | expand scheme
-compare_l2errorsquared = 1e-10
\ No newline at end of file
+compare_l2errorsquared = 1e-10
+operators = mass, r
+
+[formcompiler.mass]
+numerical_jacobian = 1, 0 | expand diff
+
+[formcompiler.r]
+numerical_jacobian = 1, 0 | expand diff
diff --git a/test/hyperbolic/lineartransport.ufl b/test/hyperbolic/lineartransport.ufl
index 20ad8bf5..04497a40 100644
--- a/test/hyperbolic/lineartransport.ufl
+++ b/test/hyperbolic/lineartransport.ufl
@@ -25,7 +25,6 @@ r = -1.*u*inner(beta, grad(v))*dx \
   + inner(beta, n)*u*v*dso \
   + numerical_flux(n, 0.0, u('-'))*v*dsd
 
-forms = [mass, r]
 is_dirichlet = dirichlet
 interpolate_expression = initial
 exact_solution = 0
\ No newline at end of file
diff --git a/test/hyperbolic/shallowwater.mini b/test/hyperbolic/shallowwater.mini
index f72b422b..39408b49 100644
--- a/test/hyperbolic/shallowwater.mini
+++ b/test/hyperbolic/shallowwater.mini
@@ -14,5 +14,11 @@ name = {__name}
 extension = vtu
 
 [formcompiler]
-numerical_jacobian = 1
+operators = mass, r
 explicit_time_stepping = 1
+
+[formcompiler.mass]
+numerical_jacobian = 1
+
+[formcompiler.r]
+numerical_jacobian = 1
diff --git a/test/hyperbolic/shallowwater.ufl b/test/hyperbolic/shallowwater.ufl
index eee5ea80..56267c99 100644
--- a/test/hyperbolic/shallowwater.ufl
+++ b/test/hyperbolic/shallowwater.ufl
@@ -32,5 +32,4 @@ r = -1. * inner(flux, grad(v))*dx \
   - inner(numerical_flux, jump(v))*dS \
   + inner(boundary_flux, v)*ds
 
-forms = [mass, r]
 interpolate_expression = f, 0.0
diff --git a/test/laplace/laplace.mini b/test/laplace/laplace.mini
index 4926306f..cdc9b9dc 100644
--- a/test/laplace/laplace.mini
+++ b/test/laplace/laplace.mini
@@ -7,5 +7,5 @@ elements = 4 4
 elementType = simplical
 printmatrix = true
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 0, 1 | expand num
diff --git a/test/laplace/laplace_dg.mini b/test/laplace/laplace_dg.mini
index 7485e186..f689d8e5 100644
--- a/test/laplace/laplace_dg.mini
+++ b/test/laplace/laplace_dg.mini
@@ -7,5 +7,5 @@ elements = 2 2
 elementType = simplical
 printmatrix = true
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
diff --git a/test/navier-stokes/navierstokes_2d_dg_quadrilateral.mini b/test/navier-stokes/navierstokes_2d_dg_quadrilateral.mini
index 50568258..5700107d 100644
--- a/test/navier-stokes/navierstokes_2d_dg_quadrilateral.mini
+++ b/test/navier-stokes/navierstokes_2d_dg_quadrilateral.mini
@@ -16,7 +16,7 @@ name = {__name}
 extension = vtu
 
 [formcompiler]
-numerical_jacobian = 0, 1 | expand num
+operators = mass, r
 compare_l2errorsquared = 5e-5
 # Only calculate error for the velocity part
 l2error_tree_path = 1, 1, 0
@@ -24,6 +24,12 @@ explicit_time_stepping = 0
 yaspgrid_offset = 1
 overlapping = 1
 
+[formcompiler.mass]
+numerical_jacobian = 0, 1 | expand num
+
+[formcompiler.r]
+numerical_jacobian = 0, 1 | expand num
+
 [instat]
 T = 1e-2
 dt = 1e-3
diff --git a/test/navier-stokes/navierstokes_2d_dg_quadrilateral.ufl b/test/navier-stokes/navierstokes_2d_dg_quadrilateral.ufl
index fc8a1505..c1aaf70a 100644
--- a/test/navier-stokes/navierstokes_2d_dg_quadrilateral.ufl
+++ b/test/navier-stokes/navierstokes_2d_dg_quadrilateral.ufl
@@ -43,6 +43,5 @@ r = mu * inner(grad(u), grad(v))*dx \
   - avg(p)*inner(jump(v), n)*dS \
   - avg(q)*inner(jump(u), n)*dS \
 
-forms = [mass,r]
 interpolate_expression = g_v, g_p
 exact_solution = g_v, g_p
diff --git a/test/navier-stokes/navierstokes_3d_dg_quadrilateral.mini b/test/navier-stokes/navierstokes_3d_dg_quadrilateral.mini
index 29ba4c0d..1da79ba9 100644
--- a/test/navier-stokes/navierstokes_3d_dg_quadrilateral.mini
+++ b/test/navier-stokes/navierstokes_3d_dg_quadrilateral.mini
@@ -12,13 +12,18 @@ name = {__name}
 extension = vtu
 
 [formcompiler]
-numerical_jacobian = 0, 1 | expand num
 explicit_time_stepping = 0
 yaspgrid_offset = 1
 compare_l2errorsquared = 5e-4
 # Only calculate error for the velocity part
 l2error_tree_path = 1, 1, 1, 0
 
+[formcompiler.mass]
+numerical_jacobian = 0, 1 | expand num
+
+[formcompiler.r]
+numerical_jacobian = 0, 1 | expand num
+
 [instat]
 T = 1e-1
 dt = 5e-2
diff --git a/test/navier-stokes/navierstokes_3d_dg_quadrilateral.ufl b/test/navier-stokes/navierstokes_3d_dg_quadrilateral.ufl
index 87682197..f6e8752f 100644
--- a/test/navier-stokes/navierstokes_3d_dg_quadrilateral.ufl
+++ b/test/navier-stokes/navierstokes_3d_dg_quadrilateral.ufl
@@ -73,6 +73,5 @@ r = mu * inner(grad(u), grad(v))*dx \
 #   + p*inner(v, n)*ds \
 #   + q*inner(u-g_v, n)*ds
 
-forms = [mass,r]
 interpolate_expression = g_v, g_p
 exact_solution = g_v, g_p
\ No newline at end of file
diff --git a/test/nonlinear/diffusivewave.mini b/test/nonlinear/diffusivewave.mini
index 2f877983..c82f8ed2 100644
--- a/test/nonlinear/diffusivewave.mini
+++ b/test/nonlinear/diffusivewave.mini
@@ -14,5 +14,12 @@ dt = 0.001
 T = 0.01
 
 [formcompiler]
+operators = mass, poisson
+
+[formcompiler.mass]
+sumfact = 0, 1 | expand sf
+fastdg = 0, 0 | expand sf
+
+[formcompiler.operator]
 sumfact = 0, 1 | expand sf
-fastdg = 0, 0 | expand sf
\ No newline at end of file
+fastdg = 0, 0 | expand sf
diff --git a/test/nonlinear/nonlinear_dg_matrix_free.mini b/test/nonlinear/nonlinear_dg_matrix_free.mini
index 7b53a3a4..dfd4035d 100644
--- a/test/nonlinear/nonlinear_dg_matrix_free.mini
+++ b/test/nonlinear/nonlinear_dg_matrix_free.mini
@@ -13,7 +13,7 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 5e-3
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
 matrix_free = 1
 
diff --git a/test/nonlinear/nonlinear_matrix_free.mini b/test/nonlinear/nonlinear_matrix_free.mini
index fdef068b..0f28479d 100644
--- a/test/nonlinear/nonlinear_matrix_free.mini
+++ b/test/nonlinear/nonlinear_matrix_free.mini
@@ -13,6 +13,6 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 6e-4
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
 matrix_free = 1
diff --git a/test/poisson/poisson.mini b/test/poisson/poisson.mini
index a851012e..6fac6a11 100644
--- a/test/poisson/poisson.mini
+++ b/test/poisson/poisson.mini
@@ -14,5 +14,5 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-7
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
diff --git a/test/poisson/poisson_dg.mini b/test/poisson/poisson_dg.mini
index 5973973e..bb806382 100644
--- a/test/poisson/poisson_dg.mini
+++ b/test/poisson/poisson_dg.mini
@@ -14,5 +14,5 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 9e-8
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
\ No newline at end of file
diff --git a/test/poisson/poisson_dg_matrix_free.mini b/test/poisson/poisson_dg_matrix_free.mini
index ca1f1146..0d8d4cd6 100644
--- a/test/poisson/poisson_dg_matrix_free.mini
+++ b/test/poisson/poisson_dg_matrix_free.mini
@@ -14,6 +14,6 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-6
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
 matrix_free = 1
\ No newline at end of file
diff --git a/test/poisson/poisson_dg_neumann.mini b/test/poisson/poisson_dg_neumann.mini
index f02d6c82..7d930fb9 100644
--- a/test/poisson/poisson_dg_neumann.mini
+++ b/test/poisson/poisson_dg_neumann.mini
@@ -14,5 +14,5 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 9e-8
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
diff --git a/test/poisson/poisson_dg_quadrilateral.mini b/test/poisson/poisson_dg_quadrilateral.mini
index 2a3cef70..dde2e495 100644
--- a/test/poisson/poisson_dg_quadrilateral.mini
+++ b/test/poisson/poisson_dg_quadrilateral.mini
@@ -12,5 +12,5 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 7e-7
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
diff --git a/test/poisson/poisson_dg_tensor.mini b/test/poisson/poisson_dg_tensor.mini
index 9db75ec7..d696cebc 100644
--- a/test/poisson/poisson_dg_tensor.mini
+++ b/test/poisson/poisson_dg_tensor.mini
@@ -14,5 +14,5 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 4e-6
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
\ No newline at end of file
diff --git a/test/poisson/poisson_matrix_free.mini b/test/poisson/poisson_matrix_free.mini
index 8d0e9d1d..3372c8ac 100644
--- a/test/poisson/poisson_matrix_free.mini
+++ b/test/poisson/poisson_matrix_free.mini
@@ -13,5 +13,5 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-7
 
-[formcompiler.operator]
+[formcompiler.r]
 matrix_free = 1
\ No newline at end of file
diff --git a/test/poisson/poisson_neumann.mini b/test/poisson/poisson_neumann.mini
index bf836b6f..76a1fa9e 100644
--- a/test/poisson/poisson_neumann.mini
+++ b/test/poisson/poisson_neumann.mini
@@ -14,5 +14,5 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 8e-8
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
diff --git a/test/poisson/poisson_tensor.mini b/test/poisson/poisson_tensor.mini
index 11fe49af..ec4d2c31 100644
--- a/test/poisson/poisson_tensor.mini
+++ b/test/poisson/poisson_tensor.mini
@@ -14,5 +14,5 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-7
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
\ No newline at end of file
diff --git a/test/stokes/stokes.mini b/test/stokes/stokes.mini
index 61f68cf9..b281b6bb 100644
--- a/test/stokes/stokes.mini
+++ b/test/stokes/stokes.mini
@@ -15,5 +15,5 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-11
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 0, 1 | expand num
diff --git a/test/stokes/stokes_3d_dg_quadrilateral.mini b/test/stokes/stokes_3d_dg_quadrilateral.mini
index a66a10cd..59396277 100644
--- a/test/stokes/stokes_3d_dg_quadrilateral.mini
+++ b/test/stokes/stokes_3d_dg_quadrilateral.mini
@@ -12,5 +12,5 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 6e-8
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 0, 1 | expand num
diff --git a/test/stokes/stokes_3d_quadrilateral.mini b/test/stokes/stokes_3d_quadrilateral.mini
index fb12e781..17f3d9f5 100644
--- a/test/stokes/stokes_3d_quadrilateral.mini
+++ b/test/stokes/stokes_3d_quadrilateral.mini
@@ -13,5 +13,5 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-10
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
diff --git a/test/stokes/stokes_dg.mini b/test/stokes/stokes_dg.mini
index e09fdb1c..2fa0e00a 100644
--- a/test/stokes/stokes_dg.mini
+++ b/test/stokes/stokes_dg.mini
@@ -17,5 +17,5 @@ zeroThreshold.data_1 = 1e-6
 [formcompiler]
 compare_l2errorsquared = 1e-9
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 0, 1 | expand num
diff --git a/test/stokes/stokes_dg_quadrilateral.mini b/test/stokes/stokes_dg_quadrilateral.mini
index c89a5d3d..78954b12 100644
--- a/test/stokes/stokes_dg_quadrilateral.mini
+++ b/test/stokes/stokes_dg_quadrilateral.mini
@@ -12,5 +12,5 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-8
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 0, 1 | expand num
diff --git a/test/stokes/stokes_quadrilateral.mini b/test/stokes/stokes_quadrilateral.mini
index bad65475..6ee36e82 100644
--- a/test/stokes/stokes_quadrilateral.mini
+++ b/test/stokes/stokes_quadrilateral.mini
@@ -13,5 +13,5 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-10
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
diff --git a/test/stokes/stokes_stress.mini b/test/stokes/stokes_stress.mini
index 1ac9b06b..9663f5f1 100644
--- a/test/stokes/stokes_stress.mini
+++ b/test/stokes/stokes_stress.mini
@@ -17,5 +17,5 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-11
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1
diff --git a/test/stokes/stokes_stress_sym.mini b/test/stokes/stokes_stress_sym.mini
index ec5f2a0d..9646ec08 100644
--- a/test/stokes/stokes_stress_sym.mini
+++ b/test/stokes/stokes_stress_sym.mini
@@ -15,5 +15,5 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-6
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1
diff --git a/test/stokes/stokes_sym.mini b/test/stokes/stokes_sym.mini
index 5755676a..89dcee74 100644
--- a/test/stokes/stokes_sym.mini
+++ b/test/stokes/stokes_sym.mini
@@ -15,5 +15,5 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-10
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 0, 1 | expand num
diff --git a/test/sumfact/mass/mass.mini b/test/sumfact/mass/mass.mini
index 8cb8cb8c..6b0e9db8 100644
--- a/test/sumfact/mass/mass.mini
+++ b/test/sumfact/mass/mass.mini
@@ -12,7 +12,7 @@ printmatrix = 1
 name = {__name}
 extension = vtu
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
 vectorization_quadloop = 1, 0 | expand vec
 sumfact = 1
diff --git a/test/sumfact/mass/mass_3d.mini b/test/sumfact/mass/mass_3d.mini
index 1bde4e8c..fff87d11 100644
--- a/test/sumfact/mass/mass_3d.mini
+++ b/test/sumfact/mass/mass_3d.mini
@@ -13,7 +13,7 @@ printmatrix = true
 name = {__name}
 extension = vtu
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
 vectorization_quadloop = 1, 0 | expand vec
 sumfact = 1
diff --git a/test/sumfact/mass/sliced.mini b/test/sumfact/mass/sliced.mini
index 542548d7..17d33190 100644
--- a/test/sumfact/mass/sliced.mini
+++ b/test/sumfact/mass/sliced.mini
@@ -9,7 +9,7 @@ printmatrix = true
 name = {__name}
 extension = vtu
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1
 vectorization_strategy = explicit
 vectorization_horizontal = 1
diff --git a/test/sumfact/poisson/diagonal.mini b/test/sumfact/poisson/diagonal.mini
index 58abb8c6..298fadba 100644
--- a/test/sumfact/poisson/diagonal.mini
+++ b/test/sumfact/poisson/diagonal.mini
@@ -10,7 +10,7 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-5
 
-[formcompiler.operator]
+[formcompiler.r]
 sumfact = 1
 vectorization_quadloop = 1
 vectorization_strategy = explicit
diff --git a/test/sumfact/poisson/opcount_poisson_2d_order2.mini b/test/sumfact/poisson/opcount_poisson_2d_order2.mini
index cc5de56f..538189b2 100644
--- a/test/sumfact/poisson/opcount_poisson_2d_order2.mini
+++ b/test/sumfact/poisson/opcount_poisson_2d_order2.mini
@@ -16,7 +16,7 @@ compare_l2errorsquared = 1e-8
 opcounter = 1
 instrumentation_level = 4
 
-[formcompiler.operator]
+[formcompiler.r]
 sumfact = 1
 
 [formcompiler.ufl_variants]
diff --git a/test/sumfact/poisson/opcount_sumfact_poisson_dg_2d_vec.mini b/test/sumfact/poisson/opcount_sumfact_poisson_dg_2d_vec.mini
index 02039a9f..b657c1a2 100644
--- a/test/sumfact/poisson/opcount_sumfact_poisson_dg_2d_vec.mini
+++ b/test/sumfact/poisson/opcount_sumfact_poisson_dg_2d_vec.mini
@@ -13,7 +13,7 @@ extension = vtu
 opcounter = 1
 instrumentation_level = 4
 
-[formcompiler.operator]
+[formcompiler.r]
 sumfact = 1
 
 [formcompiler.ufl_variants]
diff --git a/test/sumfact/poisson/poisson_2d.mini b/test/sumfact/poisson/poisson_2d.mini
index a079932b..d9ce1773 100644
--- a/test/sumfact/poisson/poisson_2d.mini
+++ b/test/sumfact/poisson/poisson_2d.mini
@@ -16,7 +16,7 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 4e-5, 4e-9 | expand deg
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
 sumfact = 1
 vectorization_strategy = explicit, none | expand grad
diff --git a/test/sumfact/poisson/poisson_3d.mini b/test/sumfact/poisson/poisson_3d.mini
index 31f556f5..e3e6da7d 100644
--- a/test/sumfact/poisson/poisson_3d.mini
+++ b/test/sumfact/poisson/poisson_3d.mini
@@ -17,7 +17,7 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-4, 1e-8 | expand deg
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
 sumfact = 1
 vectorization_quadloop = 1, 0 | expand quad
diff --git a/test/sumfact/poisson/poisson_dg_2d.mini b/test/sumfact/poisson/poisson_dg_2d.mini
index 3b4fd9a5..d6799eac 100644
--- a/test/sumfact/poisson/poisson_dg_2d.mini
+++ b/test/sumfact/poisson/poisson_dg_2d.mini
@@ -16,7 +16,7 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 5e-5, 5e-7 | expand deg
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
 sumfact = 1
 vectorization_quadloop = 1, 0 | expand quad
diff --git a/test/sumfact/poisson/poisson_dg_3d.mini b/test/sumfact/poisson/poisson_dg_3d.mini
index 58410c45..f0b4ef26 100644
--- a/test/sumfact/poisson/poisson_dg_3d.mini
+++ b/test/sumfact/poisson/poisson_dg_3d.mini
@@ -16,7 +16,7 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-4, 5e-6 | expand deg
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
 sumfact = 1
 vectorization_quadloop = 1, 0 | expand quad
diff --git a/test/sumfact/poisson/poisson_dg_tensor.mini b/test/sumfact/poisson/poisson_dg_tensor.mini
index aa485d22..f6884f96 100644
--- a/test/sumfact/poisson/poisson_dg_tensor.mini
+++ b/test/sumfact/poisson/poisson_dg_tensor.mini
@@ -14,7 +14,7 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 3e-4
 
-[formcompiler.operator]
+[formcompiler.r]
 sumfact = 1
 vectorization_quadloop = 1, 0 | expand quad
 vectorization_strategy = explicit, none | expand grad
diff --git a/test/sumfact/poisson/poisson_fastdg_2d.mini b/test/sumfact/poisson/poisson_fastdg_2d.mini
index abd5b214..53012e32 100644
--- a/test/sumfact/poisson/poisson_fastdg_2d.mini
+++ b/test/sumfact/poisson/poisson_fastdg_2d.mini
@@ -14,7 +14,7 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-4
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 0
 sumfact = 1
 vectorization_quadloop = 1, 0 | expand quadvec
diff --git a/test/sumfact/poisson/poisson_fastdg_3d.mini b/test/sumfact/poisson/poisson_fastdg_3d.mini
index e58d0785..46552ce9 100644
--- a/test/sumfact/poisson/poisson_fastdg_3d.mini
+++ b/test/sumfact/poisson/poisson_fastdg_3d.mini
@@ -14,7 +14,7 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-4
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 0
 sumfact = 1
 vectorization_quadloop = 1, 0 | expand quadvec
diff --git a/test/sumfact/poisson/sliced.mini b/test/sumfact/poisson/sliced.mini
index 26652161..55b6fcf7 100644
--- a/test/sumfact/poisson/sliced.mini
+++ b/test/sumfact/poisson/sliced.mini
@@ -10,7 +10,7 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-5
 
-[formcompiler.operator]
+[formcompiler.r]
 sumfact = 1
 vectorization_quadloop = 1
 vectorization_strategy = explicit
diff --git a/test/sumfact/stokes/stokes.mini b/test/sumfact/stokes/stokes.mini
index 203e89e2..cfb89ec5 100644
--- a/test/sumfact/stokes/stokes.mini
+++ b/test/sumfact/stokes/stokes.mini
@@ -14,7 +14,7 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-12
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 1, 0 | expand num
 vectorization_quadloop = 1, 0 | expand quad
 sumfact = 1
diff --git a/test/sumfact/stokes/stokes_dg.mini b/test/sumfact/stokes/stokes_dg.mini
index 9b5202a1..f34f2342 100644
--- a/test/sumfact/stokes/stokes_dg.mini
+++ b/test/sumfact/stokes/stokes_dg.mini
@@ -15,9 +15,9 @@ extension = vtu
 [formcompiler]
 compare_l2errorsquared = 1e-8
 
-[formcompiler.operator]
+[formcompiler.r]
 numerical_jacobian = 0, 1 | expand num
 sumfact = 1
 fastdg = 1, 0 | expand fastdg
 
-{formcompiler.operator.fastdg} == 1 and {formcompiler.numerical_jacobian} == 1 | exclude
\ No newline at end of file
+{formcompiler.r.fastdg} == 1 and {formcompiler.r.numerical_jacobian} == 1 | exclude
\ No newline at end of file
-- 
GitLab