def __init__(self, dim=None, helmholtz_k_name="k", allow_evanescent=False): """ :arg helmholtz_k_name: The argument name to use for the Helmholtz parameter when generating functions to evaluate this kernel. """ k = var(helmholtz_k_name) # Guard against code using the old positional interface. assert isinstance(allow_evanescent, bool) if dim == 2: r = pymbolic_real_norm_2(make_sym_vector("d", dim)) expr = var("hankel_1")(0, k * r) scaling = var("I") / 4 elif dim == 3: r = pymbolic_real_norm_2(make_sym_vector("d", dim)) expr = var("exp")(var("I") * k * r) / r scaling = 1 / (4 * var("pi")) else: raise RuntimeError("unsupported dimensionality") super(HelmholtzKernel, self).__init__(dim, expression=expr, global_scaling_const=scaling, is_complex_valued=True) self.helmholtz_k_name = helmholtz_k_name self.allow_evanescent = allow_evanescent
def __init__(self, dim=None, helmholtz_k_name="k", allow_evanescent=False): """ :arg helmholtz_k_name: The argument name to use for the Helmholtz parameter when generating functions to evaluate this kernel. """ k = var(helmholtz_k_name) # Guard against code using the old positional interface. assert isinstance(allow_evanescent, bool) if dim == 2: r = pymbolic_real_norm_2(make_sym_vector("d", dim)) expr = var("hankel_1")(0, k*r) scaling = var("I")/4 elif dim == 3: r = pymbolic_real_norm_2(make_sym_vector("d", dim)) expr = var("exp")(var("I")*k*r)/r scaling = 1/(4*var("pi")) elif dim is None: expr = None scaling = None else: raise RuntimeError("unsupported dimensionality") ExpressionKernel.__init__( self, dim, expression=expr, scaling=scaling, is_complex_valued=True) self.helmholtz_k_name = helmholtz_k_name self.allow_evanescent = allow_evanescent
def __init__(self, dim=None, icomp=None, jcomp=None, viscosity_mu_name="mu", stresslet_vector_name="stresslet_vec"): """ :arg viscosity_mu_name: The argument name to use for dynamic viscosity :math:`\mu` the then generating functions to evaluate this kernel. """ # Mu is unused but kept for consistency with the stokeslet. if dim == 2: d = make_sym_vector("d", dim) n = make_sym_vector(stresslet_vector_name, dim) r = pymbolic_real_norm_2(d) expr = ( sum(n[axis]*d[axis] for axis in range(dim)) * d[icomp]*d[jcomp]/r**4 ) scaling = 1/(var("pi")) elif dim == 3: d = make_sym_vector("d", dim) n = make_sym_vector(stresslet_vector_name, dim) r = pymbolic_real_norm_2(d) expr = ( sum(n[axis]*d[axis] for axis in range(dim)) * d[icomp]*d[jcomp]/r**5 ) scaling = -3/(4*var("pi")) elif dim is None: expr = None scaling = None else: raise RuntimeError("unsupported dimensionality") self.viscosity_mu_name = viscosity_mu_name self.stresslet_vector_name = stresslet_vector_name self.icomp = icomp self.jcomp = jcomp ExpressionKernel.__init__( self, dim, expression=expr, scaling=scaling, is_complex_valued=False)
def __init__(self, dim=None, yukawa_lambda_name="lam"): """ :arg yukawa_lambda_name: The argument name to use for the Yukawa parameter when generating functions to evaluate this kernel. """ lam = var(yukawa_lambda_name) if dim == 2: r = pymbolic_real_norm_2(make_sym_vector("d", dim)) # http://dlmf.nist.gov/10.27#E8 expr = var("hankel_1")(0, var("I")*lam*r) scaling_for_K0 = 1/2*var("pi")*var("I") # noqa: N806 scaling = -1/(2*var("pi")) * scaling_for_K0 else: raise RuntimeError("unsupported dimensionality") super(YukawaKernel, self).__init__( dim, expression=expr, global_scaling_const=scaling, is_complex_valued=True) self.yukawa_lambda_name = yukawa_lambda_name
def get_kernel(): from sumpy.symbolic import pymbolic_real_norm_2 from pymbolic.primitives import make_sym_vector from pymbolic import var d = make_sym_vector("d", 3) r = pymbolic_real_norm_2(d[:-1]) # r3d = pymbolic_real_norm_2(d) #expr = var("log")(r3d) log = var("log") sqrt = var("sqrt") a = d[-1] expr = log(r) expr = log(sqrt(r**2 + a**2)) expr = log(sqrt(r + a**2)) #expr = log(sqrt(r**2 + a**2))-a**2/2/(r**2+a**2) #expr = 2*log(sqrt(r**2 + a**2)) scaling = 1 / (2 * var("pi")) from sumpy.kernel import ExpressionKernel return ExpressionKernel(dim=3, expression=expr, global_scaling_const=scaling, is_complex_valued=False)
def get_kernel(): from sumpy.symbolic import pymbolic_real_norm_2 from pymbolic.primitives import make_sym_vector from pymbolic import var d = make_sym_vector("d", 3) r = pymbolic_real_norm_2(d[:-1]) # r3d = pymbolic_real_norm_2(d) #expr = var("log")(r3d) log = var("log") sqrt = var("sqrt") a = d[-1] expr = log(r) expr = log(sqrt(r**2 + a**2)) expr = log(sqrt(r + a**2)) #expr = log(sqrt(r**2 + a**2))-a**2/2/(r**2+a**2) #expr = 2*log(sqrt(r**2 + a**2)) scaling = 1/(2*var("pi")) from sumpy.kernel import ExpressionKernel return ExpressionKernel( dim=3, expression=expr, global_scaling_const=scaling, is_complex_valued=False)
def __init__(self, dim=None): # See (Kress LIE, Thm 6.2) for scaling if dim == 2: r = pymbolic_real_norm_2(make_sym_vector("d", dim)) expr = var("log")(r) scaling = 1 / (-2 * var("pi")) elif dim == 3: r = pymbolic_real_norm_2(make_sym_vector("d", dim)) expr = 1 / r scaling = 1 / (4 * var("pi")) else: raise NotImplementedError("unsupported dimensionality") super(LaplaceKernel, self).__init__(dim, expression=expr, global_scaling_const=scaling, is_complex_valued=False)
def __init__(self, dim=None): # See (Kress LIE, Thm 6.2) for scaling if dim == 2: r = pymbolic_real_norm_2(make_sym_vector("d", dim)) expr = var("log")(r) scaling = 1/(-2*var("pi")) elif dim == 3: r = pymbolic_real_norm_2(make_sym_vector("d", dim)) expr = 1/r scaling = 1/(4*var("pi")) else: raise NotImplementedError("unsupported dimensionality") super(LaplaceKernel, self).__init__( dim, expression=expr, global_scaling_const=scaling, is_complex_valued=False)
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 == 3: d = make_sym_vector("d", dim) r = pymbolic_real_norm_2(d) expr = ( (1/r)*(1 if icomp == jcomp else 0) + d[icomp]*d[jcomp]/r**3 ) scaling = -1/(8*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 __init__(self, dim, icomp, jcomp, viscosity_mu_name="mu"): r""" :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) + # noqa: W504 d[icomp]*d[jcomp]/r**2 ) scaling = -1/(4*var("pi")*mu) elif dim == 3: d = make_sym_vector("d", dim) r = pymbolic_real_norm_2(d) expr = ( (1/r)*(1 if icomp == jcomp else 0) + # noqa: W504 d[icomp]*d[jcomp]/r**3 ) scaling = -1/(8*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 super(StokesletKernel, self).__init__( dim, expression=expr, global_scaling_const=scaling, is_complex_valued=False)
def __init__(self, dim=None, icomp=None, jcomp=None, kcomp=None, viscosity_mu_name="mu"): r""" :arg viscosity_mu_name: The argument name to use for dynamic viscosity :math:`\mu` the then generating functions to evaluate this kernel. """ # Mu is unused but kept for consistency with the stokeslet. if dim == 2: d = make_sym_vector("d", dim) r = pymbolic_real_norm_2(d) expr = ( d[icomp]*d[jcomp]*d[kcomp]/r**4 ) scaling = 1/(var("pi")) elif dim == 3: d = make_sym_vector("d", dim) r = pymbolic_real_norm_2(d) expr = ( d[icomp]*d[jcomp]*d[kcomp]/r**5 ) scaling = 3/(4*var("pi")) 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 self.kcomp = kcomp super(StressletKernel, self).__init__( dim, expression=expr, global_scaling_const=scaling, is_complex_valued=False)
def __init__(self, dim=None): # See (Kress LIE, Thm 6.2) for scaling if dim == 2: r = pymbolic_real_norm_2(make_sym_vector("d", dim)) expr = var("log")(r) scaling = 1/(-2*var("pi")) elif dim == 3: r = pymbolic_real_norm_2(make_sym_vector("d", dim)) expr = 1/r scaling = 1/(4*var("pi")) elif dim is None: expr = None scaling = None else: raise RuntimeError("unsupported dimensionality") ExpressionKernel.__init__( self, dim, expression=expr, scaling=scaling, is_complex_valued=False)
def get_kernel(): from sumpy.symbolic import pymbolic_real_norm_2 from pymbolic.primitives import (make_sym_vector, Variable as var) r = pymbolic_real_norm_2(make_sym_vector("d", 3)) expr = var("log")(r) scaling = 1/(2*var("pi")) from sumpy.kernel import ExpressionKernel return ExpressionKernel( dim=3, expression=expr, scaling=scaling, is_complex_valued=False)
def __init__(self, dim=None): r = pymbolic_real_norm_2(make_sym_vector("d", dim)) if dim == 2: expr = r**2 * var("log")(r) scaling = 1 / (8 * var("pi")) elif dim == 3: expr = r scaling = 1 # FIXME: Unknown else: raise RuntimeError("unsupported dimensionality") super(BiharmonicKernel, self).__init__(dim, expression=expr, global_scaling_const=scaling, is_complex_valued=False)
def __init__(self, dim=None): r = pymbolic_real_norm_2(make_sym_vector("d", dim)) if dim == 2: expr = r**2 * var("log")(r) scaling = 1/(8*var("pi")) elif dim == 3: expr = r scaling = 1 # FIXME: Unknown else: raise RuntimeError("unsupported dimensionality") super(BiharmonicKernel, self).__init__( dim, expression=expr, global_scaling_const=scaling, is_complex_valued=False)
def __init__(self, dim=None): # See https://arxiv.org/abs/1202.1811 r = pymbolic_real_norm_2(make_sym_vector("d", dim)) if dim == 2: expr = r**2 * (var("log")(r) - 1) scaling = -1 / (8 * var("pi")) elif dim == 3: expr = r scaling = 1 / (8 * var("pi")) else: raise RuntimeError("unsupported dimensionality") super(BiharmonicKernel, self).__init__(dim, expression=expr, global_scaling_const=scaling, is_complex_valued=False)
def __init__(self, dim=None, yukawa_lambda_name="lam"): """ :arg yukawa_lambda_name: The argument name to use for the Yukawa parameter when generating functions to evaluate this kernel. """ lam = var(yukawa_lambda_name) # NOTE: The Yukawa kernel is given by [1] # -1/(2 pi)**(n/2) * (lam/r)**(n/2-1) * K(n/2-1, lam r) # where K is a modified Bessel function of the second kind. # # [1] https://en.wikipedia.org/wiki/Green%27s_function # [2] http://dlmf.nist.gov/10.27#E8 # [3] https://dlmf.nist.gov/10.47#E2 # [4] https://dlmf.nist.gov/10.49 r = pymbolic_real_norm_2(make_sym_vector("d", dim)) if dim == 2: # NOTE: transform K(0, lam r) into a Hankel function using [2] expr = var("hankel_1")(0, var("I")*lam*r) scaling_for_K0 = var("pi")/2*var("I") # noqa: N806 scaling = -1/(2*var("pi")) * scaling_for_K0 elif dim == 3: # NOTE: to get the expression, we do the following and simplify # 1. express K(1/2, lam r) as a modified spherical Bessel function # k(0, lam r) using [3] and use expression for k(0, lam r) from [4] # 2. or use (AS 10.2.17) directly expr = var("exp")(-lam*r) / r scaling = -1/(4 * var("pi")**2) else: raise RuntimeError("unsupported dimensionality") super(YukawaKernel, self).__init__( dim, expression=expr, global_scaling_const=scaling, is_complex_valued=True) self.yukawa_lambda_name = yukawa_lambda_name
def __init__(self, dim=None): r = pymbolic_real_norm_2(make_sym_vector("d", dim)) if dim == 2: # Ref: Farkas, Peter. Mathematical foundations for fast algorithms # for the biharmonic equation. Technical Report 765, # Department of Computer Science, Yale University, 1990. expr = r**2 * var("log")(r) scaling = 1 / (8 * var("pi")) elif dim == 3: # Ref: Jiang, Shidong, Bo Ren, Paul Tsuji, and Lexing Ying. # "Second kind integral equations for the first kind Dirichlet problem # of the biharmonic equation in three dimensions." # Journal of Computational Physics 230, no. 19 (2011): 7488-7501. expr = r scaling = -1 / (8 * var("pi")) else: raise RuntimeError("unsupported dimensionality") super().__init__(dim, expression=expr, global_scaling_const=scaling, is_complex_valued=False)