diff --git a/benchmarks/bench_translations.py b/benchmarks/bench_translations.py index 0601889c8aafd24e0fa5184cd04cd680e60c337a..8cd52af4765a013d3f8f6d0526b6f89997c397ed 100644 --- a/benchmarks/bench_translations.py +++ b/benchmarks/bench_translations.py @@ -1,18 +1,24 @@ +import logging + import numpy as np from pyopencl.tools import ( # noqa - pytest_generate_tests_for_pyopencl as pytest_generate_tests) + pytest_generate_tests_for_pyopencl as pytest_generate_tests, +) -from sumpy.expansion.multipole import ( - VolumeTaylorMultipoleExpansion, H2DMultipoleExpansion, - LinearPDEConformingVolumeTaylorMultipoleExpansion) from sumpy.expansion.local import ( - VolumeTaylorLocalExpansion, H2DLocalExpansion, - LinearPDEConformingVolumeTaylorLocalExpansion) + H2DLocalExpansion, + LinearPDEConformingVolumeTaylorLocalExpansion, + VolumeTaylorLocalExpansion, +) +from sumpy.expansion.multipole import ( + H2DMultipoleExpansion, + LinearPDEConformingVolumeTaylorMultipoleExpansion, + VolumeTaylorMultipoleExpansion, +) +from sumpy.kernel import HelmholtzKernel, LaplaceKernel -from sumpy.kernel import LaplaceKernel, HelmholtzKernel -import logging logger = logging.getLogger(__name__) import pymbolic.mapper.flop_counter diff --git a/doc/conf.py b/doc/conf.py index 0780e3d3dd0d74dfe2c89354a344c0a1ef7e430e..ed5049e54de5f36ee2830458cf62b973f44ae6c0 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -1,6 +1,7 @@ import os from urllib.request import urlopen + _conf_url = \ "https://raw.githubusercontent.com/inducer/sphinxconfig/main/sphinxconfig.py" with urlopen(_conf_url) as _inf: diff --git a/examples/curve-pot.py b/examples/curve-pot.py index db2c667c7f9cd54cf93574439097f3582cc85b3d..85de64eb64834d8f3300fd31ff2b284bb24bb870 100644 --- a/examples/curve-pot.py +++ b/examples/curve-pot.py @@ -3,6 +3,7 @@ import numpy.linalg as la import pyopencl as cl + try: import matplotlib.pyplot as plt USE_MATPLOTLIB = True @@ -16,6 +17,8 @@ except ImportError: USE_MAYAVI = False import logging + + logging.basicConfig(level=logging.INFO) @@ -72,9 +75,9 @@ def draw_pot_figure(aspect_ratio, # {{{ make p2p kernel calculator - from sumpy.p2p import P2P - from sumpy.kernel import LaplaceKernel, HelmholtzKernel from sumpy.expansion.local import H2DLocalExpansion, LineTaylorLocalExpansion + from sumpy.kernel import HelmholtzKernel, LaplaceKernel + from sumpy.p2p import P2P if helmholtz_k: if isinstance(helmholtz_k, complex): knl = HelmholtzKernel(2, allow_evanescent=True) @@ -178,9 +181,10 @@ def draw_pot_figure(aspect_ratio, from fourier import make_fourier_interp_matrix fim = make_fourier_interp_matrix(novsmp, nsrc) - from sumpy.tools import build_matrix from scipy.sparse.linalg import LinearOperator + from sumpy.tools import build_matrix + def apply_lpot(x): xovsmp = np.dot(fim, x) evt, (y,) = lpot(actx.queue, diff --git a/examples/curve.py b/examples/curve.py index 589ad16e7c83c7a4839340f4544e07b22c49df59..760db5f7707b701c71a75d13af1973f1ed4101f9 100644 --- a/examples/curve.py +++ b/examples/curve.py @@ -1,5 +1,4 @@ import numpy as np - import scipy as sp import scipy.fftpack diff --git a/examples/expansion-toys.py b/examples/expansion-toys.py index e76e958d0a5657721cd9146da6b85ebfd715cca5..395929e7c9d7f2c1ee2da814ed75c5def54f839d 100644 --- a/examples/expansion-toys.py +++ b/examples/expansion-toys.py @@ -3,11 +3,9 @@ import numpy as np import pyopencl as cl import sumpy.toys as t +from sumpy.kernel import HelmholtzKernel, LaplaceKernel, YukawaKernel # noqa: F401 from sumpy.visualization import FieldPlotter -from sumpy.kernel import ( # noqa: F401 - YukawaKernel, - HelmholtzKernel, - LaplaceKernel) + try: import matplotlib.pyplot as plt diff --git a/examples/sym-exp-complexity.py b/examples/sym-exp-complexity.py index 138c9c8713f62abffd2ba384329369027c75ae43..bc88cdf0c95a88a152745262b674cb4bb18d8ae5 100644 --- a/examples/sym-exp-complexity.py +++ b/examples/sym-exp-complexity.py @@ -1,16 +1,17 @@ import numpy as np -import loopy as lp +import loopy as lp import pyopencl as cl -from sumpy.kernel import LaplaceKernel, HelmholtzKernel +from sumpy.e2e import E2EFromCSR from sumpy.expansion.local import ( - LinearPDEConformingVolumeTaylorLocalExpansion, - ) + LinearPDEConformingVolumeTaylorLocalExpansion, +) from sumpy.expansion.multipole import ( - LinearPDEConformingVolumeTaylorMultipoleExpansion, - ) -from sumpy.e2e import E2EFromCSR + LinearPDEConformingVolumeTaylorMultipoleExpansion, +) +from sumpy.kernel import HelmholtzKernel, LaplaceKernel + try: import matplotlib.pyplot as plt diff --git a/pyproject.toml b/pyproject.toml index 19db2276adfd94e21b5d7c77aa83bf90a488cc73..5194016337c3f149b4a2370d33d9a5f7dbaf9c06 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ extend-select = [ "E", # pycodestyle "F", # pyflakes "G", # flake8-logging-format - # "I", # flake8-isort + "I", # flake8-isort "N", # pep8-naming "NPY", # numpy "Q", # flake8-quotes @@ -39,7 +39,14 @@ multiline-quotes = "double" [tool.ruff.lint.isort] combine-as-imports = true -known-local-folder = [ +known-first-party = [ "pytools", + "pymbolic", + "arraycontext", + "loopy", + "pyopencl", +] +known-local-folder = [ + "sumpy", ] lines-after-imports = 2 diff --git a/setup.py b/setup.py index c6fb7427daaedcd96e5e58dc75987acbf8a0c4d1..59c7f9b87a25133332196d89bec0f5ad8e01a883 100644 --- a/setup.py +++ b/setup.py @@ -1,9 +1,11 @@ #!/usr/bin/env python import os -from setuptools import setup from pathlib import Path +from setuptools import setup + + ver_dic = {} version_file = open("sumpy/version.py") try: @@ -22,14 +24,14 @@ def find_git_revision(tree_root): # Keep this routine self-contained so that it can be copy-pasted into # setup.py. - from os.path import join, exists, abspath + from os.path import abspath, exists, join tree_root = abspath(tree_root) if not exists(join(tree_root, ".git")): return None - from subprocess import Popen, PIPE, STDOUT + from subprocess import PIPE, STDOUT, Popen p = Popen( ["git", "rev-parse", "HEAD"], diff --git a/sumpy/__init__.py b/sumpy/__init__.py index e4daaaae77d7811060b9999c75fcf8335c22c2b2..29c5904b8c051b3ee20b293976880061455e8fbc 100644 --- a/sumpy/__init__.py +++ b/sumpy/__init__.py @@ -21,15 +21,23 @@ THE SOFTWARE. """ import os -from sumpy.p2p import P2P, P2PFromCSR -from sumpy.p2e import P2EFromSingleBox, P2EFromCSR -from sumpy.e2p import E2PFromSingleBox, E2PFromCSR -from sumpy.e2e import (E2EFromCSR, E2EFromChildren, E2EFromParent, + +from pytools.persistent_dict import WriteOncePersistentDict + +from sumpy.e2e import ( + E2EFromChildren, + E2EFromCSR, + E2EFromParent, + M2LGenerateTranslationClassesDependentData, + M2LPostprocessLocal, + M2LPreprocessMultipole, M2LUsingTranslationClassesDependentData, - M2LGenerateTranslationClassesDependentData, M2LPreprocessMultipole, - M2LPostprocessLocal) +) +from sumpy.e2p import E2PFromCSR, E2PFromSingleBox +from sumpy.p2e import P2EFromCSR, P2EFromSingleBox +from sumpy.p2p import P2P, P2PFromCSR from sumpy.version import VERSION_TEXT -from pytools.persistent_dict import WriteOncePersistentDict + __all__ = [ "P2P", diff --git a/sumpy/array_context.py b/sumpy/array_context.py index 3c32884957a0cebd08140e495cf48e95e7aab610..21432af3506875187d53917a3ea9ee5a801565f3 100644 --- a/sumpy/array_context.py +++ b/sumpy/array_context.py @@ -21,9 +21,12 @@ THE SOFTWARE. """ from boxtree.array_context import PyOpenCLArrayContext as PyOpenCLArrayContextBase + from arraycontext.pytest import ( - _PytestPyOpenCLArrayContextFactoryWithClass, - register_pytest_array_context_factory) + _PytestPyOpenCLArrayContextFactoryWithClass, + register_pytest_array_context_factory, +) + __doc__ = """ Array Context diff --git a/sumpy/assignment_collection.py b/sumpy/assignment_collection.py index 5115714d856c34c222bc7a61681cb22971b1a9a2..204d0fd4f062bfc2a553e2e55e8e0c87ca955a37 100644 --- a/sumpy/assignment_collection.py +++ b/sumpy/assignment_collection.py @@ -21,9 +21,11 @@ THE SOFTWARE. """ +import logging + import sumpy.symbolic as sym -import logging + logger = logging.getLogger(__name__) __doc__ = """ diff --git a/sumpy/codegen.py b/sumpy/codegen.py index 5c51cd9c7a9b868ed07997107aca3eec0bd38d76..139a17b068180624246cb166c4fdde673d68e83b 100644 --- a/sumpy/codegen.py +++ b/sumpy/codegen.py @@ -21,20 +21,20 @@ THE SOFTWARE. """ +import logging import re import numpy as np -import loopy as lp -from loopy.kernel.instruction import make_assignment -from pymbolic.mapper import IdentityMapper, CSECachingMapperMixin +import loopy as lp import pymbolic.primitives as prim - +from loopy.kernel.instruction import make_assignment +from pymbolic.mapper import CSECachingMapperMixin, IdentityMapper from pytools import memoize_method -from sumpy.symbolic import (SympyToPymbolicMapper as SympyToPymbolicMapperBase) +from sumpy.symbolic import SympyToPymbolicMapper as SympyToPymbolicMapperBase + -import logging logger = logging.getLogger(__name__) @@ -52,6 +52,8 @@ Conversion of :mod:`sympy` expressions to :mod:`loopy` # {{{ sympy -> pymbolic mapper import sumpy.symbolic as sym + + _SPECIAL_FUNCTION_NAMES = frozenset(dir(sym.functions)) @@ -654,8 +656,8 @@ def combine_mappers(*mappers): return self.rec(new_expr) return expr - from functools import partial import types + from functools import partial combine_mapper = CombinedMapper(all_methods) for method_name in all_methods.keys(): setattr(combine_mapper, method_name, diff --git a/sumpy/cse.py b/sumpy/cse.py index c401e84fb6c5d23c7f0ef6c253384f3abba50d8d..35b39980296ed2796bc6ac8aa24eaeeb4cdcd7d7 100644 --- a/sumpy/cse.py +++ b/sumpy/cse.py @@ -64,9 +64,11 @@ DAMAGE. # }}} -from sumpy.symbolic import ( - Basic, Mul, Add, Pow, Symbol, _coeff_isneg, Derivative, Subs) from sympy.utilities.iterables import numbered_symbols + +from sumpy.symbolic import Add, Basic, Derivative, Mul, Pow, Subs, Symbol, _coeff_isneg + + try: from sympy.utilities.iterables import iterable except ImportError: diff --git a/sumpy/derivative_taker.py b/sumpy/derivative_taker.py index 86b8a0240a13cc3d3722ce7f2bf151a799802550..7e6192026d986ae544e443c36818b43797d1f484 100644 --- a/sumpy/derivative_taker.py +++ b/sumpy/derivative_taker.py @@ -35,15 +35,16 @@ __doc__ = """ .. autoclass:: DifferentiatedExprDerivativeTaker """ -from pytools.tag import tag_dataclass +import logging +from typing import Any, Dict, Tuple import numpy as np -import sumpy.symbolic as sym -from sumpy.tools import add_to_sac, add_mi -from typing import Dict, Tuple, Any +from pytools.tag import tag_dataclass + +import sumpy.symbolic as sym +from sumpy.tools import add_mi, add_to_sac -import logging logger = logging.getLogger(__name__) diff --git a/sumpy/distributed.py b/sumpy/distributed.py index 1707e5e6ae16f03f8581ed0de4e96d3bf569d624..e0b6ee3b1a061152830fc61048dfe047777e540a 100644 --- a/sumpy/distributed.py +++ b/sumpy/distributed.py @@ -21,9 +21,11 @@ THE SOFTWARE. """ from boxtree.distributed.calculation import DistributedExpansionWrangler -from sumpy.fmm import SumpyExpansionWrangler + import pyopencl as cl +from sumpy.fmm import SumpyExpansionWrangler + class DistributedSumpyExpansionWrangler( DistributedExpansionWrangler, SumpyExpansionWrangler): @@ -78,8 +80,9 @@ class DistributedSumpyExpansionWrangler( def reorder_potentials(self, potentials): if self.comm.Get_rank() == 0: - from pytools.obj_array import obj_array_vectorize import numpy as np + + from pytools.obj_array import obj_array_vectorize assert ( isinstance(potentials, np.ndarray) and potentials.dtype.char == "O") diff --git a/sumpy/e2e.py b/sumpy/e2e.py index 4167d993aecacd729cb597fc0af6b429b82de3e0..c57a90b3597478e6c1ddbc56206acbefa3637677 100644 --- a/sumpy/e2e.py +++ b/sumpy/e2e.py @@ -20,19 +20,21 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ +import logging from abc import ABC, abstractmethod import numpy as np + import loopy as lp -import sumpy.symbolic as sym import pymbolic - from loopy.version import MOST_RECENT_LANGUAGE_VERSION -from sumpy.tools import KernelCacheMixin, to_complex_dtype -from sumpy.codegen import register_optimization_preambles from pytools import memoize_method -import logging +import sumpy.symbolic as sym +from sumpy.codegen import register_optimization_preambles +from sumpy.tools import KernelCacheMixin, to_complex_dtype + + logger = logging.getLogger(__name__) @@ -66,16 +68,20 @@ class E2EBase(KernelCacheMixin, ABC): device = ctx.devices[0] if src_expansion is tgt_expansion: - from sumpy.kernel import (TargetTransformationRemover, - SourceTransformationRemover) + from sumpy.kernel import ( + SourceTransformationRemover, + TargetTransformationRemover, + ) tgt_expansion = src_expansion = src_expansion.with_kernel( SourceTransformationRemover()( TargetTransformationRemover()(src_expansion.kernel))) else: - from sumpy.kernel import (TargetTransformationRemover, - SourceTransformationRemover) + from sumpy.kernel import ( + SourceTransformationRemover, + TargetTransformationRemover, + ) src_expansion = src_expansion.with_kernel( SourceTransformationRemover()( TargetTransformationRemover()(src_expansion.kernel))) diff --git a/sumpy/e2p.py b/sumpy/e2p.py index f19ca7d74a16ada6135558ecb7761741d7a17b81..07066f39a26fa5ce4c9c3033daf6f1c21b5c84e0 100644 --- a/sumpy/e2p.py +++ b/sumpy/e2p.py @@ -23,11 +23,12 @@ THE SOFTWARE. from abc import ABC, abstractmethod import numpy as np + import loopy as lp +from loopy.version import MOST_RECENT_LANGUAGE_VERSION -from sumpy.tools import KernelCacheMixin, gather_loopy_arguments from sumpy.codegen import register_optimization_preambles -from loopy.version import MOST_RECENT_LANGUAGE_VERSION +from sumpy.tools import KernelCacheMixin, gather_loopy_arguments __doc__ = """ @@ -58,8 +59,10 @@ class E2PBase(KernelCacheMixin, ABC): if device is None: device = ctx.devices[0] - from sumpy.kernel import (SourceTransformationRemover, - TargetTransformationRemover) + from sumpy.kernel import ( + SourceTransformationRemover, + TargetTransformationRemover, + ) sxr = SourceTransformationRemover() txr = TargetTransformationRemover() expansion = expansion.with_kernel( diff --git a/sumpy/expansion/__init__.py b/sumpy/expansion/__init__.py index 294337dc482e3cb73f6e6e2d9dcae9f44ca1c6fa..e2edd47c27f6dc7470d156835af12b960d9e98cb 100644 --- a/sumpy/expansion/__init__.py +++ b/sumpy/expansion/__init__.py @@ -20,19 +20,19 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ +import logging from abc import ABC, abstractmethod -from typing import ( - Any, ClassVar, Dict, Hashable, List, Optional, Sequence, Tuple, Type) +from typing import Any, ClassVar, Dict, Hashable, List, Optional, Sequence, Tuple, Type -from pytools import memoize_method import loopy as lp +import pymbolic.primitives as prim +from pytools import memoize_method import sumpy.symbolic as sym from sumpy.kernel import Kernel from sumpy.tools import add_mi -import pymbolic.primitives as prim -import logging + logger = logging.getLogger(__name__) @@ -284,8 +284,8 @@ class ExpansionTermsWrangler(ABC): Returns identifiers for every coefficient in the complete expansion. """ from pytools import ( - generate_nonnegative_integer_tuples_summing_to_at_most - as gnitstam) + generate_nonnegative_integer_tuples_summing_to_at_most as gnitstam, + ) res = sorted(gnitstam(self.order, self.dim), key=sum) @@ -948,8 +948,9 @@ class DefaultExpansionFactory(ExpansionFactoryBase): :returns: a subclass of :class:`ExpansionBase` suitable for *base_kernel*. """ from sumpy.expansion.local import ( - LinearPDEConformingVolumeTaylorLocalExpansion, - VolumeTaylorLocalExpansion) + LinearPDEConformingVolumeTaylorLocalExpansion, + VolumeTaylorLocalExpansion, + ) try: base_kernel.get_base_kernel().get_pde_as_diff_op() return LinearPDEConformingVolumeTaylorLocalExpansion @@ -961,8 +962,9 @@ class DefaultExpansionFactory(ExpansionFactoryBase): :returns: a subclass of :class:`ExpansionBase` suitable for *base_kernel*. """ from sumpy.expansion.multipole import ( - LinearPDEConformingVolumeTaylorMultipoleExpansion, - VolumeTaylorMultipoleExpansion) + LinearPDEConformingVolumeTaylorMultipoleExpansion, + VolumeTaylorMultipoleExpansion, + ) try: base_kernel.get_base_kernel().get_pde_as_diff_op() return LinearPDEConformingVolumeTaylorMultipoleExpansion diff --git a/sumpy/expansion/diff_op.py b/sumpy/expansion/diff_op.py index bca672c7d0f13319bce1fdbecdcaa8efc6a6434d..bc439e516c6940b881a5f21bbe5c196181548d0f 100644 --- a/sumpy/expansion/diff_op.py +++ b/sumpy/expansion/diff_op.py @@ -20,15 +20,19 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ +import logging from dataclasses import dataclass -from pyrsistent import pmap -from pytools import memoize -from sumpy.tools import add_mi from itertools import accumulate -import sumpy.symbolic as sym -import logging from typing import List, Mapping, Sequence + import sympy as sp +from pyrsistent import pmap + +from pytools import memoize + +import sumpy.symbolic as sym +from sumpy.tools import add_mi + logger = logging.getLogger(__name__) @@ -139,7 +143,7 @@ class LinearPDESystemOperator: return len(did.mi) def to_sym(self, fnames=None): - from sumpy.symbolic import make_sym_vector, Function + from sumpy.symbolic import Function, make_sym_vector x = list(make_sym_vector("x", self.dim)) x += list(make_sym_vector("t", self.total_dims - self.dim)) diff --git a/sumpy/expansion/level_to_order.py b/sumpy/expansion/level_to_order.py index 9c9f13103ffd1397f217ac38487af63cd9b9bec7..37a729b9815fdba0c43acf41a8fb67b064bf80c4 100644 --- a/sumpy/expansion/level_to_order.py +++ b/sumpy/expansion/level_to_order.py @@ -48,9 +48,14 @@ class FMMLibExpansionOrderFinder: self.extra_order = extra_order def __call__(self, kernel, kernel_args, tree, level): - from pyfmmlib import ( # pylint: disable=no-name-in-module - l2dterms, l3dterms, h2dterms, h3dterms) - from sumpy.kernel import LaplaceKernel, HelmholtzKernel + from pyfmmlib import ( # pylint: disable=no-name-in-module + h2dterms, + h3dterms, + l2dterms, + l3dterms, + ) + + from sumpy.kernel import HelmholtzKernel, LaplaceKernel if isinstance(kernel, LaplaceKernel): if tree.dimensions == 2: @@ -127,7 +132,7 @@ class SimpleExpansionOrderFinder: self.extra_order = extra_order def __call__(self, kernel, kernel_args, tree, level): - from sumpy.kernel import LaplaceKernel, HelmholtzKernel + from sumpy.kernel import HelmholtzKernel, LaplaceKernel assert isinstance(kernel, (LaplaceKernel, HelmholtzKernel)) diff --git a/sumpy/expansion/local.py b/sumpy/expansion/local.py index 13933d736a86ae2d5dc0c33a3fa4dc92cce51a3e..512ba782a720cd068866e399b5836d669e6a164d 100644 --- a/sumpy/expansion/local.py +++ b/sumpy/expansion/local.py @@ -20,6 +20,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ +import logging import math from abc import abstractmethod @@ -27,13 +28,14 @@ from pytools import single_valued import sumpy.symbolic as sym from sumpy.expansion import ( - ExpansionBase, - VolumeTaylorExpansion, - VolumeTaylorExpansionMixin, - LinearPDEConformingVolumeTaylorExpansion) + ExpansionBase, + LinearPDEConformingVolumeTaylorExpansion, + VolumeTaylorExpansion, + VolumeTaylorExpansionMixin, +) from sumpy.tools import add_to_sac, mi_increment_axis -import logging + logger = logging.getLogger(__name__) __doc__ = """ @@ -225,7 +227,7 @@ class VolumeTaylorLocalExpansionBase(VolumeTaylorExpansionMixin, LocalExpansionB coeffs, rscale, sac=sac)) bvec_scaled = [b*rscale**-1 for b in bvec] - from sumpy.tools import mi_power, mi_factorial + from sumpy.tools import mi_factorial, mi_power result = sum( coeff @@ -490,7 +492,7 @@ class _FourierBesselLocalExpansion(LocalExpansionBase): if not self.use_rscale: rscale = 1 - from sumpy.symbolic import sym_real_norm_2, Hankel1 + from sumpy.symbolic import Hankel1, sym_real_norm_2 arg_scale = self.get_bessel_arg_scaling() @@ -507,7 +509,7 @@ class _FourierBesselLocalExpansion(LocalExpansionBase): if not self.use_rscale: rscale = 1 - from sumpy.symbolic import sym_real_norm_2, BesselJ + from sumpy.symbolic import BesselJ, sym_real_norm_2 bvec_len = sym_real_norm_2(bvec) target_angle_rel_center = sym.atan2(bvec[1], bvec[0]) @@ -522,7 +524,7 @@ class _FourierBesselLocalExpansion(LocalExpansionBase): def translate_from(self, src_expansion, src_coeff_exprs, src_rscale, dvec, tgt_rscale, sac=None, m2l_translation_classes_dependent_data=None): - from sumpy.symbolic import sym_real_norm_2, BesselJ + from sumpy.symbolic import BesselJ, sym_real_norm_2 if not self.use_rscale: src_rscale = 1 diff --git a/sumpy/expansion/loopy.py b/sumpy/expansion/loopy.py index 20be150a90ab24517d71637530c3c607b0867da7..6c4ad370460247e322edb0a63a7b6c137a1f65c8 100644 --- a/sumpy/expansion/loopy.py +++ b/sumpy/expansion/loopy.py @@ -20,17 +20,21 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ +import logging from typing import Sequence -import pymbolic -import loopy as lp + import numpy as np -from sumpy.expansion import ExpansionBase -from sumpy.kernel import Kernel + +import loopy as lp +import pymbolic + import sumpy.symbolic as sym from sumpy.assignment_collection import SymbolicAssignmentCollection +from sumpy.expansion import ExpansionBase +from sumpy.kernel import Kernel from sumpy.tools import gather_loopy_arguments, gather_loopy_source_arguments -import logging + logger = logging.getLogger(__name__) diff --git a/sumpy/expansion/m2l.py b/sumpy/expansion/m2l.py index 9a75f8ea67408d06a6d808f79ba3463018f199e9..951b76ab3fc750a5d9bb7e42daadfe30f2ff26ae 100644 --- a/sumpy/expansion/m2l.py +++ b/sumpy/expansion/m2l.py @@ -20,17 +20,19 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ +import logging from abc import ABC, abstractmethod from typing import Any, ClassVar, Tuple -import pymbolic -import loopy as lp import numpy as np + +import loopy as lp +import pymbolic + import sumpy.symbolic as sym -from sumpy.tools import ( - add_to_sac, matvec_toeplitz_upper_triangular) +from sumpy.tools import add_to_sac, matvec_toeplitz_upper_triangular + -import logging logger = logging.getLogger(__name__) __doc__ = """ @@ -69,8 +71,10 @@ class NonFFTM2LTranslationClassFactory(M2LTranslationClassFactoryBase): """Returns a subclass of :class:`M2LTranslationBase` suitable for *base_kernel* and *local_expansion_class*. """ - from sumpy.expansion.local import (VolumeTaylorLocalExpansionBase, - _FourierBesselLocalExpansion) + from sumpy.expansion.local import ( + VolumeTaylorLocalExpansionBase, + _FourierBesselLocalExpansion, + ) if issubclass(local_expansion_class, VolumeTaylorLocalExpansionBase): return VolumeTaylorM2LTranslation elif issubclass(local_expansion_class, _FourierBesselLocalExpansion): @@ -89,8 +93,10 @@ class FFTM2LTranslationClassFactory(M2LTranslationClassFactoryBase): """Returns a subclass of :class:`M2LTranslationBase` suitable for *base_kernel* and *local_expansion_class*. """ - from sumpy.expansion.local import (VolumeTaylorLocalExpansionBase, - _FourierBesselLocalExpansion) + from sumpy.expansion.local import ( + VolumeTaylorLocalExpansionBase, + _FourierBesselLocalExpansion, + ) if issubclass(local_expansion_class, VolumeTaylorLocalExpansionBase): return VolumeTaylorM2LWithFFT elif issubclass(local_expansion_class, _FourierBesselLocalExpansion): @@ -104,8 +110,10 @@ class DefaultM2LTranslationClassFactory(M2LTranslationClassFactoryBase): """An implementation of :class:`M2LTranslationClassFactoryBase` that gives the 'best known' translation type for each kernel and local expansion class""" def get_m2l_translation_class(self, base_kernel, local_expansion_class): - from sumpy.expansion.local import (VolumeTaylorLocalExpansionBase, - _FourierBesselLocalExpansion) + from sumpy.expansion.local import ( + VolumeTaylorLocalExpansionBase, + _FourierBesselLocalExpansion, + ) if issubclass(local_expansion_class, VolumeTaylorLocalExpansionBase): return VolumeTaylorM2LWithFFT elif issubclass(local_expansion_class, _FourierBesselLocalExpansion): @@ -307,6 +315,7 @@ class VolumeTaylorM2LTranslation(M2LTranslationBase): latter. """ from pytools import generate_nonnegative_integer_tuples_below as gnitb + from sumpy.tools import add_mi dim = tgt_expansion.dim @@ -837,7 +846,7 @@ class FourierBesselM2LTranslation(M2LTranslationBase): def translation_classes_dependent_data(self, tgt_expansion, src_expansion, src_rscale, dvec, sac): - from sumpy.symbolic import sym_real_norm_2, Hankel1 + from sumpy.symbolic import Hankel1, sym_real_norm_2 dvec_len = sym_real_norm_2(dvec) new_center_angle_rel_old_center = sym.atan2(dvec[1], dvec[0]) diff --git a/sumpy/expansion/multipole.py b/sumpy/expansion/multipole.py index d63a094b4d2b0ad1ac9b892251cb495d11446597..eed92b3b6035865204c37db333155c8c3d3936dd 100644 --- a/sumpy/expansion/multipole.py +++ b/sumpy/expansion/multipole.py @@ -20,18 +20,20 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ +import logging import math from abc import abstractmethod import sumpy.symbolic as sym from sumpy.expansion import ( ExpansionBase, + LinearPDEConformingVolumeTaylorExpansion, VolumeTaylorExpansion, VolumeTaylorExpansionMixin, - LinearPDEConformingVolumeTaylorExpansion) -from sumpy.tools import mi_set_axis, add_to_sac, mi_power, mi_factorial +) +from sumpy.tools import add_to_sac, mi_factorial, mi_power, mi_set_axis + -import logging logger = logging.getLogger(__name__) @@ -418,7 +420,7 @@ class _HankelBased2DMultipoleExpansion(MultipoleExpansionBase): if kernel is None: kernel = self.kernel - from sumpy.symbolic import sym_real_norm_2, BesselJ + from sumpy.symbolic import BesselJ, sym_real_norm_2 avec_len = sym_real_norm_2(avec) arg_scale = self.get_bessel_arg_scaling() @@ -437,7 +439,7 @@ class _HankelBased2DMultipoleExpansion(MultipoleExpansionBase): if not self.use_rscale: rscale = 1 - from sumpy.symbolic import sym_real_norm_2, Hankel1 + from sumpy.symbolic import Hankel1, sym_real_norm_2 bvec_len = sym_real_norm_2(bvec) target_angle_rel_center = sym.atan2(bvec[1], bvec[0]) @@ -461,7 +463,7 @@ class _HankelBased2DMultipoleExpansion(MultipoleExpansionBase): src_rscale = 1 tgt_rscale = 1 - from sumpy.symbolic import sym_real_norm_2, BesselJ + from sumpy.symbolic import BesselJ, sym_real_norm_2 dvec_len = sym_real_norm_2(dvec) new_center_angle_rel_old_center = sym.atan2(dvec[1], dvec[0]) diff --git a/sumpy/fmm.py b/sumpy/fmm.py index d956c100be8c159213970501a1eba41827712b00..836182f3509c931ea3c1ed34f7cc746fd7a68b62 100644 --- a/sumpy/fmm.py +++ b/sumpy/fmm.py @@ -27,24 +27,35 @@ __doc__ = """Integrates :mod:`boxtree` with :mod:`sumpy`. """ +from typing import List, TypeVar, Union + +from boxtree.fmm import ExpansionWranglerInterface, TreeIndependentDataForWrangler + import pyopencl as cl import pyopencl.array - from pytools import memoize_method -from boxtree.fmm import TreeIndependentDataForWrangler, ExpansionWranglerInterface from sumpy import ( - P2EFromSingleBox, P2EFromCSR, - E2PFromSingleBox, E2PFromCSR, - P2PFromCSR, - E2EFromCSR, M2LUsingTranslationClassesDependentData, - E2EFromChildren, E2EFromParent, - M2LGenerateTranslationClassesDependentData, - M2LPreprocessMultipole, M2LPostprocessLocal) -from sumpy.tools import (to_complex_dtype, AggregateProfilingEvent, - run_opencl_fft, get_opencl_fft_app, get_native_event) - -from typing import TypeVar, List, Union + E2EFromChildren, + E2EFromCSR, + E2EFromParent, + E2PFromCSR, + E2PFromSingleBox, + M2LGenerateTranslationClassesDependentData, + M2LPostprocessLocal, + M2LPreprocessMultipole, + M2LUsingTranslationClassesDependentData, + P2EFromCSR, + P2EFromSingleBox, + P2PFromCSR, +) +from sumpy.tools import ( + AggregateProfilingEvent, + get_native_event, + get_opencl_fft_app, + run_opencl_fft, + to_complex_dtype, +) # {{{ tree-independent data for wrangler @@ -506,8 +517,9 @@ class SumpyExpansionWrangler(ExpansionWranglerInterface): return source_array.with_queue(source_array.queue)[self.tree.user_source_ids] def reorder_potentials(self, potentials): - from pytools.obj_array import obj_array_vectorize import numpy as np + + from pytools.obj_array import obj_array_vectorize assert ( isinstance(potentials, np.ndarray) and potentials.dtype.char == "O") diff --git a/sumpy/kernel.py b/sumpy/kernel.py index 0c68aa15d6947f3da0b04f7768b9a60b20d585b2..31f1fe7ed41fa7415c46037983920b827fede613 100644 --- a/sumpy/kernel.py +++ b/sumpy/kernel.py @@ -20,17 +20,20 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ +from collections import defaultdict from typing import ClassVar, Tuple -import loopy as lp import numpy as np -from pymbolic.mapper import IdentityMapper, CSECachingMapperMixin -from sumpy.symbolic import pymbolic_real_norm_2, SpatialConstant -import sumpy.symbolic as sym -from pymbolic.primitives import make_sym_vector + +import loopy as lp from pymbolic import var +from pymbolic.mapper import CSECachingMapperMixin, IdentityMapper +from pymbolic.primitives import make_sym_vector from pytools import memoize_method -from collections import defaultdict + +import sumpy.symbolic as sym +from sumpy.symbolic import SpatialConstant, pymbolic_real_norm_2 + __doc__ = """ Kernel interface @@ -226,8 +229,10 @@ class Kernel: The typical use of this function is to apply source-variable derivatives to the kernel. """ - from sumpy.derivative_taker import (ExprDerivativeTaker, - DifferentiatedExprDerivativeTaker) + from sumpy.derivative_taker import ( + DifferentiatedExprDerivativeTaker, + ExprDerivativeTaker, + ) expr_dict = {(0,)*self.dim: 1} expr_dict = self.get_derivative_coeff_dict_at_source(expr_dict) if isinstance(expr, ExprDerivativeTaker): @@ -370,7 +375,8 @@ class ExpressionKernel(Kernel): for name, value in zip(self.init_arg_names, self.__getinitargs__()): if name in ["expression", "global_scaling_const"]: from pymbolic.mapper.persistent_hash import ( - PersistentHashWalkMapper as PersistentHashWalkMapper) + PersistentHashWalkMapper as PersistentHashWalkMapper, + ) PersistentHashWalkMapper(key_hash)(value) else: key_builder.rec(key_hash, value) @@ -445,7 +451,7 @@ class LaplaceKernel(ExpressionKernel): return LaplaceDerivativeTaker(self.get_expression(dvec), dvec, rscale, sac) def get_pde_as_diff_op(self): - from sumpy.expansion.diff_op import make_identity_diff_op, laplacian + from sumpy.expansion.diff_op import laplacian, make_identity_diff_op w = make_identity_diff_op(self.dim) return laplacian(w) @@ -494,7 +500,7 @@ class BiharmonicKernel(ExpressionKernel): sac) def get_pde_as_diff_op(self): - from sumpy.expansion.diff_op import make_identity_diff_op, laplacian + from sumpy.expansion.diff_op import laplacian, make_identity_diff_op w = make_identity_diff_op(self.dim) return laplacian(laplacian(w)) @@ -570,7 +576,7 @@ class HelmholtzKernel(ExpressionKernel): return HelmholtzDerivativeTaker(self.get_expression(dvec), dvec, rscale, sac) def get_pde_as_diff_op(self): - from sumpy.expansion.diff_op import make_identity_diff_op, laplacian + from sumpy.expansion.diff_op import laplacian, make_identity_diff_op w = make_identity_diff_op(self.dim) k = sym.Symbol(self.helmholtz_k_name) @@ -652,7 +658,7 @@ class YukawaKernel(ExpressionKernel): return HelmholtzDerivativeTaker(self.get_expression(dvec), dvec, rscale, sac) def get_pde_as_diff_op(self): - from sumpy.expansion.diff_op import make_identity_diff_op, laplacian + from sumpy.expansion.diff_op import laplacian, make_identity_diff_op w = make_identity_diff_op(self.dim) lam = sym.Symbol(self.yukawa_lambda_name) return (laplacian(w) - lam**2 * w) @@ -762,7 +768,7 @@ class ElasticityKernel(ExpressionKernel): mapper_method = "map_elasticity_kernel" def get_pde_as_diff_op(self): - from sumpy.expansion.diff_op import make_identity_diff_op, laplacian + from sumpy.expansion.diff_op import laplacian, make_identity_diff_op w = make_identity_diff_op(self.dim) return laplacian(laplacian(w)) @@ -848,7 +854,7 @@ class StressletKernel(ExpressionKernel): mapper_method = "map_stresslet_kernel" def get_pde_as_diff_op(self): - from sumpy.expansion.diff_op import make_identity_diff_op, laplacian + from sumpy.expansion.diff_op import laplacian, make_identity_diff_op w = make_identity_diff_op(self.dim) return laplacian(laplacian(w)) @@ -928,7 +934,7 @@ class LineOfCompressionKernel(ExpressionKernel): mapper_method = "map_line_of_compression_kernel" def get_pde_as_diff_op(self): - from sumpy.expansion.diff_op import make_identity_diff_op, laplacian + from sumpy.expansion.diff_op import laplacian, make_identity_diff_op w = make_identity_diff_op(self.dim) return laplacian(w) @@ -1044,8 +1050,10 @@ class AxisTargetDerivative(DerivativeBase): return f"AxisTargetDerivative({self.axis}, {self.inner_kernel!r})" def postprocess_at_target(self, expr, bvec): - from sumpy.derivative_taker import (DifferentiatedExprDerivativeTaker, - diff_derivative_coeff_dict) + from sumpy.derivative_taker import ( + DifferentiatedExprDerivativeTaker, + diff_derivative_coeff_dict, + ) from sumpy.symbolic import make_sym_vector as make_sympy_vector target_vec = make_sympy_vector(self.target_array_name, self.dim) @@ -1143,9 +1151,10 @@ class DirectionalTargetDerivative(DirectionalDerivative): return transform def postprocess_at_target(self, expr, bvec): - from sumpy.derivative_taker import (DifferentiatedExprDerivativeTaker, - diff_derivative_coeff_dict) - + from sumpy.derivative_taker import ( + DifferentiatedExprDerivativeTaker, + diff_derivative_coeff_dict, + ) from sumpy.symbolic import make_sym_vector as make_sympy_vector dir_vec = make_sympy_vector(self.dir_vec_name, self.dim) target_vec = make_sympy_vector(self.target_array_name, self.dim) @@ -1270,9 +1279,11 @@ class TargetPointMultiplier(KernelWrapper): return type(self)(self.axis, new_inner_kernel) def postprocess_at_target(self, expr, avec): + from sumpy.derivative_taker import ( + DifferentiatedExprDerivativeTaker, + ExprDerivativeTaker, + ) from sumpy.symbolic import make_sym_vector as make_sympy_vector - from sumpy.derivative_taker import (ExprDerivativeTaker, - DifferentiatedExprDerivativeTaker) expr = self.inner_kernel.postprocess_at_target(expr, avec) target_vec = make_sympy_vector(self.target_array_name, self.dim) diff --git a/sumpy/p2e.py b/sumpy/p2e.py index 7268275c26fbf6c0c18bb340cd7ef3304fea8b82..4a481609173ecf6bdf5add7294ffef9107532a99 100644 --- a/sumpy/p2e.py +++ b/sumpy/p2e.py @@ -20,14 +20,17 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ +import logging + import numpy as np + import loopy as lp from loopy.version import MOST_RECENT_LANGUAGE_VERSION -from sumpy.tools import KernelCacheMixin, KernelComputation from sumpy.codegen import register_optimization_preambles +from sumpy.tools import KernelCacheMixin, KernelComputation + -import logging logger = logging.getLogger(__name__) @@ -63,8 +66,10 @@ class P2EBase(KernelCacheMixin, KernelComputation): number of strength arrays that need to be passed in. By default all kernels use the same strength. """ - from sumpy.kernel import (TargetTransformationRemover, - SourceTransformationRemover) + from sumpy.kernel import ( + SourceTransformationRemover, + TargetTransformationRemover, + ) txr = TargetTransformationRemover() sxr = SourceTransformationRemover() diff --git a/sumpy/p2p.py b/sumpy/p2p.py index ed3e801295510b64939ddb425ca01f1c5ce3c491..d89c85e8539d097c9c917806628f4612bdbe7d6d 100644 --- a/sumpy/p2p.py +++ b/sumpy/p2p.py @@ -24,12 +24,12 @@ THE SOFTWARE. """ import numpy as np + import loopy as lp from loopy.version import MOST_RECENT_LANGUAGE_VERSION -from sumpy.tools import ( - KernelComputation, KernelCacheMixin, is_obj_array_like) from sumpy.codegen import register_optimization_preambles +from sumpy.tools import KernelCacheMixin, KernelComputation, is_obj_array_like __doc__ = """ @@ -65,8 +65,11 @@ class P2PBase(KernelCacheMixin, KernelComputation): Default: all kernels use the same strength. """ from pytools import single_valued - from sumpy.kernel import (TargetTransformationRemover, - SourceTransformationRemover) + + from sumpy.kernel import ( + SourceTransformationRemover, + TargetTransformationRemover, + ) txr = TargetTransformationRemover() sxr = SourceTransformationRemover() @@ -102,9 +105,10 @@ class P2PBase(KernelCacheMixin, KernelComputation): self.device.hashable_model_and_version_identifier) def get_loopy_insns_and_result_names(self): - from sumpy.symbolic import make_sym_vector from pymbolic import var + from sumpy.symbolic import make_sym_vector + dvec = make_sym_vector("d", self.dim) from sumpy.assignment_collection import SymbolicAssignmentCollection diff --git a/sumpy/point_calculus.py b/sumpy/point_calculus.py index 2a26ecfcb58b2bdf5f3b10ceadc306346ccec5e2..238f0341339062caad2c1f9c53477af9338db244 100644 --- a/sumpy/point_calculus.py +++ b/sumpy/point_calculus.py @@ -22,8 +22,10 @@ THE SOFTWARE. import numpy as np import numpy.linalg as la + from pytools import memoize_method + __doc__ = """ .. autoclass:: CalculusPatch @@ -119,8 +121,9 @@ class CalculusPatch: a high-order interpolation basis on the :py:attr:`points`. """ + from scipy.special import eval_chebyt # pylint: disable=no-name-in-module + from pytools import indices_in_shape - from scipy.special import eval_chebyt # pylint: disable=no-name-in-module def eval_basis(ind, x): result = 1 diff --git a/sumpy/qbx.py b/sumpy/qbx.py index 345d251aad4c85aa92b1b4b3e76553c3015cfe6e..50005ddfe2669a98d38c903edb494147e486aa76 100644 --- a/sumpy/qbx.py +++ b/sumpy/qbx.py @@ -24,17 +24,19 @@ THE SOFTWARE. """ +import logging + import numpy as np + import loopy as lp from loopy.version import MOST_RECENT_LANGUAGE_VERSION -import sumpy.symbolic as sym -from pytools import memoize_method from pymbolic import parse, var +from pytools import memoize_method + +import sumpy.symbolic as sym +from sumpy.tools import KernelCacheMixin, KernelComputation, is_obj_array_like -from sumpy.tools import ( - KernelComputation, KernelCacheMixin, is_obj_array_like) -import logging logger = logging.getLogger(__name__) @@ -503,11 +505,12 @@ class LayerPotentialMatrixSubsetGenerator(LayerPotentialBase): def find_jump_term(kernel, arg_provider): from sumpy.kernel import ( - AxisSourceDerivative, - AxisTargetDerivative, - DirectionalSourceDerivative, - DirectionalTargetDerivative, - DerivativeBase) + AxisSourceDerivative, + AxisTargetDerivative, + DerivativeBase, + DirectionalSourceDerivative, + DirectionalTargetDerivative, + ) tgt_derivatives = [] src_derivatives = [] diff --git a/sumpy/symbolic.py b/sumpy/symbolic.py index 089b1507ca591aa738420128d077654942da0387..4e1b527657cffbc8b37688f09f8e6ef164912586 100644 --- a/sumpy/symbolic.py +++ b/sumpy/symbolic.py @@ -34,12 +34,15 @@ __doc__ = """ """ +import logging +import math + import numpy as np -from pymbolic.mapper import IdentityMapper as IdentityMapperBase + import pymbolic.primitives as prim -import math +from pymbolic.mapper import IdentityMapper as IdentityMapperBase + -import logging logger = logging.getLogger(__name__) USE_SYMENGINE = False @@ -85,14 +88,18 @@ _find_symbolic_backend() if USE_SYMENGINE: import symengine as sym + from pymbolic.interop.symengine import ( PymbolicToSymEngineMapper as PymbolicToSympyMapperBase, - SymEngineToPymbolicMapper as SympyToPymbolicMapperBase) + SymEngineToPymbolicMapper as SympyToPymbolicMapperBase, + ) else: import sympy as sym + from pymbolic.interop.sympy import ( PymbolicToSympyMapper as PymbolicToSympyMapperBase, - SympyToPymbolicMapper as SympyToPymbolicMapperBase) + SympyToPymbolicMapper as SympyToPymbolicMapperBase, + ) # Symbolic API common to SymEngine and sympy. # Before adding a function here, make sure it's present in both modules. diff --git a/sumpy/tools.py b/sumpy/tools.py index 6b8b68825a18ac5755cbb9f107a8f046d27ef3e6..68c7627ec7e758fed9b761a36da705549a674a0c 100644 --- a/sumpy/tools.py +++ b/sumpy/tools.py @@ -31,16 +31,19 @@ from abc import ABC, abstractmethod from dataclasses import dataclass from typing import TYPE_CHECKING, Any, List, Optional, Sequence, Tuple -import loopy as lp import numpy as np + +import loopy as lp from pymbolic.mapper import WalkMapper from pytools import memoize_method from pytools.tag import Tag, tag_dataclass import sumpy.symbolic as sym + if TYPE_CHECKING: import numpy + import pyopencl from sumpy.kernel import Kernel diff --git a/sumpy/toys.py b/sumpy/toys.py index 45d71425efd50a58f73f3b3913724e50957e32ff..02e4e214bed478cc4655d111c43d7424e94115ba 100644 --- a/sumpy/toys.py +++ b/sumpy/toys.py @@ -1,5 +1,6 @@ from __future__ import annotations + __copyright__ = """ Copyright (C) 2017 Andreas Kloeckner Copyright (C) 2017 Matt Wala @@ -25,24 +26,30 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ -from typing import Sequence, Union, Optional, TYPE_CHECKING +from functools import partial +from numbers import Number +from typing import TYPE_CHECKING, Optional, Sequence, Union from pytools import memoize_method -from numbers import Number -from functools import partial + from sumpy.kernel import TargetTransformationRemover + if TYPE_CHECKING: + import pyopencl + from sumpy.kernel import Kernel from sumpy.visualization import FieldPlotter - import pyopencl + +import logging import numpy as np + import loopy as lp # noqa: F401 import pyopencl as cl import pyopencl.array -import logging + logger = logging.getLogger(__name__) __doc__ = """ @@ -116,8 +123,10 @@ class ToyContext: mpole_expn_class = \ expansion_factory.get_multipole_expansion_class(kernel) if local_expn_class is None: - from sumpy.expansion.m2l import (NonFFTM2LTranslationClassFactory, - FFTM2LTranslationClassFactory) + from sumpy.expansion.m2l import ( + FFTM2LTranslationClassFactory, + NonFFTM2LTranslationClassFactory, + ) if m2l_use_fft: m2l_translation_class_factory = FFTM2LTranslationClassFactory() else: @@ -297,6 +306,7 @@ def _e2p(psource, targets, e2p): np.array(psource.center, dtype=np.float64).reshape(toy_ctx.kernel.dim, 1)) from pytools.obj_array import make_obj_array + from sumpy.tools import vector_to_device coeffs = cl.array.to_device(queue, np.array([psource.coeffs])) @@ -389,8 +399,7 @@ def _m2l(psource, to_center, to_rscale, to_order, e2e, expn_class, expn_kwargs, src_rscale=np.float64(psource.rscale), **toy_ctx.extra_kernel_kwargs) - from sumpy.tools import (run_opencl_fft, get_opencl_fft_app, - get_native_event) + from sumpy.tools import get_native_event, get_opencl_fft_app, run_opencl_fft if toy_ctx.use_fft: fft_app = get_opencl_fft_app(queue, (expn_size,), @@ -878,8 +887,8 @@ def l_inf(psource: PotentialSource, radius: float, # {{{ schematic visualization def draw_box(el, eh, **kwargs): - import matplotlib.pyplot as pt import matplotlib.patches as mpatches + import matplotlib.pyplot as pt from matplotlib.path import Path pathdata = [ diff --git a/sumpy/version.py b/sumpy/version.py index 5f8b4ff710784f8cc7be175e4d1bfdf835dc2b20..a812f4d6766c1f53dc65971ba229100c0f264ec6 100644 --- a/sumpy/version.py +++ b/sumpy/version.py @@ -23,6 +23,8 @@ THE SOFTWARE. # {{{ find install- or run-time git revision import os + + if os.environ.get("AKPYTHON_EXEC_FROM_WITHIN_WITHIN_SETUP_PY") is not None: # We're just being exec'd by setup.py. We can't import anything. _git_rev = None diff --git a/sumpy/visualization.py b/sumpy/visualization.py index 258745982d7011492de11b71d6643352beaf4639..02803a8e3720f3df943a6e0a9fc51b3ca758fd06 100644 --- a/sumpy/visualization.py +++ b/sumpy/visualization.py @@ -30,7 +30,7 @@ import numpy as np def separate_by_real_and_imag(data, real_only): - from pytools.obj_array import obj_array_real_copy, obj_array_imag_copy + from pytools.obj_array import obj_array_imag_copy, obj_array_real_copy for name, field in data: try: @@ -165,7 +165,7 @@ class FieldPlotter: def show_vector_in_mayavi(self, fld, do_show=True, **kwargs): c = self.points - from mayavi import mlab # pylint: disable=import-error + from mayavi import mlab # pylint: disable=import-error mlab.quiver3d(c[0], c[1], c[2], fld[0], fld[1], fld[2], **kwargs) @@ -190,7 +190,7 @@ class FieldPlotter: nd_points = self.nd_points.squeeze()[self._get_nontrivial_dims()] squeezed_fld = fld.squeeze() - from mayavi import mlab # pylint: disable=import-error + from mayavi import mlab # pylint: disable=import-error mlab.surf(nd_points[0], nd_points[1], squeezed_fld, **kwargs) # vim: foldmethod=marker diff --git a/test/test_codegen.py b/test/test_codegen.py index 9c092e58efc85ed52e128226518609ab908ebf71..ff73bc73fa55aae2177ecdcb66b26dc5513ddc44 100644 --- a/test/test_codegen.py +++ b/test/test_codegen.py @@ -20,10 +20,12 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ -import pytest +import logging import sys -import logging +import pytest + + logger = logging.getLogger(__name__) @@ -53,12 +55,12 @@ def test_symbolic_assignment_name_uniqueness(): def test_line_taylor_coeff_growth(): # Regression test for LineTaylorLocalExpansion. # See https://gitlab.tiker.net/inducer/pytential/merge_requests/12 - from sumpy.kernel import LaplaceKernel - from sumpy.expansion.local import LineTaylorLocalExpansion - from sumpy.symbolic import make_sym_vector, SympyToPymbolicMapper - import numpy as np + from sumpy.expansion.local import LineTaylorLocalExpansion + from sumpy.kernel import LaplaceKernel + from sumpy.symbolic import SympyToPymbolicMapper, make_sym_vector + order = 10 expn = LineTaylorLocalExpansion(LaplaceKernel(2), order) avec = make_sym_vector("a", 2) diff --git a/test/test_cse.py b/test/test_cse.py index e884078800660b802ed5b4141c9f137e85267848..a1d913a67a04196a59ffeefe5feeb73dcad63d39 100644 --- a/test/test_cse.py +++ b/test/test_cse.py @@ -64,18 +64,22 @@ DAMAGE. # }}} -import pytest import sys +import pytest + import sumpy.symbolic as sym -from sumpy.cse import cse, preprocess_for_cse, postprocess_for_cse +from sumpy.cse import cse, postprocess_for_cse, preprocess_for_cse + if not sym.USE_SYMENGINE: - from sympy.simplify.cse_opts import sub_pre, sub_post from sympy.functions.special.hyper import meijerg from sympy.simplify import cse_opts + from sympy.simplify.cse_opts import sub_post, sub_pre import logging + + logger = logging.getLogger(__name__) w, x, y, z = sym.symbols("w,x,y,z") @@ -287,8 +291,8 @@ def test_pow_invpow(): @sympyonly def test_issue_4499(): # previously, this gave 16 constants + from sympy import S, Tuple from sympy.abc import a, b - from sympy import Tuple, S B = sym.Function("B") # noqa: N806 G = sym.Function("G") # noqa: N806 @@ -341,7 +345,7 @@ def test_issue_6169(): @sympyonly def test_cse_indexed(): - from sympy import IndexedBase, Idx + from sympy import Idx, IndexedBase len_y = 5 y = IndexedBase("y", shape=(len_y,)) x = IndexedBase("x", shape=(len_y,)) @@ -359,7 +363,7 @@ def test_cse_indexed(): @sympyonly def test_piecewise(): - from sympy import Piecewise, Eq + from sympy import Eq, Piecewise f = Piecewise((-z + x*y, Eq(y, 0)), (-z - x*y, True)) ans = cse(f) actual_ans = ([(x0, -z), (x1, x*y)], diff --git a/test/test_distributed.py b/test/test_distributed.py index dd21b224f0c316a2a63c68a61667151911cf781c..2e3911bbde84e38d72aa499f37357a976fadfce0 100644 --- a/test/test_distributed.py +++ b/test/test_distributed.py @@ -22,10 +22,13 @@ THE SOFTWARE. import os from functools import partial -import pyopencl as cl + import numpy as np import pytest +import pyopencl as cl + + # Note: Do not import mpi4py.MPI object at the module level, because OpenMPI does not # support recursive invocations. @@ -60,8 +63,8 @@ def _test_against_single_rank( from boxtree.traversal import FMMTraversalBuilder traversal_builder = FMMTraversalBuilder(cl_context, well_sep_is_n_away=2) - from sumpy.kernel import LaplaceKernel from sumpy.expansion import DefaultExpansionFactory + from sumpy.kernel import LaplaceKernel kernel = LaplaceKernel(dims) expansion_factory = DefaultExpansionFactory() local_expansion_factory = expansion_factory.get_local_expansion_class(kernel) diff --git a/test/test_fmm.py b/test/test_fmm.py index cf0c6a23b13314e3fb79ab7bd3d1ba5200130e82..21d312ac5b77428d13a4c59f3557895a4f07a691 100644 --- a/test/test_fmm.py +++ b/test/test_fmm.py @@ -20,39 +20,34 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ -import pytest -import sys +import logging import os +import sys from functools import partial import numpy as np import numpy.linalg as la +import pytest from arraycontext import pytest_generate_tests_for_array_contexts -from sumpy.array_context import ( # noqa: F401 - PytestPyOpenCLArrayContextFactory, _acf) - -from sumpy.kernel import ( - LaplaceKernel, - HelmholtzKernel, - YukawaKernel, - BiharmonicKernel) -from sumpy.expansion.multipole import ( - VolumeTaylorMultipoleExpansion, - H2DMultipoleExpansion, - Y2DMultipoleExpansion, - LinearPDEConformingVolumeTaylorMultipoleExpansion) + +from sumpy.array_context import PytestPyOpenCLArrayContextFactory, _acf # noqa: F401 from sumpy.expansion.local import ( - VolumeTaylorLocalExpansion, H2DLocalExpansion, + LinearPDEConformingVolumeTaylorLocalExpansion, + VolumeTaylorLocalExpansion, Y2DLocalExpansion, - LinearPDEConformingVolumeTaylorLocalExpansion) -from sumpy.fmm import ( - SumpyTreeIndependentDataForWrangler, - SumpyExpansionWrangler) +) +from sumpy.expansion.multipole import ( + H2DMultipoleExpansion, + LinearPDEConformingVolumeTaylorMultipoleExpansion, + VolumeTaylorMultipoleExpansion, + Y2DMultipoleExpansion, +) +from sumpy.fmm import SumpyExpansionWrangler, SumpyTreeIndependentDataForWrangler +from sumpy.kernel import BiharmonicKernel, HelmholtzKernel, LaplaceKernel, YukawaKernel -import logging logger = logging.getLogger(__name__) pytest_generate_tests = pytest_generate_tests_for_array_contexts([ @@ -397,7 +392,7 @@ def test_unified_single_and_double(actx_factory, visualize=False): dtype = np.float64 order = 3 - from sumpy.kernel import DirectionalSourceDerivative, AxisTargetDerivative + from sumpy.kernel import AxisTargetDerivative, DirectionalSourceDerivative deriv_knl = DirectionalSourceDerivative(knl, "dir_vec") @@ -445,6 +440,7 @@ def test_sumpy_fmm_timing_data_collection(ctx_factory, use_fft, visualize=False) logging.basicConfig(level=logging.INFO) import pyopencl as cl + from sumpy.array_context import PyOpenCLArrayContext ctx = ctx_factory() @@ -607,7 +603,7 @@ def test_sumpy_axis_source_derivative(actx_factory, visualize=False): target_to_source = actx.from_numpy(np.arange(tree.ntargets, dtype=np.int32)) self_extra_kwargs = {"target_to_source": target_to_source} - from sumpy.kernel import AxisTargetDerivative, AxisSourceDerivative + from sumpy.kernel import AxisSourceDerivative, AxisTargetDerivative pots = [] for tgt_knl, src_knl in [ @@ -675,7 +671,7 @@ def test_sumpy_target_point_multiplier(actx_factory, deriv_axes, visualize=False target_to_source = actx.from_numpy(np.arange(tree.ntargets, dtype=np.int32)) self_extra_kwargs = {"target_to_source": target_to_source} - from sumpy.kernel import TargetPointMultiplier, AxisTargetDerivative + from sumpy.kernel import AxisTargetDerivative, TargetPointMultiplier tgt_knls = [TargetPointMultiplier(0, knl), knl, knl] for axis in deriv_axes: diff --git a/test/test_kernels.py b/test/test_kernels.py index 8f0a98ef21e6308ff5de6252318b6f7c840dc7fe..8be53ec7984557e26b457bcfc9680cbaf6dcaf32 100644 --- a/test/test_kernels.py +++ b/test/test_kernels.py @@ -20,42 +20,46 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ -import pytest +import logging import sys from functools import partial import numpy as np import numpy.linalg as la +import pytest -from pytools.obj_array import make_obj_array -from pytools.convergence import PConvergenceVerifier from arraycontext import pytest_generate_tests_for_array_contexts -from sumpy.array_context import ( # noqa: F401 - PytestPyOpenCLArrayContextFactory, _acf) +from pytools.convergence import PConvergenceVerifier +from pytools.obj_array import make_obj_array import sumpy.symbolic as sym +import sumpy.toys as t +from sumpy.array_context import PytestPyOpenCLArrayContextFactory, _acf # noqa: F401 +from sumpy.expansion.local import ( + H2DLocalExpansion, + LinearPDEConformingVolumeTaylorLocalExpansion, + VolumeTaylorLocalExpansion, +) +from sumpy.expansion.m2l import ( + FFTM2LTranslationClassFactory, + NonFFTM2LTranslationClassFactory, +) from sumpy.expansion.multipole import ( - VolumeTaylorMultipoleExpansion, H2DMultipoleExpansion, + LinearPDEConformingVolumeTaylorMultipoleExpansion, + VolumeTaylorMultipoleExpansion, VolumeTaylorMultipoleExpansionBase, - LinearPDEConformingVolumeTaylorMultipoleExpansion) -from sumpy.expansion.local import ( - VolumeTaylorLocalExpansion, - H2DLocalExpansion, - LinearPDEConformingVolumeTaylorLocalExpansion) -from sumpy.expansion.m2l import (NonFFTM2LTranslationClassFactory, - FFTM2LTranslationClassFactory) +) from sumpy.kernel import ( - LaplaceKernel, - HelmholtzKernel, + AxisTargetDerivative, BiharmonicKernel, + DirectionalSourceDerivative, + HelmholtzKernel, + LaplaceKernel, StokesletKernel, - AxisTargetDerivative, - DirectionalSourceDerivative) +) -import sumpy.toys as t -import logging logger = logging.getLogger(__name__) pytest_generate_tests = pytest_generate_tests_for_array_contexts([ @@ -294,7 +298,7 @@ def test_p2e2p(actx_factory, base_knl, expn_class, order, with_source_derivative ] expn = expn_class(knl, order=order) - from sumpy import P2EFromSingleBox, E2PFromSingleBox, P2P + from sumpy import P2P, E2PFromSingleBox, P2EFromSingleBox p2e = P2EFromSingleBox(actx.context, expn, kernels=[knl]) e2p = E2PFromSingleBox(actx.context, expn, kernels=target_kernels) p2p = P2P(actx.context, target_kernels, exclude_self=False) diff --git a/test/test_matrixgen.py b/test/test_matrixgen.py index 4baf3031251b349646ba4b037d813b501d36cab8..516a958149d4b938a99b1cabcdc16e91fd60cc4c 100644 --- a/test/test_matrixgen.py +++ b/test/test_matrixgen.py @@ -20,17 +20,18 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ -import pytest +import logging import sys import numpy as np import numpy.linalg as la +import pytest from arraycontext import pytest_generate_tests_for_array_contexts -from sumpy.array_context import ( # noqa: F401 - PytestPyOpenCLArrayContextFactory, _acf) -import logging +from sumpy.array_context import PytestPyOpenCLArrayContextFactory, _acf # noqa: F401 + + logger = logging.getLogger(__name__) pytest_generate_tests = pytest_generate_tests_for_array_contexts([ @@ -97,7 +98,7 @@ def test_qbx_direct(actx_factory, factor, lpot_id, visualize=False): order = 12 mode_nr = 25 - from sumpy.kernel import LaplaceKernel, DirectionalSourceDerivative + from sumpy.kernel import DirectionalSourceDerivative, LaplaceKernel if lpot_id == 1: base_knl = LaplaceKernel(ndim) knl = base_knl @@ -191,7 +192,7 @@ def test_p2p_direct(actx_factory, exclude_self, factor, lpot_id, visualize=False ndim = 2 mode_nr = 25 - from sumpy.kernel import LaplaceKernel, DirectionalSourceDerivative + from sumpy.kernel import DirectionalSourceDerivative, LaplaceKernel if lpot_id == 1: lknl = LaplaceKernel(ndim) elif lpot_id == 2: diff --git a/test/test_misc.py b/test/test_misc.py index 0284257010a70cb50422dce25d3ca3d864445ee5..302f5b8587fdd2bf96902899079ba74b3a5f72c5 100644 --- a/test/test_misc.py +++ b/test/test_misc.py @@ -20,39 +20,47 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ -import pytest +import logging import sys from dataclasses import dataclass from typing import Any, Callable import numpy as np import numpy.linalg as la +import pytest from arraycontext import pytest_generate_tests_for_array_contexts -from sumpy.array_context import ( # noqa: F401 - PytestPyOpenCLArrayContextFactory, _acf) -import sumpy.toys as t import sumpy.symbolic as sym - +import sumpy.toys as t +from sumpy.array_context import PytestPyOpenCLArrayContextFactory, _acf # noqa: F401 +from sumpy.expansion import ( + FullExpansionTermsWrangler, + LinearPDEBasedExpansionTermsWrangler, +) +from sumpy.expansion.diff_op import ( + as_scalar_pde, + concat, + curl, + diff, + divergence, + gradient, + laplacian, + make_identity_diff_op, +) from sumpy.kernel import ( - LaplaceKernel, - HelmholtzKernel, BiharmonicKernel, - YukawaKernel, - StokesletKernel, - StressletKernel, ElasticityKernel, + ExpressionKernel, + HelmholtzKernel, + LaplaceKernel, LineOfCompressionKernel, - ExpressionKernel) -from sumpy.expansion.diff_op import ( - make_identity_diff_op, concat, as_scalar_pde, diff, - gradient, divergence, laplacian, curl) + StokesletKernel, + StressletKernel, + YukawaKernel, +) -from sumpy.expansion import (FullExpansionTermsWrangler, - LinearPDEBasedExpansionTermsWrangler) -import logging logger = logging.getLogger(__name__) pytest_generate_tests = pytest_generate_tests_for_array_contexts([ @@ -125,6 +133,7 @@ def test_pde_check_kernels(actx_factory, knl_info, order=5): np.ones(50)) from pytools.convergence import EOCRecorder + from sumpy.point_calculus import CalculusPatch eoc_rec = EOCRecorder() @@ -147,9 +156,10 @@ def test_pde_check_kernels(actx_factory, knl_info, order=5): @pytest.mark.parametrize("dim", [1, 2, 3]) def test_pde_check(dim, order=4): - from sumpy.point_calculus import CalculusPatch from pytools.convergence import EOCRecorder + from sumpy.point_calculus import CalculusPatch + for iaxis in range(dim): eoc_rec = EOCRecorder() for h in [0.1, 0.01, 0.001]: @@ -296,7 +306,7 @@ def test_toy_p2e2e2p(actx_factory, case): src = case.source.reshape(dim, -1) tgt = case.target.reshape(dim, -1) - from pymbolic import parse, evaluate + from pymbolic import evaluate, parse case_conv_factor = evaluate(parse(case.conv_factor), { "s": case.source, "c1": case.center1, @@ -373,7 +383,7 @@ def test_cse_matvec(): # {{{ test_diff_op_stokes def test_diff_op_stokes(): - from sumpy.symbolic import symbols, Function + from sumpy.symbolic import Function, symbols diff_op = make_identity_diff_op(3, 4) u = diff_op[:3] p = diff_op[3] @@ -515,9 +525,10 @@ def test_weird_kernel(pde): def get_pde_as_diff_op(self): return pde - from sumpy.expansion import LinearPDEConformingVolumeTaylorExpansion - from operator import mul from functools import reduce + from operator import mul + + from sumpy.expansion import LinearPDEConformingVolumeTaylorExpansion knl = MyKernel() order = 10 diff --git a/test/test_qbx.py b/test/test_qbx.py index 3ad439b9eef0747dacc6c879e2580c8e571a30b2..fa7f6044cdb408d8aebcbf454b4c511274802751 100644 --- a/test/test_qbx.py +++ b/test/test_qbx.py @@ -20,20 +20,18 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ -import pytest +import logging import sys import numpy as np +import pytest from arraycontext import pytest_generate_tests_for_array_contexts -from sumpy.array_context import ( # noqa: F401 - PytestPyOpenCLArrayContextFactory, _acf) -from sumpy.expansion.local import ( - LineTaylorLocalExpansion, - VolumeTaylorLocalExpansion) +from sumpy.array_context import PytestPyOpenCLArrayContextFactory, _acf # noqa: F401 +from sumpy.expansion.local import LineTaylorLocalExpansion, VolumeTaylorLocalExpansion + -import logging logger = logging.getLogger(__name__) pytest_generate_tests = pytest_generate_tests_for_array_contexts([ @@ -126,7 +124,7 @@ def test_direct_qbx_vs_eigval_with_tgt_deriv( actx = actx_factory() - from sumpy.kernel import LaplaceKernel, AxisTargetDerivative + from sumpy.kernel import AxisTargetDerivative, LaplaceKernel lknl = LaplaceKernel(2) order = 8 diff --git a/test/test_tools.py b/test/test_tools.py index 09c88b78e5c4d93f40a797b59215ad092964a2ba..2043fce9778d9eb67de64116001ad83528980500 100644 --- a/test/test_tools.py +++ b/test/test_tools.py @@ -20,23 +20,24 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ -import pytest +import logging import sys import numpy as np +import pytest from arraycontext import pytest_generate_tests_for_array_contexts -from sumpy.array_context import ( # noqa: F401 - PytestPyOpenCLArrayContextFactory, _acf) import sumpy.symbolic as sym +from sumpy.array_context import PytestPyOpenCLArrayContextFactory, _acf # noqa: F401 from sumpy.tools import ( + fft, fft_toeplitz_upper_triangular, - matvec_toeplitz_upper_triangular, loopy_fft, - fft) + matvec_toeplitz_upper_triangular, +) + -import logging logger = logging.getLogger(__name__) pytest_generate_tests = pytest_generate_tests_for_array_contexts([