A scalar quantity can be determined for each particle by weighing that quantity from nearby particles with an appropriate kernel function.
rho (density) can be calculated with the mass of the particle and the default kernel function.
Updating a particle's position and velocity will be based on this equation for fluids. Pressure gradient, viscosity, and external forces (gravity) are required to solve this equation.
From Lagrangian Fluid Dynamics Using Smoothed Particle Hydrodynamics
- Mass = 0.2
- Stiffness = 3.5
- Ideal Density = 1000
- Viscosity = 3.5
- Support Radius (h for Spatial Hashing) = 0.0625
- Smoothing (h for kernels) = 0.0625
Navier-Stokes Equation Breakdown
Pressure Gradient is how much the particle is affected by other particles.
Viscosity is how much particles will stick together.
External forces: gravity
Kernel Function to calculate density. h is the smoothing constant used to calculate which particles to use to affect the current particle.
Kernel Function for calculating pressure gradient
Kernel Function for calcuating viscosity
SPH with Spacial Hashing
Code Algorithm to Update Particles with SPH
Algorithm obtained from Efficient Neighbor Search for Particle-based Fluids paper. Describes how to calculate SPH with Navier-Stokes and Kernel Functions.
The naive way of implementing SPH would be to check all particles with each other to see if they interact with each other. This makes runtime O(n2). To speed up the runtime, we can run an algorithm called the nearest neighbour algorithm that will only have particles interact with each other if they are close enough. Particles are "close enough" to each other if they are within the radius of support distance (h). Runtime will be reduced to be O(nm), where m is the average number of neighbours. The diagram to the left is an example of it in 2D. Each cell is given a number and each particle is given the location it is in. Then to detect neighbors, it grabs the nearby cells. My project does this in 3D, where instead of 9 cells to look it, it becomes 27.