23 namespace kernelHydro {
25#if defined(QUARTIC_SPLINE_KERNEL)
31#define kernel_name "Quartic spline (M5)"
33#define kernel_degree 4
36#if HYDRO_DIMENSION == 1
37#define kernel_gamma ((float)(1.936492))
38#define kernel_constant ((float)(3125. / 768.))
39#elif HYDRO_DIMENSION == 2
40#define kernel_gamma ((float)(1.977173))
41#define kernel_constant ((float)(46875. * M_1_PI / 2398.))
42#elif HYDRO_DIMENSION == 3
43#define kernel_gamma ((float)(2.018932))
44#define kernel_constant ((float)(15625. * M_1_PI / 512.))
46#pragma error "Hydro dimension undefined"
49#if defined(GPUOffloadingOMP)
50#pragma omp begin declare target
53 kernel_coeffs[(kernel_degree + 1) * (kernel_ivals + 1)]
56 6.0, 0.0, -2.4, 0.0, 0.368,
57 -4.0, 8.0, -4.8, 0.32, 0.352,
58 -4.0, 8.0, -4.8, 0.32, 0.352,
59 1.0, -4.0, 6.0, -4.0, 1.0,
60 1.0, -4.0, 6.0, -4.0, 1.0,
61 0.0, 0.0, 0.0, 0.0, 0.0};
62#if defined(GPUOffloadingOMP)
63#pragma omp end declare target
71#error "An SPH projection kernel function must be chosen !"
80#define kernel_gamma_inv ((float)(1. / kernel_gamma))
81#define kernel_gamma2 ((float)(kernel_gamma * kernel_gamma))
84#if HYDRO_DIMENSION == 1
85#define kernel_gamma_dim ((float)(kernel_gamma))
86#define kernel_gamma_dim_plus_one ((float)(kernel_gamma * kernel_gamma))
87#define kernel_gamma_inv_dim ((float)(1. / (kernel_gamma)))
88#define kernel_gamma_inv_dim_plus_one \
89 ((float)(1. / (kernel_gamma * kernel_gamma)))
90#elif HYDRO_DIMENSION == 2
91#define kernel_gamma_dim ((float)(kernel_gamma * kernel_gamma))
92#define kernel_gamma_dim_plus_one \
93 ((float)(kernel_gamma * kernel_gamma * kernel_gamma))
94#define kernel_gamma_inv_dim ((float)(1. / (kernel_gamma * kernel_gamma)))
95#define kernel_gamma_inv_dim_plus_one \
96 ((float)(1. / (kernel_gamma * kernel_gamma * kernel_gamma)))
97#elif HYDRO_DIMENSION == 3
98#define kernel_gamma_dim ((float)(kernel_gamma * kernel_gamma * kernel_gamma))
99#define kernel_gamma_dim_plus_one \
100 ((float)(kernel_gamma * kernel_gamma * kernel_gamma * kernel_gamma))
101#define kernel_gamma_inv_dim \
102 ((float)(1. / (kernel_gamma * kernel_gamma * kernel_gamma)))
103#define kernel_gamma_inv_dim_plus_one \
104 ((float)(1. / (kernel_gamma * kernel_gamma * kernel_gamma * kernel_gamma)))
108#define kernel_ivals_f ((float)(kernel_ivals))
112 ((float)(kernel_coeffs[kernel_degree]) * kernel_constant \
113 * kernel_gamma_inv_dim)
156 const int ind = temp > kernel_ivals ? kernel_ivals : temp;
157 const double*
const coeffs = &kernel_coeffs[ind * (kernel_degree + 1)];
160 double w = coeffs[0] * x + coeffs[1];
163 for (
int k = 2; k <= kernel_degree; k++)
164 w = x * w + coeffs[k];
166 w = std::max(w, 0.0);
169 W = w * kernel_constant * kernel_gamma_inv_dim;
257 const int ind = temp > kernel_ivals ? kernel_ivals : temp;
258 const double*
const coeffs = &kernel_coeffs[ind * (kernel_degree + 1)];
261 double w = coeffs[0];
262 for (
int k = 1; k <= kernel_degree; k++) {
263 w = w * x + coeffs[k];
268 double dw_dx = coeffs[0] * kernel_degree;
271 for (
int k = 1; k <= kernel_degree - 1; k++) {
272 dw_dx = dw_dx * x + coeffs[k] * (kernel_degree - k);
275 w = std::max(w, 0.0);
276 dw_dx = std::min(dw_dx, 0.0);
279 W = u == 0 ? 0: w * kernel_constant * kernel_gamma_inv_dim;
280 dW_dx = u == 0 ? 0: dw_dx * kernel_constant * kernel_gamma_inv_dim_plus_one;
void __attribute__((always_inline)) force_kernel(ParticleA &localParticle
The actual force kernel, which interacts a local particle and an active particle, and updates the loc...