Page MenuHomec4science

test_fft.cc
No OneTemporary

File Metadata

Created
Mon, Jul 22, 12:22

test_fft.cc

#include "my_types.hh"
#include "fft.hh"
#include "compute_temperature.hh"
#include <gtest/gtest.h>
#include <cstdlib>
/*****************************************************************/
TEST(FFT, transform) {
UInt N = 512;
Matrix<complex> m(N);
Real k = 2 * M_PI / N;
for (auto&& entry : index(m)) {
int i = std::get<0>(entry);
int j = std::get<1>(entry);
auto& val = std::get<2>(entry);
val = cos(k * i);
}
Matrix<complex> res = FFT::transform(m);
// Matrix<std::complex<int>> a = FFT::computeFrequencies(10);
for (auto&& entry : index(res)) {
int i = std::get<0>(entry);
int j = std::get<1>(entry);
auto& val = std::get<2>(entry);
if (std::abs(val) > 1e-10)
std::cout << i << "," << j << " = " << val << std::endl;
if (i == 1 && j == 0)
ASSERT_NEAR(std::abs(val), N * N / 2, 1e-10);
else if (i == N - 1 && j == 0)
ASSERT_NEAR(std::abs(val), N * N / 2, 1e-10);
else
ASSERT_NEAR(std::abs(val), 0, 1e-10);
}
}
/*****************************************************************/
TEST(FFT, inverse_transform) {
UInt N = 512;
Matrix<complex> m(N);
Real k = 2 * M_PI / N;
for (auto&& entry : index(m)) {
int i = std::get<0>(entry);
int j = std::get<1>(entry);
auto& val = std::get<2>(entry);
if ((i == 1 && j == 0) || (i == N - 1 && j == 0)) {
val = N * N / 2;
} else {
val = 0;
}
}
Matrix<complex> res = FFT::itransform(m);
for (auto&& entry : index(res)) {
int i = std::get<0>(entry);
int j = std::get<1>(entry);
auto& val = std::get<2>(entry);
ASSERT_NEAR(std::abs(val), std::abs(cos(k * i)), 1e-10);
}
}
/*****************************************************************/
/*****************************************************************/
TEST(FFT, Homogeneous) {
UInt N = 512;
Matrix<complex> m(N);
//Create a homogeneous matrix of material points
for (auto&& entry : index(m)) {
int i = std::get<0>(entry);
int j = std::get<1>(entry);
auto& val = std::get<2>(entry);
val = 5;
}
// Apply FFT transformation
Matrix<complex> tempMtx_fft = FFT::transform(m);
// Get FFT coordinates
Matrix<std::complex<int>> fft_coord = FFT::computeFrequencies(N);
// Heat flux
Real hv = 0;
for (auto&& entry : index(tempMtx_fft)) {
int i = std::get<0>(entry);
int j = std::get<1>(entry);
auto& val = std::get<2>(entry);
// Generates random particle heat rate
Real hr = rand() % 1;
Real q_squared;
if (i == 0 && j == 0){
val = 0;
q_squared = 1;
}else{
q_squared = pow(fft_coord(i,j).real(),2) + pow(fft_coord(j,i).real(),2);
}
// std::cout << "Before val is: " << val << ", " << hr << ", " << q_squared;
val = hv - val * hr * q_squared;
// std::cout << " After val is: " << val << std::endl;
}
// Inverse FFT transformation
Matrix<complex> tempMtx_ifft = FFT::itransform(tempMtx_fft);
tempMtx_ifft *= 0.1;
for (auto&& entry2 : index(tempMtx_ifft)) {
int i = std::get<0>(entry2);
int j = std::get<1>(entry2);
auto& val = std::get<2>(entry2);
// std::cout << " IFFT val is: " << val << std::endl;
Real new_m = std::abs(m(i,j)) + val.real();
/* std::cout << m(i,j)<< std::endl;
Real new_m=5;*/
// std::cout << " New temp is: " << mp.getTemperature() << std::endl;
ASSERT_NEAR(new_m,std::abs(m(i,j)), 1e-10);
}
}

Event Timeline