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])
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])