diff --git a/sumpy/kernel.py b/sumpy/kernel.py index b29e6237c760a4ffb45a7fce7e87386160f2719b..3f745b7086dec81bd1bdd0e8d39e5368e8e43781 100644 --- a/sumpy/kernel.py +++ b/sumpy/kernel.py @@ -370,6 +370,63 @@ class HelmholtzKernel(ExpressionKernel): mapper_method = "map_helmholtz_kernel" + +class StokesletKernel(ExpressionKernel): + init_arg_names = ("dim", "icomp", "jcomp", "viscosity_mu_name") + + def __init__(self, dim, icomp, jcomp, viscosity_mu_name="mu"): + """ + :arg viscosity_mu_name: The argument name to use for + dynamic viscosity :math:`\mu` the then generating functions to + evaluate this kernel. + """ + mu = var(viscosity_mu_name) + + if dim == 2: + d = make_sym_vector("d", dim) + r = pymbolic_real_norm_2(d) + expr = ( + -var("log")(r)*(1 if icomp == jcomp else 0) + + + d[icomp]*d[jcomp]/r**2 + ) + scaling = 1/(4*var("pi")*mu) + + elif dim is None: + expr = None + scaling = None + else: + raise RuntimeError("unsupported dimensionality") + + self.viscosity_mu_name = viscosity_mu_name + self.icomp = icomp + self.jcomp = jcomp + + ExpressionKernel.__init__( + self, + dim, + expression=expr, + scaling=scaling, + is_complex_valued=False) + + def __getinitargs__(self): + return (self._dim, self.icomp, self.jcomp, self.viscosity_mu_name) + + def update_persistent_hash(self, key_hash, key_builder): + key_hash.update(type(self).__name__.encode()) + key_builder.rec(key_hash, (self.dim, self.icomp, self.jcomp, self.viscosity_mu_name)) + + def __repr__(self): + return "StokesletKnl%dD_%d%d" % (self.dim, self.icomp, self.jcomp) + + def get_args(self): + return [ + KernelArgument( + loopy_arg=lp.ValueArg(self.viscosity_mu_name, np.float64), + )] + + mapper_method = "map_stokeslet_kernel" + # }}} diff --git a/sumpy/p2p.py b/sumpy/p2p.py index 57823498574a2ebd24724b5ba031672bcf7adb7b..64aea367892609e93c3fcd129a33d0e986fd96cb 100644 --- a/sumpy/p2p.py +++ b/sumpy/p2p.py @@ -1,7 +1,4 @@ -from __future__ import division -from __future__ import absolute_import -import six -from six.moves import range +from __future__ import division, absolute_import __copyright__ = "Copyright (C) 2012 Andreas Kloeckner" @@ -25,6 +22,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ +import six +from six.moves import range import numpy as np import loopy as lp diff --git a/sumpy/tools.py b/sumpy/tools.py index d2a66c69e3850158396def4328378202110682f2..dbad2fab86854f12d1f76e5830ff4db1679c5b06 100644 --- a/sumpy/tools.py +++ b/sumpy/tools.py @@ -229,8 +229,9 @@ class KernelCacheWrapper(object): pass logger.info("%s: kernel cache miss" % self.name) - logger.info("%s: missed cache key: %s" % ( - self.name, cache_key)) + if CACHING_ENABLED: + logger.info("%s: missed cache key: %s" % ( + self.name, cache_key)) knl = self.get_optimized_kernel(**kwargs)