From c438ac058c541675ec673ea84ce26e3b211a3045 Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner Date: Fri, 21 Dec 2012 20:20:26 -0500 Subject: [PATCH] Deal with the fact that loopy is now more strict about type inference for complex numbers. --- sumpy/codegen.py | 25 ++++++++++++++++++++++--- sumpy/layerpot.py | 4 +++- sumpy/p2p.py | 4 +++- sumpy/tools.py | 17 +++++++++++++---- 4 files changed, 41 insertions(+), 9 deletions(-) diff --git a/sumpy/codegen.py b/sumpy/codegen.py index 51296c0c..83f7bdb8 100644 --- a/sumpy/codegen.py +++ b/sumpy/codegen.py @@ -310,8 +310,23 @@ class MathConstantRewriter(IdentityMapper): +class ComplexConstantSizer(IdentityMapper): + def __init__(self, dtype): + self.dtype = dtype + + def map_constant(self, expr): + if isinstance(expr, (complex, np.complexfloating)): + assert self.dtype.kind == "c" + return self.dtype.type(expr) + else: + return expr + + + -def to_loopy_insns(assignments, vector_names=set(), pymbolic_expr_maps=[]): + +def to_loopy_insns(assignments, vector_names=set(), pymbolic_expr_maps=[], + complex_dtype=None): # convert from sympy from pymbolic.sympy_interface import SympyToPymbolicMapper sympy_conv = SympyToPymbolicMapper() @@ -330,6 +345,10 @@ def to_loopy_insns(assignments, vector_names=set(), pymbolic_expr_maps=[]): pwr = PowerRewriter() ssg = SumSignGrouper() fck = FractionKiller() + if complex_dtype is not None: + ccs = ComplexConstantSizer(np.dtype(complex_dtype)) + else: + ccs = None def convert_expr(expr): expr = bdr(expr) @@ -338,12 +357,12 @@ def to_loopy_insns(assignments, vector_names=set(), pymbolic_expr_maps=[]): expr = pwr(expr) expr = fck(expr) expr = ssg(expr) + if ccs is not None: + expr = ccs(expr) for m in pymbolic_expr_maps: expr = m(expr) return expr - - import loopy as lp return [ lp.Instruction(id=None, diff --git a/sumpy/layerpot.py b/sumpy/layerpot.py index f9fd1b90..df88c21a 100644 --- a/sumpy/layerpot.py +++ b/sumpy/layerpot.py @@ -82,7 +82,9 @@ class LayerPotentialBase(KernelComputation): vector_names=set(["a", "b"]), pymbolic_expr_maps=[ expn.kernel.transform_to_code - for expn in self.expansions]) + for expn in self.expansions], + complex_dtype=np.complex128 # FIXME + ) isrc_sym = var("isrc") exprs = [ diff --git a/sumpy/p2p.py b/sumpy/p2p.py index a30614d3..0166a4ca 100644 --- a/sumpy/p2p.py +++ b/sumpy/p2p.py @@ -56,7 +56,9 @@ class P2P(KernelComputation): from sumpy.codegen import to_loopy_insns loopy_insns = to_loopy_insns(sac.assignments.iteritems(), vector_names=set(["d"]), - pymbolic_expr_maps=[knl.transform_to_code for knl in self.kernels]) + pymbolic_expr_maps=[knl.transform_to_code for knl in self.kernels], + complex_dtype=np.complex128 # FIXME + ) from pymbolic import var exprs = [ diff --git a/sumpy/tools.py b/sumpy/tools.py index b29bb0df..d5c8fa55 100644 --- a/sumpy/tools.py +++ b/sumpy/tools.py @@ -32,6 +32,7 @@ def mi_derivative(expr, vector, mi): + def build_matrix(op, dtype=None): dtype = dtype or op.dtype from pytools import ProgressBar @@ -161,7 +162,15 @@ class KernelComputation: return result def get_kernel_scaling_assignments(self): - from sumpy.codegen import to_loopy_insns - return to_loopy_insns( - ("knl_%d_scaling" % i, kernel.get_scaling()) - for i, kernel in enumerate(self.kernels)) + from pymbolic.sympy_interface import SympyToPymbolicMapper + sympy_conv = SympyToPymbolicMapper() + from sumpy.codegen import ComplexConstantSizer + + import loopy as lp + return [ + lp.Instruction(id=None, + assignee="knl_%d_scaling" % i, + expression=ComplexConstantSizer(dtype)( + sympy_conv(kernel.get_scaling())), + temp_var_type=dtype) + for i, (kernel, dtype) in enumerate(zip(self.kernels, self.value_dtypes))] -- GitLab