16#include "backends/seq/impl.hpp"
17#include "backends/omp/impl.hpp"
30 float vx,
float vy,
float vz,
float T) {
32 p.
x = x; p.y = y; p.z = z;
33 p.vx = vx; p.vy = vy; p.vz = vz;
34 p.evx = vx; p.evy = vy; p.evz = vz;
35 p.density = params_.
rho0;
39 particles_.push_back(p);
48 if (particles_.empty())
return;
50 for (
Particle3D& p : particles_) { p.ax = p.ay = p.az = 0.0f; p.dT_dt = 0.0f; }
52 grid_.
build(particles_);
FluidSolver3D(const FluidParams3D &p)
void step()
Advance by one timestep. Dispatches to seq or omp backends.
void add_body(const RigidBody3D &b)
void add_particle(float x, float y, float z, float vx, float vy, float vz, float T)
void build(const std::vector< Particle3D > &particles)
3D WCSPH fluid solver – public interface and dispatch hub
@ omp
OpenMP parallel blocked loops.
void body_collisions(std::vector< Particle > &particles, const std::vector< RigidBody > &bodies, const FluidParams ¶ms)
void heat_compute(std::vector< Particle > &particles, const std::vector< RigidBody > &bodies, const SpatialHash &grid, const HeatParams ¶ms)
void compute_forces(std::vector< Particle > &particles, const FluidParams ¶ms, const SpatialHash &grid)
Per-particle query – each thread writes only to particles[i]. O(n*k).
void compute_density_pressure(std::vector< Particle > &particles, const FluidParams ¶ms, const SpatialHash &grid)
Per-particle query – each thread writes only to particles[i]. O(n*k).
void update_temp_range(const std::vector< Particle > &particles, const std::vector< RigidBody > &bodies, float &T_min, float &T_max)
reduction(min:T_min) reduction(max:T_max)
void integrate(std::vector< Particle > &particles, const FluidParams ¶ms)
void enforce_boundaries(std::vector< Particle > &particles, const FluidParams ¶ms)
void enforce_boundaries(std::vector< Particle > &particles, const FluidParams ¶ms)
void body_collisions(std::vector< Particle > &particles, const std::vector< RigidBody > &bodies, const FluidParams ¶ms)
void integrate(std::vector< Particle > &particles, const FluidParams ¶ms)
void compute_density_pressure(std::vector< Particle > &particles, const FluidParams ¶ms, const SpatialHash &grid)
Newton's 3rd law pair traversal – O(n*k/2).
void heat_compute(std::vector< Particle > &particles, const std::vector< RigidBody > &bodies, const SpatialHash &grid, const HeatParams ¶ms)
void update_temp_range(const std::vector< Particle > &particles, const std::vector< RigidBody > &bodies, float &T_min, float &T_max)
void integrate_bodies(std::vector< RigidBody > &bodies, const FluidParams ¶ms)
void compute_forces(std::vector< Particle > &particles, const FluidParams ¶ms, const SpatialHash &grid)
Newton's 3rd law pair traversal – O(n*k/2).
float alpha_T
Thermal diffusivity [m^2/s].
float h
Smoothing length [m].
float h_conv
Convective coefficient with rigid bodies [1/s].
num::Backend policy
seq = Newton pairs; omp = parallel
float mass
Particle mass [kg] (~= rho_0*(0.8h)^3)
float rho0
Rest density [kg/m^3].
3D SPH particle – AoS layout
3D rigid spherical body that interacts with SPH particles