numerics
Loading...
Searching...
No Matches
fluid3d.cpp
Go to the documentation of this file.
1/// @file fluid3d.cpp
2/// @brief Single-switch dispatch from Backend enum to 3D SPH backend implementations.
3///
4/// Mirrors apps/fluid_sim/fluid.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_3d/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_3d/CMakeLists.txt
14
15#include "fluid3d.hpp"
16#include "backends/seq/impl.hpp"
17#include "backends/omp/impl.hpp"
18
19namespace physics {
20
22 : params_(p)
23 , grid_(2.0f * p.h,
24 p.xmin, p.xmax,
25 p.ymin, p.ymax,
26 p.zmin, p.zmax)
27{}
28
29void FluidSolver3D::add_particle(float x, float y, float z,
30 float vx, float vy, float vz, float T) {
31 Particle3D p{};
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;
36 p.pressure = 0.0f;
37 p.temperature = T;
38 p.dT_dt = 0.0f;
39 particles_.push_back(p);
40}
41
42void FluidSolver3D::add_body(const RigidBody3D& b) { bodies_.push_back(b); }
43void FluidSolver3D::clear() { particles_.clear(); bodies_.clear(); }
44
45// --- Main step -- policy dispatch ---------------------------------------------
46
48 if (particles_.empty()) return;
49
50 for (Particle3D& p : particles_) { p.ax = p.ay = p.az = 0.0f; p.dT_dt = 0.0f; }
51
52 grid_.build(particles_); // O(n + C) counting sort -- always sequential
53
54 const HeatParams3D hp{params_.h, params_.alpha_T, params_.h_conv, params_.mass};
55
56 switch (params_.policy) {
57
59 backends::omp::compute_density_pressure(particles_, params_, grid_);
60 backends::omp::compute_forces(particles_, params_, grid_);
61 backends::omp::heat_compute(particles_, bodies_, grid_, hp);
62 backends::omp::body_collisions(particles_, bodies_, params_);
63 backends::omp::integrate(particles_, params_);
64 backends::omp::enforce_boundaries(particles_, params_);
65 backends::omp::update_temp_range(particles_, bodies_, T_min_, T_max_);
66 backends::seq::integrate_bodies(bodies_, params_); // M bodies tiny -- seq
67 break;
68
69 default: // seq: Newton pair traversal
70 backends::seq::compute_density_pressure(particles_, params_, grid_);
71 backends::seq::compute_forces(particles_, params_, grid_);
72 backends::seq::heat_compute(particles_, bodies_, grid_, hp);
73 backends::seq::body_collisions(particles_, bodies_, params_);
74 backends::seq::integrate(particles_, params_);
75 backends::seq::enforce_boundaries(particles_, params_);
76 backends::seq::update_temp_range(particles_, bodies_, T_min_, T_max_);
77 backends::seq::integrate_bodies(bodies_, params_);
78 break;
79 }
80}
81
82} // namespace physics
FluidSolver3D(const FluidParams3D &p)
Definition fluid3d.cpp:21
void step()
Advance by one timestep. Dispatches to seq or omp backends.
Definition fluid3d.cpp:47
void add_body(const RigidBody3D &b)
Definition fluid3d.cpp:42
void add_particle(float x, float y, float z, float vx, float vy, float vz, float T)
Definition fluid3d.cpp:29
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 &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 alpha_T
Thermal diffusivity [m^2/s].
Definition fluid3d.hpp:37
float h
Smoothing length [m].
Definition fluid3d.hpp:22
float h_conv
Convective coefficient with rigid bodies [1/s].
Definition fluid3d.hpp:38
num::Backend policy
seq = Newton pairs; omp = parallel
Definition fluid3d.hpp:40
float mass
Particle mass [kg] (~= rho_0*(0.8h)^3)
Definition fluid3d.hpp:27
float rho0
Rest density [kg/m^3].
Definition fluid3d.hpp:23
3D SPH particle – AoS layout
Definition particle3d.hpp:8
3D rigid spherical body that interacts with SPH particles