ENH: noiseModels - updated frequency bounds handling

This commit is contained in:
Andrew Heather 2017-03-03 14:24:56 +00:00
parent 9741ce6e0d
commit f3abf405a8
3 changed files with 32 additions and 11 deletions

View File

@ -159,7 +159,11 @@ bool Foam::noiseModel::read(const dictionary& dict)
dict.readIfPresent("rhoRef", rhoRef_);
dict.readIfPresent("N", nSamples_);
customBounds_ = false;
if (dict.readIfPresent("fl", fLower_) || dict.readIfPresent("fu", fUpper_))
if (dict.readIfPresent("fl", fLower_))
{
customBounds_ = true;
}
if (dict.readIfPresent("fu", fUpper_))
{
customBounds_ = true;
}

View File

@ -123,7 +123,7 @@ protected:
//- Upper frequency limit, default = 10kHz
scalar fUpper_;
//- Flagto indicate that custom frequenct bounds are being used
//- Flag to indicate that custom frequenct bounds are being used
bool customBounds_;
//- Start time, default = 0s

View File

@ -504,10 +504,16 @@ void surfaceNoise::calculate()
Info<< "Creating noise FFTs" << endl;
const scalarField freq1(noiseFFT::frequencies(nSamples_, deltaT_));
// Reset desired frequency range if outside actual frequency range
fLower_ = min(fLower_, max(freq1));
fUpper_ = min(fUpper_, max(freq1));
// Storage for FFT data
const label nLocalFace = pData.size();
const scalarField freq1(noiseFFT::frequencies(nSamples_, deltaT_));
const label nFFT = freq1.size()/fftWriteInterval_;
const label nFFT = ceil(freq1.size()/scalar(fftWriteInterval_));
List<scalarField> surfPrmsf(nFFT);
List<scalarField> surfPSDf(nFFT);
forAll(surfPrmsf, freqI)
@ -563,7 +569,7 @@ void surfaceNoise::calculate()
// Store the frequency results in slot for face of surface
forAll(surfPrmsf, i)
{
label freqI = (i + 1)*fftWriteInterval_ - 1;
label freqI = i*fftWriteInterval_;
surfPrmsf[i][faceI] = Prmsf.y()[freqI];
surfPSDf[i][faceI] = PSDf.y()[freqI];
}
@ -588,14 +594,24 @@ void surfaceNoise::calculate()
fileName outDir(baseFileDir()/typeName/fNameBase);
const scalar deltaf = 1.0/(deltaT_*win.nSamples());
Info<< "Writing fft surface data" << endl;
Info<< "Writing fft surface data";
if (fftWriteInterval_ == 1)
{
Info<< endl;
}
else
{
Info<< " at every " << fftWriteInterval_ << " frequency points"
<< endl;
}
{
// Determine frequency range of interest
// Note: freqencies have fixed interval, and are in the range
// 0 to (n-1)*deltaf
label f0 = ceil(fLower_/deltaf);
label f1 = floor(fUpper_/deltaf);
label nFreq = f1 - f0 + 1;
// 0 to fftWriteInterval_*(n-1)*deltaf
label f0 = ceil(fLower_/deltaf/fftWriteInterval_);
label f1 = floor(fUpper_/deltaf/fftWriteInterval_);
label nFreq = f0 == f1 ? 0 : f1 - f0 + 1;
scalarField PrmsfAve(nFreq, 0);
scalarField PSDfAve(nFreq, 0);
@ -603,9 +619,10 @@ void surfaceNoise::calculate()
for (label i = f0; i <= f1; ++i)
{
label freqI = (i + 1)*fftWriteInterval_ - 1;
label freqI = i*fftWriteInterval_;
fOut[i] = freq1[freqI];
const word gName = "fft";
PrmsfAve[i] = writeSurfaceData
(
fNameBase,