コード例 #1
0
def ffcx_jit(ufl_object, form_compiler_parameters={}, jit_parameters={}):
    """Compile UFL object with FFCx and CFFI.

    Parameters
    ----------
      ufl_object:
        Object to compile, e.g. ufl.Form

      form_compiler_parameters:
        Parameters used in FFCx compilation of this form. Run `ffcx --help` at
        the commandline to see all available options. Takes priority over all
        other parameter values, except for `scalar_type` which is determined by
        DOLFINx.

      jit_parameters:
        Parameters used in CFFI JIT compilation of C code generated by FFCx.
        See `python/dolfinx/jit.py` for all available
        parameters. Takes priority over all other parameter values.

    Returns
    -------
      (compiled object, module, (header code, implementation code))

    Notes
    -----
      Priority ordering of parameters controlling DOLFINx JIT \
      compilation from highest to lowest is:

      -  **jit_parameters** (API)
      -  **$(pwd)/dolfinx_jit_parameters.json** (local parameters)
      -  **~/.config/dolfinx/dolfinx_jit_parameters.json** (user parameters)
      -  **DOLFINX_DEFAULT_JIT_PARAMETERS** in `dolfinx.jit`

      Priority ordering of parameters controlling FFCx from highest to \
      lowest is:

      -  **scalar_type** of DOLFINx
      -  **form_compiler_parameters** (API)
      -  **$(pwd)/ffcx_parameters.json** (local parameters)
      -  **~/.config/ffcx/ffcx_parameters.json** (user parameters)
      -  **FFCX_DEFAULT_PARAMETERS** in `ffcx.parameters`

      The contents of the `dolfinx_parameters.json` files are cached \
      on the first call. Subsequent calls to this function use this cache.

      Example `dolfinx_jit_parameters.json` file:

          **{ "cffi_extra_compile_args": ["-O2", "-march=native" ],  "cffi_verbose": True }**
"""
    # Prepare form compiler parameters with priority parameters
    p_ffcx = ffcx.get_parameters(form_compiler_parameters)
    p_ffcx[
        "scalar_type"] = "double complex" if common.has_petsc_complex else "double"

    p_jit = get_parameters(jit_parameters)

    # Switch on type and compile, returning cffi object
    if isinstance(ufl_object, ufl.Form):
        r = ffcx.codegeneration.jit.compile_forms([ufl_object],
                                                  parameters=p_ffcx,
                                                  **p_jit)
    elif isinstance(ufl_object, ufl.FiniteElementBase):
        r = ffcx.codegeneration.jit.compile_elements([ufl_object],
                                                     parameters=p_ffcx,
                                                     **p_jit)
    elif isinstance(ufl_object, ufl.Mesh):
        r = ffcx.codegeneration.jit.compile_coordinate_maps([ufl_object],
                                                            parameters=p_ffcx,
                                                            **p_jit)
    elif isinstance(ufl_object, tuple) and isinstance(ufl_object[0],
                                                      ufl.core.expr.Expr):
        r = ffcx.codegeneration.jit.compile_expressions([ufl_object],
                                                        parameters=p_ffcx,
                                                        **p_jit)
    else:
        raise TypeError(type(ufl_object))

    return (r[0][0], r[1], r[2])
コード例 #2
0
def ffcx_jit(ufl_object, form_compiler_params={}, jit_params={}):
    """Compile UFL object with FFCx and CFFI.

    Args:
        ufl_object: Object to compile, e.g. ufl.Form
        form_compiler_params: Parameters used in FFCx compilation of
            this form. Run `ffcx --help` at the commandline to see all
            available options. Takes priority over all other parameter
            values.
        jit_params: Parameters used in CFFI JIT compilation of C code
            generated by FFCx. See `python/dolfinx/jit.py` for all
            available parameters. Takes priority over all other
            parameter values.

    Returns:
        (compiled object, module, (header code, implementation code))

    Notes:
        Priority ordering of parameters controlling DOLFINx JIT
        compilation from highest to lowest is:

        -  **jit_params** (API)
        -  **$PWD/dolfinx_jit_parameters.json** (local parameters)
        -  **$XDG_CONFIG_HOME/dolfinx/dolfinx_jit_parameters.json**
           (user parameters)
        -  **DOLFINX_DEFAULT_JIT_PARAMETERS** in `dolfinx.jit`

        Priority ordering of parameters controlling FFCx from highest to
        lowest is:

        -  **form_compiler_paramss** (API)
        -  **$PWD/ffcx_parameters.json** (local parameters)
        -  **$XDG_CONFIG_HOME/ffcx/ffcx_parameters.json** (user parameters)
        -  **FFCX_DEFAULT_PARAMETERS** in `ffcx.parameters`

        `$XDG_CONFIG_HOME` is `~/.config/` if the environment variable is not set.

        The contents of the `dolfinx_parameters.json` files are cached
        on the first call. Subsequent calls to this function use this
        cache.

        Example `dolfinx_jit_parameters.json` file:

            **{ "cffi_extra_compile_args": ["-O2", "-march=native" ],  "cffi_verbose": True }**

    """
    # Prepare form compiler parameters with priority parameters
    p_ffcx = ffcx.get_parameters(form_compiler_params)
    p_jit = get_parameters(jit_params)

    # Switch on type and compile, returning cffi object
    if isinstance(ufl_object, ufl.Form):
        r = ffcx.codegeneration.jit.compile_forms([ufl_object],
                                                  parameters=p_ffcx,
                                                  **p_jit)
    elif isinstance(ufl_object, ufl.FiniteElementBase):
        r = ffcx.codegeneration.jit.compile_elements([ufl_object],
                                                     parameters=p_ffcx,
                                                     **p_jit)
    elif isinstance(ufl_object, ufl.Mesh):
        r = ffcx.codegeneration.jit.compile_coordinate_maps([ufl_object],
                                                            parameters=p_ffcx,
                                                            **p_jit)
    elif isinstance(ufl_object, tuple) and isinstance(ufl_object[0],
                                                      ufl.core.expr.Expr):
        r = ffcx.codegeneration.jit.compile_expressions([ufl_object],
                                                        parameters=p_ffcx,
                                                        **p_jit)
    else:
        raise TypeError(type(ufl_object))

    return (r[0][0], r[1], r[2])