numerics
Loading...
Searching...
No Matches
fluid.cpp
Go to the documentation of this file.
1/// @file fluid.cpp
2/// @brief Single-switch dispatch from Backend enum to SPH backend implementations.
3///
4/// Mirrors src/backends/dispatch.cpp exactly:
5/// - Includes both seq and omp impl.hpp headers
6/// - switch(params_.policy) routes each phase to the correct backend
7/// - Non-computational methods (add_particle, clear, ...) live here directly
8///
9/// Adding a new backend:
10/// 1. Add the enumerator to num::Backend in include/core/policy.hpp
11/// 2. Create apps/fluid_sim/backends/<name>/ with impl.hpp + fluid.cpp + heat.cpp
12/// 3. Add `case num::Backend::<name>:` to the switch in step()
13/// 4. Register the .cpp files in apps/fluid_sim/CMakeLists.txt
14
15#include "fluid.hpp"
16#include "backends/seq/impl.hpp"
17#include "backends/omp/impl.hpp"
18
19namespace physics {
20
22 : params_(params)
23 , grid_(2.0f * params.h,
24 params.xmin, params.xmax,
25 params.ymin, params.ymax)
26{}
27
28void FluidSolver::add_particle(float x, float y, float vx, float vy, float temperature) {
29 Particle p{};
30 p.x = x; p.y = y;
31 p.vx = vx; p.vy = vy;
32 p.evx = vx; p.evy = vy;
33 p.density = params_.rho0;
34 p.pressure = 0.0f;
35 p.temperature = temperature;
36 particles_.push_back(p);
37}
38
39void FluidSolver::add_body(const RigidBody& body) { bodies_.push_back(body); }
40void FluidSolver::clear() { particles_.clear(); bodies_.clear(); }
41
42// --- Main step -- policy dispatch ---------------------------------------------
43
45 if (particles_.empty()) return;
46
47 for (Particle& p : particles_) { p.ax = p.ay = 0.0f; p.dT_dt = 0.0f; }
48
49 grid_.build(particles_); // O(n + C) counting sort -- always sequential
50
51 const HeatParams hp{params_.h, params_.alpha_T, params_.h_conv, params_.mass};
52
53 switch (params_.policy) {
54
56 backends::omp::compute_density_pressure(particles_, params_, grid_);
57 backends::omp::compute_forces(particles_, params_, grid_);
58 backends::omp::heat_compute(particles_, bodies_, grid_, hp);
59 backends::omp::body_collisions(particles_, bodies_, params_);
60 backends::omp::integrate(particles_, params_);
61 backends::omp::enforce_boundaries(particles_, params_);
62 backends::omp::update_temp_range(particles_, bodies_, T_min_, T_max_);
63 backends::seq::integrate_bodies(bodies_, params_); // M bodies tiny -- seq
64 break;
65
66 default: // seq: Newton pair traversal
67 backends::seq::compute_density_pressure(particles_, params_, grid_);
68 backends::seq::compute_forces(particles_, params_, grid_);
69 backends::seq::heat_compute(particles_, bodies_, grid_, hp);
70 backends::seq::body_collisions(particles_, bodies_, params_);
71 backends::seq::integrate(particles_, params_);
72 backends::seq::enforce_boundaries(particles_, params_);
73 backends::seq::update_temp_range(particles_, bodies_, T_min_, T_max_);
74 backends::seq::integrate_bodies(bodies_, params_);
75 break;
76 }
77}
78
79} // namespace physics
FluidSolver(const FluidParams &params)
Definition fluid.cpp:21
void add_particle(float x, float y, float vx, float vy, float temperature)
Definition fluid.cpp:28
void add_body(const RigidBody &body)
Definition fluid.cpp:39
void build(const std::vector< Particle > &particles)
Rebuild from the particle array. O(n + C).
Weakly Compressible SPH (WCSPH) fluid solver – public interface.
@ omp
OpenMP parallel blocked loops.
void body_collisions(std::vector< Particle > &particles, const std::vector< RigidBody > &bodies, const FluidParams &params)
Definition fluid.cpp:105
void heat_compute(std::vector< Particle > &particles, const std::vector< RigidBody > &bodies, const SpatialHash &grid, const HeatParams &params)
Definition heat.cpp:16
void compute_forces(std::vector< Particle > &particles, const FluidParams &params, const SpatialHash &grid)
Per-particle query – each thread writes only to particles[i]. O(n*k).
Definition fluid.cpp:62
void compute_density_pressure(std::vector< Particle > &particles, const FluidParams &params, const SpatialHash &grid)
Per-particle query – each thread writes only to particles[i]. O(n*k).
Definition fluid.cpp:33
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)
Definition fluid.cpp:168
void integrate(std::vector< Particle > &particles, const FluidParams &params)
Definition fluid.cpp:133
void enforce_boundaries(std::vector< Particle > &particles, const FluidParams &params)
Definition fluid.cpp:151
void enforce_boundaries(std::vector< Particle > &particles, const FluidParams &params)
Definition fluid.cpp:119
void body_collisions(std::vector< Particle > &particles, const std::vector< RigidBody > &bodies, const FluidParams &params)
Definition fluid.cpp:87
void integrate(std::vector< Particle > &particles, const FluidParams &params)
Definition fluid.cpp:108
void compute_density_pressure(std::vector< Particle > &particles, const FluidParams &params, const SpatialHash &grid)
Newton's 3rd law pair traversal – O(n*k/2).
Definition fluid.cpp:19
void heat_compute(std::vector< Particle > &particles, const std::vector< RigidBody > &bodies, const SpatialHash &grid, const HeatParams &params)
Definition heat.cpp:11
void update_temp_range(const std::vector< Particle > &particles, const std::vector< RigidBody > &bodies, float &T_min, float &T_max)
Definition fluid.cpp:129
void integrate_bodies(std::vector< RigidBody > &bodies, const FluidParams &params)
Definition fluid.cpp:144
void compute_forces(std::vector< Particle > &particles, const FluidParams &params, const SpatialHash &grid)
Newton's 3rd law pair traversal – O(n*k/2).
Definition fluid.cpp:50
float rho0
Rest density [kg/m^3].
Definition fluid.hpp:37
float alpha_T
Thermal diffusivity [m^2/s].
Definition fluid.hpp:58
float h
Smoothing length [m].
Definition fluid.hpp:34
num::Backend policy
seq = Newton pairs; omp = parallel
Definition fluid.hpp:62
float h_conv
Convective coefficient with rigid bodies [1/s].
Definition fluid.hpp:59
float mass
Particle mass [kg] (~= rho_0*dx^2, dx=0.8h)
Definition fluid.hpp:41
A single SPH fluid particle (float precision for performance)
Definition particle.hpp:8
A rigid spherical body that interacts with fluid particles.
Definition rigid_body.hpp:8