Module phi.physics.sph
Tools for running Smoothed Particle Hydrodynamics (SPH) simulations.
- Create particles as a
Geometry
collections. - Use
neighbor_graph()
to find neighbor particles and compute kernel weights. - Use custom function or built-in physics operations to integrate the dynamics.
Functions
def evaluate_kernel(delta,
distance,
h,
spatial_rank: int,
kernel: str,
types: Sequence[str] = ('kernel',)) ‑> Dict[str, phiml.math._tensors.Tensor]-
Compute the SPH kernel value or a derivative of the kernel function.
For kernels that only depends on the squared distance, such as
poly6
, thedistance
variable is not used. Instead, the squared distance is derived fromdelta
.Args
delta
- Vectors to neighbors, i.e. position differences.
distance
- Scalar distance to neighbors.
h
- Support radius / smoothing length / maximum distance / cutoff.
spatial_rank
- Dimensionality of the simulation.
kernel
- Which kernel to use, one of
'quintic-spline'
,'wendland-c2'
,'poly6'
. types
- Ordered
tuple
of derivatives to compute,'kernel'
,'grad'
,'laplace'
.
Returns
phi.math.Tensor
def expected_neighbors(volume: phiml.math._tensors.Tensor, support_radius, spatial_rank: int)
-
Given the average element volume and support radius, returns the average number of neighbors for a region filled with particles.
Args
volume
- Average particle volume.
support_radius
- Other elements are considered neighbors if their center lies within a sphere of this radius around a particle.
spatial_rank
- Spatial rank of the simulation.
Returns
Number of expected neighbors.
def neighbor_graph(nodes: phi.geom._geom.Geometry,
kernel: str,
boundary: Dict[str, Dict[str, slice]] = None,
desired_neighbors: float = None,
compute: str = 'kernel,grad',
format='sparse',
search_method='auto',
domain: phi.geom._box.Box = None,
periodic: bool | phiml.math._tensors.Tensor = False) ‑> phi.geom._graph.Graph-
Build a
Graph
based on proximity ofnodes
and evaluates the kernel function.Args
nodes
- Particles including obstacle particles as
Geometry
collection. kernel
- Kernel function to evaluate.
boundary
- Marks ranges of nodes as boundary particles, see
Graph
. desired_neighbors
- Target average number of neighbors per particle. This determines the support radius (cutoff) used.
compute
- Comma-separated
str
of kernel properties to compute on the graph edges. Can contain'kernel'
,'grad'
,'laplace'
. If no kernel property is given, the edge values will be set to the inverse distance between nodes instead. format
- Sparse format in which store neighborhood information. Allowed strings are
'dense',
'csr',
'coo',
'csc'`. search_method
- Neighborhood search method, see
phi.math.pairwise_differences
. domain
- (Optional) Specify a fixed domain size in which the centers of all nodes must be located. This is required for periodic domains.
periodic
- Which domain boundaries should be treated as periodic, i.e. particles on opposite sides are neighbors.
Can be specified as a
bool
for all sides or as a vector-valued booleanTensor
to specify periodicity by direction.
Returns
Graph
with edge values storing the kernel values, i.e. the interaction strength between particles.