From f85b7801539fc356e410a092c8e3aa6e004e771e Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Mon, 22 Jan 2024 18:59:21 +0100 Subject: [PATCH] Lighter switch to ruff (#2998) * Basic configuration from other branch. * Ignore X | Y, our supported Python to old * Cannot use isort package from ruff. * Use traditional isort + ruff --fix . * Unsafe fixes. * Add back in isort. * Add ruff.toml * Fix. * Ignore RUF012 * Fix circleci * Remove deprecated numpy random call. * Add back isort. * Move Python minimum to 3.9 (discuss). * More fixes. * ruff fix. * Fix isort configuration and re-isort. * Fixes. * Python 3.10 * Not necessary. * Add back in some removals. * isort. * Rocky and Intel OneAPI on Python 3.9 * Seed random number generator. * Remove | stuff. * Fix circleci. --- .circleci/config.yml | 13 ++-- .github/workflows/ccpp.yml | 19 ++---- cpp/ruff.toml | 1 + python/.isort.cfg | 6 -- python/demo/demo_biharmonic.py | 3 +- python/demo/demo_cahn-hilliard.py | 3 +- python/demo/demo_elasticity.py | 9 +-- python/demo/demo_lagrange_variants.py | 5 +- python/demo/demo_mixed-poisson.py | 3 +- python/demo/demo_navier-stokes.py | 4 +- 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 +- python/demo/demo_pyvista.py | 3 +- .../analytical_efficiencies_wire.py | 3 +- .../demo_scattering_boundary_conditions.py | 3 +- python/demo/demo_static-condensation.py | 9 +-- python/demo/demo_stokes.py | 3 +- python/demo/demo_tnt-elements.py | 7 +- .../demo_half_loaded_waveguide.py | 3 +- python/dolfinx/__init__.py | 6 +- python/dolfinx/common.py | 3 +- python/dolfinx/fem/__init__.py | 17 ++--- 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 | 4 +- python/dolfinx/io/__init__.py | 10 ++- python/dolfinx/io/gmshio.py | 11 ++-- python/dolfinx/io/utils.py | 20 +++--- python/dolfinx/jit.py | 2 +- python/dolfinx/log.py | 3 +- python/dolfinx/mesh.py | 8 +-- python/dolfinx/pkgconfig.py | 2 +- python/dolfinx/plot.py | 2 +- python/dolfinx/utils.py | 12 ++-- python/pyproject.toml | 34 ++++++++-- python/test/conftest.py | 5 +- python/test/unit/common/test_index_map.py | 2 +- 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 ++-- .../test/unit/fem/test_complex_assembler.py | 5 +- python/test/unit/fem/test_custom_assembler.py | 4 +- .../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_function_space.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 | 20 ++---- .../unit/fem/test_petsc_discrete_operators.py | 6 +- .../test/unit/fem/test_special_functions.py | 13 ++-- .../unit/geometry/test_bounding_box_tree.py | 13 ++-- python/test/unit/io/test_adios2.py | 3 +- python/test/unit/io/test_vtk.py | 5 +- 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 | 13 ++-- .../test/unit/mesh/test_mesh_partitioners.py | 3 +- python/test/unit/mesh/test_meshtags.py | 3 +- python/test/unit/mesh/test_refinement.py | 26 ++++---- python/test/unit/nls/test_newton.py | 6 +- 75 files changed, 247 insertions(+), 332 deletions(-) create mode 100644 cpp/ruff.toml delete mode 100644 python/.isort.cfg diff --git a/.circleci/config.yml b/.circleci/config.yml index dd6a7c9c6cc..44a4552e549 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 - name: Flake8 checks on Python code +ruff-isort-python-code: &ruff-isort-python-code + name: ruff and isort 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 @@ -131,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 diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml index 734d0778054..124b33c96f1 100644 --- a/.github/workflows/ccpp.yml +++ b/.github/workflows/ccpp.yml @@ -60,24 +60,15 @@ 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 - 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 + - name: ruff and isort C++ .py file checks run: | cd cpp/ + ruff check . python3 -m isort --check . - cd .. + - name: ruff and isort Python interface checks + run: | cd python/ + ruff check . python3 -m isort --check . - name: mypy checks run: | 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" 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 0ed51d2c023..44fc31b087c 100644 --- a/python/demo/demo_biharmonic.py +++ b/python/demo/demo_biharmonic.py @@ -120,8 +120,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_cahn-hilliard.py b/python/demo/demo_cahn-hilliard.py index 87fdc589f4d..055af00fe80 100644 --- a/python/demo/demo_cahn-hilliard.py +++ b/python/demo/demo_cahn-hilliard.py @@ -202,7 +202,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(42) +u.sub(0).interpolate(lambda x: 0.63 + 0.02 * (0.5 - rng.random(x.shape[1]))) u.x.scatter_forward() # - 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_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_mixed-poisson.py b/python/demo/demo_mixed-poisson.py index 42f5b974e76..9cc7c7c843e 100644 --- a/python/demo/demo_mixed-poisson.py +++ b/python/demo/demo_mixed-poisson.py @@ -101,8 +101,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 a18f8704aef..3d1e283daee 100644 --- a/python/demo/demo_navier-stokes.py +++ b/python/demo/demo_navier-stokes.py @@ -171,8 +171,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_pml/demo_pml.py b/python/demo/demo_pml/demo_pml.py index b292aa1e188..887d848f0ea 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 @@ -358,7 +358,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_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_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 54964bd1e45..cc9fcb99043 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/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 a8a53a32d0c..25fc430e2f7 100644 --- a/python/demo/demo_stokes.py +++ b/python/demo/demo_stokes.py @@ -93,8 +93,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 51df68c7a3c..3cdcc889a77 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 @@ -31,10 +31,9 @@ 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 -matplotlib.use('agg') +mpl.use('agg') # - # ## Defining a degree 1 TNT element diff --git a/python/demo/demo_waveguide/demo_half_loaded_waveguide.py b/python/demo/demo_waveguide/demo_half_loaded_waveguide.py index 64df7e1bb59..f12ad5adb01 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/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 877672b24ec..730488b6bf0 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..4576e1b0bdd 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 @@ -199,7 +199,7 @@ def squared_distance(mesh: Mesh, dim: int, entities: typing.List[int], points: n 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)``). diff --git a/python/dolfinx/io/__init__.py b/python/dolfinx/io/__init__.py index a1917113dc7..88d90108d6a 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) - __all__ = __all__ + ["FidesWriter", "VTXWriter", "FidesMeshPolicy"] + from dolfinx.io.utils import FidesMeshPolicy, FidesWriter, VTXWriter + __all__ = [*__all__, "FidesWriter", "VTXWriter", "FidesMeshPolicy"] diff --git a/python/dolfinx/io/gmshio.py b/python/dolfinx/io/gmshio.py index e54983f0886..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"] @@ -64,7 +63,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 +103,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 +179,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 +298,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 abebf14aa61..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 # 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 +from dolfinx.cpp.io import perm_vtk as cell_perm_vtk from dolfinx.fem import Function from dolfinx.mesh import GhostMode, Mesh, MeshTags @@ -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] @@ -37,8 +37,8 @@ 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 - __all__ = __all__ + ["FidesWriter", "VTXWriter", "FidesMeshPolicy"] + from dolfinx.cpp.io import FidesMeshPolicy # F401 + __all__ = [*__all__, "FidesWriter", "VTXWriter", "FidesMeshPolicy"] class VTXWriter: """Writer for VTX files, using ADIOS2 to create the files. @@ -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], - npt.NDArray[np.int32]]: + 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")) \ 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 f698b7009d7..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 @@ -592,7 +590,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/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/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 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""" diff --git a/python/pyproject.toml b/python/pyproject.toml index 9a201af2dbd..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.8.0" +requires-python = ">=3.9.0" license = { file = "../COPYING.LESSER" } authors = [ { email = "fenics-steering-council@googlegroups.com" }, @@ -34,7 +34,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 = [ @@ -57,9 +57,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 +68,30 @@ warn_return_any = false warn_unused_ignores = false show_error_codes = true 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 +indent-width = 4 +allowed-confusables = ["σ"] + +[tool.ruff.lint] +select = [ + "E", # pycodestyle + "W", # pycodestyle + "F", # pyflakes + # "I", # isort - use standalone isort + "RUF", # Ruff-specific rules + "UP", # pyupgrade + "ICN", # flake8-import-conventions + "NPY", # numpy-specific rules + "FLY", # use f-string not static joins +] +ignore = ["UP007", "RUF012"] 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/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_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_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 diff --git a/python/test/unit/fem/test_custom_assembler.py b/python/test/unit/fem/test_custom_assembler.py index 4e044d458a1..6e05e21b954 100644 --- a/python/test/unit/fem/test_custom_assembler.py +++ b/python/test/unit/fem/test_custom_assembler.py @@ -229,7 +229,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) @@ -280,7 +280,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_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_function_space.py b/python/test/unit/fem/test_function_space.py index a4ff21fa9d8..1d173b50d61 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): 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 26e11fe6f79..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 @@ -182,7 +176,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/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 5d8e4949fbd..847e9547f79 100644 --- a/python/test/unit/fem/test_special_functions.py +++ b/python/test/unit/fem/test_special_functions.py @@ -7,14 +7,13 @@ from mpi4py import MPI -import numpy +import numpy as np import pytest 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(): @@ -27,8 +26,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 +51,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/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 da6062f8971..d5738e5b28f 100644 --- a/python/test/unit/io/test_vtk.py +++ b/python/test/unit/io/test_vtk.py @@ -17,9 +17,8 @@ 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.mesh import (CellType, create_mesh, create_unit_cube, - create_unit_interval, create_unit_square) +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 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 795f0ad2322..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): @@ -362,7 +359,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_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 07993422bea..ece08d50bff 100644 --- a/python/test/unit/mesh/test_refinement.py +++ b/python/test/unit/mesh/test_refinement.py @@ -6,17 +6,15 @@ from mpi4py import MPI -import numpy +import numpy as np import pytest from numpy import isclose, logical_and 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(): @@ -133,8 +131,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 +146,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 +161,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) 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