From 6682405d0adb9fa6ccbe3e391a61e0317f042532 Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner <inform@tiker.net> Date: Tue, 27 Mar 2012 17:34:43 -0400 Subject: [PATCH] A zoo of little changes towards enabling the QUACK scheme code. --- setup.py | 2 +- sumpy/symbolic/__init__.py | 55 +++++++++++++++++++++++++++++++++----- sumpy/symbolic/codegen.py | 4 +++ sumpy/tools.py | 6 +++++ test/test_kernels.py | 4 +++ 5 files changed, 63 insertions(+), 8 deletions(-) diff --git a/setup.py b/setup.py index c793e73c..58cc30f0 100644 --- a/setup.py +++ b/setup.py @@ -37,7 +37,7 @@ setup(name="sumpy", author="Rio Yokota, Andreas Kloeckner, Matthew Knepley", author_email="yokota@bu.edu", license = "MIT", - packages=["sumpy"], + packages=["sumpy", "sumpy.symbolic"], # 2to3 invocation cmdclass={'build_py': build_py}) diff --git a/sumpy/symbolic/__init__.py b/sumpy/symbolic/__init__.py index 9c184b17..58d4f8d5 100644 --- a/sumpy/symbolic/__init__.py +++ b/sumpy/symbolic/__init__.py @@ -61,7 +61,7 @@ class IdentityMapper(SympyMapper): map_Symbol = map_Integer map_Real = map_Integer - + map_ImaginaryUnit = map_Integer @@ -129,6 +129,9 @@ class CSEMapper(IdentityMapper): else: return IdentityMapper.map_Rational(self, expr) + def map_Subs(self, expr): + return expr + @@ -154,7 +157,7 @@ def eliminate_common_subexpressions(exprs, sym_gen): else: iterable = node - for arg in node.args: + for arg in iterable: gather_use_counts(arg) for expr in exprs: @@ -204,20 +207,58 @@ def diff_multi_index(expr, multi_index, var_name): -def make_coulomb_kernel_in(var_name, dimensions): - from sumpy.symbolic import make_sym_vector - dist = make_sym_vector(var_name, dimensions) +def make_coulomb_kernel(dist_vec): + dimensions = len(dist_vec) + r = sp.sqrt((dist_vec.T*dist_vec)[0,0]) if dimensions == 2: - return sp.log(sp.sqrt((dist.T*dist)[0,0])) + return sp.log(r) elif dimensions == 3: - return 1/sp.sqrt((dist.T*dist)[0,0]) + return 1/r else: raise RuntimeError("unsupported dimensionality") + +def make_helmholtz_kernel(dist_vec): + dimensions = len(dist_vec) + r = sp.sqrt((dist_vec.T*dist_vec)[0,0]) + + i = sp.sqrt(-1) + k = sp.Symbol("k") + + if dimensions == 2: + return i/4 * sp.Function("H1_0")(k*r) + elif dimensions == 3: + return sp.exp(i*k*r)/r + else: + raise RuntimeError("unsupported dimensionality") + + + + +def make_coulomb_kernel_in(var_name, dimensions): + from warnings import warn + warn("make_coulomb_kernel_in is deprecated", DeprecationWarning, stacklevel=2) + + from sumpy.symbolic import make_sym_vector + return make_coulomb_kernel(make_sym_vector(var_name, dimensions)) + + + + +def make_helmholtz_kernel_in(var_name, dimensions): + from warnings import warn + warn("make_helmholtz_kernel_in is deprecated", DeprecationWarning, stacklevel=2) + + from sumpy.symbolic import make_sym_vector + return make_helmholtz_kernel(make_sym_vector(var_name, dimensions)) + + + + def make_coulomb_kernel_ts(dimensions): old = make_sym_vector("d", dimensions) new = (make_sym_vector("t", dimensions) diff --git a/sumpy/symbolic/codegen.py b/sumpy/symbolic/codegen.py index a30523ca..8b1523f3 100644 --- a/sumpy/symbolic/codegen.py +++ b/sumpy/symbolic/codegen.py @@ -88,6 +88,10 @@ class PowRewriter(IdentityMapper): return IdentityMapper.map_Pow(self, expr) + def map_Subs(self, expr): + return expr + + diff --git a/sumpy/tools.py b/sumpy/tools.py index b9d6c8ba..f9f102c2 100644 --- a/sumpy/tools.py +++ b/sumpy/tools.py @@ -21,6 +21,12 @@ def mi_power(vector, mi): result *= vec_i**mi_i return result +def mi_derivative(expr, vector, mi): + for mi_i, vec_i in zip(mi, vector): + expr = expr.diff(vec_i, mi_i) + return expr + + # }}} diff --git a/test/test_kernels.py b/test/test_kernels.py index eb466aea..cb5d585e 100644 --- a/test/test_kernels.py +++ b/test/test_kernels.py @@ -156,6 +156,8 @@ def test_p2m2p(ctx_getter): assert la.norm((potential_dev-potential_dev_direct).get())/res**2 < 1e-3 + # }}} + @@ -263,6 +265,8 @@ def test_p2m2m2p(ctx_getter): assert la.norm((potential_dev-potential_dev_direct).get())/res**2 < 1e-3 + # }}} + -- GitLab