diff --git a/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C new file mode 100644 index 0000000000..c32c4ec21d --- /dev/null +++ b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C @@ -0,0 +1,150 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2015 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +\*---------------------------------------------------------------------------*/ + +#include "noiseModel.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(noiseModel, 0); + defineRunTimeSelectionTable(noiseModel, dictionary); +} + +// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * // + +Foam::scalar Foam::noiseModel::checkUniformTimeStep +( + const scalarList& times +) const +{ + scalar deltaT = -1.0; + + if (times.size() > 1) + { + for (label i = 1; i < times.size(); i++) + { + scalar dT = times[i] - times[i-1]; + + if (deltaT < 0) + { + deltaT = dT; + } + + if (mag(deltaT - dT) > SMALL) + { + FatalErrorInFunction + << "Unable to process data with a variable time step" + << exit(FatalError); + } + } + } + else + { + FatalErrorInFunction + << "Unable to create FFT with a single value" + << exit(FatalError); + } + + return deltaT; +} + + +Foam::label Foam::noiseModel::findStartTimeIndex +( + const instantList& allTimes, + const scalar startTime +) const +{ + forAll(allTimes, timeI) + { + const instant& i = allTimes[timeI]; + + if (i.value() >= startTime) + { + return timeI; + } + } + + return 0; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::noiseModel::noiseModel(const dictionary& dict) +: + dict_(dict), + pRef_(dict.lookupOrDefault("pRef", 0)), + nSamples_(dict.lookupOrDefault("N", 65536)), + fLower_(dict.lookupOrDefault("fl", 25)), + fUpper_(dict.lookupOrDefault("fu", 10000)), + startTime_(dict.lookupOrDefault("startTime", 0)), + windowModelPtr_(windowModel::New(dict, nSamples_)) +{ + // 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) + << "fl: lower frequency bound must be greater than zero" + << exit(FatalIOError); + + } + + if (fUpper_ < 0) + { + FatalIOErrorInFunction(dict) + << "fu: upper frequency bound must be greater than zero" + << exit(FatalIOError); + + } + + if (fUpper_ < fLower_) + { + FatalIOErrorInFunction(dict) + << "fu: upper frequency bound must be greater than lower " + << "frequency bound (fl)" + << exit(FatalIOError); + + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::noiseModel::~noiseModel() +{} + + +// ************************************************************************* // diff --git a/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.H b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.H new file mode 100644 index 0000000000..f7e739b7d0 --- /dev/null +++ b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.H @@ -0,0 +1,175 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2015-2016 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +Class + Foam::noiseModel + +Description + Base class for noise models. + + Data is read from a dictionary, e.g. + + \verbatim + pRef 0; + N 4096; + fl 25; + fu 25; + startTime 0; + \endverbatim + + where + \table + Property | Description | Required | Default value + pRef | Reference pressure | no | 0 + N | Number of samples in sampling window | no | 65536 (2^16) + fl | Lower frequency bounds | no | 25 + fu | Upper frequency bounds | no | 10000 + \endtable + +Note + The number of samples in the sampling window must be a power of 2 + + +SourceFiles + noiseModel.C + +\*---------------------------------------------------------------------------*/ + +#ifndef noiseModel_H +#define noiseModel_H + +#include "dictionary.H" +#include "scalarList.H" +#include "instantList.H" +#include "windowModel.H" +#include "runTimeSelectionTables.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class noiseModel Declaration +\*---------------------------------------------------------------------------*/ + +class noiseModel +{ + +private: + + // Private Member Functions + + //- Disallow default bitwise copy construct + noiseModel(const noiseModel&); + + //- Disallow default bitwise assignment + void operator=(const noiseModel&); + + +protected: + + // Protected Data + + //- Copy of dictionary used for construction + const dictionary dict_; + + //- Reference pressure + scalar pRef_; + + //- Number of samples in sampling window, default = 2^16 + label nSamples_; + + //- Lower frequency limit, default = 25Hz + scalar fLower_; + + //- Upper frequency limit, default = 10kHz + scalar fUpper_; + + //- Start time, default = 0s + scalar startTime_; + + //- Window model + autoPtr windowModelPtr_; + + + + // Protected Member Functions + + //- Check and return uniform time step + scalar checkUniformTimeStep + ( + const scalarList& times + ) const; + + //- Find and return start time index + label findStartTimeIndex + ( + const instantList& allTimes, + const scalar startTime + ) const; + + +public: + + //- Runtime type information + TypeName("noiseModel"); + + //- Run time selection table + declareRunTimeSelectionTable + ( + autoPtr, + noiseModel, + dictionary, + ( + const dictionary& dict + ), + (dict) + ); + + //- Selector + static autoPtr New(const dictionary& dict); + + //- Constructor + noiseModel(const dictionary& dict); + + //- Destructor + virtual ~noiseModel(); + + + // Public Member Functions + + //- Abstract call to calculate + virtual void calculate() = 0; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/randomProcesses/noise/noiseModels/noiseModel/noiseModelNew.C b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModelNew.C new file mode 100644 index 0000000000..3f5fa4f25f --- /dev/null +++ b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModelNew.C @@ -0,0 +1,53 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +\*---------------------------------------------------------------------------*/ + +#include "noiseModel.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::autoPtr Foam::noiseModel::New(const dictionary& dict) +{ + const word modelType(dict.lookup("noiseModel")); + + Info<< "Selecting noiseModel " << modelType << endl; + + dictionaryConstructorTable::iterator cstrIter = + dictionaryConstructorTablePtr_->find(modelType); + + if (cstrIter == dictionaryConstructorTablePtr_->end()) + { + FatalErrorInFunction + << "Unknown noiseModel type " + << modelType << nl << nl + << "Valid noiseModel types are:" << nl + << dictionaryConstructorTablePtr_->sortedToc() + << exit(FatalError); + } + + return autoPtr(cstrIter()(dict.subDict(modelType + "Coeffs"))); +} + + +// ************************************************************************* //