From e7441601bc614644b71aedb63f02e49dda41662f Mon Sep 17 00:00:00 2001 From: Timon Habenicht <t.habenicht@tu-bs.de> Date: Wed, 21 Nov 2018 11:09:33 +0100 Subject: [PATCH] new FFTCalucator --- .../FFTCalculator/FFTCalculator.cpp | 50 ++++++++++++++----- .../Calculator/FFTCalculator/FFTCalculator.h | 32 ++++++------ 2 files changed, 51 insertions(+), 31 deletions(-) diff --git a/targets/tests/NumericalTests/Utilities/Calculator/FFTCalculator/FFTCalculator.cpp b/targets/tests/NumericalTests/Utilities/Calculator/FFTCalculator/FFTCalculator.cpp index 03d9f9f75..cf85fb61d 100644 --- a/targets/tests/NumericalTests/Utilities/Calculator/FFTCalculator/FFTCalculator.cpp +++ b/targets/tests/NumericalTests/Utilities/Calculator/FFTCalculator/FFTCalculator.cpp @@ -1,22 +1,34 @@ #include "FFTCalculator.h" -#include "Utilities/SimulationResults/SimulationResults.h" +#include "Utilities/Results/SimulationResults/SimulationResults.h" #include "Tests/PhiAndNuTest/PhiAndNuTest.h" #define _USE_MATH_DEFINES #include <math.h> #include <stdlib.h> -void FFTCalculator::calcAndCopyToTestResults() +void FFTCalculator::calc() { init(); nu = calcNu(); nudiff = calcNuDiff(nu); - phidiff = calcPhiDiff(); + phidiff = calcPhi(); +} + +double FFTCalculator::getNuDiff() +{ + return nudiff; +} - testResults->add(nudiff, phidiff, lx); - testResults->evaluate(); +double FFTCalculator::getPhiDiff() +{ + return phidiff; +} + +std::shared_ptr<FFTCalculator> FFTCalculator::getNewInstance(double viscosity) +{ + return std::shared_ptr<FFTCalculator>(new FFTCalculator(viscosity)); } void FFTCalculator::setSimulationResults(std::shared_ptr<SimulationResults> simResults) @@ -24,17 +36,26 @@ void FFTCalculator::setSimulationResults(std::shared_ptr<SimulationResults> simR this->simResults = simResults; } +void FFTCalculator::setVectorToCalc(std::vector<std::vector<double>> data) +{ + this->data = data; +} + void FFTCalculator::init() { - setVectorToCalc(); - lz = (double)simResults->getZNodes(); - lx = (double)simResults->getXNodes(); + fftResultsIm.clear(); + fftResultsRe.clear(); + phi.clear(); + amplitude.clear(); + logAmplitude.clear(); + lz = (double)simResults->getNumberOfZNodes(); + lx = (double)simResults->getNumberOfXNodes(); timeStepLength = simResults->getTimeStepLength(); numberOfTimeSteps = simResults->getNumberOfTimeSteps(); fftCalculated = false; } -FFTCalculator::FFTCalculator(double viscosity, std::shared_ptr<PhiAndNuTest> testResults) : vis(viscosity), testResults(testResults) +FFTCalculator::FFTCalculator(double viscosity) : vis(viscosity) { } @@ -54,9 +75,9 @@ double FFTCalculator::calcNuDiff(double nu) return nudiff; } -double FFTCalculator::calcPhiDiff() +double FFTCalculator::calcPhi() { - calcPhiForAllTimeSteps(); + phi = calcPhiForAllTimeSteps(); std::vector<double> linReg = calcLinReg(phi); return linReg.at(0); @@ -121,8 +142,10 @@ void FFTCalculator::calcAmplitudeForAllTimeSteps() amplitude.push_back(4.0 / (lx * lz) * sqrt(fftResultsRe.at(timeStep).at(pos) * fftResultsRe.at(timeStep).at(pos) + fftResultsIm.at(timeStep).at(pos) * fftResultsIm.at(timeStep).at(pos))); } -void FFTCalculator::calcPhiForAllTimeSteps() +std::vector<double> FFTCalculator::calcPhiForAllTimeSteps() { + std::vector<double> result; + if (fftCalculated == false) { for (int timeStep = 0; timeStep < numberOfTimeSteps; timeStep++) calcFFT2D(timeStep); @@ -130,7 +153,8 @@ void FFTCalculator::calcPhiForAllTimeSteps() } int pos = 2 + (lx - 1); for (int timeStep = 0; timeStep < numberOfTimeSteps; timeStep++) - phi.push_back(atan(fftResultsIm.at(timeStep).at(pos) / fftResultsRe.at(timeStep).at(pos))); + result.push_back(atan(fftResultsIm.at(timeStep).at(pos) / fftResultsRe.at(timeStep).at(pos))); + return result; } void FFTCalculator::calcFFT2D(unsigned int timeStep) diff --git a/targets/tests/NumericalTests/Utilities/Calculator/FFTCalculator/FFTCalculator.h b/targets/tests/NumericalTests/Utilities/Calculator/FFTCalculator/FFTCalculator.h index cc1509882..7802e8d6f 100644 --- a/targets/tests/NumericalTests/Utilities/Calculator/FFTCalculator/FFTCalculator.h +++ b/targets/tests/NumericalTests/Utilities/Calculator/FFTCalculator/FFTCalculator.h @@ -1,8 +1,6 @@ #ifndef FFTCALCULATOR_H #define FFTCALCULATOR_H -#include "../Calculator.h" - #include <memory> #include <vector> #include <fftw3.h> @@ -12,46 +10,44 @@ class EvaluationParameter; class TestResults; class PhiAndNuTest; -class FFTCalculator : public Calculator +class FFTCalculator { public: - void calcAndCopyToTestResults(); + static std::shared_ptr<FFTCalculator> getNewInstance(double viscosity); void setSimulationResults(std::shared_ptr<SimulationResults> simResults); - -protected: - FFTCalculator(double viscosity, std::shared_ptr<PhiAndNuTest> testResults); - virtual void setVectorToCalc() = 0; - - std::shared_ptr<SimulationResults> simResults; - std::vector<std::vector<double>> data; + void setVectorToCalc(std::vector<std::vector<double>> data); + + void calc(); + + double getNuDiff(); + double getPhiDiff(); private: + FFTCalculator(double viscosity); void init(); double calcNu(); double calcNuDiff(double nu); - double calcPhiDiff(); - std::vector<double> calcLinReg(std::vector<double> y); + double calcPhi(); + std::vector< double> calcPhiForAllTimeSteps(); + std::vector< double> calcLinReg(std::vector<double> y); void calcLogAmplitudeForAllTimeSteps(); void calcAmplitudeForAllTimeSteps(); - void calcPhiForAllTimeSteps(); void calcFFT2D(unsigned int timeStep); void initDataForFFT(fftw_complex* input, unsigned int timeStep); void setFFTResults(fftw_complex* result, unsigned int timeStep); - std::shared_ptr<PhiAndNuTest> testResults; + std::shared_ptr<SimulationResults> simResults; + std::vector<std::vector<double>> data; std::vector<std::vector<double>> fftResultsIm; std::vector<std::vector<double>> fftResultsRe; std::vector<double> phi; std::vector<double> amplitude; std::vector<double> logAmplitude; - bool fftCalculated; - double lx, lz; double vis; double timeStepLength; int numberOfTimeSteps; - double nu; double nudiff, phidiff; }; -- GitLab