From 480647379d85f3f2b7c0d314ea612cca93111511 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 18 Jan 2024 14:24:24 +0100 Subject: [PATCH 01/25] Basic configuration from other branch. --- .github/workflows/ccpp.yml | 19 ++++--------------- python/pyproject.toml | 39 +++++++++++++++++++++++++++++++++----- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml index 734d0778054..749c2d420db 100644 --- a/.github/workflows/ccpp.yml +++ b/.github/workflows/ccpp.yml @@ -60,25 +60,14 @@ jobs: python3 -m pip install git+https://github.com/FEniCS/basix.git@${{ github.event.inputs.basix_ref }} python3 -m pip install git+https://github.com/FEniCS/ffcx.git@${{ github.event.inputs.ffcx_ref }} - - name: Flake8 checks + - name: ruff C++ .py file checks run: | cd cpp/ - python3 -m flake8 cmake - python3 -m flake8 demo - python3 -m flake8 test - cd .. - cd python/ - python3 -m flake8 dolfinx - python3 -m flake8 demo - python3 -m flake8 test - - name: isort checks (non-blocking) - continue-on-error: true + ruff check . + - name: ruff Python interface checks run: | - cd cpp/ - python3 -m isort --check . - cd .. cd python/ - python3 -m isort --check . + ruff check . - name: mypy checks run: | cd python/ diff --git a/python/pyproject.toml b/python/pyproject.toml index 9a201af2dbd..034b9d9684e 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -4,7 +4,7 @@ # pip install -r build-requirements.txt [build-system] requires = [ - "scikit-build-core[pyproject]>=0.5", + "scikit-build-core[pyproject]", "nanobind>=1.8.0", "petsc4py", "mpi4py", @@ -27,7 +27,6 @@ dependencies = [ "cffi", "petsc4py", "mpi4py", - "fenics-basix>=0.8.0.dev0,<0.9.0", "fenics-ffcx>=0.8.0.dev0,<0.9.0", "fenics-ufl>=2023.3.0.dev0,<2023.4.0", ] @@ -57,9 +56,6 @@ wheel.license-files = ["../COPYING*"] [tool.pytest] junit_family = "xunit2" -[tool.isort] -line_length = 120 - [tool.mypy] # Suggested at https://blog.wolt.com/engineering/2021/09/30/professional-grade-mypy-configuration/ # Goal would be to make all of the below True long-term @@ -71,3 +67,36 @@ warn_return_any = false warn_unused_ignores = false show_error_codes = true ignore_missing_imports = true + +[tool.black] +line-length = 120 + +[tool.ruff] +line-length = 120 +indent-width = 4 +allowed-confusables = ["σ"] + +[tool.ruff.lint] +select = [ + # "B", + # "D", # pydocstyle + "E", # pycodestyle + "W", # pycodestyle + "F", # pyflakes + "I", # isort + "RUF", # Ruff-specific rules + "UP", # pyupgrade + # "ANN", + "ICN", + # "SIM", + # "PL", +] +ignore = [] + +[tool.ruff.lint.isort] +known-first-party = ["basix", "dolfinx", "ffcx", "ufl"] +known-third-party = ["gmsh", "numba", "numpy", "pytest", "pyvista"] +section-order = ["future", "standard-library", "mpi", "third-party", "first-party", "local-folder"] + +[tool.ruff.lint.isort.sections] +"mpi" = ["mpi4py", "petsc4py"] From f55135ee39e4d0c0e1829e2bbaecbe792a7cccf2 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 18 Jan 2024 14:36:37 +0100 Subject: [PATCH 02/25] Ignore X | Y, our supported Python to old --- python/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/pyproject.toml b/python/pyproject.toml index 034b9d9684e..c41b13894dd 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -91,7 +91,7 @@ select = [ # "SIM", # "PL", ] -ignore = [] +ignore = ["UP007"] [tool.ruff.lint.isort] known-first-party = ["basix", "dolfinx", "ffcx", "ufl"] From 81e8a7ff037f9f3db1550a43f95cbe3df02d48ae Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 18 Jan 2024 14:46:06 +0100 Subject: [PATCH 03/25] Cannot use isort package from ruff. --- python/pyproject.toml | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/python/pyproject.toml b/python/pyproject.toml index c41b13894dd..6c3c952fc1c 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -68,9 +68,6 @@ warn_unused_ignores = false show_error_codes = true ignore_missing_imports = true -[tool.black] -line-length = 120 - [tool.ruff] line-length = 120 indent-width = 4 @@ -83,7 +80,7 @@ select = [ "E", # pycodestyle "W", # pycodestyle "F", # pyflakes - "I", # isort + # "I", # isort "RUF", # Ruff-specific rules "UP", # pyupgrade # "ANN", @@ -92,11 +89,3 @@ select = [ # "PL", ] ignore = ["UP007"] - -[tool.ruff.lint.isort] -known-first-party = ["basix", "dolfinx", "ffcx", "ufl"] -known-third-party = ["gmsh", "numba", "numpy", "pytest", "pyvista"] -section-order = ["future", "standard-library", "mpi", "third-party", "first-party", "local-folder"] - -[tool.ruff.lint.isort.sections] -"mpi" = ["mpi4py", "petsc4py"] From cebb3347c7c4fbcaed0a7f09b001fd00f5abf67a Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 18 Jan 2024 14:46:57 +0100 Subject: [PATCH 04/25] Use traditional isort + ruff --fix . --- python/demo/demo_lagrange_variants.py | 3 +- python/demo/demo_static-condensation.py | 3 +- python/dolfinx/__init__.py | 3 +- python/dolfinx/fem/assemble.py | 12 ++-- python/dolfinx/fem/bcs.py | 2 +- python/dolfinx/fem/forms.py | 2 +- python/dolfinx/fem/function.py | 6 +- python/dolfinx/fem/petsc.py | 66 +++++++++---------- python/dolfinx/geometry.py | 2 +- python/dolfinx/io/__init__.py | 8 +-- python/dolfinx/io/utils.py | 6 +- python/dolfinx/mesh.py | 2 +- python/dolfinx/plot.py | 2 +- python/dolfinx/utils.py | 4 +- python/test/unit/common/test_index_map.py | 2 +- python/test/unit/fem/test_custom_assembler.py | 4 +- .../test/unit/fem/test_custom_jit_kernels.py | 2 +- .../test/unit/fem/test_nonlinear_assembler.py | 2 +- python/test/unit/io/test_vtk.py | 2 +- python/test/unit/mesh/test_mesh.py | 2 +- python/test/unit/mesh/test_mixed_topology.py | 3 +- 21 files changed, 71 insertions(+), 67 deletions(-) diff --git a/python/demo/demo_lagrange_variants.py b/python/demo/demo_lagrange_variants.py index 5193556a6f7..81a9e19e750 100644 --- a/python/demo/demo_lagrange_variants.py +++ b/python/demo/demo_lagrange_variants.py @@ -18,6 +18,7 @@ # We begin this demo by importing the required modules. import typing + from mpi4py import MPI # + @@ -26,7 +27,7 @@ import basix import basix.ufl -import ufl # type: ignore +import ufl # type: ignore from dolfinx import default_scalar_type, fem, mesh from dolfinx.fem.petsc import LinearProblem from ufl import ds, dx, grad, inner diff --git a/python/demo/demo_static-condensation.py b/python/demo/demo_static-condensation.py index 57219aaad22..31464b0a283 100644 --- a/python/demo/demo_static-condensation.py +++ b/python/demo/demo_static-condensation.py @@ -42,7 +42,8 @@ from dolfinx.io import XDMFFile from dolfinx.jit import ffcx_jit from dolfinx.mesh import locate_entities_boundary, meshtags -from ffcx.codegeneration.utils import numba_ufcx_kernel_signature as ufcx_signature +from ffcx.codegeneration.utils import \ + numba_ufcx_kernel_signature as ufcx_signature if default_real_type == np.float32: print("float32 not yet supported for this demo.") diff --git a/python/dolfinx/__init__.py b/python/dolfinx/__init__.py index b91d7691f4d..8e789acb561 100644 --- a/python/dolfinx/__init__.py +++ b/python/dolfinx/__init__.py @@ -20,7 +20,8 @@ from dolfinx import common from dolfinx import cpp as _cpp -from dolfinx import fem, geometry, graph, io, jit, la, log, mesh, nls, plot, utils +from dolfinx import (fem, geometry, graph, io, jit, la, log, mesh, nls, plot, + utils) # Initialise logging from dolfinx.common import (TimingType, git_commit_hash, has_debug, has_kahip, has_parmetis, list_timings, timing) diff --git a/python/dolfinx/fem/assemble.py b/python/dolfinx/fem/assemble.py index 715f8ed285c..44d2c538141 100644 --- a/python/dolfinx/fem/assemble.py +++ b/python/dolfinx/fem/assemble.py @@ -213,7 +213,7 @@ def _assemble_vector_array(b: np.ndarray, L: Form, constants=None, coeffs=None): @functools.singledispatch -def assemble_matrix(a: typing.Any, bcs: typing.Optional[typing.List[DirichletBC]] = None, +def assemble_matrix(a: typing.Any, bcs: typing.Optional[list[DirichletBC]] = None, diagonal: float = 1.0, constants=None, coeffs=None, block_mode: typing.Optional[la.BlockMode] = None): """Assemble bilinear form into a matrix. @@ -246,7 +246,7 @@ def assemble_matrix(a: typing.Any, bcs: typing.Optional[typing.List[DirichletBC] @assemble_matrix.register -def _assemble_matrix_csr(A: la.MatrixCSR, a: Form, bcs: typing.Optional[typing.List[DirichletBC]] = None, +def _assemble_matrix_csr(A: la.MatrixCSR, a: Form, bcs: typing.Optional[list[DirichletBC]] = None, diagonal: float = 1.0, constants=None, coeffs=None) -> la.MatrixCSR: """Assemble bilinear form into a matrix. @@ -284,9 +284,9 @@ def _assemble_matrix_csr(A: la.MatrixCSR, a: Form, bcs: typing.Optional[typing.L # -- Modifiers for Dirichlet conditions --------------------------------------- -def apply_lifting(b: np.ndarray, a: typing.List[Form], - bcs: typing.List[typing.List[DirichletBC]], - x0: typing.Optional[typing.List[np.ndarray]] = None, +def apply_lifting(b: np.ndarray, a: list[Form], + bcs: list[list[DirichletBC]], + x0: typing.Optional[list[np.ndarray]] = None, scale: float = 1.0, constants=None, coeffs=None) -> None: """Modify RHS vector b for lifting of Dirichlet boundary conditions. @@ -316,7 +316,7 @@ def apply_lifting(b: np.ndarray, a: typing.List[Form], _cpp.fem.apply_lifting(b, _a, constants, coeffs, _bcs, x0, scale) -def set_bc(b: np.ndarray, bcs: typing.List[DirichletBC], +def set_bc(b: np.ndarray, bcs: list[DirichletBC], x0: typing.Optional[np.ndarray] = None, scale: float = 1.0) -> None: """Insert boundary condition values into vector. diff --git a/python/dolfinx/fem/bcs.py b/python/dolfinx/fem/bcs.py index faf3d3661e7..f05aefa6d90 100644 --- a/python/dolfinx/fem/bcs.py +++ b/python/dolfinx/fem/bcs.py @@ -185,7 +185,7 @@ def dirichletbc(value: typing.Union[Function, Constant, np.ndarray], def bcs_by_block(spaces: typing.Iterable[typing.Union[dolfinx.fem.FunctionSpace, None]], - bcs: typing.Iterable[DirichletBC]) -> typing.List[typing.List[DirichletBC]]: + bcs: typing.Iterable[DirichletBC]) -> list[list[DirichletBC]]: """Arrange Dirichlet boundary conditions by the function space that they constrain. diff --git a/python/dolfinx/fem/forms.py b/python/dolfinx/fem/forms.py index d78c8f01ca2..4cd5ce3d7d3 100644 --- a/python/dolfinx/fem/forms.py +++ b/python/dolfinx/fem/forms.py @@ -62,7 +62,7 @@ def rank(self) -> int: return self._cpp_object.rank # type: ignore @property - def function_spaces(self) -> typing.List[FunctionSpace]: + def function_spaces(self) -> list[FunctionSpace]: """Function spaces on which this form is defined""" return self._cpp_object.function_spaces # type: ignore diff --git a/python/dolfinx/fem/function.py b/python/dolfinx/fem/function.py index 5760bec68a5..c233971e525 100644 --- a/python/dolfinx/fem/function.py +++ b/python/dolfinx/fem/function.py @@ -455,7 +455,7 @@ def sub(self, i: int) -> Function: returned `Function` should be stored by the caller to avoid repeated re-computation of the subspac. """ - return Function(self._V.sub(i), self.x, name=f"{str(self)}_{i}") + return Function(self._V.sub(i), self.x, name=f"{self!s}_{i}") def split(self) -> tuple[Function, ...]: """Extract (any) sub-functions. @@ -492,13 +492,13 @@ class ElementMetaData(typing.NamedTuple): """ family: str degree: int - shape: typing.Optional[typing.Tuple[int, ...]] = None + shape: typing.Optional[tuple[int, ...]] = None symmetry: typing.Optional[bool] = None def functionspace(mesh: Mesh, element: typing.Union[ufl.FiniteElementBase, ElementMetaData, - typing.Tuple[str, int, typing.Tuple, bool]], + tuple[str, int, tuple, bool]], form_compiler_options: typing.Optional[dict[str, typing.Any]] = None, jit_options: typing.Optional[dict[str, typing.Any]] = None) -> FunctionSpace: """Create a finite element function space. diff --git a/python/dolfinx/fem/petsc.py b/python/dolfinx/fem/petsc.py index 6c5c1f4e9c5..96fdf54defb 100644 --- a/python/dolfinx/fem/petsc.py +++ b/python/dolfinx/fem/petsc.py @@ -43,7 +43,7 @@ "LinearProblem", "NonlinearProblem"] -def _extract_function_spaces(a: typing.List[typing.List[Form]]): +def _extract_function_spaces(a: list[list[Form]]): """From a rectangular array of bilinear forms, extract the function spaces for each block row and block column. @@ -58,8 +58,8 @@ def fn(form): Vblock: typing.Iterable = map(partial(map, fn), a) # Compute spaces for each row/column block - rows: typing.List[typing.Set] = [set() for i in range(len(a))] - cols: typing.List[typing.Set] = [set() for i in range(len(a[0]))] + rows: list[set] = [set() for i in range(len(a))] + cols: list[set] = [set() for i in range(len(a[0]))] for i, Vrow in enumerate(Vblock): for j, V in enumerate(Vrow): if V is not None: @@ -90,7 +90,7 @@ def create_vector(L: Form) -> PETSc.Vec: return create_petsc_vector(dofmap.index_map, dofmap.index_map_bs) -def create_vector_block(L: typing.List[Form]) -> PETSc.Vec: +def create_vector_block(L: list[Form]) -> PETSc.Vec: """Create a PETSc vector (blocked) that is compaible with a list of linear forms. Args: @@ -105,7 +105,7 @@ def create_vector_block(L: typing.List[Form]) -> PETSc.Vec: return _cpp.fem.petsc.create_vector_block(maps) -def create_vector_nest(L: typing.List[Form]) -> PETSc.Vec: +def create_vector_nest(L: list[Form]) -> PETSc.Vec: """Create a PETSc nested vector (``VecNest``) that is compatible with a list of linear forms. Args: @@ -140,7 +140,7 @@ def create_matrix(a: Form, mat_type=None) -> PETSc.Mat: return _cpp.fem.petsc.create_matrix(a._cpp_object, mat_type) -def create_matrix_block(a: typing.List[typing.List[Form]]) -> PETSc.Mat: +def create_matrix_block(a: list[list[Form]]) -> PETSc.Mat: """Create a PETSc matrix that is compatible with a rectangular array of bilinear forms. Args: @@ -155,7 +155,7 @@ def create_matrix_block(a: typing.List[typing.List[Form]]) -> PETSc.Mat: return _cpp.fem.petsc.create_matrix_block(_a) -def create_matrix_nest(a: typing.List[typing.List[Form]]) -> PETSc.Mat: +def create_matrix_nest(a: list[list[Form]]) -> PETSc.Mat: """Create a PETSc matrix (``MatNest``) that is compatible with a rectangular array of bilinear forms. Args: @@ -232,7 +232,7 @@ def assemble_vector_nest(L: typing.Any, constants=None, coeffs=None) -> PETSc.Ve @assemble_vector_nest.register -def _assemble_vector_nest_vec(b: PETSc.Vec, L: typing.List[Form], constants=None, coeffs=None) -> PETSc.Vec: +def _assemble_vector_nest_vec(b: PETSc.Vec, L: list[Form], constants=None, coeffs=None) -> PETSc.Vec: """Assemble linear forms into a nested PETSc (``VecNest``) vector. The vector is not zeroed before assembly and it is not finalised, i.e. ghost values are not accumulated on the owning processes. @@ -248,9 +248,9 @@ def _assemble_vector_nest_vec(b: PETSc.Vec, L: typing.List[Form], constants=None # FIXME: Revise this interface @functools.singledispatch -def assemble_vector_block(L: typing.List[Form], - a: typing.List[typing.List[Form]], - bcs: typing.List[DirichletBC] = [], +def assemble_vector_block(L: list[Form], + a: list[list[Form]], + bcs: list[DirichletBC] = [], x0: typing.Optional[PETSc.Vec] = None, scale: float = 1.0, constants_L=None, coeffs_L=None, @@ -270,9 +270,9 @@ def assemble_vector_block(L: typing.List[Form], @assemble_vector_block.register def _assemble_vector_block_vec(b: PETSc.Vec, - L: typing.List[Form], - a: typing.List[typing.List[Form]], - bcs: typing.List[DirichletBC] = [], + L: list[Form], + a: list[list[Form]], + bcs: list[DirichletBC] = [], x0: typing.Optional[PETSc.Vec] = None, scale: float = 1.0, constants_L=None, coeffs_L=None, @@ -330,7 +330,7 @@ def _assemble_vector_block_vec(b: PETSc.Vec, # -- Matrix assembly --------------------------------------------------------- @functools.singledispatch -def assemble_matrix(a: typing.Any, bcs: typing.List[DirichletBC] = [], +def assemble_matrix(a: typing.Any, bcs: list[DirichletBC] = [], diagonal: float = 1.0, constants=None, coeffs=None): """Assemble bilinear form into a matrix. The returned matrix is not finalised, i.e. ghost values are not accumulated. @@ -357,7 +357,7 @@ def assemble_matrix(a: typing.Any, bcs: typing.List[DirichletBC] = [], @assemble_matrix.register -def assemble_matrix_mat(A: PETSc.Mat, a: Form, bcs: typing.List[DirichletBC] = [], +def assemble_matrix_mat(A: PETSc.Mat, a: Form, bcs: list[DirichletBC] = [], diagonal: float = 1.0, constants=None, coeffs=None) -> PETSc.Mat: """Assemble bilinear form into a matrix. The returned matrix is not finalised, i.e. ghost values are not accumulated. @@ -376,8 +376,8 @@ def assemble_matrix_mat(A: PETSc.Mat, a: Form, bcs: typing.List[DirichletBC] = [ # FIXME: Revise this interface @functools.singledispatch -def assemble_matrix_nest(a: typing.List[typing.List[Form]], - bcs: typing.List[DirichletBC] = [], mat_types=[], +def assemble_matrix_nest(a: list[list[Form]], + bcs: list[DirichletBC] = [], mat_types=[], diagonal: float = 1.0, constants=None, coeffs=None) -> PETSc.Mat: """Create a nested matrix and assembled bilinear forms into the matrix. @@ -402,8 +402,8 @@ def assemble_matrix_nest(a: typing.List[typing.List[Form]], @assemble_matrix_nest.register -def _assemble_matrix_nest_mat(A: PETSc.Mat, a: typing.List[typing.List[Form]], - bcs: typing.List[DirichletBC] = [], diagonal: float = 1.0, +def _assemble_matrix_nest_mat(A: PETSc.Mat, a: list[list[Form]], + bcs: list[DirichletBC] = [], diagonal: float = 1.0, constants=None, coeffs=None) -> PETSc.Mat: """Assemble bilinear forms into a nested matrix @@ -445,8 +445,8 @@ def _assemble_matrix_nest_mat(A: PETSc.Mat, a: typing.List[typing.List[Form]], # FIXME: Revise this interface @functools.singledispatch -def assemble_matrix_block(a: typing.List[typing.List[Form]], - bcs: typing.List[DirichletBC] = [], +def assemble_matrix_block(a: list[list[Form]], + bcs: list[DirichletBC] = [], diagonal: float = 1.0, constants=None, coeffs=None) -> PETSc.Mat: # type: ignore """Assemble bilinear forms into a blocked matrix.""" @@ -456,8 +456,8 @@ def assemble_matrix_block(a: typing.List[typing.List[Form]], @assemble_matrix_block.register -def _assemble_matrix_block_mat(A: PETSc.Mat, a: typing.List[typing.List[Form]], - bcs: typing.List[DirichletBC] = [], diagonal: float = 1.0, +def _assemble_matrix_block_mat(A: PETSc.Mat, a: list[list[Form]], + bcs: list[DirichletBC] = [], diagonal: float = 1.0, constants=None, coeffs=None) -> PETSc.Mat: """Assemble bilinear forms into a blocked matrix.""" constants = [[_pack_constants(form._cpp_object) if form is not None else np.array( @@ -503,9 +503,9 @@ def _assemble_matrix_block_mat(A: PETSc.Mat, a: typing.List[typing.List[Form]], # -- Modifiers for Dirichlet conditions --------------------------------------- -def apply_lifting(b: PETSc.Vec, a: typing.List[Form], - bcs: typing.List[typing.List[DirichletBC]], - x0: typing.List[PETSc.Vec] = [], +def apply_lifting(b: PETSc.Vec, a: list[Form], + bcs: list[list[DirichletBC]], + x0: list[PETSc.Vec] = [], scale: float = 1.0, constants=None, coeffs=None) -> None: """Apply the function :func:`dolfinx.fem.apply_lifting` to a PETSc Vector.""" with contextlib.ExitStack() as stack: @@ -515,8 +515,8 @@ def apply_lifting(b: PETSc.Vec, a: typing.List[Form], _assemble.apply_lifting(b_local.array_w, a, bcs, x0_r, scale, constants, coeffs) -def apply_lifting_nest(b: PETSc.Vec, a: typing.List[typing.List[Form]], - bcs: typing.List[DirichletBC], +def apply_lifting_nest(b: PETSc.Vec, a: list[list[Form]], + bcs: list[DirichletBC], x0: typing.Optional[PETSc.Vec] = None, scale: float = 1.0, constants=None, coeffs=None) -> PETSc.Vec: """Apply the function :func:`dolfinx.fem.apply_lifting` to each sub-vector in a nested PETSc Vector.""" @@ -532,7 +532,7 @@ def apply_lifting_nest(b: PETSc.Vec, a: typing.List[typing.List[Form]], return b -def set_bc(b: PETSc.Vec, bcs: typing.List[DirichletBC], +def set_bc(b: PETSc.Vec, bcs: list[DirichletBC], x0: typing.Optional[PETSc.Vec] = None, scale: float = 1.0) -> None: """Apply the function :func:`dolfinx.fem.set_bc` to a PETSc Vector.""" if x0 is not None: @@ -540,7 +540,7 @@ def set_bc(b: PETSc.Vec, bcs: typing.List[DirichletBC], _assemble.set_bc(b.array_w, bcs, x0, scale) -def set_bc_nest(b: PETSc.Vec, bcs: typing.List[typing.List[DirichletBC]], +def set_bc_nest(b: PETSc.Vec, bcs: list[list[DirichletBC]], x0: typing.Optional[PETSc.Vec] = None, scale: float = 1.0) -> None: """Apply the function :func:`dolfinx.fem.set_bc` to each sub-vector of a nested PETSc Vector.""" _b = b.getNestSubVecs() @@ -557,7 +557,7 @@ class LinearProblem: """ - def __init__(self, a: ufl.Form, L: ufl.Form, bcs: typing.List[DirichletBC] = [], + def __init__(self, a: ufl.Form, L: ufl.Form, bcs: list[DirichletBC] = [], u: typing.Optional[_Function] = None, petsc_options: typing.Optional[dict] = None, form_compiler_options: typing.Optional[dict] = None, @@ -691,7 +691,7 @@ class NonlinearProblem: """ - def __init__(self, F: ufl.form.Form, u: _Function, bcs: typing.List[DirichletBC] = [], + def __init__(self, F: ufl.form.Form, u: _Function, bcs: list[DirichletBC] = [], J: ufl.form.Form = None, form_compiler_options: typing.Optional[dict] = None, jit_options: typing.Optional[dict] = None): """Initialize solver for solving a non-linear problem using Newton's method, :math:`(dF/du)(u) du = -F(u)`. diff --git a/python/dolfinx/geometry.py b/python/dolfinx/geometry.py index f3d185c02e9..138b730218c 100644 --- a/python/dolfinx/geometry.py +++ b/python/dolfinx/geometry.py @@ -176,7 +176,7 @@ def compute_colliding_cells(mesh: Mesh, candidates: AdjacencyList_int32, x: npt. return _cpp.geometry.compute_colliding_cells(mesh._cpp_object, candidates, x) -def squared_distance(mesh: Mesh, dim: int, entities: typing.List[int], points: npt.NDArray[np.floating]): +def squared_distance(mesh: Mesh, dim: int, entities: list[int], points: npt.NDArray[np.floating]): """Compute the squared distance between a point and a mesh entity. The distance is computed between the ith input points and the ith diff --git a/python/dolfinx/io/__init__.py b/python/dolfinx/io/__init__.py index a1917113dc7..e28a666d65e 100644 --- a/python/dolfinx/io/__init__.py +++ b/python/dolfinx/io/__init__.py @@ -6,14 +6,12 @@ """Tools for file input/output (IO).""" from dolfinx import cpp as _cpp -from dolfinx.io import gmshio # noqa: F401 -from dolfinx.io.utils import (VTKFile, XDMFFile, # noqa: F401 - distribute_entity_data) +from dolfinx.io import gmshio +from dolfinx.io.utils import VTKFile, XDMFFile, distribute_entity_data __all__ = ["gmshio", "distribute_entity_data", "VTKFile", "XDMFFile"] if _cpp.common.has_adios2: # FidesWriter and VTXWriter require ADIOS2 - from dolfinx.io.utils import (FidesMeshPolicy, FidesWriter, # noqa: F401 - VTXWriter) + from dolfinx.io.utils import FidesMeshPolicy, FidesWriter, VTXWriter __all__ = __all__ + ["FidesWriter", "VTXWriter", "FidesMeshPolicy"] diff --git a/python/dolfinx/io/utils.py b/python/dolfinx/io/utils.py index abebf14aa61..5af67555600 100644 --- a/python/dolfinx/io/utils.py +++ b/python/dolfinx/io/utils.py @@ -18,8 +18,8 @@ import basix.ufl import ufl from dolfinx import cpp as _cpp -from dolfinx.cpp.io import perm_gmsh as cell_perm_gmsh # noqa F401 -from dolfinx.cpp.io import perm_vtk as cell_perm_vtk # noqa F401 +from dolfinx.cpp.io import perm_gmsh as cell_perm_gmsh # F401 +from dolfinx.cpp.io import perm_vtk as cell_perm_vtk # F401 from dolfinx.fem import Function from dolfinx.mesh import GhostMode, Mesh, MeshTags @@ -37,7 +37,7 @@ def _extract_cpp_functions(functions: typing.Union[typing.List[Function], Functi # FidesWriter and VTXWriter require ADIOS2 if _cpp.common.has_adios2: - from dolfinx.cpp.io import FidesMeshPolicy # noqa F401 + from dolfinx.cpp.io import FidesMeshPolicy # F401 __all__ = __all__ + ["FidesWriter", "VTXWriter", "FidesMeshPolicy"] class VTXWriter: diff --git a/python/dolfinx/mesh.py b/python/dolfinx/mesh.py index f698b7009d7..37e8ab924ec 100644 --- a/python/dolfinx/mesh.py +++ b/python/dolfinx/mesh.py @@ -592,7 +592,7 @@ def create_unit_square(comm: _MPI.Comm, nx: int, ny: int, cell_type=CellType.tri partitioner, diagonal) -def create_box(comm: _MPI.Comm, points: typing.List[npt.ArrayLike], n: list, +def create_box(comm: _MPI.Comm, points: list[npt.ArrayLike], n: list, cell_type=CellType.tetrahedron, dtype: npt.DTypeLike = default_real_type, ghost_mode=GhostMode.shared_facet, partitioner=None) -> Mesh: """Create a box mesh. diff --git a/python/dolfinx/plot.py b/python/dolfinx/plot.py index 7b91db387cc..b0ccbda2f3b 100644 --- a/python/dolfinx/plot.py +++ b/python/dolfinx/plot.py @@ -104,7 +104,7 @@ def _(V: fem.FunctionSpace, entities=None): Topology, type for each cell, and geometry in VTK-ready format. """ - if not (V.ufl_element().family_name in ['Discontinuous Lagrange', "Lagrange", "DQ", "Q", "DP", "P"]): + if V.ufl_element().family_name not in ['Discontinuous Lagrange', "Lagrange", "DQ", "Q", "DP", "P"]: raise RuntimeError("Can only create meshes from continuous or discontinuous Lagrange spaces") degree = V.ufl_element().degree diff --git a/python/dolfinx/utils.py b/python/dolfinx/utils.py index e5a6f91d674..af16805fb53 100644 --- a/python/dolfinx/utils.py +++ b/python/dolfinx/utils.py @@ -69,6 +69,7 @@ def set_vals(A: int, """ try: import petsc4py.PETSc as _PETSc + import llvmlite as _llvmlite import numba as _numba _llvmlite.binding.load_library_permanently(str(get_petsc_lib())) @@ -157,10 +158,11 @@ def set_vals(A: int, ffi.from_buffer(rows(data), mode) """ try: + from petsc4py import PETSc as _PETSc + import cffi as _cffi import numba as _numba import numba.core.typing.cffi_utils as _cffi_support - from petsc4py import PETSc as _PETSc # Register complex types _ffi = _cffi.FFI() diff --git a/python/test/unit/common/test_index_map.py b/python/test/unit/common/test_index_map.py index 120708f21e5..8dc8cbbf921 100644 --- a/python/test/unit/common/test_index_map.py +++ b/python/test/unit/common/test_index_map.py @@ -40,7 +40,7 @@ def test_sub_index_map(): # Build list for each rank of the first (myrank + myrank % 2) local # indices - submap_local_size = [int((rank + rank % 2)) for rank in range(comm.size)] + submap_local_size = [int(rank + rank % 2) for rank in range(comm.size)] local_indices = [np.arange(submap_local_size[rank], dtype=np.int32) for rank in range(comm.size)] # Create sub index map and a map from the ghost position in new map diff --git a/python/test/unit/fem/test_custom_assembler.py b/python/test/unit/fem/test_custom_assembler.py index 6dc38049803..ff1f97e4b00 100644 --- a/python/test/unit/fem/test_custom_assembler.py +++ b/python/test/unit/fem/test_custom_assembler.py @@ -226,7 +226,7 @@ def test_custom_mesh_loop_rank1(dtype): start = time.time() assemble_vector(b, (x_dofs, x), dofmap, num_owned_cells) end = time.time() - print("Time (numba, pass {}): {}".format(i, end - start)) + print(f"Time (numba, pass {i}): {end - start}") b0.x.scatter_reverse(dolfinx.la.InsertMode.add) b0sum = np.sum(b0.x.array[:b0.x.index_map.size_local * b0.x.block_size]) assert mesh.comm.allreduce(b0sum, op=MPI.SUM) == pytest.approx(1.0) @@ -277,7 +277,7 @@ def test_custom_mesh_loop_rank1(dtype): start = time.time() assemble_vector_ufc(b, kernel, (x_dofs, x), dofmap, num_owned_cells, dtype) end = time.time() - print("Time (numba/cffi, pass {}): {}".format(i, end - start)) + print(f"Time (numba/cffi, pass {i}): {end - start}") b3.x.scatter_reverse(dolfinx.la.InsertMode.add) assert np.linalg.norm(b3.x.array - b0.x.array) == pytest.approx(0.0, abs=1e-8) diff --git a/python/test/unit/fem/test_custom_jit_kernels.py b/python/test/unit/fem/test_custom_jit_kernels.py index 27f6e01bd6f..50b037a811b 100644 --- a/python/test/unit/fem/test_custom_jit_kernels.py +++ b/python/test/unit/fem/test_custom_jit_kernels.py @@ -16,12 +16,12 @@ import dolfinx import dolfinx.utils +import ffcx.codegeneration.utils from dolfinx import TimingType from dolfinx import cpp as _cpp from dolfinx import fem, la, list_timings from dolfinx.fem import Form, Function, IntegralType, functionspace from dolfinx.mesh import create_unit_square -import ffcx.codegeneration.utils numba = pytest.importorskip("numba") ufcx_signature = ffcx.codegeneration.utils.numba_ufcx_kernel_signature diff --git a/python/test/unit/fem/test_nonlinear_assembler.py b/python/test/unit/fem/test_nonlinear_assembler.py index 26e11fe6f79..33e3afeca2f 100644 --- a/python/test/unit/fem/test_nonlinear_assembler.py +++ b/python/test/unit/fem/test_nonlinear_assembler.py @@ -182,7 +182,7 @@ def monolithic(): assert bnorm2 == pytest.approx(bnorm0, 1.0e-6) -class NonlinearPDE_SNESProblem(): +class NonlinearPDE_SNESProblem: def __init__(self, F, J, soln_vars, bcs, P=None): self.L = F self.a = J diff --git a/python/test/unit/io/test_vtk.py b/python/test/unit/io/test_vtk.py index da6062f8971..bd08117820d 100644 --- a/python/test/unit/io/test_vtk.py +++ b/python/test/unit/io/test_vtk.py @@ -17,7 +17,7 @@ from dolfinx import default_real_type from dolfinx.fem import Function, functionspace from dolfinx.io import VTKFile -from dolfinx.io.utils import cell_perm_vtk # noqa F401 +from dolfinx.io.utils import cell_perm_vtk # F401 from dolfinx.mesh import (CellType, create_mesh, create_unit_cube, create_unit_interval, create_unit_square) from dolfinx.plot import vtk_mesh diff --git a/python/test/unit/mesh/test_mesh.py b/python/test/unit/mesh/test_mesh.py index 795f0ad2322..1eca68f4e8f 100644 --- a/python/test/unit/mesh/test_mesh.py +++ b/python/test/unit/mesh/test_mesh.py @@ -362,7 +362,7 @@ def xfail_ghosted_quads_hexes(mesh_factory, ghost_mode): Needs implementing.""" if mesh_factory in [create_unit_square, create_unit_cube]: if ghost_mode == GhostMode.shared_vertex: - pytest.xfail(reason="Missing functionality in \'{}\' with \'{}\' mode".format(mesh_factory, ghost_mode)) + pytest.xfail(reason=f"Missing functionality in \'{mesh_factory}\' with \'{ghost_mode}\' mode") @pytest.mark.parametrize("ghost_mode", diff --git a/python/test/unit/mesh/test_mixed_topology.py b/python/test/unit/mesh/test_mixed_topology.py index f9f230708f2..1c00f2edcce 100644 --- a/python/test/unit/mesh/test_mixed_topology.py +++ b/python/test/unit/mesh/test_mixed_topology.py @@ -1,5 +1,6 @@ from mpi4py import MPI -from dolfinx.cpp.mesh import create_topology, CellType + +from dolfinx.cpp.mesh import CellType, create_topology def test_triquad(): From c3427f53128f8267c0c84573be6c8447acd15e61 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 18 Jan 2024 14:47:38 +0100 Subject: [PATCH 05/25] Unsafe fixes. --- python/demo/demo_tnt-elements.py | 4 ++-- python/dolfinx/io/__init__.py | 2 +- python/dolfinx/io/utils.py | 2 +- python/dolfinx/pkgconfig.py | 2 +- python/dolfinx/utils.py | 10 +++++----- python/test/unit/fem/test_special_functions.py | 10 +++++----- python/test/unit/mesh/test_refinement.py | 18 +++++++++--------- 7 files changed, 24 insertions(+), 24 deletions(-) diff --git a/python/demo/demo_tnt-elements.py b/python/demo/demo_tnt-elements.py index dd31603867f..427d1790ec2 100644 --- a/python/demo/demo_tnt-elements.py +++ b/python/demo/demo_tnt-elements.py @@ -23,7 +23,7 @@ from mpi4py import MPI # + -import matplotlib +import matplotlib as mpl import matplotlib.pylab as plt import numpy as np @@ -34,7 +34,7 @@ from ufl import (SpatialCoordinate, TestFunction, TrialFunction, cos, div, dx, grad, inner, sin) -matplotlib.use('agg') +mpl.use('agg') # - # ## Defining a degree 1 TNT element diff --git a/python/dolfinx/io/__init__.py b/python/dolfinx/io/__init__.py index e28a666d65e..88d90108d6a 100644 --- a/python/dolfinx/io/__init__.py +++ b/python/dolfinx/io/__init__.py @@ -14,4 +14,4 @@ if _cpp.common.has_adios2: # FidesWriter and VTXWriter require ADIOS2 from dolfinx.io.utils import FidesMeshPolicy, FidesWriter, VTXWriter - __all__ = __all__ + ["FidesWriter", "VTXWriter", "FidesMeshPolicy"] + __all__ = [*__all__, "FidesWriter", "VTXWriter", "FidesMeshPolicy"] diff --git a/python/dolfinx/io/utils.py b/python/dolfinx/io/utils.py index 5af67555600..f0c4af39d05 100644 --- a/python/dolfinx/io/utils.py +++ b/python/dolfinx/io/utils.py @@ -38,7 +38,7 @@ def _extract_cpp_functions(functions: typing.Union[typing.List[Function], Functi # FidesWriter and VTXWriter require ADIOS2 if _cpp.common.has_adios2: from dolfinx.cpp.io import FidesMeshPolicy # F401 - __all__ = __all__ + ["FidesWriter", "VTXWriter", "FidesMeshPolicy"] + __all__ = [*__all__, "FidesWriter", "VTXWriter", "FidesMeshPolicy"] class VTXWriter: """Writer for VTX files, using ADIOS2 to create the files. diff --git a/python/dolfinx/pkgconfig.py b/python/dolfinx/pkgconfig.py index 7cca48b30d4..32adabe5fc4 100644 --- a/python/dolfinx/pkgconfig.py +++ b/python/dolfinx/pkgconfig.py @@ -16,7 +16,7 @@ def _pkgconfig_query(s): pkg_config_exe = os.environ.get('PKG_CONFIG', None) or 'pkg-config' - cmd = [pkg_config_exe] + s.split() + cmd = [pkg_config_exe, *s.split()] proc = subprocess.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = proc.communicate() diff --git a/python/dolfinx/utils.py b/python/dolfinx/utils.py index af16805fb53..e84b2f5c803 100644 --- a/python/dolfinx/utils.py +++ b/python/dolfinx/utils.py @@ -12,7 +12,7 @@ import os import pathlib -import numpy as _np +import numpy as np __all__ = ["cffi_utils", "numba_utils", "ctypes_utils"] @@ -117,7 +117,7 @@ def set_vals(A: int, # Note: ctypes does not have complex types, hence we use void* for # scalar data - _int = _np.ctypeslib.as_ctypes_type(_PETSc.IntType) # type: ignore + _int = np.ctypeslib.as_ctypes_type(_PETSc.IntType) # type: ignore MatSetValuesLocal = _lib_ctypes.MatSetValuesLocal """See PETSc `MatSetValuesLocal @@ -171,9 +171,9 @@ def set_vals(A: int, _lib_cffi = _ffi.dlopen(str(get_petsc_lib())) - _CTYPES = {_np.int32: "int32_t", _np.int64: "int64_t", - _np.float32: "float", _np.float64: "double", - _np.complex64: "float _Complex", _np.complex128: "double _Complex"} + _CTYPES = {np.int32: "int32_t", np.int64: "int64_t", + np.float32: "float", np.float64: "double", + np.complex64: "float _Complex", np.complex128: "double _Complex"} _c_int_t = _CTYPES[_PETSc.IntType] # type: ignore _c_scalar_t = _CTYPES[_PETSc.ScalarType] # type: ignore _ffi.cdef(f""" diff --git a/python/test/unit/fem/test_special_functions.py b/python/test/unit/fem/test_special_functions.py index 5d8e4949fbd..9838864fe66 100644 --- a/python/test/unit/fem/test_special_functions.py +++ b/python/test/unit/fem/test_special_functions.py @@ -7,7 +7,7 @@ from mpi4py import MPI -import numpy +import numpy as np import pytest import ufl @@ -27,8 +27,8 @@ def test_facet_area1D(): ds = ufl.Measure("ds", domain=mesh) a0 = mesh.comm.allreduce(assemble_scalar(form(c * ds)), op=MPI.SUM) a = mesh.comm.allreduce(assemble_scalar(form(c0 * ds)), op=MPI.SUM) - assert numpy.isclose(a.real, 2) - assert numpy.isclose(a0.real, 2) + assert np.isclose(a.real, 2) + assert np.isclose(a0.real, 2) @pytest.mark.parametrize('mesh_factory', [(create_unit_square, (MPI.COMM_WORLD, 3, 3), 1. / 3), @@ -52,5 +52,5 @@ def test_facet_area(mesh_factory): ds = ufl.Measure("ds", domain=mesh) a = mesh.comm.allreduce(assemble_scalar(form(c * ds)), op=MPI.SUM) a0 = mesh.comm.allreduce(assemble_scalar(form(c0 * ds)), op=MPI.SUM) - assert numpy.isclose(a.real, num_faces) - assert numpy.isclose(a0.real, num_faces * exact_area) + assert np.isclose(a.real, num_faces) + assert np.isclose(a0.real, num_faces * exact_area) diff --git a/python/test/unit/mesh/test_refinement.py b/python/test/unit/mesh/test_refinement.py index 07993422bea..e5f2383f42a 100644 --- a/python/test/unit/mesh/test_refinement.py +++ b/python/test/unit/mesh/test_refinement.py @@ -6,7 +6,7 @@ from mpi4py import MPI -import numpy +import numpy as np import pytest from numpy import isclose, logical_and @@ -133,8 +133,8 @@ def test_refine_facet_meshtag(tdim): for f in range(mesh.topology.index_map(tdim - 1).size_local): if len(f_to_c.links(f)) == 1: facet_indices += [f] - meshtag = meshtags(mesh, tdim - 1, numpy.array(facet_indices, dtype=numpy.int32), - numpy.arange(len(facet_indices), dtype=numpy.int32)) + meshtag = meshtags(mesh, tdim - 1, np.array(facet_indices, dtype=np.int32), + np.arange(len(facet_indices), dtype=np.int32)) fine_mesh, parent_cell, parent_facet = refine_plaza(mesh, False, RefinementOption.parent_cell_and_facet) fine_mesh.topology.create_entities(tdim - 1) @@ -148,9 +148,9 @@ def test_refine_facet_meshtag(tdim): assert len(new_f_to_c.links(f)) == 1 # Now mark all facets (including internal) - facet_indices = numpy.arange(mesh.topology.index_map(tdim - 1).size_local) - meshtag = meshtags(mesh, tdim - 1, numpy.array(facet_indices, dtype=numpy.int32), - numpy.arange(len(facet_indices), dtype=numpy.int32)) + facet_indices = np.arange(mesh.topology.index_map(tdim - 1).size_local) + meshtag = meshtags(mesh, tdim - 1, np.array(facet_indices, dtype=np.int32), + np.arange(len(facet_indices), dtype=np.int32)) new_meshtag = transfer_meshtag(meshtag, fine_mesh, parent_cell, parent_facet) assert len(new_meshtag.indices) == (tdim * 2 - 2) * len(meshtag.indices) @@ -163,9 +163,9 @@ def test_refine_cell_meshtag(tdim): mesh = create_unit_square(MPI.COMM_WORLD, 2, 5, CellType.triangle, ghost_mode=GhostMode.none) mesh.topology.create_entities(1) - cell_indices = numpy.arange(mesh.topology.index_map(tdim).size_local) - meshtag = meshtags(mesh, tdim, numpy.array(cell_indices, dtype=numpy.int32), - numpy.arange(len(cell_indices), dtype=numpy.int32)) + cell_indices = np.arange(mesh.topology.index_map(tdim).size_local) + meshtag = meshtags(mesh, tdim, np.array(cell_indices, dtype=np.int32), + np.arange(len(cell_indices), dtype=np.int32)) fine_mesh, parent_cell, _ = refine_plaza(mesh, False, RefinementOption.parent_cell_and_facet) new_meshtag = transfer_meshtag(meshtag, fine_mesh, parent_cell) From b5b719147401e3425bffc1c3c457b9256e52f9b2 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 18 Jan 2024 14:58:36 +0100 Subject: [PATCH 06/25] Add back in isort. --- .github/workflows/ccpp.yml | 6 ++++-- python/pyproject.toml | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml index 749c2d420db..124b33c96f1 100644 --- a/.github/workflows/ccpp.yml +++ b/.github/workflows/ccpp.yml @@ -60,14 +60,16 @@ jobs: python3 -m pip install git+https://github.com/FEniCS/basix.git@${{ github.event.inputs.basix_ref }} python3 -m pip install git+https://github.com/FEniCS/ffcx.git@${{ github.event.inputs.ffcx_ref }} - - name: ruff C++ .py file checks + - name: ruff and isort C++ .py file checks run: | cd cpp/ ruff check . - - name: ruff Python interface checks + python3 -m isort --check . + - name: ruff and isort Python interface checks run: | cd python/ ruff check . + python3 -m isort --check . - name: mypy checks run: | cd python/ diff --git a/python/pyproject.toml b/python/pyproject.toml index 6c3c952fc1c..12c0306a264 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -33,7 +33,7 @@ dependencies = [ [project.optional-dependencies] docs = ["markdown", "pyyaml", "sphinx", "sphinx_rtd_theme"] -lint = ["flake8", "pydocstyle"] +lint = ["ruff", "isort"] optional = ["numba"] test = ["pytest", "sympy", "scipy", "matplotlib", "fenics-dolfinx[optional]"] ci = [ @@ -80,7 +80,7 @@ select = [ "E", # pycodestyle "W", # pycodestyle "F", # pyflakes - # "I", # isort + # "I", # isort - use standalone isort "RUF", # Ruff-specific rules "UP", # pyupgrade # "ANN", From 0b67404b05256909e07a618fa6c914ee115619ef Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 18 Jan 2024 15:00:50 +0100 Subject: [PATCH 07/25] Add ruff.toml --- cpp/ruff.toml | 1 + 1 file changed, 1 insertion(+) create mode 100644 cpp/ruff.toml diff --git a/cpp/ruff.toml b/cpp/ruff.toml new file mode 100644 index 00000000000..ef2167487e1 --- /dev/null +++ b/cpp/ruff.toml @@ -0,0 +1 @@ +extend = "../python/pyproject.toml" From fb1f579ace5c6b4a4e5b70c91c5c96fefca0d2cc Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 18 Jan 2024 15:06:26 +0100 Subject: [PATCH 08/25] Fix. --- python/dolfinx/geometry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/dolfinx/geometry.py b/python/dolfinx/geometry.py index 138b730218c..4576e1b0bdd 100644 --- a/python/dolfinx/geometry.py +++ b/python/dolfinx/geometry.py @@ -199,7 +199,7 @@ def squared_distance(mesh: Mesh, dim: int, entities: list[int], points: npt.NDAr def compute_distance_gjk(p: npt.NDArray[np.floating], q: npt.NDArray[np.floating]) -> npt.NDArray[np.floating]: """Compute the distance between two convex bodies p and q, each defined by a set of points. - Uses the Gilbert–Johnson–Keerthi (GJK) distance algorithm. + Uses the Gilbert-Johnson-Keerthi (GJK) distance algorithm. Args: p: Body 1 list of points (``shape=(num_points, gdim)``). From 54834fefde4ab344225bfb43a14eded0c7c2a89d Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 18 Jan 2024 15:09:18 +0100 Subject: [PATCH 09/25] Ignore RUF012 --- python/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/pyproject.toml b/python/pyproject.toml index 12c0306a264..a0e2b07e162 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -88,4 +88,4 @@ select = [ # "SIM", # "PL", ] -ignore = ["UP007"] +ignore = ["UP007", "RUF012"] From a32efe5ec49a824782e0d010199ea0cf3aa2a784 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 18 Jan 2024 15:16:11 +0100 Subject: [PATCH 10/25] Fix circleci --- .circleci/config.yml | 9 ++++----- python/pyproject.toml | 1 + 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index dd6a7c9c6cc..f93b0b38214 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -11,13 +11,12 @@ install-python-components: &install-python-components pip3 install git+https://github.com/FEniCS/ufl.git pip3 install git+https://github.com/FEniCS/ffcx.git -flake8-python-code: &flake8-python-code +ruff-isort-python-code: &ruff-isort-python-code name: Flake8 checks on Python code command: | cd python/ - python3 -m flake8 dolfinx - python3 -m flake8 demo - python3 -m flake8 test + ruff check . + isort --check . configure-cpp: &configure-cpp name: Configure (C++) @@ -101,7 +100,7 @@ jobs: steps: - checkout - run: *install-python-components - - run: *flake8-python-code + - run: *ruff-isort-python-code - run: *configure-cpp - run: *build-install-cpp diff --git a/python/pyproject.toml b/python/pyproject.toml index a0e2b07e162..b833e714b79 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -87,5 +87,6 @@ select = [ "ICN", # "SIM", # "PL", + "NPY", ] ignore = ["UP007", "RUF012"] From 231d144c0ffba207c7cf1d4ee5f7088b26394b0b Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 18 Jan 2024 15:20:27 +0100 Subject: [PATCH 11/25] Remove deprecated numpy random call. --- python/demo/demo_cahn-hilliard.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/demo/demo_cahn-hilliard.py b/python/demo/demo_cahn-hilliard.py index 337ec767b0b..bc0903a0aff 100644 --- a/python/demo/demo_cahn-hilliard.py +++ b/python/demo/demo_cahn-hilliard.py @@ -194,7 +194,8 @@ u.x.array[:] = 0.0 # Interpolate initial condition -u.sub(0).interpolate(lambda x: 0.63 + 0.02 * (0.5 - np.random.rand(x.shape[1]))) +rng = np.random.default_rng() +u.sub(0).interpolate(lambda x: 0.63 + 0.02 * (0.5 - rng.random(x.shape[1]))) u.x.scatter_forward() # - From d80318d342d220f6ab63a72dd56e5c78d2bf51ad Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 18 Jan 2024 15:26:55 +0100 Subject: [PATCH 12/25] Add back isort. --- python/pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/python/pyproject.toml b/python/pyproject.toml index b833e714b79..19d22944450 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -68,6 +68,9 @@ warn_unused_ignores = false show_error_codes = true ignore_missing_imports = true +[tool.isort] +line_length = 120 + [tool.ruff] line-length = 120 indent-width = 4 From 30a033da0a090e78b4b75d9ca5f318704c3d8c1f Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 18 Jan 2024 15:31:00 +0100 Subject: [PATCH 13/25] Move Python minimum to 3.9 (discuss). --- python/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/pyproject.toml b/python/pyproject.toml index 19d22944450..d6db28d31a6 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -16,7 +16,7 @@ name = "fenics-dolfinx" version = "0.8.0.dev0" description = "DOLFINx Python interface" readme = "../README.md" -requires-python = ">=3.8.0" +requires-python = ">=3.9.0" license = { file = "../COPYING.LESSER" } authors = [ { email = "fenics-steering-council@googlegroups.com" }, From 3b333401beb354db5fac143fc03e37f1b585ed73 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 18 Jan 2024 15:38:36 +0100 Subject: [PATCH 14/25] More fixes. --- python/demo/demo_lagrange_variants.py | 5 ++--- python/demo/demo_pml/demo_pml.py | 4 ++-- python/demo/demo_pml/efficiencies_pml_demo.py | 3 +-- python/demo/demo_pml/mesh_wire_pml.py | 3 +-- .../analytical_efficiencies_wire.py | 3 +-- .../demo_scattering_boundary_conditions.py | 3 +-- python/dolfinx/io/gmshio.py | 8 ++++---- python/dolfinx/io/utils.py | 10 +++++----- python/dolfinx/jit.py | 2 +- 9 files changed, 18 insertions(+), 23 deletions(-) diff --git a/python/demo/demo_lagrange_variants.py b/python/demo/demo_lagrange_variants.py index 81a9e19e750..f7e375b0430 100644 --- a/python/demo/demo_lagrange_variants.py +++ b/python/demo/demo_lagrange_variants.py @@ -17,7 +17,6 @@ # # We begin this demo by importing the required modules. -import typing from mpi4py import MPI @@ -166,8 +165,8 @@ def saw_tooth(x): uh = fem.Function(V) uh.interpolate(lambda x: saw_tooth(x[0])) if MPI.COMM_WORLD.size == 1: # Skip this plotting in parallel - pts: typing.List[typing.List[float]] = [] - cells: typing.List[int] = [] + pts: list[list[float]] = [] + cells: list[int] = [] for cell in range(10): for i in range(51): pts.append([cell / 10 + i / 50 / 10, 0, 0]) diff --git a/python/demo/demo_pml/demo_pml.py b/python/demo/demo_pml/demo_pml.py index db45e2d787e..48d13343743 100644 --- a/python/demo/demo_pml/demo_pml.py +++ b/python/demo/demo_pml/demo_pml.py @@ -17,7 +17,7 @@ # + import sys from functools import partial -from typing import Tuple, Union +from typing import Union from mpi4py import MPI @@ -354,7 +354,7 @@ def pml_coordinates(x: ufl.indexed.Indexed, alpha: float, k0: complex, l_dom: fl def create_eps_mu(pml: ufl.tensors.ListTensor, eps_bkg: Union[float, ufl.tensors.ListTensor], - mu_bkg: Union[float, ufl.tensors.ListTensor]) -> Tuple[ufl.tensors.ComponentTensor, + mu_bkg: Union[float, ufl.tensors.ListTensor]) -> tuple[ufl.tensors.ComponentTensor, ufl.tensors.ComponentTensor]: J = ufl.grad(pml) diff --git a/python/demo/demo_pml/efficiencies_pml_demo.py b/python/demo/demo_pml/efficiencies_pml_demo.py index 9da52ba4957..54a4337cc0d 100644 --- a/python/demo/demo_pml/efficiencies_pml_demo.py +++ b/python/demo/demo_pml/efficiencies_pml_demo.py @@ -64,7 +64,6 @@ # & q_{\mathrm{abs}} = q_{\mathrm{ext}} - q_{\mathrm{sca}} # $$ -from typing import Tuple import numpy as np from scipy.special import h2vp, hankel2, jv, jvp @@ -107,7 +106,7 @@ def compute_a(nu: int, m: complex, alpha: float) -> float: def calculate_analytical_efficiencies(eps: complex, n_bkg: float, wl0: float, radius_wire: float, - num_n: int = 50) -> Tuple[float, float, float]: + num_n: int = 50) -> tuple[float, float, float]: m = np.sqrt(np.conj(eps)) / n_bkg alpha = 2 * np.pi * radius_wire / wl0 * n_bkg c = 2 / alpha diff --git a/python/demo/demo_pml/mesh_wire_pml.py b/python/demo/demo_pml/mesh_wire_pml.py index f55b96112ee..903eac582d0 100644 --- a/python/demo/demo_pml/mesh_wire_pml.py +++ b/python/demo/demo_pml/mesh_wire_pml.py @@ -30,7 +30,6 @@ import sys from functools import reduce -from typing import List import numpy.typing @@ -117,7 +116,7 @@ def generate_mesh_wire(radius_wire: float, radius_scatt: float, l_dom: float, l_ gmsh.model.addPhysicalGroup(dim, y_group, tag=pml_tag + 2) # Marker interior surface in bkg group - boundaries: List[numpy.typing.NDArray[numpy.int32]] = [] + boundaries: list[numpy.typing.NDArray[numpy.int32]] = [] for tag in bkg_group: boundary_pairs = gmsh.model.get_boundary([(dim, tag)], oriented=False) boundaries.append(numpy.asarray([pair[1] for pair in boundary_pairs], dtype=numpy.int32)) diff --git a/python/demo/demo_scattering_boundary_conditions/analytical_efficiencies_wire.py b/python/demo/demo_scattering_boundary_conditions/analytical_efficiencies_wire.py index 8a91b18e442..d6b60a798f7 100644 --- a/python/demo/demo_scattering_boundary_conditions/analytical_efficiencies_wire.py +++ b/python/demo/demo_scattering_boundary_conditions/analytical_efficiencies_wire.py @@ -64,7 +64,6 @@ # & q_{\mathrm{abs}} = q_{\mathrm{ext}} - q_{\mathrm{sca}} # $$ -from typing import Tuple import numpy as np from scipy.special import h2vp, hankel2, jv, jvp @@ -106,7 +105,7 @@ def compute_a(nu: int, m: complex, alpha: float) -> float: def calculate_analytical_efficiencies(eps: complex, n_bkg: float, wl0: float, radius_wire: float, - num_n: int = 50) -> Tuple[float, float, float]: + num_n: int = 50) -> tuple[float, float, float]: m = np.sqrt(np.conj(eps)) / n_bkg alpha = 2 * np.pi * radius_wire / wl0 * n_bkg c = 2 / alpha diff --git a/python/demo/demo_scattering_boundary_conditions/demo_scattering_boundary_conditions.py b/python/demo/demo_scattering_boundary_conditions/demo_scattering_boundary_conditions.py index d75655db4c0..98513d72fcd 100644 --- a/python/demo/demo_scattering_boundary_conditions/demo_scattering_boundary_conditions.py +++ b/python/demo/demo_scattering_boundary_conditions/demo_scattering_boundary_conditions.py @@ -31,7 +31,6 @@ # + import sys -from typing import Tuple from mpi4py import MPI @@ -115,7 +114,7 @@ def __init__(self, theta: float, n_bkg: float, k0: complex): self.k0 = k0 # vacuum wavevector self.n_bkg = n_bkg # background refractive index - def eval(self, x: np.typing.NDArray[np.float64]) -> Tuple[np.typing.NDArray[np.complex128], + def eval(self, x: np.typing.NDArray[np.float64]) -> tuple[np.typing.NDArray[np.complex128], np.typing.NDArray[np.complex128]]: kx = self.n_bkg * self.k0 * np.cos(self.theta) ky = self.n_bkg * self.k0 * np.sin(self.theta) diff --git a/python/dolfinx/io/gmshio.py b/python/dolfinx/io/gmshio.py index e54983f0886..371a7ffc1ba 100644 --- a/python/dolfinx/io/gmshio.py +++ b/python/dolfinx/io/gmshio.py @@ -64,7 +64,7 @@ def ufl_mesh(gmsh_cell: int, gdim: int, dtype: npt.DTypeLike) -> ufl.Mesh: return ufl.Mesh(element) -def cell_perm_array(cell_type: CellType, num_nodes: int) -> typing.List[int]: +def cell_perm_array(cell_type: CellType, num_nodes: int) -> list[int]: """The permutation array for permuting Gmsh ordering to DOLFINx ordering. Args: @@ -104,7 +104,7 @@ def extract_topology_and_markers(model, name: typing.Optional[str] = None): # Get the physical groups from gmsh in the form [(dim1, tag1), # (dim1, tag2), (dim2, tag3),...] phys_grps = model.getPhysicalGroups() - topologies: typing.Dict[int, typing.Dict[str, npt.NDArray[typing.Any]]] = {} + topologies: dict[int, dict[str, npt.NDArray[typing.Any]]] = {} for dim, tag in phys_grps: # Get the entities of dimension `dim`, dim=0 -> Points, dim=1 - # >Lines, dim=2 -> Triangles/Quadrilaterals, etc. @@ -180,7 +180,7 @@ def extract_geometry(model, name: typing.Optional[str] = None) -> npt.NDArray[np def model_to_mesh(model, comm: _MPI.Comm, rank: int, gdim: int = 3, partitioner: typing.Optional[typing.Callable[ [_MPI.Comm, int, int, AdjacencyList_int32], AdjacencyList_int32]] = None, - dtype=default_real_type) -> typing.Tuple[ + dtype=default_real_type) -> tuple[ Mesh, _cpp.mesh.MeshTags_int32, _cpp.mesh.MeshTags_int32]: """Create a Mesh from a Gmsh model. @@ -299,7 +299,7 @@ def model_to_mesh(model, comm: _MPI.Comm, rank: int, gdim: int = 3, def read_from_msh(filename: str, comm: _MPI.Comm, rank: int = 0, gdim: int = 3, partitioner: typing.Optional[typing.Callable[ - [_MPI.Comm, int, int, AdjacencyList_int32], AdjacencyList_int32]] = None) -> typing.Tuple[ + [_MPI.Comm, int, int, AdjacencyList_int32], AdjacencyList_int32]] = None) -> tuple[ Mesh, _cpp.mesh.MeshTags_int32, _cpp.mesh.MeshTags_int32]: """Read a Gmsh .msh file and return a distributed :class:`dolfinx.mesh.Mesh` and and cell facet markers. diff --git a/python/dolfinx/io/utils.py b/python/dolfinx/io/utils.py index f0c4af39d05..664b571ebc8 100644 --- a/python/dolfinx/io/utils.py +++ b/python/dolfinx/io/utils.py @@ -27,7 +27,7 @@ "distribute_entity_data"] -def _extract_cpp_functions(functions: typing.Union[typing.List[Function], Function]): +def _extract_cpp_functions(functions: typing.Union[list[Function], Function]): """Extract C++ object for a single function or a list of functions""" if isinstance(functions, (list, tuple)): return [getattr(u, "_cpp_object", u) for u in functions] @@ -53,7 +53,7 @@ class VTXWriter: _cpp_object: typing.Union[_cpp.io.VTXWriter_float32, _cpp.io.VTXWriter_float64] def __init__(self, comm: _MPI.Comm, filename: typing.Union[str, Path], - output: typing.Union[Mesh, Function, typing.List[Function]], + output: typing.Union[Mesh, Function, list[Function]], engine: str = "BPFile"): """Initialize a writer for outputting data in the VTX format. @@ -118,7 +118,7 @@ class FidesWriter: _cpp_object: typing.Union[_cpp.io.FidesWriter_float32, _cpp.io.FidesWriter_float64] def __init__(self, comm: _MPI.Comm, filename: typing.Union[str, Path], - output: typing.Union[Mesh, typing.List[Function], Function], + output: typing.Union[Mesh, list[Function], Function], engine: str = "BPFile", mesh_policy: FidesMeshPolicy = FidesMeshPolicy.update): """Initialize a writer for outputting a mesh, a single Lagrange function or list of Lagrange functions sharing the same @@ -189,7 +189,7 @@ def write_mesh(self, mesh: Mesh, t: float = 0.0) -> None: """Write mesh to file for a given time (default 0.0)""" self.write(mesh._cpp_object, t) - def write_function(self, u: typing.Union[typing.List[Function], Function], t: float = 0.0) -> None: + def write_function(self, u: typing.Union[list[Function], Function], t: float = 0.0) -> None: """Write a single function or a list of functions to file for a given time (default 0.0)""" super().write(_extract_cpp_functions(u), t) @@ -249,6 +249,6 @@ def read_meshtags(self, mesh, name, xpath="/Xdmf/Domain"): def distribute_entity_data(mesh: Mesh, entity_dim: int, entities: npt.NDArray[np.int64], - values: npt.NDArray[np.int32]) -> typing.Tuple[npt.NDArray[np.int64], + values: npt.NDArray[np.int32]) -> tuple[npt.NDArray[np.int64], npt.NDArray[np.int32]]: return _cpp.io.distribute_entity_data(mesh._cpp_object, entity_dim, entities, values) diff --git a/python/dolfinx/jit.py b/python/dolfinx/jit.py index 0e65eb602fc..f36b73f2ef9 100644 --- a/python/dolfinx/jit.py +++ b/python/dolfinx/jit.py @@ -96,7 +96,7 @@ def mpi_jit(comm, *args, **kwargs): return mpi_jit -@functools.lru_cache(maxsize=None) +@functools.cache def _load_options(): """Loads options from JSON files.""" user_config_file = os.getenv("XDG_CONFIG_HOME", default=Path.home().joinpath(".config")) \ From 081d67049ad9269ae32b492015ef0b4f382cfeb6 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Sun, 21 Jan 2024 21:18:06 +0100 Subject: [PATCH 15/25] ruff fix. --- python/demo/demo_lagrange_variants.py | 5 ++--- python/dolfinx/utils.py | 12 ++++++------ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/python/demo/demo_lagrange_variants.py b/python/demo/demo_lagrange_variants.py index 81a9e19e750..f7e375b0430 100644 --- a/python/demo/demo_lagrange_variants.py +++ b/python/demo/demo_lagrange_variants.py @@ -17,7 +17,6 @@ # # We begin this demo by importing the required modules. -import typing from mpi4py import MPI @@ -166,8 +165,8 @@ def saw_tooth(x): uh = fem.Function(V) uh.interpolate(lambda x: saw_tooth(x[0])) if MPI.COMM_WORLD.size == 1: # Skip this plotting in parallel - pts: typing.List[typing.List[float]] = [] - cells: typing.List[int] = [] + pts: list[list[float]] = [] + cells: list[int] = [] for cell in range(10): for i in range(51): pts.append([cell / 10 + i / 50 / 10, 0, 0]) diff --git a/python/dolfinx/utils.py b/python/dolfinx/utils.py index a1928f5555e..445d5c4b4d6 100644 --- a/python/dolfinx/utils.py +++ b/python/dolfinx/utils.py @@ -12,7 +12,7 @@ import os import pathlib -import numpy as _np +import numpy as np __all__ = ["cffi_utils", "numba_utils", "ctypes_utils"] @@ -117,7 +117,7 @@ def set_vals(A: int, # Note: ctypes does not have complex types, hence we use void* for # scalar data - _int = _np.ctypeslib.as_ctypes_type(_PETSc.IntType) # type: ignore + _int = np.ctypeslib.as_ctypes_type(_PETSc.IntType) # type: ignore MatSetValuesLocal = _lib_ctypes.MatSetValuesLocal """See PETSc `MatSetValuesLocal @@ -171,10 +171,10 @@ def set_vals(A: int, _lib_cffi = _ffi.dlopen(str(get_petsc_lib())) - _CTYPES = {_np.int32: "int32_t", _np.int64: "int64_t", - _np.float32: "float", _np.float64: "double", - _np.complex64: "float _Complex", _np.complex128: "double _Complex", - _np.longlong: "long long"} + _CTYPES = {np.int32: "int32_t", np.int64: "int64_t", + np.float32: "float", np.float64: "double", + np.complex64: "float _Complex", np.complex128: "double _Complex", + np.longlong: "long long"} _c_int_t = _CTYPES[_PETSc.IntType] # type: ignore _c_scalar_t = _CTYPES[_PETSc.ScalarType] # type: ignore _ffi.cdef(f""" From f7f6896458e5d913d1763b4c316fe2c3aa9a6b01 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Sun, 21 Jan 2024 22:43:50 +0100 Subject: [PATCH 16/25] Fix isort configuration and re-isort. --- python/.isort.cfg | 6 ------ python/demo/demo_biharmonic.py | 3 +-- python/demo/demo_elasticity.py | 9 +++----- python/demo/demo_mixed-poisson.py | 3 +-- python/demo/demo_navier-stokes.py | 4 ++-- python/demo/demo_pyvista.py | 3 +-- python/demo/demo_static-condensation.py | 9 +++----- python/demo/demo_stokes.py | 3 +-- python/demo/demo_tnt-elements.py | 3 +-- .../demo_half_loaded_waveguide.py | 3 +-- python/dolfinx/__init__.py | 6 ++---- python/dolfinx/common.py | 3 +-- python/dolfinx/fem/__init__.py | 17 ++++++--------- python/dolfinx/io/gmshio.py | 3 +-- python/dolfinx/log.py | 3 +-- python/dolfinx/mesh.py | 6 ++---- python/pyproject.toml | 5 +++++ python/test/unit/fem/test_assemble_domains.py | 6 ++---- python/test/unit/fem/test_assemble_submesh.py | 3 +-- python/test/unit/fem/test_assembler.py | 21 +++++++------------ python/test/unit/fem/test_bcs.py | 11 ++++------ .../unit/fem/test_custom_basix_element.py | 12 ++++------- .../test/unit/fem/test_custom_jit_kernels.py | 3 +-- .../test/unit/fem/test_discrete_operators.py | 3 +-- python/test/unit/fem/test_dofmap.py | 3 +-- .../test/unit/fem/test_element_integrals.py | 3 +-- python/test/unit/fem/test_fem_pipeline.py | 13 +++++------- python/test/unit/fem/test_function.py | 3 +-- python/test/unit/fem/test_interpolation.py | 9 +++----- python/test/unit/fem/test_mixed_element.py | 3 +-- .../test/unit/fem/test_nonlinear_assembler.py | 18 ++++++---------- .../unit/fem/test_petsc_discrete_operators.py | 6 ++---- .../test/unit/fem/test_special_functions.py | 3 +-- .../unit/geometry/test_bounding_box_tree.py | 13 ++++-------- python/test/unit/io/test_adios2.py | 3 +-- python/test/unit/io/test_vtk.py | 3 +-- python/test/unit/io/test_xdmf_function.py | 3 +-- python/test/unit/io/test_xdmf_mesh.py | 3 +-- python/test/unit/io/test_xdmf_meshdata.py | 3 +-- python/test/unit/la/test_krylov_solver.py | 9 +++----- python/test/unit/la/test_nullspace.py | 3 +-- python/test/unit/mesh/test_face.py | 3 +-- python/test/unit/mesh/test_ghost_mesh.py | 3 +-- python/test/unit/mesh/test_mesh.py | 11 ++++------ .../test/unit/mesh/test_mesh_partitioners.py | 3 +-- python/test/unit/mesh/test_meshtags.py | 3 +-- python/test/unit/mesh/test_refinement.py | 8 +++---- python/test/unit/nls/test_newton.py | 6 ++---- 48 files changed, 99 insertions(+), 187 deletions(-) delete mode 100644 python/.isort.cfg diff --git a/python/.isort.cfg b/python/.isort.cfg deleted file mode 100644 index 75da09b67dc..00000000000 --- a/python/.isort.cfg +++ /dev/null @@ -1,6 +0,0 @@ -[settings] -src_paths = demo,dolfinx,test -known_first_party = basix,dolfinx,ffcx,ufl -known_third_party = gmsh,numba,numpy,pytest,pyvista -known_mpi = mpi4py,petsc4py -sections=FUTURE,STDLIB,MPI,THIRDPARTY,FIRSTPARTY,LOCALFOLDER diff --git a/python/demo/demo_biharmonic.py b/python/demo/demo_biharmonic.py index 927ba5d64de..56381283bab 100644 --- a/python/demo/demo_biharmonic.py +++ b/python/demo/demo_biharmonic.py @@ -118,8 +118,7 @@ from dolfinx import fem, io, mesh, plot from dolfinx.fem.petsc import LinearProblem from dolfinx.mesh import CellType, GhostMode -from ufl import (CellDiameter, FacetNormal, avg, div, dS, dx, grad, inner, - jump, pi, sin) +from ufl import CellDiameter, FacetNormal, avg, div, dS, dx, grad, inner, jump, pi, sin # - diff --git a/python/demo/demo_elasticity.py b/python/demo/demo_elasticity.py index c0a5699c64e..3376b81bf53 100644 --- a/python/demo/demo_elasticity.py +++ b/python/demo/demo_elasticity.py @@ -31,13 +31,10 @@ import dolfinx import ufl from dolfinx import la -from dolfinx.fem import (Expression, Function, FunctionSpace, dirichletbc, - form, functionspace, locate_dofs_topological) -from dolfinx.fem.petsc import (apply_lifting, assemble_matrix, assemble_vector, - set_bc) +from dolfinx.fem import Expression, Function, FunctionSpace, dirichletbc, form, functionspace, locate_dofs_topological +from dolfinx.fem.petsc import apply_lifting, assemble_matrix, assemble_vector, set_bc from dolfinx.io import XDMFFile -from dolfinx.mesh import (CellType, GhostMode, create_box, - locate_entities_boundary) +from dolfinx.mesh import CellType, GhostMode, create_box, locate_entities_boundary from ufl import dx, grad, inner dtype = PETSc.ScalarType # type: ignore diff --git a/python/demo/demo_mixed-poisson.py b/python/demo/demo_mixed-poisson.py index f05e656f5d6..176ba056ee0 100644 --- a/python/demo/demo_mixed-poisson.py +++ b/python/demo/demo_mixed-poisson.py @@ -92,8 +92,7 @@ from basix.ufl import element, mixed_element from dolfinx import fem, io, mesh from dolfinx.fem.petsc import LinearProblem -from ufl import (Measure, SpatialCoordinate, TestFunctions, TrialFunctions, - div, exp, inner) +from ufl import Measure, SpatialCoordinate, TestFunctions, TrialFunctions, div, exp, inner msh = mesh.create_unit_square(MPI.COMM_WORLD, 32, 32, mesh.CellType.quadrilateral) diff --git a/python/demo/demo_navier-stokes.py b/python/demo/demo_navier-stokes.py index 81f5bc0e299..47ee34b0b1f 100644 --- a/python/demo/demo_navier-stokes.py +++ b/python/demo/demo_navier-stokes.py @@ -163,8 +163,8 @@ from dolfinx import default_real_type, fem, io, mesh from dolfinx.fem.petsc import assemble_matrix_block, assemble_vector_block -from ufl import (CellDiameter, FacetNormal, TestFunction, TrialFunction, avg, - conditional, div, dot, dS, ds, dx, grad, gt, inner, outer) +from ufl import (CellDiameter, FacetNormal, TestFunction, TrialFunction, avg, conditional, div, dot, dS, ds, dx, grad, + gt, inner, outer) if np.issubdtype(PETSc.ScalarType, np.complexfloating): # type: ignore print("Demo should only be executed with DOLFINx real mode") diff --git a/python/demo/demo_pyvista.py b/python/demo/demo_pyvista.py index 620c8395685..c286150d09c 100644 --- a/python/demo/demo_pyvista.py +++ b/python/demo/demo_pyvista.py @@ -29,8 +29,7 @@ import dolfinx.plot as plot from dolfinx.fem import Function, functionspace -from dolfinx.mesh import (CellType, compute_midpoints, create_unit_cube, - create_unit_square, meshtags) +from dolfinx.mesh import CellType, compute_midpoints, create_unit_cube, create_unit_square, meshtags try: import pyvista diff --git a/python/demo/demo_static-condensation.py b/python/demo/demo_static-condensation.py index 2ef2ce49b34..0f0e9573081 100644 --- a/python/demo/demo_static-condensation.py +++ b/python/demo/demo_static-condensation.py @@ -33,16 +33,13 @@ import ufl from basix.ufl import element from dolfinx import geometry -from dolfinx.fem import (Form, Function, IntegralType, dirichletbc, form, - form_cpp_class, functionspace, +from dolfinx.fem import (Form, Function, IntegralType, dirichletbc, form, form_cpp_class, functionspace, locate_dofs_topological) -from dolfinx.fem.petsc import (apply_lifting, assemble_matrix, assemble_vector, - set_bc) +from dolfinx.fem.petsc import apply_lifting, assemble_matrix, assemble_vector, set_bc from dolfinx.io import XDMFFile from dolfinx.jit import ffcx_jit from dolfinx.mesh import locate_entities_boundary, meshtags -from ffcx.codegeneration.utils import \ - numba_ufcx_kernel_signature as ufcx_signature +from ffcx.codegeneration.utils import numba_ufcx_kernel_signature as ufcx_signature if PETSc.RealType == np.float32: # type: ignore print("float32 not yet supported for this demo.") diff --git a/python/demo/demo_stokes.py b/python/demo/demo_stokes.py index 3d26d496256..21f4f0f2786 100644 --- a/python/demo/demo_stokes.py +++ b/python/demo/demo_stokes.py @@ -90,8 +90,7 @@ import ufl from basix.ufl import element, mixed_element from dolfinx import fem, la -from dolfinx.fem import (Constant, Function, dirichletbc, - extract_function_spaces, form, functionspace, +from dolfinx.fem import (Constant, Function, dirichletbc, extract_function_spaces, form, functionspace, locate_dofs_topological) from dolfinx.fem.petsc import assemble_matrix_block, assemble_vector_block from dolfinx.io import XDMFFile diff --git a/python/demo/demo_tnt-elements.py b/python/demo/demo_tnt-elements.py index 427d1790ec2..20f0ab2d602 100644 --- a/python/demo/demo_tnt-elements.py +++ b/python/demo/demo_tnt-elements.py @@ -31,8 +31,7 @@ import basix.ufl from dolfinx import fem, mesh from dolfinx.fem.petsc import LinearProblem -from ufl import (SpatialCoordinate, TestFunction, TrialFunction, cos, div, dx, - grad, inner, sin) +from ufl import SpatialCoordinate, TestFunction, TrialFunction, cos, div, dx, grad, inner, sin mpl.use('agg') # - diff --git a/python/demo/demo_waveguide/demo_half_loaded_waveguide.py b/python/demo/demo_waveguide/demo_half_loaded_waveguide.py index 50f9a3bf340..f3321214760 100644 --- a/python/demo/demo_waveguide/demo_half_loaded_waveguide.py +++ b/python/demo/demo_waveguide/demo_half_loaded_waveguide.py @@ -50,8 +50,7 @@ from basix.ufl import element, mixed_element from dolfinx import default_scalar_type, fem, io, plot from dolfinx.fem.petsc import assemble_matrix -from dolfinx.mesh import (CellType, create_rectangle, exterior_facet_indices, - locate_entities) +from dolfinx.mesh import CellType, create_rectangle, exterior_facet_indices, locate_entities try: import pyvista diff --git a/python/dolfinx/__init__.py b/python/dolfinx/__init__.py index 8e789acb561..e18d68ad761 100644 --- a/python/dolfinx/__init__.py +++ b/python/dolfinx/__init__.py @@ -20,11 +20,9 @@ from dolfinx import common from dolfinx import cpp as _cpp -from dolfinx import (fem, geometry, graph, io, jit, la, log, mesh, nls, plot, - utils) +from dolfinx import fem, geometry, graph, io, jit, la, log, mesh, nls, plot, utils # Initialise logging -from dolfinx.common import (TimingType, git_commit_hash, has_debug, has_kahip, - has_parmetis, list_timings, timing) +from dolfinx.common import TimingType, git_commit_hash, has_debug, has_kahip, has_parmetis, list_timings, timing from dolfinx.cpp import __version__ _cpp.common.init_logging(sys.argv) diff --git a/python/dolfinx/common.py b/python/dolfinx/common.py index 24c5136723c..5ef1f82a93e 100644 --- a/python/dolfinx/common.py +++ b/python/dolfinx/common.py @@ -9,8 +9,7 @@ import typing from dolfinx import cpp as _cpp -from dolfinx.cpp.common import (IndexMap, git_commit_hash, has_adios2, # noqa - has_debug, has_kahip, has_parmetis) +from dolfinx.cpp.common import IndexMap, git_commit_hash, has_adios2, has_debug, has_kahip, has_parmetis # noqa __all__ = ["IndexMap", "Timer", "timed"] diff --git a/python/dolfinx/fem/__init__.py b/python/dolfinx/fem/__init__.py index 6abf5071f2c..5023155310c 100644 --- a/python/dolfinx/fem/__init__.py +++ b/python/dolfinx/fem/__init__.py @@ -5,21 +5,16 @@ # SPDX-License-Identifier: LGPL-3.0-or-later """Tools for assembling and manipulating finite element forms.""" -from dolfinx.cpp.fem import (IntegralType, - create_nonmatching_meshes_interpolation_data) +from dolfinx.cpp.fem import IntegralType, create_nonmatching_meshes_interpolation_data from dolfinx.cpp.fem import create_sparsity_pattern as _create_sparsity_pattern from dolfinx.cpp.fem import transpose_dofmap -from dolfinx.fem.assemble import (apply_lifting, assemble_matrix, - assemble_scalar, assemble_vector, - create_matrix, create_vector, set_bc) -from dolfinx.fem.bcs import (DirichletBC, bcs_by_block, dirichletbc, - locate_dofs_geometrical, locate_dofs_topological) +from dolfinx.fem.assemble import (apply_lifting, assemble_matrix, assemble_scalar, assemble_vector, create_matrix, + create_vector, set_bc) +from dolfinx.fem.bcs import DirichletBC, bcs_by_block, dirichletbc, locate_dofs_geometrical, locate_dofs_topological from dolfinx.fem.dofmap import DofMap from dolfinx.fem.element import CoordinateElement, coordinate_element -from dolfinx.fem.forms import (Form, extract_function_spaces, form, - form_cpp_class) -from dolfinx.fem.function import (Constant, ElementMetaData, Expression, - Function, FunctionSpace, functionspace) +from dolfinx.fem.forms import Form, extract_function_spaces, form, form_cpp_class +from dolfinx.fem.function import Constant, ElementMetaData, Expression, Function, FunctionSpace, functionspace def create_sparsity_pattern(a: Form): diff --git a/python/dolfinx/io/gmshio.py b/python/dolfinx/io/gmshio.py index 371a7ffc1ba..19d4cf1e40c 100644 --- a/python/dolfinx/io/gmshio.py +++ b/python/dolfinx/io/gmshio.py @@ -18,8 +18,7 @@ from dolfinx import cpp as _cpp from dolfinx import default_real_type from dolfinx.cpp.graph import AdjacencyList_int32 -from dolfinx.mesh import (CellType, Mesh, create_mesh, meshtags, - meshtags_from_entities) +from dolfinx.mesh import CellType, Mesh, create_mesh, meshtags, meshtags_from_entities __all__ = ["cell_perm_array", "ufl_mesh", "extract_topology_and_markers", "extract_geometry", "model_to_mesh", "read_from_msh"] diff --git a/python/dolfinx/log.py b/python/dolfinx/log.py index 7c84ad8f6fd..45486eab71f 100644 --- a/python/dolfinx/log.py +++ b/python/dolfinx/log.py @@ -7,5 +7,4 @@ """Logging module.""" # Import nanobind wrapped code intp dolfinx.log -from dolfinx.cpp.log import (LogLevel, get_log_level, log, # noqa - set_log_level, set_output_file) +from dolfinx.cpp.log import LogLevel, get_log_level, log, set_log_level, set_output_file # noqa diff --git a/python/dolfinx/mesh.py b/python/dolfinx/mesh.py index 37e8ab924ec..2c303b3fdc3 100644 --- a/python/dolfinx/mesh.py +++ b/python/dolfinx/mesh.py @@ -19,10 +19,8 @@ import ufl from dolfinx import cpp as _cpp from dolfinx import default_real_type -from dolfinx.cpp.mesh import (CellType, DiagonalType, GhostMode, - build_dual_graph, cell_dim, - create_cell_partitioner, exterior_facet_indices, - to_string, to_type) +from dolfinx.cpp.mesh import (CellType, DiagonalType, GhostMode, build_dual_graph, cell_dim, create_cell_partitioner, + exterior_facet_indices, to_string, to_type) from dolfinx.cpp.refinement import RefinementOption from dolfinx.fem import CoordinateElement as _CoordinateElement from dolfinx.fem import coordinate_element as _coordinate_element diff --git a/python/pyproject.toml b/python/pyproject.toml index d6db28d31a6..e941132df15 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -70,6 +70,11 @@ ignore_missing_imports = true [tool.isort] line_length = 120 +src_paths = ["demo", "dolfinx" , "test"] +known_first_party = ["basix", "dolfinx", "ffcx", "ufl"] +known_third_party = ["gmsh", "numba", "numpy", "pytest", "pyvista"] +known_mpi = ["mpi4py", "petsc4py"] +sections= ["FUTURE", "STDLIB", "MPI", "THIRDPARTY", "FIRSTPARTY", "LOCALFOLDER"] [tool.ruff] line-length = 120 diff --git a/python/test/unit/fem/test_assemble_domains.py b/python/test/unit/fem/test_assemble_domains.py index 7388044246b..0140b6353d7 100644 --- a/python/test/unit/fem/test_assemble_domains.py +++ b/python/test/unit/fem/test_assemble_domains.py @@ -13,10 +13,8 @@ import ufl from dolfinx import cpp as _cpp from dolfinx import default_scalar_type, fem, la -from dolfinx.fem import (Constant, Function, assemble_scalar, dirichletbc, - form, functionspace) -from dolfinx.mesh import (GhostMode, Mesh, create_unit_square, locate_entities, - locate_entities_boundary, meshtags, +from dolfinx.fem import Constant, Function, assemble_scalar, dirichletbc, form, functionspace +from dolfinx.mesh import (GhostMode, Mesh, create_unit_square, locate_entities, locate_entities_boundary, meshtags, meshtags_from_entities) diff --git a/python/test/unit/fem/test_assemble_submesh.py b/python/test/unit/fem/test_assemble_submesh.py index 939056d4b59..91681b8fd4a 100644 --- a/python/test/unit/fem/test_assemble_submesh.py +++ b/python/test/unit/fem/test_assemble_submesh.py @@ -13,8 +13,7 @@ import ufl from dolfinx import default_scalar_type, fem, la -from dolfinx.mesh import (GhostMode, create_box, create_rectangle, - create_submesh, create_unit_cube, create_unit_square, +from dolfinx.mesh import (GhostMode, create_box, create_rectangle, create_submesh, create_unit_cube, create_unit_square, locate_entities, locate_entities_boundary) diff --git a/python/test/unit/fem/test_assembler.py b/python/test/unit/fem/test_assembler.py index 6c8efdd9d67..0fc5a9e7e8c 100644 --- a/python/test/unit/fem/test_assembler.py +++ b/python/test/unit/fem/test_assembler.py @@ -19,26 +19,19 @@ from basix.ufl import element, mixed_element from dolfinx import cpp as _cpp from dolfinx import default_real_type, fem, graph, la -from dolfinx.fem import (Constant, Function, assemble_scalar, bcs_by_block, - dirichletbc, extract_function_spaces, form, - functionspace, locate_dofs_geometrical, - locate_dofs_topological) +from dolfinx.fem import (Constant, Function, assemble_scalar, bcs_by_block, dirichletbc, extract_function_spaces, form, + functionspace, locate_dofs_geometrical, locate_dofs_topological) from dolfinx.fem.petsc import apply_lifting as petsc_apply_lifting from dolfinx.fem.petsc import apply_lifting_nest as petsc_apply_lifting_nest from dolfinx.fem.petsc import assemble_matrix as petsc_assemble_matrix -from dolfinx.fem.petsc import \ - assemble_matrix_block as petsc_assemble_matrix_block -from dolfinx.fem.petsc import \ - assemble_matrix_nest as petsc_assemble_matrix_nest +from dolfinx.fem.petsc import assemble_matrix_block as petsc_assemble_matrix_block +from dolfinx.fem.petsc import assemble_matrix_nest as petsc_assemble_matrix_nest from dolfinx.fem.petsc import assemble_vector as petsc_assemble_vector -from dolfinx.fem.petsc import \ - assemble_vector_block as petsc_assemble_vector_block -from dolfinx.fem.petsc import \ - assemble_vector_nest as petsc_assemble_vector_nest +from dolfinx.fem.petsc import assemble_vector_block as petsc_assemble_vector_block +from dolfinx.fem.petsc import assemble_vector_nest as petsc_assemble_vector_nest from dolfinx.fem.petsc import set_bc as petsc_set_bc from dolfinx.fem.petsc import set_bc_nest as petsc_set_bc_nest -from dolfinx.mesh import (CellType, GhostMode, create_mesh, create_rectangle, - create_unit_cube, create_unit_square, +from dolfinx.mesh import (CellType, GhostMode, create_mesh, create_rectangle, create_unit_cube, create_unit_square, locate_entities_boundary) from ufl import derivative, ds, dx, inner from ufl.geometry import SpatialCoordinate diff --git a/python/test/unit/fem/test_bcs.py b/python/test/unit/fem/test_bcs.py index d07cc47847a..3287c7c7796 100644 --- a/python/test/unit/fem/test_bcs.py +++ b/python/test/unit/fem/test_bcs.py @@ -12,13 +12,10 @@ import ufl from basix.ufl import element, mixed_element from dolfinx import default_real_type, default_scalar_type, la -from dolfinx.fem import (Constant, Function, apply_lifting, assemble_matrix, - assemble_vector, create_matrix, create_vector, - dirichletbc, form, functionspace, - locate_dofs_geometrical, locate_dofs_topological, - set_bc) -from dolfinx.mesh import (CellType, create_unit_cube, create_unit_square, - locate_entities_boundary) +from dolfinx.fem import (Constant, Function, apply_lifting, assemble_matrix, assemble_vector, create_matrix, + create_vector, dirichletbc, form, functionspace, locate_dofs_geometrical, + locate_dofs_topological, set_bc) +from dolfinx.mesh import CellType, create_unit_cube, create_unit_square, locate_entities_boundary from ufl import dx, inner diff --git a/python/test/unit/fem/test_custom_basix_element.py b/python/test/unit/fem/test_custom_basix_element.py index 3caba1e0f1d..0559ed9eaa2 100644 --- a/python/test/unit/fem/test_custom_basix_element.py +++ b/python/test/unit/fem/test_custom_basix_element.py @@ -7,14 +7,10 @@ import basix import basix.ufl import ufl -from dolfinx.fem import (Function, assemble_scalar, dirichletbc, form, - functionspace, locate_dofs_topological) -from dolfinx.fem.petsc import (apply_lifting, assemble_matrix, assemble_vector, - set_bc) -from dolfinx.mesh import (CellType, create_unit_cube, create_unit_square, - exterior_facet_indices) -from ufl import (SpatialCoordinate, TestFunction, TrialFunction, div, dx, grad, - inner) +from dolfinx.fem import Function, assemble_scalar, dirichletbc, form, functionspace, locate_dofs_topological +from dolfinx.fem.petsc import apply_lifting, assemble_matrix, assemble_vector, set_bc +from dolfinx.mesh import CellType, create_unit_cube, create_unit_square, exterior_facet_indices +from ufl import SpatialCoordinate, TestFunction, TrialFunction, div, dx, grad, inner def run_scalar_test(V, degree): diff --git a/python/test/unit/fem/test_custom_jit_kernels.py b/python/test/unit/fem/test_custom_jit_kernels.py index 9297b8acd9d..edccce2f42b 100644 --- a/python/test/unit/fem/test_custom_jit_kernels.py +++ b/python/test/unit/fem/test_custom_jit_kernels.py @@ -20,8 +20,7 @@ from dolfinx import TimingType from dolfinx import cpp as _cpp from dolfinx import fem, la, list_timings -from dolfinx.fem import (Form, Function, IntegralType, form_cpp_class, - functionspace) +from dolfinx.fem import Form, Function, IntegralType, form_cpp_class, functionspace from dolfinx.mesh import create_unit_square numba = pytest.importorskip("numba") diff --git a/python/test/unit/fem/test_discrete_operators.py b/python/test/unit/fem/test_discrete_operators.py index cf819ace3fa..44f29fc54ba 100644 --- a/python/test/unit/fem/test_discrete_operators.py +++ b/python/test/unit/fem/test_discrete_operators.py @@ -15,8 +15,7 @@ import ufl from dolfinx.cpp.fem import discrete_gradient from dolfinx.fem import Expression, Function, functionspace -from dolfinx.mesh import (CellType, GhostMode, create_unit_cube, - create_unit_square) +from dolfinx.mesh import CellType, GhostMode, create_unit_cube, create_unit_square @pytest.mark.parametrize("mesh", [create_unit_square(MPI.COMM_WORLD, 11, 6, diff --git a/python/test/unit/fem/test_dofmap.py b/python/test/unit/fem/test_dofmap.py index 7c12a2dc7c9..9d714031788 100644 --- a/python/test/unit/fem/test_dofmap.py +++ b/python/test/unit/fem/test_dofmap.py @@ -16,8 +16,7 @@ import ufl from basix.ufl import element, mixed_element from dolfinx.fem import functionspace -from dolfinx.mesh import (CellType, create_mesh, create_unit_cube, - create_unit_interval, create_unit_square) +from dolfinx.mesh import CellType, create_mesh, create_unit_cube, create_unit_interval, create_unit_square xfail = pytest.mark.xfail(strict=True) diff --git a/python/test/unit/fem/test_element_integrals.py b/python/test/unit/fem/test_element_integrals.py index 6aea6016a59..b8ddcfb5952 100644 --- a/python/test/unit/fem/test_element_integrals.py +++ b/python/test/unit/fem/test_element_integrals.py @@ -16,8 +16,7 @@ import dolfinx import ufl from basix.ufl import element -from dolfinx.fem import (Constant, Function, assemble_matrix, assemble_scalar, - assemble_vector, form, functionspace) +from dolfinx.fem import Constant, Function, assemble_matrix, assemble_scalar, assemble_vector, form, functionspace from dolfinx.mesh import CellType, create_mesh, meshtags parametrize_cell_types = pytest.mark.parametrize( diff --git a/python/test/unit/fem/test_fem_pipeline.py b/python/test/unit/fem/test_fem_pipeline.py index e77beb1afc0..2f53b01db2e 100644 --- a/python/test/unit/fem/test_fem_pipeline.py +++ b/python/test/unit/fem/test_fem_pipeline.py @@ -16,16 +16,13 @@ import ufl from basix.ufl import element, mixed_element from dolfinx import default_real_type -from dolfinx.fem import (Function, assemble_scalar, dirichletbc, form, - functionspace, locate_dofs_topological) -from dolfinx.fem.petsc import (apply_lifting, assemble_matrix, assemble_vector, - set_bc) +from dolfinx.fem import Function, assemble_scalar, dirichletbc, form, functionspace, locate_dofs_topological +from dolfinx.fem.petsc import apply_lifting, assemble_matrix, assemble_vector, set_bc from dolfinx.io import XDMFFile -from dolfinx.mesh import (CellType, create_rectangle, create_unit_cube, - create_unit_square, exterior_facet_indices, +from dolfinx.mesh import (CellType, create_rectangle, create_unit_cube, create_unit_square, exterior_facet_indices, locate_entities_boundary) -from ufl import (CellDiameter, FacetNormal, SpatialCoordinate, TestFunction, - TrialFunction, avg, div, ds, dS, dx, grad, inner, jump) +from ufl import (CellDiameter, FacetNormal, SpatialCoordinate, TestFunction, TrialFunction, avg, div, ds, dS, dx, grad, + inner, jump) def run_scalar_test(mesh, V, degree): diff --git a/python/test/unit/fem/test_function.py b/python/test/unit/fem/test_function.py index 93a6a09280e..2327c54c1a0 100644 --- a/python/test/unit/fem/test_function.py +++ b/python/test/unit/fem/test_function.py @@ -17,8 +17,7 @@ from basix.ufl import element, mixed_element from dolfinx import default_real_type, la from dolfinx.fem import Function, functionspace -from dolfinx.geometry import (bb_tree, compute_colliding_cells, - compute_collisions_points) +from dolfinx.geometry import bb_tree, compute_colliding_cells, compute_collisions_points from dolfinx.mesh import create_mesh, create_unit_cube diff --git a/python/test/unit/fem/test_interpolation.py b/python/test/unit/fem/test_interpolation.py index bba1a0977fd..7d2ecd65400 100644 --- a/python/test/unit/fem/test_interpolation.py +++ b/python/test/unit/fem/test_interpolation.py @@ -14,15 +14,12 @@ import basix import ufl -from basix.ufl import (blocked_element, custom_element, element, - enriched_element, mixed_element) +from basix.ufl import blocked_element, custom_element, element, enriched_element, mixed_element from dolfinx import default_real_type -from dolfinx.fem import (Expression, Function, assemble_scalar, - create_nonmatching_meshes_interpolation_data, form, +from dolfinx.fem import (Expression, Function, assemble_scalar, create_nonmatching_meshes_interpolation_data, form, functionspace) from dolfinx.geometry import bb_tree, compute_collisions_points -from dolfinx.mesh import (CellType, create_mesh, create_rectangle, - create_unit_cube, create_unit_square, +from dolfinx.mesh import (CellType, create_mesh, create_rectangle, create_unit_cube, create_unit_square, locate_entities, locate_entities_boundary, meshtags) parametrize_cell_types = pytest.mark.parametrize( diff --git a/python/test/unit/fem/test_mixed_element.py b/python/test/unit/fem/test_mixed_element.py index 8fdc70713fe..3c079425ffc 100644 --- a/python/test/unit/fem/test_mixed_element.py +++ b/python/test/unit/fem/test_mixed_element.py @@ -13,8 +13,7 @@ import ufl from basix.ufl import element, mixed_element from dolfinx.fem import form, functionspace -from dolfinx.mesh import (CellType, GhostMode, create_unit_cube, - create_unit_square) +from dolfinx.mesh import CellType, GhostMode, create_unit_cube, create_unit_square @pytest.mark.skip_in_parallel diff --git a/python/test/unit/fem/test_nonlinear_assembler.py b/python/test/unit/fem/test_nonlinear_assembler.py index 33e3afeca2f..3cdb70a6ac4 100644 --- a/python/test/unit/fem/test_nonlinear_assembler.py +++ b/python/test/unit/fem/test_nonlinear_assembler.py @@ -16,19 +16,13 @@ import ufl from basix.ufl import element, mixed_element from dolfinx.cpp.la.petsc import scatter_local_vectors -from dolfinx.fem import (Function, bcs_by_block, dirichletbc, - extract_function_spaces, form, functionspace, +from dolfinx.fem import (Function, bcs_by_block, dirichletbc, extract_function_spaces, form, functionspace, locate_dofs_topological) -from dolfinx.fem.petsc import (apply_lifting, apply_lifting_nest, - assemble_matrix, assemble_matrix_block, - assemble_matrix_nest, assemble_vector, - assemble_vector_block, assemble_vector_nest, - create_matrix, create_matrix_block, - create_matrix_nest, create_vector, - create_vector_block, create_vector_nest, set_bc, - set_bc_nest) -from dolfinx.mesh import (GhostMode, create_unit_cube, create_unit_square, - locate_entities_boundary) +from dolfinx.fem.petsc import (apply_lifting, apply_lifting_nest, assemble_matrix, assemble_matrix_block, + assemble_matrix_nest, assemble_vector, assemble_vector_block, assemble_vector_nest, + create_matrix, create_matrix_block, create_matrix_nest, create_vector, + create_vector_block, create_vector_nest, set_bc, set_bc_nest) +from dolfinx.mesh import GhostMode, create_unit_cube, create_unit_square, locate_entities_boundary from ufl import derivative, dx, inner diff --git a/python/test/unit/fem/test_petsc_discrete_operators.py b/python/test/unit/fem/test_petsc_discrete_operators.py index 4f00ed6e19a..1e6dcca40b3 100644 --- a/python/test/unit/fem/test_petsc_discrete_operators.py +++ b/python/test/unit/fem/test_petsc_discrete_operators.py @@ -15,10 +15,8 @@ from basix.ufl import element from dolfinx import default_real_type from dolfinx.cpp.fem.petsc import discrete_gradient, interpolation_matrix -from dolfinx.fem import (Expression, Function, assemble_scalar, form, - functionspace) -from dolfinx.mesh import (CellType, GhostMode, create_mesh, create_unit_cube, - create_unit_square) +from dolfinx.fem import Expression, Function, assemble_scalar, form, functionspace +from dolfinx.mesh import CellType, GhostMode, create_mesh, create_unit_cube, create_unit_square @pytest.mark.skip_in_parallel diff --git a/python/test/unit/fem/test_special_functions.py b/python/test/unit/fem/test_special_functions.py index 9838864fe66..847e9547f79 100644 --- a/python/test/unit/fem/test_special_functions.py +++ b/python/test/unit/fem/test_special_functions.py @@ -13,8 +13,7 @@ import ufl from dolfinx import default_scalar_type from dolfinx.fem import Constant, assemble_scalar, form -from dolfinx.mesh import (create_unit_cube, create_unit_interval, - create_unit_square) +from dolfinx.mesh import create_unit_cube, create_unit_interval, create_unit_square def test_facet_area1D(): diff --git a/python/test/unit/geometry/test_bounding_box_tree.py b/python/test/unit/geometry/test_bounding_box_tree.py index b9ff92d1316..16d70c1d2bd 100644 --- a/python/test/unit/geometry/test_bounding_box_tree.py +++ b/python/test/unit/geometry/test_bounding_box_tree.py @@ -11,15 +11,10 @@ import pytest from dolfinx import cpp as _cpp -from dolfinx.geometry import (bb_tree, compute_closest_entity, - compute_colliding_cells, - compute_collisions_points, - compute_collisions_trees, compute_distance_gjk, - create_midpoint_tree) -from dolfinx.mesh import (CellType, create_box, create_unit_cube, - create_unit_interval, create_unit_square, - exterior_facet_indices, locate_entities, - locate_entities_boundary) +from dolfinx.geometry import (bb_tree, compute_closest_entity, compute_colliding_cells, compute_collisions_points, + compute_collisions_trees, compute_distance_gjk, create_midpoint_tree) +from dolfinx.mesh import (CellType, create_box, create_unit_cube, create_unit_interval, create_unit_square, + exterior_facet_indices, locate_entities, locate_entities_boundary) def extract_geometricial_data(mesh, dim, entities): diff --git a/python/test/unit/io/test_adios2.py b/python/test/unit/io/test_adios2.py index 98e4e1b86f7..22cee7c62ac 100644 --- a/python/test/unit/io/test_adios2.py +++ b/python/test/unit/io/test_adios2.py @@ -17,8 +17,7 @@ from dolfinx.common import has_adios2 from dolfinx.fem import Function, functionspace from dolfinx.graph import adjacencylist -from dolfinx.mesh import (CellType, create_mesh, create_unit_cube, - create_unit_square) +from dolfinx.mesh import CellType, create_mesh, create_unit_cube, create_unit_square try: from dolfinx.io import FidesWriter, VTXWriter diff --git a/python/test/unit/io/test_vtk.py b/python/test/unit/io/test_vtk.py index bd08117820d..d5738e5b28f 100644 --- a/python/test/unit/io/test_vtk.py +++ b/python/test/unit/io/test_vtk.py @@ -18,8 +18,7 @@ from dolfinx.fem import Function, functionspace from dolfinx.io import VTKFile from dolfinx.io.utils import cell_perm_vtk # F401 -from dolfinx.mesh import (CellType, create_mesh, create_unit_cube, - create_unit_interval, create_unit_square) +from dolfinx.mesh import CellType, create_mesh, create_unit_cube, create_unit_interval, create_unit_square from dolfinx.plot import vtk_mesh cell_types_2D = [CellType.triangle, CellType.quadrilateral] diff --git a/python/test/unit/io/test_xdmf_function.py b/python/test/unit/io/test_xdmf_function.py index 517acf0f9b2..673c5cf3edb 100644 --- a/python/test/unit/io/test_xdmf_function.py +++ b/python/test/unit/io/test_xdmf_function.py @@ -14,8 +14,7 @@ import basix from dolfinx.fem import Function, functionspace from dolfinx.io import XDMFFile -from dolfinx.mesh import (CellType, create_unit_cube, create_unit_interval, - create_unit_square) +from dolfinx.mesh import CellType, create_unit_cube, create_unit_interval, create_unit_square # Supported XDMF file encoding if MPI.COMM_WORLD.size > 1: diff --git a/python/test/unit/io/test_xdmf_mesh.py b/python/test/unit/io/test_xdmf_mesh.py index 082f265ff0a..8711f39b575 100644 --- a/python/test/unit/io/test_xdmf_mesh.py +++ b/python/test/unit/io/test_xdmf_mesh.py @@ -15,8 +15,7 @@ from dolfinx import default_real_type from dolfinx.io import XDMFFile from dolfinx.io.gmshio import cell_perm_array, ufl_mesh -from dolfinx.mesh import (CellType, GhostMode, create_mesh, create_submesh, - create_unit_cube, create_unit_interval, +from dolfinx.mesh import (CellType, GhostMode, create_mesh, create_submesh, create_unit_cube, create_unit_interval, create_unit_square, locate_entities) # Supported XDMF file encoding diff --git a/python/test/unit/io/test_xdmf_meshdata.py b/python/test/unit/io/test_xdmf_meshdata.py index b9e3b1d529a..e0e7dd771d6 100644 --- a/python/test/unit/io/test_xdmf_meshdata.py +++ b/python/test/unit/io/test_xdmf_meshdata.py @@ -13,8 +13,7 @@ from dolfinx import default_real_type from dolfinx.io import XDMFFile -from dolfinx.mesh import (CellType, create_unit_cube, create_unit_interval, - create_unit_square) +from dolfinx.mesh import CellType, create_unit_cube, create_unit_interval, create_unit_square # Supported XDMF file encoding if MPI.COMM_WORLD.size > 1: diff --git a/python/test/unit/la/test_krylov_solver.py b/python/test/unit/la/test_krylov_solver.py index 62c0f5f4080..ca795da22e9 100644 --- a/python/test/unit/la/test_krylov_solver.py +++ b/python/test/unit/la/test_krylov_solver.py @@ -15,13 +15,10 @@ import ufl from dolfinx import la -from dolfinx.fem import (Function, dirichletbc, form, functionspace, - locate_dofs_topological) -from dolfinx.fem.petsc import (apply_lifting, assemble_matrix, assemble_vector, - set_bc) +from dolfinx.fem import Function, dirichletbc, form, functionspace, locate_dofs_topological +from dolfinx.fem.petsc import apply_lifting, assemble_matrix, assemble_vector, set_bc from dolfinx.mesh import create_unit_square, locate_entities_boundary -from ufl import (Identity, TestFunction, TrialFunction, dot, dx, grad, inner, - sym, tr) +from ufl import Identity, TestFunction, TrialFunction, dot, dx, grad, inner, sym, tr def test_krylov_solver_lu(): diff --git a/python/test/unit/la/test_nullspace.py b/python/test/unit/la/test_nullspace.py index 07d55ec56eb..3e44dea5f7b 100644 --- a/python/test/unit/la/test_nullspace.py +++ b/python/test/unit/la/test_nullspace.py @@ -18,8 +18,7 @@ from dolfinx.fem import form, functionspace from dolfinx.fem.petsc import assemble_matrix from dolfinx.la import create_petsc_vector -from dolfinx.mesh import (CellType, GhostMode, create_box, create_unit_cube, - create_unit_square) +from dolfinx.mesh import CellType, GhostMode, create_box, create_unit_cube, create_unit_square from ufl import TestFunction, TrialFunction, dx, grad, inner diff --git a/python/test/unit/mesh/test_face.py b/python/test/unit/mesh/test_face.py index 083b7bd7a8c..13aa57d5308 100644 --- a/python/test/unit/mesh/test_face.py +++ b/python/test/unit/mesh/test_face.py @@ -11,8 +11,7 @@ from dolfinx import cpp as _cpp from dolfinx.cpp.mesh import cell_normals -from dolfinx.mesh import (create_unit_cube, create_unit_square, - locate_entities_boundary) +from dolfinx.mesh import create_unit_cube, create_unit_square, locate_entities_boundary @pytest.fixture diff --git a/python/test/unit/mesh/test_ghost_mesh.py b/python/test/unit/mesh/test_ghost_mesh.py index a9deef5e580..acf42918769 100644 --- a/python/test/unit/mesh/test_ghost_mesh.py +++ b/python/test/unit/mesh/test_ghost_mesh.py @@ -9,8 +9,7 @@ import numpy as np import pytest -from dolfinx.mesh import (GhostMode, compute_midpoints, create_unit_cube, - create_unit_interval, create_unit_square) +from dolfinx.mesh import GhostMode, compute_midpoints, create_unit_cube, create_unit_interval, create_unit_square @pytest.mark.xfail(reason="Shared vertex currently disabled") diff --git a/python/test/unit/mesh/test_mesh.py b/python/test/unit/mesh/test_mesh.py index 1eca68f4e8f..34ea9f1a0f2 100644 --- a/python/test/unit/mesh/test_mesh.py +++ b/python/test/unit/mesh/test_mesh.py @@ -18,14 +18,11 @@ from dolfinx import cpp as _cpp from dolfinx import graph from dolfinx import mesh as _mesh -from dolfinx.cpp.mesh import (create_cell_partitioner, entities_to_geometry, - is_simplex) +from dolfinx.cpp.mesh import create_cell_partitioner, entities_to_geometry, is_simplex from dolfinx.fem import assemble_scalar, coordinate_element, form -from dolfinx.mesh import (CellType, DiagonalType, GhostMode, create_box, - create_interval, create_rectangle, create_submesh, - create_unit_cube, create_unit_interval, - create_unit_square, exterior_facet_indices, - locate_entities, locate_entities_boundary) +from dolfinx.mesh import (CellType, DiagonalType, GhostMode, create_box, create_interval, create_rectangle, + create_submesh, create_unit_cube, create_unit_interval, create_unit_square, + exterior_facet_indices, locate_entities, locate_entities_boundary) def submesh_topology_test(mesh, submesh, entity_map, vertex_map, entity_dim): diff --git a/python/test/unit/mesh/test_mesh_partitioners.py b/python/test/unit/mesh/test_mesh_partitioners.py index cb12c74b7cb..fc090b0bf77 100644 --- a/python/test/unit/mesh/test_mesh_partitioners.py +++ b/python/test/unit/mesh/test_mesh_partitioners.py @@ -17,8 +17,7 @@ from basix.ufl import element from dolfinx import default_real_type from dolfinx.io import XDMFFile -from dolfinx.mesh import (CellType, GhostMode, compute_midpoints, create_box, - create_cell_partitioner, create_mesh) +from dolfinx.mesh import CellType, GhostMode, compute_midpoints, create_box, create_cell_partitioner, create_mesh partitioners = [dolfinx.graph.partitioner()] try: diff --git a/python/test/unit/mesh/test_meshtags.py b/python/test/unit/mesh/test_meshtags.py index 5256009f46f..5425178d86f 100644 --- a/python/test/unit/mesh/test_meshtags.py +++ b/python/test/unit/mesh/test_meshtags.py @@ -10,8 +10,7 @@ import pytest from dolfinx.graph import adjacencylist -from dolfinx.mesh import (CellType, create_unit_cube, locate_entities, - meshtags_from_entities) +from dolfinx.mesh import CellType, create_unit_cube, locate_entities, meshtags_from_entities from ufl import Measure celltypes_3D = [CellType.tetrahedron, CellType.hexahedron] diff --git a/python/test/unit/mesh/test_refinement.py b/python/test/unit/mesh/test_refinement.py index e5f2383f42a..ece08d50bff 100644 --- a/python/test/unit/mesh/test_refinement.py +++ b/python/test/unit/mesh/test_refinement.py @@ -12,11 +12,9 @@ import ufl from dolfinx.fem import assemble_matrix, form, functionspace -from dolfinx.mesh import (CellType, DiagonalType, GhostMode, RefinementOption, - compute_incident_entities, create_unit_cube, - create_unit_square, locate_entities, - locate_entities_boundary, meshtags, refine, - refine_plaza, transfer_meshtag) +from dolfinx.mesh import (CellType, DiagonalType, GhostMode, RefinementOption, compute_incident_entities, + create_unit_cube, create_unit_square, locate_entities, locate_entities_boundary, meshtags, + refine, refine_plaza, transfer_meshtag) def test_Refinecreate_unit_square(): diff --git a/python/test/unit/nls/test_newton.py b/python/test/unit/nls/test_newton.py index e8251c92383..2c167332c23 100644 --- a/python/test/unit/nls/test_newton.py +++ b/python/test/unit/nls/test_newton.py @@ -13,10 +13,8 @@ import ufl from dolfinx import cpp as _cpp from dolfinx import default_real_type -from dolfinx.fem import (Function, dirichletbc, form, functionspace, - locate_dofs_geometrical) -from dolfinx.fem.petsc import (apply_lifting, assemble_matrix, assemble_vector, - create_matrix, create_vector, set_bc) +from dolfinx.fem import Function, dirichletbc, form, functionspace, locate_dofs_geometrical +from dolfinx.fem.petsc import apply_lifting, assemble_matrix, assemble_vector, create_matrix, create_vector, set_bc from dolfinx.la import create_petsc_vector from dolfinx.mesh import create_unit_square from ufl import TestFunction, TrialFunction, derivative, dx, grad, inner From 70be3d7e249bee22c61c3bbfdd5b36caf5f2edf3 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Sun, 21 Jan 2024 22:47:36 +0100 Subject: [PATCH 17/25] Fixes. --- python/dolfinx/io/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/dolfinx/io/utils.py b/python/dolfinx/io/utils.py index 664b571ebc8..5d342443f29 100644 --- a/python/dolfinx/io/utils.py +++ b/python/dolfinx/io/utils.py @@ -18,8 +18,8 @@ import basix.ufl import ufl from dolfinx import cpp as _cpp -from dolfinx.cpp.io import perm_gmsh as cell_perm_gmsh # F401 -from dolfinx.cpp.io import perm_vtk as cell_perm_vtk # F401 +from dolfinx.cpp.io import perm_gmsh as cell_perm_gmsh +from dolfinx.cpp.io import perm_vtk as cell_perm_vtk from dolfinx.fem import Function from dolfinx.mesh import GhostMode, Mesh, MeshTags @@ -250,5 +250,5 @@ def read_meshtags(self, mesh, name, xpath="/Xdmf/Domain"): def distribute_entity_data(mesh: Mesh, entity_dim: int, entities: npt.NDArray[np.int64], values: npt.NDArray[np.int32]) -> tuple[npt.NDArray[np.int64], - npt.NDArray[np.int32]]: + npt.NDArray[np.int32]]: return _cpp.io.distribute_entity_data(mesh._cpp_object, entity_dim, entities, values) From 30e2f45146a3ef550b697620f9cf7eabeb1aaffc Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Mon, 22 Jan 2024 11:21:01 +0100 Subject: [PATCH 18/25] Python 3.10 --- python/dolfinx/fem/element.py | 2 +- python/dolfinx/io/utils.py | 2 +- python/pyproject.toml | 13 +++++-------- python/test/unit/fem/test_function_space.py | 3 +-- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/python/dolfinx/fem/element.py b/python/dolfinx/fem/element.py index 3126a4f7e00..c621b32e057 100644 --- a/python/dolfinx/fem/element.py +++ b/python/dolfinx/fem/element.py @@ -32,7 +32,7 @@ def __init__(self, cmap: typing.Union[_cpp.fem.CoordinateElement_float32, Args: cmap: A C++ CoordinateElement. """ - assert isinstance(cmap, (_cpp.fem.CoordinateElement_float32, _cpp.fem.CoordinateElement_float64)) + assert isinstance(cmap, _cpp.fem.CoordinateElement_float32 | _cpp.fem.CoordinateElement_float64) self._cpp_object = cmap @property diff --git a/python/dolfinx/io/utils.py b/python/dolfinx/io/utils.py index 5d342443f29..4e5229a1807 100644 --- a/python/dolfinx/io/utils.py +++ b/python/dolfinx/io/utils.py @@ -29,7 +29,7 @@ def _extract_cpp_functions(functions: typing.Union[list[Function], Function]): """Extract C++ object for a single function or a list of functions""" - if isinstance(functions, (list, tuple)): + if isinstance(functions, list | tuple): return [getattr(u, "_cpp_object", u) for u in functions] else: return [getattr(functions, "_cpp_object", functions)] diff --git a/python/pyproject.toml b/python/pyproject.toml index e941132df15..5795f87a8dc 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -16,7 +16,7 @@ name = "fenics-dolfinx" version = "0.8.0.dev0" description = "DOLFINx Python interface" readme = "../README.md" -requires-python = ">=3.9.0" +requires-python = ">=3.10.0" license = { file = "../COPYING.LESSER" } authors = [ { email = "fenics-steering-council@googlegroups.com" }, @@ -80,21 +80,18 @@ sections= ["FUTURE", "STDLIB", "MPI", "THIRDPARTY", "FIRSTPARTY", "LOCALFOLDER"] line-length = 120 indent-width = 4 allowed-confusables = ["σ"] +target-version = "py310" [tool.ruff.lint] select = [ - # "B", - # "D", # pydocstyle "E", # pycodestyle "W", # pycodestyle "F", # pyflakes # "I", # isort - use standalone isort "RUF", # Ruff-specific rules "UP", # pyupgrade - # "ANN", - "ICN", - # "SIM", - # "PL", - "NPY", + "ICN", # flake8-import-conventions + "NPY", # numpy-specific rules + "FLY", # use f-string not static joins ] ignore = ["UP007", "RUF012"] diff --git a/python/test/unit/fem/test_function_space.py b/python/test/unit/fem/test_function_space.py index a4ff21fa9d8..8604bae0541 100644 --- a/python/test/unit/fem/test_function_space.py +++ b/python/test/unit/fem/test_function_space.py @@ -241,8 +241,7 @@ def test_cell_mismatch(mesh): def test_basix_element(V, W, Q, V2): for V_ in (V, W, V2): e = V_.element.basix_element - assert isinstance(e, (basix._basixcpp.FiniteElement_float64, - basix._basixcpp.FiniteElement_float32)) + assert isinstance(e, basix._basixcpp.FiniteElement_float64 | basix._basixcpp.FiniteElement_float32) # Mixed spaces do not yet return a basix element with pytest.raises(RuntimeError): From 57f0a6223fe78c73374da1bbe4deb085204b61fb Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Mon, 22 Jan 2024 11:24:28 +0100 Subject: [PATCH 19/25] Not necessary. --- python/pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/python/pyproject.toml b/python/pyproject.toml index 5795f87a8dc..f207112253b 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -80,7 +80,6 @@ sections= ["FUTURE", "STDLIB", "MPI", "THIRDPARTY", "FIRSTPARTY", "LOCALFOLDER"] line-length = 120 indent-width = 4 allowed-confusables = ["σ"] -target-version = "py310" [tool.ruff.lint] select = [ From 235515fb31f30f040d62dc39fcf9554d0d3082e2 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Mon, 22 Jan 2024 11:30:57 +0100 Subject: [PATCH 20/25] Add back in some removals. --- python/pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/pyproject.toml b/python/pyproject.toml index f207112253b..490543cfea9 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -4,7 +4,7 @@ # pip install -r build-requirements.txt [build-system] requires = [ - "scikit-build-core[pyproject]", + "scikit-build-core[pyproject]>=0.5", "nanobind>=1.8.0", "petsc4py", "mpi4py", @@ -27,6 +27,7 @@ dependencies = [ "cffi", "petsc4py", "mpi4py", + "fenics-basix>=0.8.0.dev0,<0.9.0", "fenics-ffcx>=0.8.0.dev0,<0.9.0", "fenics-ufl>=2023.3.0.dev0,<2023.4.0", ] From 5d031608cb13fd479be21e15503682b6126071bd Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Mon, 22 Jan 2024 13:27:01 +0100 Subject: [PATCH 21/25] isort. --- python/test/conftest.py | 5 +++-- python/test/unit/fem/test_complex_assembler.py | 5 ++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/python/test/conftest.py b/python/test/conftest.py index 0e6c1bbb2fa..e6dd25f2f6a 100644 --- a/python/test/conftest.py +++ b/python/test/conftest.py @@ -3,13 +3,14 @@ import shutil import time from collections import defaultdict -from dolfinx.la import vector as dolfinx_vector -import numpy as np from mpi4py import MPI +import numpy as np import pytest +from dolfinx.la import vector as dolfinx_vector + def pytest_runtest_teardown(item): """Collect garbage after every test to force calling diff --git a/python/test/unit/fem/test_complex_assembler.py b/python/test/unit/fem/test_complex_assembler.py index 56ae0909e9e..6600ed79606 100644 --- a/python/test/unit/fem/test_complex_assembler.py +++ b/python/test/unit/fem/test_complex_assembler.py @@ -10,11 +10,10 @@ import numpy as np import pytest +import dolfinx.la as la import ufl from basix.ufl import element -from dolfinx.fem import Function, form, functionspace -from dolfinx.fem import assemble_matrix, assemble_vector -import dolfinx.la as la +from dolfinx.fem import Function, assemble_matrix, assemble_vector, form, functionspace from dolfinx.mesh import create_unit_square from ufl import dx, grad, inner From 383d4060737816f1e9e1d94966a54cdafea34f46 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Mon, 22 Jan 2024 13:51:52 +0100 Subject: [PATCH 22/25] Rocky and Intel OneAPI on Python 3.9 --- python/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/pyproject.toml b/python/pyproject.toml index 490543cfea9..c62b3b2abe1 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -16,7 +16,7 @@ name = "fenics-dolfinx" version = "0.8.0.dev0" description = "DOLFINx Python interface" readme = "../README.md" -requires-python = ">=3.10.0" +requires-python = ">=3.9.0" license = { file = "../COPYING.LESSER" } authors = [ { email = "fenics-steering-council@googlegroups.com" }, From 82eaf51dcf17240113a52256d469c86ba4b05cab Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Mon, 22 Jan 2024 14:11:42 +0100 Subject: [PATCH 23/25] Seed random number generator. --- python/demo/demo_cahn-hilliard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/demo/demo_cahn-hilliard.py b/python/demo/demo_cahn-hilliard.py index 9849fa012c0..055af00fe80 100644 --- a/python/demo/demo_cahn-hilliard.py +++ b/python/demo/demo_cahn-hilliard.py @@ -202,7 +202,7 @@ u.x.array[:] = 0.0 # Interpolate initial condition -rng = np.random.default_rng() +rng = np.random.default_rng(42) u.sub(0).interpolate(lambda x: 0.63 + 0.02 * (0.5 - rng.random(x.shape[1]))) u.x.scatter_forward() # - From 41d8acefe07617763f0f5b1f371a8ccd1224b903 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Mon, 22 Jan 2024 14:31:36 +0100 Subject: [PATCH 24/25] Remove | stuff. --- python/dolfinx/fem/element.py | 2 +- python/dolfinx/io/utils.py | 2 +- python/test/unit/fem/test_function_space.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/python/dolfinx/fem/element.py b/python/dolfinx/fem/element.py index c621b32e057..3126a4f7e00 100644 --- a/python/dolfinx/fem/element.py +++ b/python/dolfinx/fem/element.py @@ -32,7 +32,7 @@ def __init__(self, cmap: typing.Union[_cpp.fem.CoordinateElement_float32, Args: cmap: A C++ CoordinateElement. """ - assert isinstance(cmap, _cpp.fem.CoordinateElement_float32 | _cpp.fem.CoordinateElement_float64) + assert isinstance(cmap, (_cpp.fem.CoordinateElement_float32, _cpp.fem.CoordinateElement_float64)) self._cpp_object = cmap @property diff --git a/python/dolfinx/io/utils.py b/python/dolfinx/io/utils.py index 4e5229a1807..5d342443f29 100644 --- a/python/dolfinx/io/utils.py +++ b/python/dolfinx/io/utils.py @@ -29,7 +29,7 @@ def _extract_cpp_functions(functions: typing.Union[list[Function], Function]): """Extract C++ object for a single function or a list of functions""" - if isinstance(functions, list | tuple): + if isinstance(functions, (list, tuple)): return [getattr(u, "_cpp_object", u) for u in functions] else: return [getattr(functions, "_cpp_object", functions)] diff --git a/python/test/unit/fem/test_function_space.py b/python/test/unit/fem/test_function_space.py index 8604bae0541..1d173b50d61 100644 --- a/python/test/unit/fem/test_function_space.py +++ b/python/test/unit/fem/test_function_space.py @@ -241,7 +241,7 @@ def test_cell_mismatch(mesh): def test_basix_element(V, W, Q, V2): for V_ in (V, W, V2): e = V_.element.basix_element - assert isinstance(e, basix._basixcpp.FiniteElement_float64 | basix._basixcpp.FiniteElement_float32) + assert isinstance(e, (basix._basixcpp.FiniteElement_float64, basix._basixcpp.FiniteElement_float32)) # Mixed spaces do not yet return a basix element with pytest.raises(RuntimeError): From 93b2da02b5dc5946ab526b7eac36d307cbbe200e Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Mon, 22 Jan 2024 15:44:01 +0100 Subject: [PATCH 25/25] Fix circleci. --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f93b0b38214..44a4552e549 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -12,7 +12,7 @@ install-python-components: &install-python-components pip3 install git+https://github.com/FEniCS/ffcx.git ruff-isort-python-code: &ruff-isort-python-code - name: Flake8 checks on Python code + name: ruff and isort checks on Python code command: | cd python/ ruff check . @@ -130,7 +130,7 @@ jobs: steps: - checkout - run: *install-python-components - - run: *flake8-python-code + - run: *ruff-isort-python-code - run: *configure-cpp - run: *build-install-cpp