Subject: Re: [Ffc] [Branch ~ffc-core/ffc/dev] Rev 1602: Some comments, cleanups and added option -f convert_exceptions_to_warnings

From: Kristian Oelgaard <[email-masked]>
Date: Sat, 30 Jan 2010 20:31:44 +0100 (CET)

On 30 January 2010 20:20,  <[email-masked]> wrote:
> ------------------------------------------------------------
> revno: 1602
> committer: Anders Logg <[email-masked]>
> branch nick: ffc-dev
> timestamp: Sat 2010-01-30 20:17:52 +0100
> message:
>  Some comments, cleanups and added option -f convert_exceptions_to_warnings

I like the long name, it will discourage people to use it :)

Kristian

> modified:
>  ffc/codegeneration.py
>  ffc/constants.py
>  ffc/cpp.py
>  ffc/evaluatebasis.py
>  ffc/evaluatebasisderivatives.py
>  ffc/fiatinterface.py
>  ffc/interpolatevertexvalues.py
>  ffc/quadratureelement.py
>  test/regression/test.py
>
>
> --
> lp:~ffc-core/ffc/dev
> https://code.launchpad.net/~ffc-core/ffc/dev
>
> You are subscribed to branch lp:~ffc-core/ffc/dev.
> To unsubscribe from this branch go to https://code.launchpad.net/~ffc-core/ffc/dev/+edit-subscription.
>
> === modified file 'ffc/codegeneration.py'
> --- ffc/codegeneration.py       2010-01-28 17:27:57 +0000
> +++ ffc/codegeneration.py       2010-01-30 19:17:52 +0000
> @@ -11,11 +11,12 @@
>  __copyright__ = "Copyright (C) 2009 " + __author__
>  __license__  = "GNU GPL version 3 or any later version"
>
> -# Last changed: 2010-01-28
> +# Last changed: 2010-01-30
>
>  # FFC modules
>  from ffc.log import info, begin, end, debug_code
> -from ffc.cpp import format, indent, set_float_formatting
> +from ffc.cpp import format, indent
> +from ffc.cpp import set_float_formatting, set_exception_handling
>
>  # FFC code generation modules
>  from ffc.evaluatebasis import _evaluate_basis, _evaluate_basis_all
> @@ -35,8 +36,12 @@
>
>     begin("Compiler stage 4: Generating code")
>
> -    # Set floating point format
> -    set_float_formatting(options)
> +    # FIXME: Document option -fconvert_exceptions_to_warnings
> +    # FIXME: Remove option epsilon and just rely on precision?
> +
> +    # Set code generation options
> +    set_float_formatting(int(options["precision"]))
> +    set_exception_handling(options["convert_exceptions_to_warnings"])
>
>     # Extract representations
>     ir_elements, ir_dofmaps, ir_integrals, ir_forms = ir
>
> === modified file 'ffc/constants.py'
> --- ffc/constants.py    2010-01-21 20:56:39 +0000
> +++ ffc/constants.py    2010-01-30 19:17:52 +0000
> @@ -4,26 +4,26 @@
>  __license__  = "GNU GPL version 3 or any later version"
>
>  # Modified by Kristian B. Oelgaard, 2009
> -# Last changed: 2010-01-21
> +# Last changed: 2010-01-30
>
>  from log import INFO
>
>  FFC_VERSION = "0.7.1"
>
> -FFC_OPTIONS = {"format":              "ufc",  # code generation format
> -               "representation":      "auto", # form representation / code generation strategy
> -               "quadrature_rule":     "auto", # quadrature rule used for integration of element tensors
> -               "quadrature_degree":   "auto", # quadrature degree used for computing integrals
> -               "precision":           "15",   # precision used when writing numbers
> -               "split":                False, # split generated code into .h and .cpp file
> -               "form_postfix":         True,  # postfix form name with "Function", "LinearForm" or BilinearForm
> -               "cache_dir":            None,  # cache dir used by Instant
> -               "output_dir":           ".",   # output directory for generated code
> -               "cpp optimize":         False, # optimization for the JIT compiler
> -               "optimize":             False, # optimise the quadrature code generation
> -               "log_level":            INFO,  # log level, displaying only messages with level >= log_level
> -               "log_prefix":           "",    # log prefix
> -               "epsilon":              1e-14} # machine precision, used for dropping zero terms
> +FFC_OPTIONS = {"format":                         "ufc",  # code generation format
> +               "representation":                 "auto", # form representation / code generation strategy
> +               "quadrature_rule":                "auto", # quadrature rule used for integration of element tensors
> +               "quadrature_degree":              "auto", # quadrature degree used for computing integrals
> +               "precision":                      "15",   # precision used when writing numbers
> +               "split":                          False,  # split generated code into .h and .cpp file
> +               "form_postfix":                   True,   # postfix form name with "Function", "LinearForm" or BilinearForm
> +               "cache_dir":                      None,   # cache dir used by Instant
> +               "output_dir":                     ".",    # output directory for generated code
> +               "cpp optimize":                   False,  # optimization for the JIT compiler
> +               "optimize":                       False,  # optimise the quadrature code generation
> +               "log_level":                      INFO,   # log level, displaying only messages with level >= log_level
> +               "log_prefix":                     "",     # log prefix
> +               "epsilon":                        1e-14,  # machine precision, used for dropping zero terms
> +               "convert_exceptions_to_warnings": False}  # convert all exceptions to warning in generated code
>
> -# FIXME: Change to 1.2 when we support UFC 1.2
> -UFC_VERSION = "1.0"
> +UFC_VERSION = "1.2"
>
> === modified file 'ffc/cpp.py'
> --- ffc/cpp.py  2010-01-29 23:21:06 +0000
> +++ ffc/cpp.py  2010-01-30 19:17:52 +0000
> @@ -811,13 +811,8 @@
>         error("Unsupported domain_type: %s" % str(domain_type))
>     return code
>
> -
> -
> -def set_float_formatting(options):
> -    "Set floating point formatting based on options."
> -
> -    # Get number of digits
> -    precision = int(options["precision"])
> +def set_float_formatting(precision):
> +    "Set floating point formatting based on precision."
>
>     # Options for float formatting
>     f1 = "%%.%df" % precision
> @@ -845,3 +840,8 @@
>
>     # Set machine precision
>     format["epsilon"] = 10.0*eval("1e-%s" % precision)
> +
> +def set_exception_handling(convert_exceptions_to_warnings):
> +    "Set handling of exceptions."
> +    if convert_exceptions_to_warnings:
> +        format["exception"] = format["warning"]
>
> === modified file 'ffc/evaluatebasis.py'
> --- ffc/evaluatebasis.py        2010-01-30 14:21:36 +0000
> +++ ffc/evaluatebasis.py        2010-01-30 19:17:52 +0000
> @@ -29,9 +29,9 @@
>     """Like evaluate_basis, but return the values of all basis functions (dofs)."""
>
>     if isinstance(data_list, str):
> -        return format["warning"]("evaluate_basis_all: %s" % data_list)
> +        return format["exception"]("evaluate_basis_all: %s" % data_list)
>
> -    format_r, format_s  =  format["free indices"][:2]
> +    format_r, format_s  = format["free indices"][:2]
>     format_assign       = format["assign"]
>
>     # Initialise objects
> @@ -109,7 +109,7 @@
>     untested for tensor valued element."""
>
>     if isinstance(data_list, str):
> -        return format["warning"]("evaluate_basis: %s" % data_list)
> +        return format["exception"]("evaluate_basis: %s" % data_list)
>
>     # Init return code and indent object
>     code = []
>
> === modified file 'ffc/evaluatebasisderivatives.py'
> --- ffc/evaluatebasisderivatives.py     2010-01-29 23:18:30 +0000
> +++ ffc/evaluatebasisderivatives.py     2010-01-30 19:17:52 +0000
> @@ -30,7 +30,7 @@
>     """Like evaluate_basis, but return the values of all basis functions (dofs)."""
>
>     if isinstance(data_list, str):
> -        return format["warning"]("evaluate_basis_derivatives_all: %s" % data_list)
> +        return format["exception"]("evaluate_basis_derivatives_all: %s" % data_list)
>
>     format_r, format_s = format["free indices"][:2]
>     format_assign = format["assign"]
> @@ -126,7 +126,7 @@
>     Nedelec (broken?)"""
>
>     if isinstance(data_list, str):
> -        return format["warning"]("evaluate_basis_derivatives: %s" % data_list)
> +        return format["exception"]("evaluate_basis_derivatives: %s" % data_list)
>
>     # Init return code and indent object
>     code = []
>
> === modified file 'ffc/fiatinterface.py'
> --- ffc/fiatinterface.py        2010-01-30 17:59:11 +0000
> +++ ffc/fiatinterface.py        2010-01-30 19:17:52 +0000
> @@ -28,6 +28,8 @@
>  # instead? The same goes for similar dictionaries in UFL (geometry.py). After
>  # all both FFC and UFL complies with UFC or not?
>  # Mapping from domain to dimension
> +# FIXME: AL: They should be in UFL (and probably are there already). They
> +# FIXME: can't be in UFC since UFL cannot depend on UFC.
>  domain2dim = {"vertex": 0,
>               "interval": 1,
>               "triangle": 2,
> @@ -49,16 +51,18 @@
>         debug("Reusing element from cache")
>         return _cache[ufl_element]
>
> -    # Initialize element based on type
> +    # Create regular FIAT finite element
>     if isinstance(ufl_element, ufl.FiniteElement):
> -        element = create_fiat_element(ufl_element)
> +        element = _create_fiat_element(ufl_element)
>
> +    # Create mixed element (implemented by FFC)
>     elif isinstance(ufl_element, ufl.MixedElement):
>         elements = _extract_elements(ufl_element)
>         element = MixedElement(elements)
>
> +    # Create restricted element(implemented by FFC)
>     elif isinstance(ufl_element, ufl.ElementRestriction):
> -        element = create_restricted_element(ufl_element)
> +        element = _create_restricted_element(ufl_element)
>
>     else:
>         error("Cannot handle this element type: %s" % str(ufl_element))
> @@ -68,13 +72,16 @@
>
>     return element
>
> -def create_fiat_element(ufl_element):
> +def _create_fiat_element(ufl_element):
>     "Create FIAT element corresponding to given finite element."
>
>     family = ufl_element.family()
> -    # Handle QuadrtureElement
> +
> +    # FIXME: AL: Should this really be here?
> +    # Handle QuadratureElement
>     if family == "Quadrature":
>         return FFCQuadratureElement(ufl_element)
> +
>     # Check if finite element family is supported by FIAT
>     elif not family in FIAT.element_classes:
>         error("Sorry, finite element of type \"%s\" are not supported by FIAT.", family)
> @@ -129,8 +136,6 @@
>
>     return new_points
>
> -
> -# -- Extract elements from UFL mixed element
>  def _extract_elements(ufl_element, domain=None):
>     "Recursively extract un-nested list of (component) elements."
>
> @@ -146,9 +151,7 @@
>     elements += [create_element(ufl_element)]
>     return elements
>
> -
> -# -- Restricted element initializer functions
> -def create_restricted_element(ufl_element):
> +def _create_restricted_element(ufl_element):
>     "Create an FFC representation for an UFL ElementRestriction."
>
>     if not isinstance(ufl_element, ufl.ElementRestriction):
> @@ -159,7 +162,7 @@
>
>     # If simple element -> create RestrictedElement from fiat_element
>     if isinstance(base_element, ufl.FiniteElement):
> -        element = create_fiat_element(base_element)
> +        element = _create_fiat_element(base_element)
>         return RestrictedElement(element, _indices(element, domain))
>
>     # If restricted mixed element -> convert to mixed restricted element
> @@ -180,4 +183,3 @@
>         for (entity, index) in entities.iteritems():
>             indices += index
>     return indices
> -
>
> === modified file 'ffc/interpolatevertexvalues.py'
> --- ffc/interpolatevertexvalues.py      2010-01-29 23:18:30 +0000
> +++ ffc/interpolatevertexvalues.py      2010-01-30 19:17:52 +0000
> @@ -25,7 +25,7 @@
>
>     # Handle unsupported elements.
>     if isinstance(ir, str):
> -        return format["warning"]("interpolate_vertex_values: %s" % ir)
> +        return format["exception"]("interpolate_vertex_values: %s" % ir)
>
>     # Add code for Jacobian if necessary
>     code = []
>
> === modified file 'ffc/quadratureelement.py'
> --- ffc/quadratureelement.py    2010-01-29 15:02:09 +0000
> +++ ffc/quadratureelement.py    2010-01-30 19:17:52 +0000
> @@ -4,7 +4,7 @@
>  __license__  = "GNU GPL version 3 or any later version"
>
>  # Modified by Garth N. Wells 2006-2009
> -# Last changed: 2010-01-29
> +# Last changed: 2010-01-30
>
>  # Python modules.
>  import numpy
> @@ -121,4 +121,3 @@
>
>  # FFC modules to avoid circular import
>  from ffc.fiatinterface import create_quadrature, reference_cell
> -
>
> === modified file 'test/regression/test.py'
> --- test/regression/test.py     2010-01-29 17:33:27 +0000
> +++ test/regression/test.py     2010-01-30 19:17:52 +0000
> @@ -96,7 +96,7 @@
>     for f in form_files:
>
>         # Generate code
> -        ok = run_command("ffc -d %s" % f)
> +        ok = run_command("ffc -d -fconvert_exceptions_to_warnings %s" % f)
>
>         # Check status
>         if ok:
>
>
>