From 8f4f81dc6227166c7e6ce35bbb6e4565d5909ad8 Mon Sep 17 00:00:00 2001 From: Matthieu Schaller <matthieu.schaller@durham.ac.uk> Date: Mon, 25 Sep 2017 17:17:41 +0100 Subject: [PATCH] Fixed FPE problem due to vectorization of the FFT task. --- src/kernel_long_gravity.h | 2 +- src/runner_doiact_fft.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/kernel_long_gravity.h b/src/kernel_long_gravity.h index ec31c27430..2e0097ded2 100644 --- a/src/kernel_long_gravity.h +++ b/src/kernel_long_gravity.h @@ -78,7 +78,7 @@ __attribute__((always_inline)) INLINE static void fourier_kernel_long_grav_eval( #else const double u = sqrt(u2); const double arg = M_PI_2 * u; - *W = arg / sinh(arg); + *W = arg / (sinh(arg) + FLT_MIN); #endif } diff --git a/src/runner_doiact_fft.c b/src/runner_doiact_fft.c index 26b59f9f6b..a8a882e4e7 100644 --- a/src/runner_doiact_fft.c +++ b/src/runner_doiact_fft.c @@ -231,7 +231,7 @@ void runner_do_grav_fft(struct runner* r, int timer) { const int kz = (k > N_half ? k - N : k); const double kz_d = (double)kz; const double fz = k_fac * kz_d; - const double sinc_kz_inv = (kz != 0) ? fz / sin(fz) : 1.; + const double sinc_kz_inv = (kz != 0) ? fz / (sin(fz) + FLT_MIN) : 1.; /* Norm of vector in Fourier space */ const double k2 = (kx_d * kx_d + ky_d * ky_d + kz_d * kz_d); @@ -242,7 +242,7 @@ void runner_do_grav_fft(struct runner* r, int timer) { /* Green function */ double W; fourier_kernel_long_grav_eval(k2 * a_smooth2, &W); - const double green_cor = green_fac * W / k2; + const double green_cor = green_fac * W / (k2 + FLT_MIN); /* Deconvolution of CIC */ const double CIC_cor = sinc_kx_inv * sinc_ky_inv * sinc_kz_inv; -- GitLab