Welcome to biem-helmholtz-sphere documentation!

Installation & Usage

biem-helmholtz-sphere

CI Status Documentation Status Test coverage percentage

uv Ruff pre-commit

PyPI Version Supported Python versions License


Documentation: https://biem-helmholtz-sphere.readthedocs.io

Source Code: https://github.com/ultrasphere-dev/biem-helmholtz-sphere


Acoustic scattering from multiple n-spheres in NumPy / PyTorch

Open in Spaces

Open in Spaces

Installation

Install this via pip (or your favourite package manager):

pip install biem-helmholtz-sphere

Usage (GUI)

GUI

uvx biem-helmholtz-sphere serve

Usage

Boundary Integral Equation Method (BIEM) for the Helmholtz equation.

Let \(d \in \mathbb{N} \setminus \lbrace 1 \rbrace\) be the dimension of the space, \(k\) be the wave number, and \(\mathbb{S}^{d-1} = \lbrace x \in \mathbb{R}^d \mid \|x\| = 1 \rbrace\) be a unit sphere in \(\mathbb{R}^d\). Let \(B := {0, ..., }\) be the index set of spheres, \(c_b \in \mathbb{R}^d\) be the center of sphere \(b \in B\), and \(\rho_b > 0\) be the radius of sphere \(b \in B\). Assume that the closure of spheres do not overlap, i.e.,

\[ \forall b, b' \in B, b \neq b', \|c_b - c_b'\| > \rho_b + \rho_b' \]

Asuume that \(u_\text{in}\) is an incident wave satisfying the Helmholtz equation

\[ \Delta u_\text{in} + k^2 u_\text{in} = 0 \]

and scattered wave \(u\) satisfies the following:

\[\begin{split} \begin{cases} \Delta u + k^2 u = 0 \quad &x \in \mathbb{R}^d \setminus \overline{\mathbb{S}^{d-1}} \\ \alpha u + \beta \nabla u \cdot n_x = -\alpha u_\text{in} -\beta \nabla u_\text{in} \cdot n_x \quad &x \in \mathbb{S}^{d-1} \\ \lim_{\|x\| \to \infty} \|x\|^{\frac{d-1}{2}} \left( \frac{\partial u}{\partial \|x\|} - i k u \right) = 0 \quad &\frac{x}{\|x\|} \in \mathbb{S}^{d-1} \end{cases} \end{split}\]

The following code assumes

\[ d = 3, k = 1, u_\text{in} (x) = e^{i k x_0}, c_0 = (0, 2, 0), c_1 = (0, -2, 0), \rho_0 = 1, \rho_1 = 1, \alpha = 1, \beta = 0 \quad \text{(Sound-soft)} \]

and computes the scattered wave at \((0, 0, 0)\).

>>> from array_api_compat import numpy as xp
>>> from biem_helmholtz_sphere import BIEMResultCalculator, biem, plane_wave
>>> from ultrasphere import create_from_branching_types
>>> c = create_from_branching_types("ba")
>>> uin, uin_grad = plane_wave(k=xp.asarray(1.0), direction=xp.asarray((1.0, 0.0, 0.0)))
>>> calc = biem(c, uin=uin, uin_grad=uin_grad, k=xp.asarray(1.0), n_end=6, eta=xp.asarray(1.0), centers=xp.asarray(((0.0, 2.0, 0.0), (0.0, -2.0, 0.0))), radii=xp.asarray((1.0, 1.0)), kind="outer")
>>> complex(xp.round(calc.uscat(xp.asarray((0.0, 0.0, 0.0))), 6))
(-0.741333-0.669657j)

Accuracy

  • The radius of spheres is fixed to 1.0.

  • The incident wave is \(u_\text{in} (x) = e^{i k x_0}\).

  • For n_balls == 2, spheres are centered at (0, 2, 0, ...) and (0, -2, 0, ...).

  • For n_balls == 4, ..., spheres are placed in 2D grid pattern with distance of 4.0 between adjacent spheres.

vs Wavenumber k

2D

k vs error 2D

3D

k vs error 3D

vs Number of Spheres n_balls

2D

n_balls vs error 2D

Citation

Consider citing the following paper if you use this package in your research:

Contributors ✨

Thanks goes to these wonderful people (emoji key):

This project follows the all-contributors specification. Contributions of any kind welcome!

Credits

Copier

This package was created with Copier and the browniebroke/pypackage-template project template.