diff --git a/pytential/qbx/__init__.py b/pytential/qbx/__init__.py index a968c53a7..bfdd2a99e 100644 --- a/pytential/qbx/__init__.py +++ b/pytential/qbx/__init__.py @@ -42,6 +42,8 @@ .. autoclass:: QBXTargetAssociationFailedException .. autoclass:: DefaultExpansionFactory + +.. autoclass:: NonFFTExpansionFactory """ @@ -51,7 +53,8 @@ class DefaultExpansionFactory(DefaultExpansionFactoryBase): """A expansion factory to create QBX local, local and multipole expansions """ def get_qbx_local_expansion_class(self, kernel): - local_expn_class = self.get_local_expansion_class(kernel) + local_expn_class = DefaultExpansionFactoryBase.get_local_expansion_class( + self, kernel) from sumpy.expansion.m2l import NonFFTM2LTranslationClassFactory factory = NonFFTM2LTranslationClassFactory() m2l_translation = factory.get_m2l_translation_class(kernel, @@ -59,6 +62,13 @@ def get_qbx_local_expansion_class(self, kernel): return partial(local_expn_class, m2l_translation=m2l_translation) +class NonFFTExpansionFactory(DefaultExpansionFactoryBase): + """A expansion factory to create QBX local, local and multipole expansions + with no FFT for multipole-to-local translations + """ + get_local_expansion_class = DefaultExpansionFactory.get_qbx_local_expansion_class + + class _not_provided: # noqa: N801 pass diff --git a/test/extra_int_eq_data.py b/test/extra_int_eq_data.py index 3b9ed18b7..f7a188f1c 100644 --- a/test/extra_int_eq_data.py +++ b/test/extra_int_eq_data.py @@ -104,6 +104,7 @@ class IntegralEquationTestCase: fmm_backend: str = "sumpy" fmm_order: Optional[int] = None fmm_tol: Optional[float] = None + disable_fft: bool = False # solver gmres_tol: float = 1.0e-14 @@ -202,6 +203,10 @@ def get_layer_potential(self, actx, resolution, mesh_order): else: fmm_kwargs["fmm_order"] = self.qbx_order + 5 + if self.disable_fft: + from pytential.qbx import NonFFTExpansionFactory + fmm_kwargs["expansion_factory"] = NonFFTExpansionFactory() + from pytential.qbx import QBXLayerPotentialSource return QBXLayerPotentialSource( pre_density_discr, diff --git a/test/test_scalar_int_eq.py b/test/test_scalar_int_eq.py index d3085306d..eaff298c1 100644 --- a/test/test_scalar_int_eq.py +++ b/test/test_scalar_int_eq.py @@ -464,7 +464,12 @@ def run_int_eq_test(actx, bc_type="clamped_plate", side=-1, fmm_backend=None), inteq.EllipseTestCase( knl_class_or_helmholtz_k=BiharmonicKernel, - bc_type="clamped_plate", side=-1, fmm_backend="sumpy", fmm_order=15), + bc_type="clamped_plate", side=-1, fmm_backend="sumpy", fmm_order=15, + gmres_tol=1e-9), + inteq.EllipseTestCase( + knl_class_or_helmholtz_k=BiharmonicKernel, + bc_type="clamped_plate", side=-1, fmm_backend="sumpy", fmm_order=15, + disable_fft=True), ]