37#define _USE_MATH_DEFINES
54 this->timeStepLength = (
double)timeStepLength;
55 this->transposeData = transposeData;
59 this->data = transpose(data);
72 this->timeStepLength = (
double)timeStepLength;
73 this->transposeData = transposeData;
77 this->data = transpose(data);
86FFTCalculator::FFTCalculator()
95 this->transposeData = transposeData;
97 this->data.push_back(data);
98 std::vector<double> amplitude = calcAmplitudeForAllSteps();
99 return amplitude.at(0);
102void FFTCalculator::init()
104 fftResultsIm.clear();
105 fftResultsRe.clear();
106 fftCalculated =
false;
111 std::vector<double>
logAmplitude = calcLogAmplitudeForAllSteps();
114 -(1.0 / (((2.0 *
M_PI / lz) * (2.0 *
M_PI / lz) + (2.0 *
M_PI / lx) * (2.0 *
M_PI / lx)) * timeStepLength)) *
121 std::vector<double>
phi = calcPhiForAllSteps();
122 std::vector<double>
linReg = calcLinReg(
phi);
127std::vector<double> FFTCalculator::calcLinReg(std::vector<double>
y)
129 std::vector<double>
result;
130 std::vector<double>
x(
y.size());
134 for (
int i = 0;
i <
y.size();
i++) {
143 for (
int i = 0;
i <
y.size();
i++) {
154 for (
int i = 0;
i <
y.size();
i++) {
163std::vector<double> FFTCalculator::calcLogAmplitudeForAllSteps()
165 std::vector<double> amplitude = calcAmplitudeForAllSteps();
167 for (
int i = 0;
i < amplitude.size();
i++)
173std::vector<double> FFTCalculator::calcAmplitudeForAllSteps()
175 std::vector<double> amplitude;
176 if (fftCalculated ==
false) {
177 for (
int step = 0; step < data.size(); step++)
179 fftCalculated =
true;
187 for (
int step = 0; step < data.size(); step++)
188 amplitude.push_back(4.0 / (lx * lz) *
189 sqrt(fftResultsRe.at(step).at(
pos) * fftResultsRe.at(step).at(
pos) +
190 fftResultsIm.at(step).at(
pos) * fftResultsIm.at(step).at(
pos)));
195std::vector<double> FFTCalculator::calcPhiForAllSteps()
197 std::vector<double>
phi;
198 if (fftCalculated ==
false) {
199 for (
int step = 0; step < data.size(); step++)
201 fftCalculated =
true;
209 for (
int step = 0; step < data.size(); step++) {
210 phi.push_back(
atan(fftResultsIm.at(step).at(
pos) / fftResultsRe.at(step).at(
pos)));
216void FFTCalculator::calcFFT2D(
unsigned int timeStep)
221 initDataForFFT(
in, timeStep);
230 setFFTResults(
out, timeStep);
237std::vector<std::vector<double>> FFTCalculator::transpose(std::vector<std::vector<double>>
dataToTranspose)
239 std::vector<std::vector<std::vector<double>>>
dataInLx;
246 for (
int timeStep = 0; timeStep <
dataInLx.size(); timeStep++) {
252 std::vector<std::vector<std::vector<double>>>
dataInLz;
260 for (
int timeStep = 0; timeStep <
dataInLz.size(); timeStep++) {
266 std::vector<std::vector<double>>
result;
269 for (
int timeStep = 0; timeStep <
dataInLz.size(); timeStep++) {
270 result.at(timeStep).resize(0);
280 for (
int i = 0;
i < data.at(step).size();
i++) {
281 input[
i][0] = data.at(step).at(
i);
289 fftRe.resize(data.at(step).size());
290 fftIm.resize(data.at(step).size());
292 for (
int i = 0;
i < data.at(step).size();
i++) {
296 fftResultsIm.push_back(
fftIm);
297 fftResultsRe.push_back(
fftRe);
double calcAmplitudeForTimeStep(std::vector< double > data, bool transposeData, int lx, int lz)
double calcNy(std::vector< std::vector< double > > data, bool transposeData, int lx, int lz, int timeStepLength)
void log(const char *fmt)
static std::shared_ptr< FFTCalculator > getInstance()
double calcPhiDiff(std::vector< std::vector< double > > data, bool transposeData, int lx, int lz, int timeStepLength)
std::shared_ptr< T > SPtr