diff --git a/.basedpyright/baseline.json b/.basedpyright/baseline.json index 4cf269371..fa3f4c231 100644 --- a/.basedpyright/baseline.json +++ b/.basedpyright/baseline.json @@ -778,11 +778,11 @@ } }, { - "code": "reportIndexIssue", + "code": "reportUnreachable", "range": { - "startColumn": 12, - "endColumn": 17, - "lineCount": 1 + "startColumn": 8, + "endColumn": 45, + "lineCount": 7 } }, { @@ -908,11 +908,11 @@ } }, { - "code": "reportIndexIssue", + "code": "reportUnreachable", "range": { - "startColumn": 12, - "endColumn": 17, - "lineCount": 1 + "startColumn": 8, + "endColumn": 45, + "lineCount": 7 } }, { @@ -924,43 +924,11 @@ } }, { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 19, - "endColumn": 41, - "lineCount": 1 - } - }, - { - "code": "reportUnknownVariableType", - "range": { - "startColumn": 32, - "endColumn": 44, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", + "code": "reportUnreachable", "range": { "startColumn": 8, "endColumn": 17, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 8, - "endColumn": 19, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 8, - "endColumn": 15, - "lineCount": 1 + "lineCount": 8 } } ], @@ -21186,35 +21154,11 @@ } }, { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 28, - "endColumn": 33, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 46, - "endColumn": 63, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 46, - "endColumn": 63, - "lineCount": 1 - } - }, - { - "code": "reportArgumentType", + "code": "reportUnreachable", "range": { - "startColumn": 41, - "endColumn": 53, - "lineCount": 1 + "startColumn": 8, + "endColumn": 56, + "lineCount": 4 } }, { @@ -28689,6 +28633,14 @@ "lineCount": 1 } }, + { + "code": "reportAbstractUsage", + "range": { + "startColumn": 19, + "endColumn": 18, + "lineCount": 4 + } + }, { "code": "reportCallIssue", "range": { @@ -28817,6 +28769,14 @@ "lineCount": 1 } }, + { + "code": "reportAbstractUsage", + "range": { + "startColumn": 19, + "endColumn": 18, + "lineCount": 4 + } + }, { "code": "reportCallIssue", "range": { @@ -44037,14 +43997,6 @@ "lineCount": 1 } }, - { - "code": "reportUnnecessaryTypeIgnoreComment", - "range": { - "startColumn": 97, - "endColumn": 117, - "lineCount": 1 - } - }, { "code": "reportUnknownVariableType", "range": { @@ -44053,38 +44005,6 @@ "lineCount": 1 } }, - { - "code": "reportUnknownVariableType", - "range": { - "startColumn": 12, - "endColumn": 18, - "lineCount": 1 - } - }, - { - "code": "reportOptionalSubscript", - "range": { - "startColumn": 21, - "endColumn": 48, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 49, - "endColumn": 70, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 49, - "endColumn": 55, - "lineCount": 1 - } - }, { "code": "reportUnknownMemberType", "range": { @@ -44260,6 +44180,24 @@ } } ], + "./test/test_layer_pot_eigenvalues.py": [ + { + "code": "reportUnreachable", + "range": { + "startColumn": 12, + "endColumn": 21, + "lineCount": 8 + } + }, + { + "code": "reportUnreachable", + "range": { + "startColumn": 12, + "endColumn": 21, + "lineCount": 4 + } + } + ], "./test/test_layer_pot_identity.py": [ { "code": "reportReturnType", diff --git a/doc/conf.py b/doc/conf.py index 1d2b79e0e..a6a727a03 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -101,7 +101,7 @@ # sumpy "ExpansionBase": "class:sumpy.expansion.ExpansionBase", "ExpansionFactoryBase": "class:sumpy.expansion.ExpansionFactoryBase", - "Kernel": "class:sumpy.kernel.Kernel", + "ScalarKernel": "class:sumpy.kernel.ScalarKernel", "HelmholtzKernel": "class:sumpy.kernel.HelmholtzKernel", "P2P": "class:sumpy.p2p.P2P", "P2PBase": "class:sumpy.p2p.P2PBase", diff --git a/pytential/linalg/proxy.py b/pytential/linalg/proxy.py index 86c0adc65..d5d47063d 100644 --- a/pytential/linalg/proxy.py +++ b/pytential/linalg/proxy.py @@ -51,7 +51,7 @@ from boxtree.tree_build import TreeKind from sumpy.expansion import ExpansionBase - from sumpy.kernel import Kernel + from sumpy.kernel import ScalarKernel from pytential.linalg.utils import IndexList from pytential.symbolic.dof_desc import DOFDescriptorLike @@ -182,7 +182,7 @@ def __init__(self, self.lpot_source = lpot_source def get_expansion_for_qbx_direct_eval( - self, base_kernel: Kernel, target_kernels: Sequence[Kernel] + self, base_kernel: ScalarKernel, target_kernels: Sequence[ScalarKernel] ) -> ExpansionBase: """Wrapper around ``pytential.qbx.QBXLayerPotentialSource.get_expansion_for_qbx_direct_eval`` diff --git a/pytential/qbx/__init__.py b/pytential/qbx/__init__.py index e628027e8..0e704e9cc 100644 --- a/pytential/qbx/__init__.py +++ b/pytential/qbx/__init__.py @@ -58,7 +58,7 @@ from pymbolic import ArithmeticExpression from sumpy.expansion import LocalExpansionFactory from sumpy.fmm import FMMLevelToOrder - from sumpy.kernel import Kernel + from sumpy.kernel import ScalarKernel from pytential.collection import GeometryCollection, GeometryLike from pytential.qbx.cost import AbstractQBXCostModel @@ -99,7 +99,7 @@ class QBXDefaultExpansionFactory(DefaultExpansionFactoryBase): """An expansion factory to create QBX local, local and multipole expansions """ def get_qbx_local_expansion_class(self, - kernel: Kernel, / + kernel: ScalarKernel, / ) -> LocalExpansionFactory: local_expn_class = DefaultExpansionFactoryBase.get_local_expansion_class( self, kernel) @@ -199,7 +199,7 @@ def __init__( :arg fmm_level_to_order: A callable that takes arguments of *(kernel, kernel_args, tree, level)* and returns the expansion order to be used on a given *level* of *tree* with *kernel*, where - *kernel* is the :class:`sumpy.kernel.Kernel` being evaluated, and + *kernel* is the :class:`sumpy.kernel.ScalarKernel` being evaluated, and *kernel_args* is a set of *(key, value)* tuples with evaluated kernel arguments. May not be given if *fmm_order* is given. :arg fmm_backend: a string denoting the desired FMM backend to use, diff --git a/pytential/source.py b/pytential/source.py index b0329dcc7..f3c254ea1 100644 --- a/pytential/source.py +++ b/pytential/source.py @@ -45,7 +45,7 @@ import pyopencl as cl from meshmode.discretization import Discretization - from sumpy.kernel import Kernel + from sumpy.kernel import ScalarKernel from sumpy.p2p import P2P from pytential.collection import GeometryCollection @@ -103,16 +103,16 @@ def op_group_features(self, expr: IntG) -> tuple[Hashable, ...]: def get_p2p(self, actx: PyOpenCLArrayContext, - target_kernels: tuple[Kernel, ...], - source_kernels: tuple[Kernel, ...] | None = None) -> P2P: + target_kernels: tuple[ScalarKernel, ...], + source_kernels: tuple[ScalarKernel, ...] | None = None) -> P2P: """ :returns: a subclass of :class:`~sumpy.p2p.P2P` for evaluating the *target_kernels* and the *source_kernels* on the source geometry. """ @memoize_in(actx, (PotentialSource, "p2p")) - def p2p(target_kernels: tuple[Kernel, ...], - source_kernels: tuple[Kernel, ...] | None) -> P2P: + def p2p(target_kernels: tuple[ScalarKernel, ...], + source_kernels: tuple[ScalarKernel, ...] | None) -> P2P: if any(knl.is_complex_valued for knl in target_kernels): value_dtype = self.complex_dtype else: @@ -364,7 +364,7 @@ def complex_dtype(self) -> np.dtype[np.complexfloating]: # {{{ fmm setup helpers - def get_fmm_kernel(self, kernels: Iterable[Kernel]) -> Kernel | None: + def get_fmm_kernel(self, kernels: Iterable[ScalarKernel]) -> ScalarKernel | None: fmm_kernel = None from sumpy.kernel import TargetTransformationRemover @@ -380,7 +380,7 @@ def get_fmm_kernel(self, kernels: Iterable[Kernel]) -> Kernel | None: def get_fmm_output_and_expansion_dtype( self, - kernels: Iterable[Kernel], + kernels: Iterable[ScalarKernel], strengths: ArrayOrContainerOrScalar) -> np.dtype[Any]: if ( any(knl.is_complex_valued for knl in kernels) @@ -392,7 +392,7 @@ def get_fmm_output_and_expansion_dtype( def get_fmm_expansion_wrangler_extra_kwargs( self, actx: PyOpenCLArrayContext, - target_kernels: tuple[Kernel, ...], + target_kernels: tuple[ScalarKernel, ...], tree_user_source_ids: Array, arguments: KernelArgumentMapping, evaluator: Callable[[Operand], ArrayOrContainerOrScalar], diff --git a/pytential/symbolic/compiler.py b/pytential/symbolic/compiler.py index ae8e12b06..e17a2589f 100644 --- a/pytential/symbolic/compiler.py +++ b/pytential/symbolic/compiler.py @@ -54,7 +54,7 @@ from pymbolic.geometric_algebra import MultiVector from pymbolic.mapper.dependency import Dependency from pymbolic.typing import Expression - from sumpy.kernel import Kernel + from sumpy.kernel import ScalarKernel from pytential.collection import GeometryCollection from pytential.symbolic.primitives import KernelArgumentMapping, Operand @@ -229,14 +229,14 @@ class ComputePotential(Statement): """A tuple of :class:`PotentialOutput` instances. The entries in the list correspond to :attr:`Statement.names`. """ - target_kernels: tuple[Kernel, ...] - """A tuple of :class:`sumpy.kernel.Kernel` instances, indexed by + target_kernels: tuple[ScalarKernel, ...] + """A tuple of :class:`sumpy.kernel.ScalarKernel` instances, indexed by :attr:`PotentialOutput.target_kernel_index`. """ kernel_arguments: KernelArgumentMapping """A dictionary mapping argument names to kernel arguments.""" - source_kernels: tuple[Kernel, ...] - """A tuple of :class:`sumpy.kernel.Kernel` instances with only source + source_kernels: tuple[ScalarKernel, ...] + """A tuple of :class:`sumpy.kernel.ScalarKernel` instances with only source derivatives and no target derivatives. See the :class:`~pytential.symbolic.primitives.IntG` docstring for details. """ diff --git a/pytential/symbolic/pde/beltrami.py b/pytential/symbolic/pde/beltrami.py index b1e7fdee7..d6b515b7f 100644 --- a/pytential/symbolic/pde/beltrami.py +++ b/pytential/symbolic/pde/beltrami.py @@ -39,7 +39,7 @@ if TYPE_CHECKING: - from sumpy.kernel import Kernel + from sumpy.kernel import ScalarKernel # {{{ beltrami operator @@ -85,7 +85,8 @@ class BeltramiOperator: .. automethod:: operator """ - def __init__(self, kernel: Kernel, *, + def __init__( + self, kernel: ScalarKernel, *, dim: int | None = None, precond: str = "left", kernel_arguments: dict[str, Any] | None = None) -> None: diff --git a/pytential/symbolic/pde/scalar.py b/pytential/symbolic/pde/scalar.py index 48dc71584..2f3ab96f5 100644 --- a/pytential/symbolic/pde/scalar.py +++ b/pytential/symbolic/pde/scalar.py @@ -44,7 +44,7 @@ from typing_extensions import override from pymbolic.typing import ArithmeticExpression -from sumpy.kernel import DirectionalSourceDerivative, Kernel +from sumpy.kernel import DirectionalSourceDerivative, ScalarKernel from pytential import sym @@ -96,14 +96,14 @@ class L2WeightedPDEOperator(ABC): .. automethod:: __init__ """ - kernel: Kernel + kernel: ScalarKernel """The kernel used in the integral operator.""" use_l2_weighting: bool """If *True*, :math:`L^2`-weighting is performed. This can be turned off for testing purposes, but should be enabled for other applications. """ - def __init__(self, kernel: Kernel, *, use_l2_weighting: bool = True) -> None: + def __init__(self, kernel: ScalarKernel, *, use_l2_weighting: bool = True) -> None: self.kernel = kernel self.use_l2_weighting = use_l2_weighting @@ -237,13 +237,13 @@ class DirichletOperator(L2WeightedPDEOperator): def __init__( self, - kernel: Kernel, + kernel: ScalarKernel, loc_sign: Side, *, alpha: complex | None = None, use_l2_weighting: bool = False, kernel_arguments: dict[str, Operand] | None = None) -> None: assert loc_sign in [-1, 1] - assert isinstance(kernel, Kernel) + assert isinstance(kernel, ScalarKernel) if kernel_arguments is None: kernel_arguments = {} @@ -398,14 +398,14 @@ class NeumannOperator(L2WeightedPDEOperator): """ def __init__(self, - kernel: Kernel, + kernel: ScalarKernel, loc_sign: Side, *, alpha: complex | None = None, use_improved_operator: bool = True, use_l2_weighting: bool = False, kernel_arguments: dict[str, Any] | None = None): assert loc_sign in [-1, 1] - assert isinstance(kernel, Kernel) + assert isinstance(kernel, ScalarKernel) if kernel_arguments is None: kernel_arguments = {} @@ -589,12 +589,12 @@ class BiharmonicClampedPlateOperator: .. automethod:: __init__ """ - kernel: Kernel + kernel: ScalarKernel """The kernel used in the integral operator.""" loc_sign: Side """Side of the operator evaluation.""" - def __init__(self, kernel: Kernel, loc_sign: Side) -> None: + def __init__(self, kernel: ScalarKernel, loc_sign: Side) -> None: if loc_sign != -1: raise ValueError( "only interior problems (loc_sign == -1) are supported") @@ -644,10 +644,10 @@ def default_map_potentials(x: ArithmeticExpression) -> ArithmeticExpression: map_potentials = default_map_potentials - def dn(knl: Kernel) -> Kernel: + def dn(knl: ScalarKernel) -> ScalarKernel: return DirectionalSourceDerivative(knl, "normal_dir") - def dt(knl: Kernel) -> Kernel: + def dt(knl: ScalarKernel) -> ScalarKernel: return DirectionalSourceDerivative(knl, "tangent_dir") from pytools.obj_array import from_numpy diff --git a/pytential/symbolic/primitives.py b/pytential/symbolic/primitives.py index ccc4ec2d4..b46006510 100644 --- a/pytential/symbolic/primitives.py +++ b/pytential/symbolic/primitives.py @@ -67,7 +67,7 @@ ShapeT, from_numpy, ) -from sumpy.kernel import Kernel +from sumpy.kernel import ScalarKernel from sumpy.symbolic import SpatialConstant from pytential.symbolic.dof_desc import ( @@ -1871,8 +1871,8 @@ class IntG(ExpressionNode): .. autoattribute:: kernel_arguments """ - target_kernel: Kernel - """An instance of :class:`~sumpy.kernel.Kernel` with only target dervatives + target_kernel: ScalarKernel + """An instance of :class:`~sumpy.kernel.ScalarKernel` with only target dervatives attached. This represents the target derivative operator :math:`T` above. Note that the term ``target_kernel`` is bad as it's not a kernel and merely @@ -1880,8 +1880,8 @@ class IntG(ExpressionNode): properly supports derivative operators. This also means that the user has to make sure that base kernels of all the kernels passed are the same. """ - source_kernels: tuple[Kernel, ...] - """A tuple of instances of :class:`~sumpy.kernel.Kernel` with only source + source_kernels: tuple[ScalarKernel, ...] + """A tuple of instances of :class:`~sumpy.kernel.ScalarKernel` with only source derivatives attached. k-th elements represents the k-th source derivative operator above. """ @@ -1920,16 +1920,16 @@ class IntG(ExpressionNode): """ kernel_arguments: KernelArgumentMapping = field(default_factory=dict) - """A dictionary mapping named :class:`~sumpy.kernel.Kernel` arguments - (see :meth:`~sumpy.kernel.Kernel.get_args` and - :meth:`~sumpy.kernel.Kernel.get_source_args`) to expressions that determine + """A dictionary mapping named :class:`~sumpy.kernel.ScalarKernel` arguments + (see :meth:`~sumpy.kernel.ScalarKernel.get_args` and + :meth:`~sumpy.kernel.ScalarKernel.get_source_args`) to expressions that determine them. """ def __init__( self, - target_kernel: Kernel, - source_kernels: Iterable[Kernel], + target_kernel: ScalarKernel, + source_kernels: Iterable[ScalarKernel], densities: Iterable[ArithmeticExpression], qbx_forced_limit: QBXForcedLimit, source: DOFDescriptorLike | None = None, @@ -2088,7 +2088,7 @@ def __hash__(self) -> int: _DIR_VEC_NAME = "dsource_vec" -def _insert_source_derivative_into_kernel(kernel: Kernel) -> Kernel: +def _insert_source_derivative_into_kernel(kernel: ScalarKernel) -> ScalarKernel: # Inserts the source derivative at the innermost kernel wrapping level. from sumpy.kernel import DirectionalSourceDerivative @@ -2139,7 +2139,7 @@ def map_quotient(self, expr: Quotient) -> CoeffsT: def int_g_dsource( ambient_dim: int, dsource: MultiVector[ArithmeticExpression], - kernel: Kernel, + kernel: ScalarKernel, density: Operand, qbx_forced_limit: QBXForcedLimit, source: DOFDescriptorLike | None = None, @@ -2193,7 +2193,7 @@ class _unspecified: # noqa: N801 def int_g_vec( - kernel: Kernel, + kernel: ScalarKernel, density: OperandTc, qbx_forced_limit: QBXForcedLimit, source: DOFDescriptorLike = None, @@ -2248,7 +2248,7 @@ def make_op(operand_i: ArithmeticExpression) -> IntG: def S( - kernel: Kernel, + kernel: ScalarKernel, density: OperandTc, qbx_forced_limit: QBXForcedLimit = _unspecified, source: DOFDescriptorLike = None, @@ -2311,7 +2311,7 @@ def normal_second_derivative( def Sp( - kernel: Kernel, + kernel: ScalarKernel, density: OperandTc, qbx_forced_limit: QBXForcedLimit = _unspecified, source: DOFDescriptorLike | None = None, @@ -2326,7 +2326,7 @@ def Sp( "Choosing default 'avg'.", stacklevel=2) qbx_forced_limit = "avg" - if ambient_dim is None and isinstance(kernel, Kernel): + if ambient_dim is None and isinstance(kernel, ScalarKernel): ambient_dim = kernel.dim if ambient_dim is None: @@ -2341,7 +2341,7 @@ def Sp( def Spp( - kernel: Kernel, + kernel: ScalarKernel, density: ArithmeticExpression, qbx_forced_limit: QBXForcedLimit = _unspecified, source: DOFDescriptorLike | None = None, @@ -2356,7 +2356,7 @@ def Spp( "Choosing default '+1'.", stacklevel=2) qbx_forced_limit = +1 - if ambient_dim is None and isinstance(kernel, Kernel): + if ambient_dim is None and isinstance(kernel, ScalarKernel): ambient_dim = kernel.dim if ambient_dim is None: @@ -2371,7 +2371,7 @@ def Spp( def D( - kernel: Kernel, + kernel: ScalarKernel, density: OperandTc, qbx_forced_limit: QBXForcedLimit = _unspecified, source: DOFDescriptorLike | None = None, @@ -2386,7 +2386,7 @@ def D( "Choosing default 'avg'.", stacklevel=2) qbx_forced_limit = "avg" - if ambient_dim is None and isinstance(kernel, Kernel): + if ambient_dim is None and isinstance(kernel, ScalarKernel): ambient_dim = kernel.dim if ambient_dim is None: @@ -2405,7 +2405,7 @@ def D( def Dp( - kernel: Kernel, + kernel: ScalarKernel, density: OperandTc, qbx_forced_limit: QBXForcedLimit = _unspecified, source: DOFDescriptorLike | None = None, @@ -2420,7 +2420,7 @@ def Dp( "Choosing default '+1'.", stacklevel=2) qbx_forced_limit = +1 - if ambient_dim is None and isinstance(kernel, Kernel): + if ambient_dim is None and isinstance(kernel, ScalarKernel): ambient_dim = kernel.dim if ambient_dim is None: diff --git a/pytential/symbolic/stokes.py b/pytential/symbolic/stokes.py index 4ae4cafbc..7c7f71f11 100644 --- a/pytential/symbolic/stokes.py +++ b/pytential/symbolic/stokes.py @@ -25,7 +25,11 @@ import numpy as np -from sumpy.kernel import LaplaceKernel, StokesletKernel, StressletKernel +from sumpy.kernel import ( + LaplaceKernel, + StokesletComponentKernel, + StressletComponentKernel, +) from pytential import sym @@ -43,7 +47,7 @@ # {{{ StokesletWrapper class StokesletWrapper: - """Wrapper class for the :class:`~sumpy.kernel.StokesletKernel` kernel. + """Wrapper class for the :class:`~sumpy.kernel.StokesletComponentKernel` kernel. This class is meant to shield the user from the messiness of writing out every term in the expansion of the double-indexed Stokeslet kernel @@ -84,23 +88,21 @@ def __init__(self, dim: int): if dim == 2: self.kernel_dict = { - (2, 0): StokesletKernel(dim=2, icomp=0, jcomp=0), - (1, 1): StokesletKernel(dim=2, icomp=0, jcomp=1), - (0, 2): StokesletKernel(dim=2, icomp=1, jcomp=1) - } - + (2, 0): StokesletComponentKernel(dim=2, icomp=0, jcomp=0), + (1, 1): StokesletComponentKernel(dim=2, icomp=0, jcomp=1), + (0, 2): StokesletComponentKernel(dim=2, icomp=1, jcomp=1) + } elif dim == 3: self.kernel_dict = { - (2, 0, 0): StokesletKernel(dim=3, icomp=0, jcomp=0), - (1, 1, 0): StokesletKernel(dim=3, icomp=0, jcomp=1), - (1, 0, 1): StokesletKernel(dim=3, icomp=0, jcomp=2), - (0, 2, 0): StokesletKernel(dim=3, icomp=1, jcomp=1), - (0, 1, 1): StokesletKernel(dim=3, icomp=1, jcomp=2), - (0, 0, 2): StokesletKernel(dim=3, icomp=2, jcomp=2) - } - + (2, 0, 0): StokesletComponentKernel(dim=3, icomp=0, jcomp=0), + (1, 1, 0): StokesletComponentKernel(dim=3, icomp=0, jcomp=1), + (1, 0, 1): StokesletComponentKernel(dim=3, icomp=0, jcomp=2), + (0, 2, 0): StokesletComponentKernel(dim=3, icomp=1, jcomp=1), + (0, 1, 1): StokesletComponentKernel(dim=3, icomp=1, jcomp=2), + (0, 0, 2): StokesletComponentKernel(dim=3, icomp=2, jcomp=2) + } else: - raise ValueError("unsupported dimension given to StokesletWrapper") + raise ValueError(f"unsupported dimension given to StokesletWrapper: {dim}") def apply(self, density_vec_sym, mu_sym, qbx_forced_limit): """Symbolic expressions for integrating Stokeslet kernel. @@ -273,7 +275,7 @@ def apply_stress(self, density_vec_sym, dir_vec_sym, # {{{ StressletWrapper class StressletWrapper: - """Wrapper class for the :class:`~sumpy.kernel.StressletKernel` kernel. + """Wrapper class for the :class:`~sumpy.kernel.StressletComponentKernel` kernel. This class is meant to shield the user from the messiness of writing out every term in the expansion of the triple-indexed Stresslet @@ -313,28 +315,26 @@ def __init__(self, dim: int): if dim == 2: self.kernel_dict = { - (3, 0): StressletKernel(dim=2, icomp=0, jcomp=0, kcomp=0), - (2, 1): StressletKernel(dim=2, icomp=0, jcomp=0, kcomp=1), - (1, 2): StressletKernel(dim=2, icomp=0, jcomp=1, kcomp=1), - (0, 3): StressletKernel(dim=2, icomp=1, jcomp=1, kcomp=1) - } - + (3, 0): StressletComponentKernel(dim=2, icomp=0, jcomp=0, kcomp=0), + (2, 1): StressletComponentKernel(dim=2, icomp=0, jcomp=0, kcomp=1), + (1, 2): StressletComponentKernel(dim=2, icomp=0, jcomp=1, kcomp=1), + (0, 3): StressletComponentKernel(dim=2, icomp=1, jcomp=1, kcomp=1) + } elif dim == 3: self.kernel_dict = { - (3, 0, 0): StressletKernel(dim=3, icomp=0, jcomp=0, kcomp=0), - (2, 1, 0): StressletKernel(dim=3, icomp=0, jcomp=0, kcomp=1), - (2, 0, 1): StressletKernel(dim=3, icomp=0, jcomp=0, kcomp=2), - (1, 2, 0): StressletKernel(dim=3, icomp=0, jcomp=1, kcomp=1), - (1, 1, 1): StressletKernel(dim=3, icomp=0, jcomp=1, kcomp=2), - (1, 0, 2): StressletKernel(dim=3, icomp=0, jcomp=2, kcomp=2), - (0, 3, 0): StressletKernel(dim=3, icomp=1, jcomp=1, kcomp=1), - (0, 2, 1): StressletKernel(dim=3, icomp=1, jcomp=1, kcomp=2), - (0, 1, 2): StressletKernel(dim=3, icomp=1, jcomp=2, kcomp=2), - (0, 0, 3): StressletKernel(dim=3, icomp=2, jcomp=2, kcomp=2) - } - + (3, 0, 0): StressletComponentKernel(dim=3, icomp=0, jcomp=0, kcomp=0), + (2, 1, 0): StressletComponentKernel(dim=3, icomp=0, jcomp=0, kcomp=1), + (2, 0, 1): StressletComponentKernel(dim=3, icomp=0, jcomp=0, kcomp=2), + (1, 2, 0): StressletComponentKernel(dim=3, icomp=0, jcomp=1, kcomp=1), + (1, 1, 1): StressletComponentKernel(dim=3, icomp=0, jcomp=1, kcomp=2), + (1, 0, 2): StressletComponentKernel(dim=3, icomp=0, jcomp=2, kcomp=2), + (0, 3, 0): StressletComponentKernel(dim=3, icomp=1, jcomp=1, kcomp=1), + (0, 2, 1): StressletComponentKernel(dim=3, icomp=1, jcomp=1, kcomp=2), + (0, 1, 2): StressletComponentKernel(dim=3, icomp=1, jcomp=2, kcomp=2), + (0, 0, 3): StressletComponentKernel(dim=3, icomp=2, jcomp=2, kcomp=2) + } else: - raise ValueError("unsupported dimension given to StressletWrapper") + raise ValueError(f"unsupported dimension given to StressletWrapper: {dim}") def apply(self, density_vec_sym, dir_vec_sym, mu_sym, qbx_forced_limit): """Symbolic expressions for integrating Stresslet kernel. diff --git a/test/extra_int_eq_data.py b/test/extra_int_eq_data.py index 944ce5a70..b66edda9a 100644 --- a/test/extra_int_eq_data.py +++ b/test/extra_int_eq_data.py @@ -49,7 +49,7 @@ from arraycontext import ArrayContext from boxtree.tree_build import ExtentNorm - from sumpy.kernel import Kernel + from sumpy.kernel import ScalarKernel from pytential.array_context import PyOpenCLArrayContext from pytential.symbolic.pde.scalar import L2WeightedPDEOperator @@ -121,7 +121,7 @@ class IntegralEquationTestCase(ABC): ambient_dim: int = -1 # operator - knl_class_or_helmholtz_k: type[Kernel] | int | float = 0 + knl_class_or_helmholtz_k: type[ScalarKernel] | int | float = 0 knl_kwargs: dict[str, Any] = field(default_factory=dict) bc_type: str = "dirichlet" side: int = -1 @@ -157,7 +157,7 @@ class IntegralEquationTestCase(ABC): @property @memoize_method - def knl_class(self) -> type[Kernel]: + def knl_class(self) -> type[ScalarKernel]: if isinstance(self.knl_class_or_helmholtz_k, type): return self.knl_class_or_helmholtz_k diff --git a/test/test_layer_pot_identity.py b/test/test_layer_pot_identity.py index eef7d8bb9..fe3eb8942 100644 --- a/test/test_layer_pot_identity.py +++ b/test/test_layer_pot_identity.py @@ -42,7 +42,7 @@ ) # from sumpy.visualization import FieldPlotter -from sumpy.kernel import HelmholtzKernel, Kernel, LaplaceKernel +from sumpy.kernel import HelmholtzKernel, LaplaceKernel, ScalarKernel from pytential import GeometryCollection, bind, norm, sym from pytential.array_context import PytestPyOpenCLArrayContextFactory @@ -78,7 +78,7 @@ class IdentityExpr(ABC): order_drop: ClassVar[int] @abstractmethod - def get_zero_op(self, kernel: Kernel, **knl_kwargs: sym.Operand) -> sym.Operand: + def get_zero_op(self, kernel: ScalarKernel, **kwargs: sym.Operand) -> sym.Operand: pass @@ -87,13 +87,13 @@ class GreenExpr(IdentityExpr): order_drop: ClassVar[int] = 0 @override - def get_zero_op(self, kernel: Kernel, **knl_kwargs: sym.Operand) -> sym.Operand: + def get_zero_op(self, kernel: ScalarKernel, **kwargs: sym.Operand) -> sym.Operand: u_sym = sym.var("u") dn_u_sym = sym.var("dn_u") return ( - sym.S(kernel, dn_u_sym, qbx_forced_limit=-1, **knl_kwargs) - - sym.D(kernel, u_sym, qbx_forced_limit="avg", **knl_kwargs) + sym.S(kernel, dn_u_sym, qbx_forced_limit=-1, **kwargs) + - sym.D(kernel, u_sym, qbx_forced_limit="avg", **kwargs) - 0.5*u_sym) @@ -102,7 +102,7 @@ class GradGreenExpr(IdentityExpr): order_drop: ClassVar[int] = 1 @override - def get_zero_op(self, kernel: Kernel, **knl_kwargs: sym.Operand) -> sym.Operand: + def get_zero_op(self, kernel: ScalarKernel, **kwargs: sym.Operand) -> sym.Operand: d = kernel.dim u_sym = sym.var("u") grad_u_sym = sym.make_sym_mv("grad_u", d) @@ -110,9 +110,9 @@ def get_zero_op(self, kernel: Kernel, **knl_kwargs: sym.Operand) -> sym.Operand: return ( d1.resolve(d1.dnabla(d) * d1(sym.S(kernel, dn_u_sym, - qbx_forced_limit="avg", **knl_kwargs))) + qbx_forced_limit="avg", **kwargs))) - d2.resolve(d2.dnabla(d) * d2(sym.D(kernel, u_sym, - qbx_forced_limit="avg", **knl_kwargs))) + qbx_forced_limit="avg", **kwargs))) - 0.5*grad_u_sym ).as_vector() @@ -122,9 +122,9 @@ class ZeroCalderonExpr(IdentityExpr): order_drop: ClassVar[int] = 1 @override - def get_zero_op(self, kernel: Kernel, **knl_kwargs: sym.Operand) -> sym.Operand: + def get_zero_op(self, kernel: ScalarKernel, **kwargs: sym.Operand) -> sym.Operand: assert isinstance(kernel, LaplaceKernel) - assert not knl_kwargs + assert not kwargs u_sym = sym.var("u") diff --git a/test/test_symbolic.py b/test/test_symbolic.py index 36049e815..f1ba0c040 100644 --- a/test/test_symbolic.py +++ b/test/test_symbolic.py @@ -466,9 +466,9 @@ def test_derivative_binder_expr(): # {{{ test_mapper_kernel_transformation_remover def _make_operator(ambient_dim: int, op_name: str, k: float, *, side: int = +1): - from sumpy.kernel import HelmholtzKernel, Kernel, LaplaceKernel + from sumpy.kernel import HelmholtzKernel, LaplaceKernel, ScalarKernel if k == 0: - kernel: Kernel = LaplaceKernel(ambient_dim) + kernel: ScalarKernel = LaplaceKernel(ambient_dim) kernel_arguments = {} else: kernel = HelmholtzKernel(ambient_dim)