diff --git a/python/dune/perftool/compile.py b/python/dune/perftool/compile.py index a40a178227823c199c2a59a6f83baa8cb899d10b..8e8f9f4506cd2f4b0b308e334fc85cc63edf567b 100644 --- a/python/dune/perftool/compile.py +++ b/python/dune/perftool/compile.py @@ -90,9 +90,18 @@ def compile_form(): with cache_context('driver', delete=True): generate_driver(formdatas[0].preprocessed_form, get_option("driver_file")) + # In case of multiple forms: Genarate one file that includes all localoperator files + if len(formdatas) > 1: + from dune.perftool.pdelab.localoperator import generate_localoperator_basefile + generate_localoperator_basefile(formdatas, data) + # Generate local operator files - for formdata in formdatas: + for index, formdata in enumerate(formdatas): with global_context(data=data, formdata=formdata): + # Make sure cache is empty + from dune.perftool.generation import delete_cache_items + delete_cache_items() + if get_option("operator_file"): from dune.perftool.pdelab.localoperator import generate_localoperator_kernels kernels = generate_localoperator_kernels(formdata, data) @@ -108,4 +117,3 @@ def compile_form(): from dune.perftool.pdelab.localoperator import generate_localoperator_file generate_localoperator_file(kernels, filename) - break diff --git a/python/dune/perftool/pdelab/driver.py b/python/dune/perftool/pdelab/driver.py index 9a3ad1474c8667e1c2e2d1ea4f36d574097ce281..011c2dac4c49387d57387246a31078e4d78b9432 100644 --- a/python/dune/perftool/pdelab/driver.py +++ b/python/dune/perftool/pdelab/driver.py @@ -610,8 +610,7 @@ def typedef_localoperator(name): from dune.perftool.generation import get_global_context_value data = get_global_context_value("data") formdata = get_global_context_value("formdata") - from dune.perftool.pdelab.localoperator import name_localoperator_file - filename = name_localoperator_file(formdata, data) + filename = get_option("operator_file") include_file(filename, filetag="driver") from dune.perftool.pdelab.localoperator import localoperator_basename lopname = localoperator_basename(formdata, data) diff --git a/python/dune/perftool/pdelab/localoperator.py b/python/dune/perftool/pdelab/localoperator.py index dde94934766335f1a85d340ca53073b7b14b6911..b4990c0f4328d8ccfa5008b3025f03e05e0d8cf2 100644 --- a/python/dune/perftool/pdelab/localoperator.py +++ b/python/dune/perftool/pdelab/localoperator.py @@ -34,10 +34,13 @@ def name_form(formdata, data): def name_localoperator_file(formdata, data): - suffix = '_' + name_form(formdata, data) from dune.perftool.options import get_option - basename, extension = splitext(get_option("operator_file")) - filename = basename + suffix + extension + if len(data.forms) == 1: + filename = get_option("operator_file") + else: + suffix = '_' + name_form(formdata, data) + basename, extension = splitext(get_option("operator_file")) + filename = basename + suffix + extension return filename @@ -128,7 +131,7 @@ def name_initree_member(): @class_basename("operator") def localoperator_basename(formdata, data): form_name = name_form(formdata, data) - return "LocalOperator"+form_name.capitalize() + return "LocalOperator" + form_name.capitalize() def class_type_from_cache(classtag): @@ -447,3 +450,13 @@ def generate_localoperator_file(kernels, filename): # TODO take the name of this thing from the UFL file lop = cgen_class_from_cache("operator", members=operator_methods) generate_file(filename, "operatorfile", [param, lop]) + + +def generate_localoperator_basefile(formdatas, data): + filename = get_option("operator_file") + for formdata in formdatas: + lop_filename = name_localoperator_file(formdata, data) + include_file(lop_filename, filetag="operatorbasefile") + + from dune.perftool.file import generate_file + generate_file(filename, "operatorbasefile", []) diff --git a/test/heatequation/heatequation.ufl b/test/heatequation/heatequation.ufl index 8392d99ecc3398757e401489b4a980d79b916fe8..d883d345c9ae65e6175b66a380385766a65af953 100644 --- a/test/heatequation/heatequation.ufl +++ b/test/heatequation/heatequation.ufl @@ -5,9 +5,7 @@ V = FiniteElement("CG", "triangle", 1, dirichlet_expression=g) u = TrialFunction(V) v = TestFunction(V) -# mass = (u*v)*dx -# poisson = (inner(grad(u), grad(v)) - f*v)*dx +mass = (u*v)*dx +poisson = (inner(grad(u), grad(v)) - f*v)*dx -# forms = [poisson,mass] - -forms = [(u*v)*dx,(inner(grad(u), grad(v)) - f*v)*dx] \ No newline at end of file +forms = [poisson,mass] \ No newline at end of file