Skip to content

Commit b0cd1db

Browse files
committed
Fourier/Hankel/LineTaylor: Use tuples as coeff identifiers
1 parent 7800026 commit b0cd1db

File tree

3 files changed

+36
-26
lines changed

3 files changed

+36
-26
lines changed

sumpy/expansion/local.py

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
from collections.abc import Sequence
4848

4949
from sumpy.assignment_collection import SymbolicAssignmentCollection
50+
from sumpy.expansion.diff_op import MultiIndex
5051
from sumpy.expansion.m2l import M2LTranslationBase
5152
from sumpy.expansion.multipole import (
5253
MultipoleExpansionBase,
@@ -117,12 +118,14 @@ def m2l_translation(self):
117118
# FIXME: Um...
118119
raise NotImplementedError()
119120

120-
def get_storage_index(self, k):
121-
return k
122-
121+
@override
122+
def get_storage_index(self, mi: MultiIndex):
123+
ind, = mi
124+
return ind
123125

126+
@override
124127
def get_coefficient_identifiers(self):
125-
return list(range(self.order+1))
128+
return [(i,) for i in range(self.order+1)]
126129

127130
@override
128131
def coefficients_from_source(self,
@@ -172,7 +175,7 @@ def evaluate(self, tgt_kernel, coeffs, bvec, rscale, sac=None):
172175
# NOTE: We can't meaningfully apply target derivatives here.
173176
# Instead, this is handled in LayerPotentialBase._evaluate.
174177
return sym.Add(*(
175-
coeffs[self.get_storage_index(i)] / math.factorial(i)
178+
coeffs[self.get_storage_index(i)] / math.factorial(i[0])
176179
for i in self.get_coefficient_identifiers()))
177180

178181
@override
@@ -551,11 +554,14 @@ def m2l_translation(self) -> M2LTranslationBase:
551554
def get_bessel_arg_scaling(self):
552555
pass
553556

554-
def get_storage_index(self, k):
555-
return self.order+k
557+
@override
558+
def get_storage_index(self, mi: MultiIndex):
559+
ind, = mi
560+
return self.order+ind
556561

562+
@override
557563
def get_coefficient_identifiers(self):
558-
return list(range(-self.order, self.order+1))
564+
return [(i,) for i in range(-self.order, self.order+1)]
559565

560566
@override
561567
def coefficients_from_source(self,
@@ -579,7 +585,7 @@ def coefficients_from_source(self,
579585
Hankel1(c, arg_scale * avec_len, 0)
580586
* rscale ** abs(c)
581587
* sym.exp(sym.I * c * source_angle_rel_center), avec)
582-
for c in self.get_coefficient_identifiers()]
588+
for c, in self.get_coefficient_identifiers()]
583589

584590
@override
585591
def evaluate(self,
@@ -598,12 +604,12 @@ def evaluate(self,
598604

599605
arg_scale = self.get_bessel_arg_scaling()
600606

601-
return sym.sympify(sum(coeffs[self.get_storage_index(c)]
607+
return sym.sympify(sum(coeffs[self.get_storage_index((c,))]
602608
* kernel.postprocess_at_target(
603609
BesselJ(c, arg_scale * bvec_len, 0)
604610
/ rscale ** abs(c)
605611
* sym.exp(sym.I * c * -target_angle_rel_center), bvec)
606-
for c in self.get_coefficient_identifiers()))
612+
for c, in self.get_coefficient_identifiers()))
607613

608614
@override
609615
def translate_from(self,
@@ -628,14 +634,14 @@ def translate_from(self,
628634
new_center_angle_rel_old_center = sym.atan2(dvec[1], dvec[0])
629635
translated_coeffs = []
630636

631-
for j in self.get_coefficient_identifiers():
637+
for j, in self.get_coefficient_identifiers():
632638
translated_coeffs.append(
633-
sum(src_coeff_exprs[src_expansion.get_storage_index(m)]
639+
sum(src_coeff_exprs[src_expansion.get_storage_index((m,))]
634640
* BesselJ(m - j, arg_scale * dvec_len, 0)
635641
/ src_rscale ** abs(m)
636642
* tgt_rscale ** abs(j)
637643
* sym.exp(sym.I * (m - j) * -new_center_angle_rel_old_center)
638-
for m in src_expansion.get_coefficient_identifiers()))
644+
for m, in src_expansion.get_coefficient_identifiers()))
639645
return translated_coeffs
640646

641647
if isinstance(src_expansion, self.mpole_expn_class):

sumpy/expansion/m2l.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -850,9 +850,9 @@ def translate(self, tgt_expansion, src_expansion, src_coeff_exprs, src_rscale,
850850

851851
translated_coeffs = [
852852
sum(derivatives[m + j + tgt_expansion.order + src_expansion.order]
853-
* src_coeff_exprs[src_expansion.get_storage_index(m)]
854-
for m in src_expansion.get_coefficient_identifiers())
855-
for j in tgt_expansion.get_coefficient_identifiers()]
853+
* src_coeff_exprs[src_expansion.get_storage_index((m,))]
854+
for m, in src_expansion.get_coefficient_identifiers())
855+
for j, in tgt_expansion.get_coefficient_identifiers()]
856856

857857
translated_coeffs = self.postprocess_local_exprs(tgt_expansion,
858858
src_expansion, translated_coeffs, src_rscale, tgt_rscale,

sumpy/expansion/multipole.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
from collections.abc import Sequence
4545

4646
from sumpy.assignment_collection import SymbolicAssignmentCollection
47+
from sumpy.expansion.diff_op import MultiIndex
4748
from sumpy.kernel import Kernel
4849

4950

@@ -405,11 +406,14 @@ class _HankelBased2DMultipoleExpansion(MultipoleExpansionBase):
405406
def get_bessel_arg_scaling(self):
406407
return
407408

408-
def get_storage_index(self, k):
409-
return self.order+k
409+
@override
410+
def get_storage_index(self, mi: MultiIndex):
411+
ind, = mi
412+
return self.order+ind
410413

414+
@override
411415
def get_coefficient_identifiers(self):
412-
return list(range(-self.order, self.order+1))
416+
return [(i,) for i in range(-self.order, self.order+1)]
413417

414418
def coefficients_from_source(self, kernel, avec, bvec, rscale, sac=None):
415419
if not self.use_rscale:
@@ -431,7 +435,7 @@ def coefficients_from_source(self, kernel, avec, bvec, rscale, sac=None):
431435
/ rscale ** abs(c)
432436
* sym.exp(sym.I * c * -source_angle_rel_center),
433437
avec)
434-
for c in self.get_coefficient_identifiers()]
438+
for c, in self.get_coefficient_identifiers()]
435439

436440
def evaluate(self, kernel, coeffs, bvec, rscale, sac=None):
437441
if not self.use_rscale:
@@ -443,12 +447,12 @@ def evaluate(self, kernel, coeffs, bvec, rscale, sac=None):
443447

444448
arg_scale = self.get_bessel_arg_scaling()
445449

446-
return sum(coeffs[self.get_storage_index(c)]
450+
return sum(coeffs[self.get_storage_index((c,))]
447451
* kernel.postprocess_at_target(
448452
Hankel1(c, arg_scale * bvec_len, 0)
449453
* rscale ** abs(c)
450454
* sym.exp(sym.I * c * target_angle_rel_center), bvec)
451-
for c in self.get_coefficient_identifiers())
455+
for c, in self.get_coefficient_identifiers())
452456

453457
def translate_from(self, src_expansion, src_coeff_exprs, src_rscale,
454458
dvec, tgt_rscale, sac=None):
@@ -468,14 +472,14 @@ def translate_from(self, src_expansion, src_coeff_exprs, src_rscale,
468472
arg_scale = self.get_bessel_arg_scaling()
469473

470474
translated_coeffs = []
471-
for j in self.get_coefficient_identifiers():
475+
for j, in self.get_coefficient_identifiers():
472476
translated_coeffs.append(
473-
sum(src_coeff_exprs[src_expansion.get_storage_index(m)]
477+
sum(src_coeff_exprs[src_expansion.get_storage_index((m,))]
474478
* BesselJ(m - j, arg_scale * dvec_len, 0)
475479
* src_rscale ** abs(m)
476480
/ tgt_rscale ** abs(j)
477481
* sym.exp(sym.I * (m - j) * new_center_angle_rel_old_center)
478-
for m in src_expansion.get_coefficient_identifiers()))
482+
for m, in src_expansion.get_coefficient_identifiers()))
479483
return translated_coeffs
480484

481485

0 commit comments

Comments
 (0)