diff --git a/sumpy/e2e.py b/sumpy/e2e.py index 66e5e97567d8675834c54f7291dba7d49bd20b19..bff0f508c05ea378fb5c7cd31ce85f82c0ffdfcd 100644 --- a/sumpy/e2e.py +++ b/sumpy/e2e.py @@ -63,6 +63,22 @@ class E2EBase(KernelCacheWrapper): if device is None: device = ctx.devices[0] + if src_expansion is tgt_expansion: + from sumpy.kernel import TargetDerivativeRemover, SourceDerivativeRemover + tgt_expansion = src_expansion = src_expansion.with_kernel( + SourceDerivativeRemover()( + TargetDerivativeRemover()(src_expansion.kernel))) + + else: + + from sumpy.kernel import TargetDerivativeRemover, SourceDerivativeRemover + src_expansion = src_expansion.with_kernel( + SourceDerivativeRemover()( + TargetDerivativeRemover()(src_expansion.kernel))) + tgt_expansion = tgt_expansion.with_kernel( + SourceDerivativeRemover()( + TargetDerivativeRemover()(tgt_expansion.kernel))) + self.ctx = ctx self.src_expansion = src_expansion self.tgt_expansion = tgt_expansion diff --git a/sumpy/e2p.py b/sumpy/e2p.py index 6a77a5cc416af3c01df9786bac5fd236927e787c..9a2a8bc1ea564e37cf4e2d248de6952cfd386067 100644 --- a/sumpy/e2p.py +++ b/sumpy/e2p.py @@ -59,6 +59,15 @@ class E2PBase(KernelCacheWrapper): if device is None: device = ctx.devices[0] + from sumpy.kernel import SourceDerivativeRemover, TargetDerivativeRemover + sdr = SourceDerivativeRemover() + tdr = TargetDerivativeRemover() + expansion = expansion.with_kernel( + sdr(expansion.kernel)) + + for knl in kernels: + assert sdr(tdr(knl)) == expansion.kernel + self.ctx = ctx self.expansion = expansion self.kernels = kernels @@ -68,11 +77,6 @@ class E2PBase(KernelCacheWrapper): self.dim = expansion.dim - from sumpy.kernel import TargetDerivativeRemover - tdr = TargetDerivativeRemover() - for knl in kernels: - assert tdr(knl) == expansion.kernel - def get_loopy_insns_and_result_names(self): from sumpy.symbolic import make_sym_vector bvec = make_sym_vector("b", self.dim) diff --git a/sumpy/expansion/__init__.py b/sumpy/expansion/__init__.py index 08754a10240061ac9858034a561fb301c7db6925..b5096e0c572af3bc9e779976d3368d6c377cf5d0 100644 --- a/sumpy/expansion/__init__.py +++ b/sumpy/expansion/__init__.py @@ -83,6 +83,10 @@ class ExpansionBase(object): # }}} + def with_kernel(self, kernel): + return type(self)(kernel, self.order) + # FIXME: add self.use_rscale once the rscale MR is in + def __len__(self): return len(self.get_coefficient_identifiers()) diff --git a/sumpy/fmm.py b/sumpy/fmm.py index b20c9827e46e86e98ab81ab2c4c2822ee1163cd6..77226a9a4df94d72f6c95cad39ecd8e103bd486c 100644 --- a/sumpy/fmm.py +++ b/sumpy/fmm.py @@ -517,7 +517,7 @@ class SumpyExpansionWrangler(object): p2l = self.code.p2l(self.level_orders[lev]) target_level_start_ibox, target_local_exps_view = \ - self.multipole_expansions_view(local_exps, lev) + self.local_expansions_view(local_exps, lev) evt, (result,) = p2l( self.level_queues[lev], diff --git a/sumpy/kernel.py b/sumpy/kernel.py index aed3d931d1fa18cb78825de0ad9ab5c9760c9ea7..780cf8eb4dd2eb482ea0492779232bbff92c75c3 100644 --- a/sumpy/kernel.py +++ b/sumpy/kernel.py @@ -902,6 +902,11 @@ class TargetDerivativeRemover(AxisTargetDerivativeRemover): return self.rec(kernel.inner_kernel) +class SourceDerivativeRemover(KernelIdentityMapper): + def map_directional_source_derivative(self, kernel): + return self.rec(kernel.inner_kernel) + + class DerivativeCounter(KernelCombineMapper): def combine(self, values): return max(values) diff --git a/sumpy/p2e.py b/sumpy/p2e.py index 6a8fcfa9d2ea8dd7a034d0adb1a7cc152c8db7bc..b8c60a6423bc1dd704cf63cf915831c084480b7b 100644 --- a/sumpy/p2e.py +++ b/sumpy/p2e.py @@ -61,6 +61,10 @@ class P2EBase(KernelCacheWrapper): if device is None: device = ctx.devices[0] + from sumpy.kernel import TargetDerivativeRemover + expansion = expansion.with_kernel( + TargetDerivativeRemover()(expansion.kernel)) + self.ctx = ctx self.expansion = expansion self.options = options diff --git a/test/test_fmm.py b/test/test_fmm.py index 0d8f36d81979de64103c50f29ac21ecc46625abf..c1df96a6d65ec147eb523d1326b887f8521aeae8 100644 --- a/test/test_fmm.py +++ b/test/test_fmm.py @@ -169,7 +169,7 @@ def test_sumpy_fmm(ctx_getter, knl, local_expn_class, mpole_expn_class): # }}} from pyopencl.clrandom import PhiloxGenerator - rng = PhiloxGenerator(ctx) + rng = PhiloxGenerator(ctx, seed=44) weights = rng.uniform(queue, nsources, dtype=np.float64) logger.info("computing direct (reference) result")