numerics
Loading...
Searching...
No Matches
heat.cpp
Go to the documentation of this file.
1/// @file backends/omp/heat.cpp
2/// @brief OpenMP heat diffusion backend
3
4#include "impl.hpp"
5#include "backends/seq/impl.hpp"
6#include "kernel.hpp"
7#include <cmath>
8#include <algorithm>
9
10#ifdef NUMERICS_HAS_OMP
11# include <omp.h>
12#endif
13
14namespace physics::backends::omp {
15
16void heat_compute(std::vector<Particle>& particles,
17 const std::vector<RigidBody>& bodies,
18 const SpatialHash& grid,
19 const HeatParams& params) {
20#ifdef NUMERICS_HAS_OMP
21 const float h = params.h;
22 const float alpha = params.alpha_T;
23 const float m = params.mass;
24 const float h_conv = params.h_conv;
25 const float supp_sq = 4.0f * h * h;
26 const float eps2 = 0.01f * h * h;
27 const int n = static_cast<int>(particles.size());
28
29# pragma omp parallel for schedule(static)
30 for (int i = 0; i < n; ++i) {
31 Particle& pi = particles[i];
32 float dT = 0.0f;
33
34 grid.query(pi.x, pi.y, [&](int j) {
35 if (j == i) return;
36 const Particle& pj = particles[j];
37 const float rx = pi.x - pj.x, ry = pi.y - pj.y;
38 const float r2 = rx * rx + ry * ry;
39 if (r2 >= supp_sq || r2 < 1e-10f) return;
40 const float r = std::sqrt(r2);
41 const float rij_dot_gradW = Kernel::dW_dr(r, h) * r;
42 dT += 2.0f * alpha * (m / pj.density)
43 * (pi.temperature - pj.temperature)
44 * rij_dot_gradW / (r2 + eps2);
45 });
46
47 for (const RigidBody& body : bodies) {
48 const float dx = pi.x - body.x, dy = pi.y - body.y;
49 const float d = std::sqrt(dx * dx + dy * dy);
50 if (d < body.radius + 2.0f * h) {
51 const float excess = std::max(0.0f, d - body.radius);
52 const float phi = 1.0f - excess / (2.0f * h);
53 dT += h_conv * (body.temperature - pi.temperature) * phi;
54 }
55 }
56
57 pi.dT_dt = dT;
58 }
59#else
60 seq::heat_compute(particles, bodies, grid, params);
61#endif
62}
63
64} // namespace physics::backends::omp
void query(float px, float py, F &&f) const
void heat_compute(std::vector< Particle > &particles, const std::vector< RigidBody > &bodies, const SpatialHash &grid, const HeatParams &params)
Definition heat.cpp:16
void heat_compute(std::vector< Particle > &particles, const std::vector< RigidBody > &bodies, const SpatialHash &grid, const HeatParams &params)
Definition heat.cpp:11
std::experimental::simd butterfly for FFT.
float mass
Particle mass [kg].
Definition heat.hpp:14
float h
Smoothing length [m].
Definition heat.hpp:11
float h_conv
Convective heat transfer coefficient [1/s].
Definition heat.hpp:13
float alpha_T
Thermal diffusivity [m^2/s].
Definition heat.hpp:12
static float dW_dr(float r, float h)
Definition kernel.hpp:16
A single SPH fluid particle (float precision for performance)
Definition particle.hpp:8
float y
Position [m].
Definition particle.hpp:9
float temperature
Temperature T_i [ degC].
Definition particle.hpp:16
float density
SPH density rho_i [kg/m^3].
Definition particle.hpp:14
A rigid spherical body that interacts with fluid particles.
Definition rigid_body.hpp:8