Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
176 changes: 176 additions & 0 deletions .basedpyright/baseline.json
Original file line number Diff line number Diff line change
Expand Up @@ -17531,6 +17531,182 @@
"lineCount": 1
}
},
{
"code": "reportUnknownArgumentType",
"range": {
"startColumn": 27,
"endColumn": 43,
"lineCount": 1
}
},
{
"code": "reportCallIssue",
"range": {
"startColumn": 34,
"endColumn": 38,
"lineCount": 1
}
},
{
"code": "reportUnknownMemberType",
"range": {
"startColumn": 15,
"endColumn": 24,
"lineCount": 1
}
},
{
"code": "reportUnknownMemberType",
"range": {
"startColumn": 20,
"endColumn": 45,
"lineCount": 1
}
},
{
"code": "reportUnknownMemberType",
"range": {
"startColumn": 22,
"endColumn": 47,
"lineCount": 1
}
},
{
"code": "reportUnknownMemberType",
"range": {
"startColumn": 20,
"endColumn": 47,
"lineCount": 1
}
},
{
"code": "reportUnknownMemberType",
"range": {
"startColumn": 22,
"endColumn": 49,
"lineCount": 1
}
},
{
"code": "reportUnknownMemberType",
"range": {
"startColumn": 16,
"endColumn": 42,
"lineCount": 1
}
},
{
"code": "reportUnknownArgumentType",
"range": {
"startColumn": 16,
"endColumn": 71,
"lineCount": 1
}
},
{
"code": "reportUnknownMemberType",
"range": {
"startColumn": 22,
"endColumn": 48,
"lineCount": 1
}
},
{
"code": "reportUnknownMemberType",
"range": {
"startColumn": 24,
"endColumn": 50,
"lineCount": 1
}
},
{
"code": "reportArgumentType",
"range": {
"startColumn": 52,
"endColumn": 55,
"lineCount": 1
}
},
{
"code": "reportArgumentType",
"range": {
"startColumn": 59,
"endColumn": 62,
"lineCount": 1
}
},
{
"code": "reportArgumentType",
"range": {
"startColumn": 59,
"endColumn": 62,
"lineCount": 1
}
},
{
"code": "reportArgumentType",
"range": {
"startColumn": 57,
"endColumn": 60,
"lineCount": 1
}
},
{
"code": "reportArgumentType",
"range": {
"startColumn": 57,
"endColumn": 60,
"lineCount": 1
}
},
{
"code": "reportCallIssue",
"range": {
"startColumn": 20,
"endColumn": 76,
"lineCount": 1
}
},
{
"code": "reportArgumentType",
"range": {
"startColumn": 25,
"endColumn": 75,
"lineCount": 1
}
},
{
"code": "reportArgumentType",
"range": {
"startColumn": 29,
"endColumn": 33,
"lineCount": 1
}
},
{
"code": "reportCallIssue",
"range": {
"startColumn": 26,
"endColumn": 73,
"lineCount": 1
}
},
{
"code": "reportUnknownArgumentType",
"range": {
"startColumn": 26,
"endColumn": 73,
"lineCount": 1
}
},
{
"code": "reportArgumentType",
"range": {
"startColumn": 46,
"endColumn": 72,
"lineCount": 1
}
},
{
"code": "reportUnknownParameterType",
"range": {
Expand Down
6 changes: 3 additions & 3 deletions sumpy/kernel.py
Original file line number Diff line number Diff line change
Expand Up @@ -1116,9 +1116,9 @@ def __init__(self,
d[icomp] / r**2 * delta_jk
+ d[jcomp] / r**2 * delta_ik
- d[kcomp] / r**2 * delta_ij)
+ 3 * d[icomp] * d[jcomp] * d[kcomp] / r**4
+ 2 * d[icomp] * d[jcomp] * d[kcomp] / r**4
)
scaling = -1/(4*var("pi")*(1 - nu))
scaling = 1/(4*var("pi")*(1 - nu))
elif dim == 3:
expr = (
(1 - 2*nu) * (
Expand All @@ -1127,7 +1127,7 @@ def __init__(self,
- d[kcomp] / r**3 * delta_ij)
+ 3 * d[icomp] * d[jcomp] * d[kcomp] / r**5
)
scaling = -1/(8*var("pi")*(1 - nu))
scaling = 1/(8*var("pi")*(1 - nu))
else:
raise NotImplementedError(f"unsupported dimension: '{dim}'")

Expand Down
4 changes: 2 additions & 2 deletions sumpy/test/test_kernels.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ def test_p2e_multiple(
extra_kwargs["k"] = 0.2 * (0.707 + 0.707j)
else:
extra_kwargs["k"] = 0.2
if isinstance(base_knl, StokesletComponentKernel):
elif isinstance(base_knl, StokesletComponentKernel):
extra_kwargs["mu"] = 0.2

source_kernels = [
Expand Down Expand Up @@ -313,7 +313,7 @@ def test_p2e2p(
extra_kwargs["k"] = 0.2 * (0.707 + 0.707j)
else:
extra_kwargs["k"] = 0.2
if isinstance(base_knl, StokesletComponentKernel):
elif isinstance(base_knl, StokesletComponentKernel):
extra_kwargs["mu"] = 0.2

if with_source_derivative:
Expand Down
95 changes: 95 additions & 0 deletions sumpy/test/test_misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,101 @@ def test_pde_check_kernels(actx_factory: ArrayContextFactory, knl_info, order=5)
# }}}


# {{{ test_stress_kernel_definition


@pytest.mark.parametrize("dim", [2, 3])
@pytest.mark.parametrize(["name", "kernel_kwargs"], [
("stokes", {"mu": 2.5}),
("elasticity", {"mu": 2.5, "nu": 0.2}),
("brinkman", {"mu": 2.5, "k": 1.3}),
])
def test_stress_kernel_definition(
dim: int, name: str, kernel_kwargs: dict[str, float]
) -> None:
from itertools import product

rng = np.random.default_rng(42)
dvec = sym.make_sym_vector("d", dim)
kernel_kwargs = {
sym.SpatialConstant(k).as_sympy().name: v for k, v in kernel_kwargs.items()
}

def evalf(expr: sym.Expr) -> complex:
if sym.USE_SYMENGINE:
return complex(expr.n(prec=100))
else:
return complex(expr.evalf(30))

def pressure_expr(i: int) -> sym.Expr:
kernel = LaplaceKernel(dim)
expr = kernel.get_global_scaling_const() * kernel.get_expression(dvec)
return expr.diff(dvec[i])

def stokeslet_expr(i: int, j: int) -> sym.Expr:
u = StokesletComponentKernel(dim, i, j)
return u.get_global_scaling_const() * u.get_expression(dvec)

def brinkmanlet_expr(i: int, j: int) -> sym.Expr:
u = BrinkmanletComponentKernel(dim, i, j)
return u.get_global_scaling_const() * u.get_expression(dvec)

def elasticity_expr(i: int, j: int) -> sym.Expr:
u = ElasticityComponentKernel(dim, i, j)
return u.get_global_scaling_const() * u.get_expression(dvec)

def ref_stokes_stress(i: int, j: int, k: int) -> sym.Expr:
mu = sym.SpatialConstant("mu").as_sympy()
return (
-pressure_expr(j) * int(i == k)
+ mu * (stokeslet_expr(i, j).diff(dvec[k])
+ stokeslet_expr(k, j).diff(dvec[i]))
)

def ref_brinkman_stress(i: int, j: int, k: int) -> sym.Expr:
mu = sym.SpatialConstant("mu").as_sympy()
return (
-pressure_expr(j) * int(i == k)
+ mu * (brinkmanlet_expr(i, j).diff(dvec[k])
+ brinkmanlet_expr(k, j).diff(dvec[i]))
)

def ref_elasticity_stress(i: int, j: int, k: int) -> sym.Expr:
mu = sym.SpatialConstant("mu").as_sympy()
nu = sym.SpatialConstant("nu").as_sympy()
lm = 2 * mu * nu / (1 - 2 * nu)

return (
lm * int(i == j) * sum(
elasticity_expr(d, k).diff(dvec[d]) for d in range(dim)
) + mu * (elasticity_expr(i, k).diff(dvec[j])
+ elasticity_expr(j, k).diff(dvec[i]))
)

for ijk in product(range(dim), repeat=3):
if name == "stokes":
kernel = StressletComponentKernel(dim, *ijk)
stress = kernel.get_global_scaling_const() * kernel.get_expression(dvec)
ref = ref_stokes_stress(*ijk)
elif name == "elasticity":
kernel = ElasticityStressComponentKernel(dim, *ijk)
stress = kernel.get_global_scaling_const() * kernel.get_expression(dvec)
ref = ref_elasticity_stress(*ijk)
elif name == "brinkman":
kernel = BrinkmanStressComponentKernel(dim, *ijk)
stress = kernel.get_global_scaling_const() * kernel.get_expression(dvec)
ref = ref_brinkman_stress(*ijk)
else:
raise AssertionError

for _ in range(3):
point = dict(zip(dvec, rng.uniform(0.3, 1.2, dim), strict=True))
ratio = evalf((stress / ref).subs({**kernel_kwargs, **point}))
assert abs(ratio - 1) < 1.0e-10, f"{kernel}: got ratio {ratio}"

# }}}


# {{{ test_pde_check

@pytest.mark.parametrize("dim", [1, 2, 3])
Expand Down
Loading