From 65a3598032fbe78b39af80ab950497b7a1fe2015 Mon Sep 17 00:00:00 2001 From: Andrew Heather <> Date: Fri, 9 Nov 2018 09:20:50 +0000 Subject: [PATCH] ENH: fft - use fftw_malloc to create in/out arrays. Fixes #1095 --- src/randomProcesses/fft/fft.C | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/randomProcesses/fft/fft.C b/src/randomProcesses/fft/fft.C index 21e7fd85c4..6e5a74beef 100644 --- a/src/randomProcesses/fft/fft.C +++ b/src/randomProcesses/fft/fft.C @@ -180,10 +180,12 @@ void Foam::fft::transform ) { // Copy field into fftw containers - // NB: this is not fully compliant, since array sizing is non-constexpr. - // However, cannot instantiate List with fftw_complex const label N = field.size(); - fftw_complex in[N], out[N]; + + fftw_complex* inPtr = + static_cast<fftw_complex*>(fftw_malloc(sizeof(fftw_complex)*N)); + fftw_complex* outPtr = + static_cast<fftw_complex*>(fftw_malloc(sizeof(fftw_complex)*N)); // If reverse transform : renumber before transform if (dir == REVERSE_TRANSFORM) @@ -193,8 +195,8 @@ void Foam::fft::transform forAll(field, i) { - in[i][0] = field[i].Re(); - in[i][1] = field[i].Im(); + inPtr[i][0] = field[i].Re(); + inPtr[i][1] = field[i].Im(); } // Create the plan @@ -208,19 +210,22 @@ void Foam::fft::transform // Generic 1..3-D plan const label rank = nn.size(); fftw_plan plan = - fftw_plan_dft(rank, nn.begin(), in, out, dir, FFTW_ESTIMATE); + fftw_plan_dft(rank, nn.begin(), inPtr, outPtr, dir, FFTW_ESTIMATE); // Compute the FFT fftw_execute(plan); forAll(field, i) { - field[i].Re() = out[i][0]; - field[i].Im() = out[i][1]; + field[i].Re() = outPtr[i][0]; + field[i].Im() = outPtr[i][1]; } fftw_destroy_plan(plan); + fftw_free(inPtr); + fftw_free(outPtr); + // If forward transform : renumber after transform if (dir == FORWARD_TRANSFORM) { -- GitLab