From cdc7ec2deb592bf588faa25d61827fe66c530410 Mon Sep 17 00:00:00 2001 From: Dominic Kempf <dominic.r.kempf@gmail.com> Date: Wed, 2 Sep 2015 16:41:53 +0200 Subject: [PATCH] Some infrastructure update --- python/dune/perftool/compile.py | 30 +++++++++++++++++++----------- python/dune/perftool/driver.py | 5 +++++ python/dune/perftool/generation.py | 6 ++++++ python/dune/perftool/options.py | 19 ++++++++++++++----- python/setup.py | 2 +- 5 files changed, 45 insertions(+), 17 deletions(-) diff --git a/python/dune/perftool/compile.py b/python/dune/perftool/compile.py index 8bee29ee..dd3dbb14 100644 --- a/python/dune/perftool/compile.py +++ b/python/dune/perftool/compile.py @@ -4,9 +4,7 @@ The methods to run the parts of the form compiler Should also contain the entrypoint methods. """ -def read_ufl(uflfile=None): - assert uflfile - +def read_ufl(uflfile): from ufl.algorithms.formfiles import read_ufl_file, interpret_ufl_namespace from ufl.algorithms import compute_form_data @@ -19,13 +17,10 @@ def read_ufl(uflfile=None): return formdata -def write_driver(formdata=None, filename=None): - assert formdata - assert filename - +def generate_driver(formdata, filename): # The driver module uses a global variable for ease of use - import dune.perftool.driver - dune.perftool.driver._formdata = formdata + from dune.perftool.driver import set_formdata + set_formdata(formdata) # The vtkoutput is the generating method that triggers all others. # Alternatively, one could use the `solve` method. @@ -53,10 +48,23 @@ def write_driver(formdata=None, filename=None): f.write("\nvoid driver(int argc, char** argv)\n") f.write("\n".join(driver.generate())) + # Reset the caching data structure + from dune.perftool.generation import delete_cache + delete_cache() -def write_localoperator(): + +def generate_localoperator(): pass def compile_form(): - pass + from dune.perftool.options import get_option + ufldata = read_ufl(get_option("uflfile")) + + generate_localoperator() + + if get_option("driver_file"): + generate_driver(ufldata, get_option("driver_file")) + + if get_option("operator_file"): + generate_localoperator(ufldata, get_option("operator_file")) diff --git a/python/dune/perftool/driver.py b/python/dune/perftool/driver.py index da8c8e9f..539c4fe4 100644 --- a/python/dune/perftool/driver.py +++ b/python/dune/perftool/driver.py @@ -14,6 +14,11 @@ from dune.perftool.generation import dune_include, dune_preamble, dune_symbol # through the entire generator chain. _formdata = None +# Have a function access this global data structure +def set_formdata(fd): + global _formdata + _formdata = fd + def isLagrange(fem): return fem._short_name is 'CG' diff --git a/python/dune/perftool/generation.py b/python/dune/perftool/generation.py index 0801d08a..3eb7b5b3 100644 --- a/python/dune/perftool/generation.py +++ b/python/dune/perftool/generation.py @@ -66,12 +66,18 @@ class LoopDomainCacheItem(UFL2LoopyCacheItem): class IncludeCacheItem(NoReturnCacheItem): def __init__(self, content): NoReturnCacheItem.__init__(self, content) + from cgen import Include self.content = "#include<{}>".format(content) # have one cache the module level. It is easier than handing around an instance of it. _cache = {} +# Have an easy button to delete the cache from other modules +def delete_cache(): + global _cache + _cache = {} + def freeze(data): """ A function that deterministically generates an diff --git a/python/dune/perftool/options.py b/python/dune/perftool/options.py index 125d112f..efb2cda7 100644 --- a/python/dune/perftool/options.py +++ b/python/dune/perftool/options.py @@ -4,18 +4,27 @@ from pytools import memoize @memoize def get_form_compiler_arguments(): + # define an argument parser. from argparse import ArgumentParser parser = ArgumentParser(description="Compile UFL files to PDELab C++ code", epilog="Please report bugs to dominic.kempf@iwr.uni-heidelberg.de") parser.add_argument("uflfile", type=str, nargs=1, help="the UFL file to compile") + parser.add_argument("--driver-file", type=str, help="The filename for the generated driver header") + parser.add_argument("--operator-file", type=str, help="The filename for the generated local operator header") + parser.add_argument('--version', action='version', version='%(prog)s 0.1') + + # These are the options that I deemed necessary in uflpdelab # parser.add_argument("--numerical-jacobian", action="store_true", help="use numerical jacobians (only makes sense, if uflpdelab for some reason fails to generate analytic jacobians)") -# parser.add_argument('--version', action='version', version='%(prog)s 0.0') -# parser.add_argument("--operator-file", type=str, help="The filename for the generated local operator header") -# parser.add_argument("--driver-file", type=str, help="The filename for the generated driver header") # parser.add_argument("--param-class-file", type=str, help="The filename for the generated parameter class header") # parser.add_argument("--export-trafo-graphs", action="store_true", help="export expression graphs after the application of each single transformation") # parser.add_argument("--parameter-tree", action="store_true", help="have the generated local operate take a Dune::ParameterTree as constructor argument") # parser.add_argument("--inifile", type=str, help="The inifile that this program's driver should be hardcoded to. Omit to use a commandline argument ini file") - return vars(parser.parse_args) + + # Modify the positional argument to not be a list + args = vars(parser.parse_args()) + args["uflfile"] = args["uflfile"][0] + + # Return the argument dict. This result is memoized to turn all get_option calls into simple dict lookups. + return args def get_option(key): - return get_form_compiler_arguments()(key) \ No newline at end of file + return get_form_compiler_arguments().get(key, None) \ No newline at end of file diff --git a/python/setup.py b/python/setup.py index 4a6b0729..8ed37cb0 100644 --- a/python/setup.py +++ b/python/setup.py @@ -35,6 +35,6 @@ setup(name='dune.perftool', cmdclass={'test': PyTest}, entry_points = { "console_scripts": [ - "ufl2pdelab = dune.perftool.compiler:compile_form", + "ufl2pdelab = dune.perftool.compile:compile_form", ] }) -- GitLab