Skip to content

Commit e778b17

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

3 files changed

Lines changed: 45 additions & 35 deletions

File tree

‎sumpy/expansion/local.py‎

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
from collections.abc import Sequence
4949

5050
from sumpy.assignment_collection import SymbolicAssignmentCollection
51+
from sumpy.expansion.diff_op import MultiIndex
5152
from sumpy.expansion.m2l import M2LTranslationBase
5253
from sumpy.expansion.multipole import (
5354
HankelBased2DMultipoleExpansion,
@@ -118,12 +119,14 @@ def m2l_translation(self):
118119
# FIXME: Um...
119120
raise NotImplementedError()
120121

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

127+
@override
125128
def get_coefficient_identifiers(self):
126-
return list(range(self.order+1))
129+
return [(i,) for i in range(self.order+1)]
127130

128131
@override
129132
def coefficients_from_source(self,
@@ -165,15 +168,15 @@ def coefficients_from_source(self,
165168
return [kernel.postprocess_at_source(
166169
line_kernel.diff(tau, i), avec)
167170
.subs(tau, 0)
168-
for i in self.get_coefficient_identifiers()]
171+
for i, in self.get_coefficient_identifiers()]
169172

170173
def evaluate(self, tgt_kernel, coeffs, bvec, rscale, sac=None):
171174
# no point in heeding rscale here--just ignore it
172175

173176
# NOTE: We can't meaningfully apply target derivatives here.
174177
# Instead, this is handled in LayerPotentialBase._evaluate.
175178
return sym.Add(*(
176-
coeffs[self.get_storage_index(i)] / math.factorial(i)
179+
coeffs[self.get_storage_index(i)] / math.factorial(i[0])
177180
for i in self.get_coefficient_identifiers()))
178181

179182
@override
@@ -557,11 +560,14 @@ def m2l_translation(self) -> M2LTranslationBase:
557560
def get_bessel_arg_scaling(self):
558561
pass
559562

560-
def get_storage_index(self, k):
561-
return self.order+k
563+
@override
564+
def get_storage_index(self, mi: MultiIndex):
565+
ind, = mi
566+
return self.order+ind
562567

568+
@override
563569
def get_coefficient_identifiers(self):
564-
return list(range(-self.order, self.order+1))
570+
return [(i,) for i in range(-self.order, self.order+1)]
565571

566572
@override
567573
def coefficients_from_source(self,
@@ -585,7 +591,7 @@ def coefficients_from_source(self,
585591
Hankel1(c, arg_scale * avec_len, 0)
586592
* rscale ** abs(c)
587593
* sym.exp(sym.I * c * source_angle_rel_center), avec)
588-
for c in self.get_coefficient_identifiers()]
594+
for c, in self.get_coefficient_identifiers()]
589595

590596
@override
591597
def evaluate(self,
@@ -604,12 +610,12 @@ def evaluate(self,
604610

605611
arg_scale = self.get_bessel_arg_scaling()
606612

607-
return sym.sympify(sum(coeffs[self.get_storage_index(c)]
613+
return sym.sympify(sum(coeffs[self.get_storage_index((c,))]
608614
* kernel.postprocess_at_target(
609615
BesselJ(c, arg_scale * bvec_len, 0)
610616
/ rscale ** abs(c)
611617
* sym.exp(sym.I * c * -target_angle_rel_center), bvec)
612-
for c in self.get_coefficient_identifiers()))
618+
for c, in self.get_coefficient_identifiers()))
613619

614620
@override
615621
def translate_from(self,
@@ -634,14 +640,14 @@ def translate_from(self,
634640
new_center_angle_rel_old_center = sym.atan2(dvec[1], dvec[0])
635641
translated_coeffs = []
636642

637-
for j in self.get_coefficient_identifiers():
643+
for j, in self.get_coefficient_identifiers():
638644
translated_coeffs.append(
639-
sum(src_coeff_exprs[src_expansion.get_storage_index(m)]
645+
sum(src_coeff_exprs[src_expansion.get_storage_index((m,))]
640646
* BesselJ(m - j, arg_scale * dvec_len, 0)
641647
/ src_rscale ** abs(m)
642648
* tgt_rscale ** abs(j)
643649
* sym.exp(sym.I * (m - j) * -new_center_angle_rel_old_center)
644-
for m in src_expansion.get_coefficient_identifiers()))
650+
for m, in src_expansion.get_coefficient_identifiers()))
645651
return translated_coeffs
646652

647653
if isinstance(src_expansion, self.mpole_expn_class):

‎sumpy/expansion/m2l.py‎

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

893893
translated_coeffs = [
894894
sum(derivatives[m + j + tgt_expansion.order + src_expansion.order]
895-
* src_coeff_exprs[src_expansion.get_storage_index(m)]
896-
for m in src_expansion.get_coefficient_identifiers())
897-
for j in tgt_expansion.get_coefficient_identifiers()]
895+
* src_coeff_exprs[src_expansion.get_storage_index((m,))]
896+
for m, in src_expansion.get_coefficient_identifiers())
897+
for j, in tgt_expansion.get_coefficient_identifiers()]
898898

899899
translated_coeffs = self.postprocess_local_exprs(tgt_expansion,
900900
src_expansion, translated_coeffs, src_rscale, tgt_rscale,
@@ -930,10 +930,10 @@ def translation_classes_dependent_data(self,
930930
# evaluations. https://dlmf.nist.gov/10.23.F1
931931
# This loop computes the first row and the last column vector sufficient
932932
# to specify the matrix entries.
933-
for j in tgt_expansion.get_coefficient_identifiers():
934-
idx_j = tgt_expansion.get_storage_index(j)
935-
for m in src_expansion.get_coefficient_identifiers():
936-
idx_m = src_expansion.get_storage_index(m)
933+
for j, in tgt_expansion.get_coefficient_identifiers():
934+
idx_j = tgt_expansion.get_storage_index((j,))
935+
for m, in src_expansion.get_coefficient_identifiers():
936+
idx_m = src_expansion.get_storage_index((m,))
937937
translation_classes_dependent_data[idx_j + idx_m] = (
938938
Hankel1(m + j, arg_scale * dvec_len, 0)
939939
* sym.exp(sym.I * (m + j) * new_center_angle_rel_old_center))
@@ -944,8 +944,8 @@ def preprocess_multipole_exprs(self, tgt_expansion, src_expansion,
944944
src_coeff_exprs, sac, src_rscale):
945945

946946
src_coeff_exprs = list(src_coeff_exprs)
947-
for m in src_expansion.get_coefficient_identifiers():
948-
src_coeff_exprs[src_expansion.get_storage_index(m)] *= src_rscale**abs(m)
947+
for m, in src_expansion.get_coefficient_identifiers():
948+
src_coeff_exprs[src_expansion.get_storage_index((m,))] *= src_rscale**abs(m)
949949
return src_coeff_exprs
950950

951951
def preprocess_multipole_nexprs(self, tgt_expansion, src_expansion):
@@ -956,8 +956,8 @@ def postprocess_local_exprs(self, tgt_expansion, src_expansion,
956956

957957
# Filter out the dummy rows and scale them for target
958958
result = []
959-
for j in tgt_expansion.get_coefficient_identifiers():
960-
result.append(m2l_result[tgt_expansion.get_storage_index(j)]
959+
for j, in tgt_expansion.get_coefficient_identifiers():
960+
result.append(m2l_result[tgt_expansion.get_storage_index((j,))]
961961
* tgt_rscale**(abs(j)) * sym.Integer(-1)**j)
962962

963963
return result

‎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, ABC):
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)