From 23af7e435a4acb100add288dd5322697cb9b5a0a Mon Sep 17 00:00:00 2001
From: Andrew Heather <a.heather@opencfd.co.uk>
Date: Fri, 29 Dec 2017 23:57:22 +0000
Subject: [PATCH] ENH: FFT - removed power-of-2 constraint on number of samples

---
 .../utilities/postProcessing/noise/noise.C         |  3 +--
 .../utilities/postProcessing/noise/noiseDict       |  6 ++----
 src/randomProcesses/fft/fft.C                      | 14 --------------
 .../noise/noiseModels/noiseModel/noiseModel.C      | 10 ----------
 .../noise/noiseModels/noiseModel/noiseModel.H      |  3 ---
 .../noise/noiseModels/pointNoise/pointNoise.H      |  3 +--
 .../noise/noiseModels/surfaceNoise/surfaceNoise.H  |  3 +--
 .../LES/vortexShed/system/noiseDict-point          |  2 +-
 .../LES/vortexShed/system/noiseDict-surface        |  2 +-
 9 files changed, 7 insertions(+), 39 deletions(-)

diff --git a/applications/utilities/postProcessing/noise/noise.C b/applications/utilities/postProcessing/noise/noise.C
index 97f2cb775f3..61653947eaa 100644
--- a/applications/utilities/postProcessing/noise/noise.C
+++ b/applications/utilities/postProcessing/noise/noise.C
@@ -74,8 +74,7 @@ Usage
             }
         }
 
-        // Number of samples in sampling window
-        // Must be a power of 2, default = 2^16 (=65536)
+        // Number of samples in sampling window, default = 2^16 (=65536)
         N               4096;
 
         // Write interval for FFT data, default = 1
diff --git a/applications/utilities/postProcessing/noise/noiseDict b/applications/utilities/postProcessing/noise/noiseDict
index ca808462c4c..9323c98df62 100644
--- a/applications/utilities/postProcessing/noise/noiseDict
+++ b/applications/utilities/postProcessing/noise/noiseDict
@@ -72,8 +72,7 @@ surfaceNoiseCoeffs
     // Reference density (to convert from kinematic to static pressure)
     rhoRef          1.205;
 
-    // Number of samples in sampling window
-    // Must be a power of 2, default = 2^16 (=65536)
+    // Number of samples in sampling window, default = 2^16 (=65536)
     N               4096; // 8192; // 4096;
 
     // Lower frequency limit, default = 25Hz
@@ -123,8 +122,7 @@ pointNoiseCoeffs
     // Reference density (to convert from kinematic to static pressure)
     rhoRef          1.2;
 
-    // Number of samples in sampling window
-    // Must be a power of 2, default = 2^16 (=65536)
+    // Number of samples in sampling window, default = 2^16 (=65536)
     N               4096;
 
     // Lower frequency limit, default = 25Hz
diff --git a/src/randomProcesses/fft/fft.C b/src/randomProcesses/fft/fft.C
index 658e477f1e2..260bc1901e0 100644
--- a/src/randomProcesses/fft/fft.C
+++ b/src/randomProcesses/fft/fft.C
@@ -95,20 +95,6 @@ void Foam::fft::transform
     transformDirection dir
 )
 {
-    forAll(nn, idim)
-    {
-        // Check for power of two
-        unsigned int dimCount = nn[idim];
-        if (!dimCount || (dimCount & (dimCount - 1)))
-        {
-            FatalErrorInFunction
-                << "number of elements in direction " << idim
-                << " is not a power of 2" << endl
-                << "    Number of elements in each direction = " << nn
-                << abort(FatalError);
-        }
-    }
-
     // Copy field into fftw containers
     const label N = field.size();
     fftw_complex in[N], out[N];
diff --git a/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C
index 84ba84ca4be..008d161cbd9 100644
--- a/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C
+++ b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C
@@ -206,16 +206,6 @@ bool Foam::noiseModel::read(const dictionary& dict)
     dict.readIfPresent("maxPressure", maxPressure_);
     dict.readIfPresent("outputPrefix", outputPrefix_);
 
-    // Check number of samples  - must be a power of 2 for our FFT
-    bool powerOf2 = ((nSamples_ != 0) && !(nSamples_ & (nSamples_ - 1)));
-    if (!powerOf2)
-    {
-        FatalIOErrorInFunction(dict)
-            << "N: Number of samples in sampling windows must be a "
-            << "power of 2"
-            << exit(FatalIOError);
-    }
-
     if (fLower_ < 0)
     {
         FatalIOErrorInFunction(dict)
diff --git a/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.H b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.H
index b74e053dd00..336f46ca863 100644
--- a/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.H
+++ b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.H
@@ -66,9 +66,6 @@ Description
         writeOctaves | Write octaves data            | no        | yes
     \endtable
 
-Note
-    The number of samples in the sampling window must be a power of 2
-
 
 SourceFiles
     noiseModel.C
diff --git a/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.H b/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.H
index 3e05e14cb7d..1a860fe8e2c 100644
--- a/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.H
+++ b/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.H
@@ -33,8 +33,7 @@ Description
     // Pressure reference
     pRef            0;
 
-    // Number of samples in sampling window
-    // Must be a power of 2, default = 2^16 (=65536)
+    // Number of samples in sampling window, default = 2^16 (=65536)
     N               4096;
 
     // Lower frequency bounds
diff --git a/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.H b/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.H
index ad7cedebcc0..6cb08327ea5 100644
--- a/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.H
+++ b/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.H
@@ -33,8 +33,7 @@ Description
     // Pressure reference
     pRef            0;
 
-    // Number of samples in sampling window
-    // Must be a power of 2, default = 2^16 (=65536)
+    // Number of samples in sampling window, default = 2^16 (=65536)
     N               4096;
 
     // Lower frequency bounds
diff --git a/tutorials/incompressible/pimpleFoam/LES/vortexShed/system/noiseDict-point b/tutorials/incompressible/pimpleFoam/LES/vortexShed/system/noiseDict-point
index 2f640c98c26..b7935e68103 100644
--- a/tutorials/incompressible/pimpleFoam/LES/vortexShed/system/noiseDict-point
+++ b/tutorials/incompressible/pimpleFoam/LES/vortexShed/system/noiseDict-point
@@ -45,7 +45,7 @@ pointNoiseCoeffs
     separator       " ";
 
     // Number of samples in sampling window
-    // Must be a power of 2, default = 2^16 (=65536)
+    // default = 2^16 (=65536)
     N               4096;
 
     rhoRef          1.205;
diff --git a/tutorials/incompressible/pimpleFoam/LES/vortexShed/system/noiseDict-surface b/tutorials/incompressible/pimpleFoam/LES/vortexShed/system/noiseDict-surface
index a1206332108..6d620735bc4 100644
--- a/tutorials/incompressible/pimpleFoam/LES/vortexShed/system/noiseDict-surface
+++ b/tutorials/incompressible/pimpleFoam/LES/vortexShed/system/noiseDict-surface
@@ -56,7 +56,7 @@ surfaceNoiseCoeffs
     p               Curle;
 
     // Number of samples in sampling window
-    // Must be a power of 2, default = 2^16 (=65536)
+    // default = 2^16 (=65536)
     N               1024;
 
     rhoRef          1.205;
-- 
GitLab