diff --git a/applications/utilities/postProcessing/noise/noise.C b/applications/utilities/postProcessing/noise/noise.C index 5c3ad2a139..cf5794075f 100644 --- a/applications/utilities/postProcessing/noise/noise.C +++ b/applications/utilities/postProcessing/noise/noise.C @@ -107,7 +107,7 @@ int main(int argc, char *argv[]) #include "setRootCase.H" #include "createTime.H" - word dictName("noiseDict"); + fileName dictName(runTime.system()/"noiseDict"); if (args.optionFound("dict")) { dictName = args["dict"]; @@ -118,7 +118,6 @@ int main(int argc, char *argv[]) IOobject ( dictName, - runTime.system(), runTime, IOobject::MUST_READ ) diff --git a/applications/utilities/postProcessing/noise/noiseDict b/applications/utilities/postProcessing/noise/noiseDict new file mode 100644 index 0000000000..e983cabc12 --- /dev/null +++ b/applications/utilities/postProcessing/noise/noiseDict @@ -0,0 +1,136 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object noiseDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +noiseModel surfaceNoise; + +surfaceNoiseCoeffs +{ + windowModel Hanning; + + HanningCoeffs + { + // Window overlap percentage + overlapPercent 50; + symmetric yes; + extended yes; + + // Optional number of windows, default = all available + // nWindow 1; + } + +/* + windowModel uniform; + + uniformCoeffs + { + // Window overlap percentage + overlapPercent 50; + + value 1; + + // Optional number of windows, default = all available + // nWindow 1; + } +*/ + + + // Input file + inputFile "postProcessing/faceSource1/surface/patch_motorBike_rider-helmet%65/patch_motorBike_rider-helmet%65.case"; + + // Surface reader + reader ensight; + + // Surface writer + writer ensight; + + // Collate times for ensight output - ensures geometry is only written once + writeOptions + { + ensight + { + collateTimes 1; + } + } + + // 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) + N 4096; // 8192; // 4096; + + // Lower frequency limit, default = 25Hz + //fl 25; + + // Upper frequency limit, default = 10kHz + fu 15000; + + // Start time, default = 0s + //startTime 0; + + // Write interval for FFT data, default = 1 +// fftWriteInterval 100; +} + +pointNoiseCoeffs +{ + csvFileData + { + fileName "pressureData"; + nHeaderLine 1; + refColumn 0; + componentColumns (1); + separator " "; + mergeSeparators yes; + } + + HanningCoeffs + { + // Window overlap percentage + overlapPercent 50; + symmetric yes; + extended yes; + + // Optional number of windows, default = all available + //nWindow 5; + } + + // Graph format, default = raw + graphFormat raw; + + // 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) + N 4096; + + // Lower frequency limit, default = 25Hz + //fl 25; + + // Upper frequency limit, default = 10kHz + //fu 10000; + + // Start time, default = 0s + //startTime 0; + + // Write interval for FFT data, default = 1 + fftWriteInterval 100; +} + + +// ************************************************************************* // diff --git a/src/randomProcesses/Make/files b/src/randomProcesses/Make/files index a16bde251c..11138bd932 100644 --- a/src/randomProcesses/Make/files +++ b/src/randomProcesses/Make/files @@ -3,7 +3,6 @@ $(Kmesh)/Kmesh.C fft = fft $(fft)/fft.C -$(fft)/fftRenumber.C $(fft)/calcEk.C $(fft)/kShellIntegration.C @@ -26,6 +25,7 @@ windowModels = windowModels $(windowModels)/windowModel/windowModel.C $(windowModels)/windowModel/windowModelNew.C $(windowModels)/Hanning/Hanning.C +$(windowModels)/uniform/uniform.C LIB = $(FOAM_LIBBIN)/librandomProcesses diff --git a/src/randomProcesses/Make/options b/src/randomProcesses/Make/options index 86d0d7baee..e1eddd51d2 100644 --- a/src/randomProcesses/Make/options +++ b/src/randomProcesses/Make/options @@ -1,9 +1,11 @@ EXE_INC = \ + -I$(FFTW_ARCH_PATH)/include \ -I$(LIB_SRC)/finiteVolume/lnInclude \ -I$(LIB_SRC)/sampling/lnInclude \ -I$(LIB_SRC)/surfMesh/lnInclude LIB_LIBS = \ + -L$(FFTW_ARCH_PATH)/lib$(WM_COMPILER_LIB_ARCH) -lfftw3 \ -lfiniteVolume \ -lsampling \ -lsurfMesh diff --git a/src/randomProcesses/noise/noiseFFT/noiseFFT.C b/src/randomProcesses/noise/noiseFFT/noiseFFT.C index 0d36c47d16..abaf199514 100644 --- a/src/randomProcesses/noise/noiseFFT/noiseFFT.C +++ b/src/randomProcesses/noise/noiseFFT/noiseFFT.C @@ -26,9 +26,10 @@ License #include "noiseFFT.H" #include "IFstream.H" #include "DynamicList.H" -#include "fft.H" #include "SubField.H" #include "mathematicalConstants.H" +#include "HashSet.H" +#include "fft.H" using namespace Foam::constant; @@ -44,7 +45,7 @@ Foam::tmp Foam::noiseFFT::frequencies ) { tmp tf(new scalarField(N/2, 0)); - scalarField& f = tf(); + scalarField& f = tf.ref(); scalar deltaf = 1.0/(N*deltaT); forAll(f, i) @@ -56,70 +57,80 @@ Foam::tmp Foam::noiseFFT::frequencies } -void Foam::noiseFFT::octaveFrequenciesIDs +Foam::tmp Foam::noiseFFT::PSD(const scalarField& PSDf) +{ + return 10*log10(PSDf/sqr(p0)); +} + + +Foam::tmp Foam::noiseFFT::SPL(const scalarField& Prms2) +{ + return 10*log10(Prms2/sqr(p0)); +} + + +void Foam::noiseFFT::octaveBandInfo ( const scalarField& f, const scalar fLower, const scalar fUpper, const scalar octave, - labelList& freqBandIDs + labelList& fBandIDs, + scalarField& fCentre ) { // Set the indices of to the lower frequency bands for the input frequency // range. Ensure that the centre frequency passes though 1000 Hz // Low frequency bound given by: - // fLow = f0*(2^(bandI/octave/2)) - // Centre frequency given by: - // fCentre = f0*(2^(bandI/octave)) + // fLow = f0*(2^(0.5*bandI/octave)) - scalar f0 = 1000; - scalar minFrequency = max(fLower, min(f)); + // Initial (lowest centre frequency) + scalar fTest = 15.625; - // Lower frequency band limit - label band0Low = ceil(2*octave*log(minFrequency/f0)/log(2.0)); + const scalar fRatio = pow(2, 1.0/octave); + const scalar fRatioL2C = pow(2, 0.5/octave); - // Centre frequency band limit - //label band0Centre = ceil(octave*log(fLower/f0)/log(2.0)); + // IDs of band IDs + labelHashSet bandIDs(f.size()); - scalar fLowerBand = f0*pow(2, band0Low/octave/2); - scalar fRatio = pow(2, 1.0/octave); + // Centre frequencies + DynamicList fc; + + // Convert to lower band limit + fTest /= fRatioL2C; - bool complete = false; - DynamicList