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