#ifndef __SIMPLE_FFT__COPY_ARRAY_HPP #define __SIMPLE_FFT__COPY_ARRAY_HPP #include "fft_settings.h" #include "error_handling.hpp" #include using std::size_t; namespace simple_fft { namespace copy_array { template void copyArray(const TComplexArray1D & data_from, TComplexArray1D & data_to, const size_t size) { int size_signed = static_cast(size); #ifndef __clang__ #ifdef __USE_OPENMP #pragma omp parallel for #endif #endif for(int i = 0; i < size_signed; ++i) { #ifdef __USE_SQUARE_BRACKETS_FOR_ELEMENT_ACCESS_OPERATOR data_to[i] = data_from[i]; #else data_to(i) = data_from(i); #endif } } template void copyArray(const TRealArray1D & data_from, TComplexArray1D & data_to, const size_t size) { int size_signed = static_cast(size); // NOTE: user's complex type should have constructor like // "complex(real, imag)", where each of real and imag has // real type. #ifndef __clang__ #ifdef __USE_OPENMP #pragma omp parallel for #endif #endif for(int i = 0; i < size_signed; ++i) { #ifdef __USE_SQUARE_BRACKETS_FOR_ELEMENT_ACCESS_OPERATOR data_to[i] = complex_type(data_from[i], 0.0); #else data_to(i) = complex_type(data_from(i), 0.0); #endif } } template void copyArray(const TComplexArray2D & data_from, TComplexArray2D & data_to, const size_t size1, const size_t size2) { int size1_signed = static_cast(size1); int size2_signed = static_cast(size2); #ifndef __clang__ #ifdef __USE_OPENMP #pragma omp parallel for #endif #endif for(int i = 0; i < size1_signed; ++i) { for(int j = 0; j < size2_signed; ++j) { #ifdef __USE_SQUARE_BRACKETS_FOR_ELEMENT_ACCESS_OPERATOR data_to[i][j] = data_from[i][j]; #else data_to(i,j) = data_from(i,j); #endif } } } template void copyArray(const TRealArray2D & data_from, TComplexArray2D & data_to, const size_t size1, const size_t size2) { int size1_signed = static_cast(size1); int size2_signed = static_cast(size2); // NOTE: user's complex type should have constructor like // "complex(real, imag)", where each of real and imag has // real type. #ifndef __clang__ #ifdef __USE_OPENMP #pragma omp parallel for #endif #endif for(int i = 0; i < size1_signed; ++i) { for(int j = 0; j < size2_signed; ++j) { #ifdef __USE_SQUARE_BRACKETS_FOR_ELEMENT_ACCESS_OPERATOR data_to[i][j] = complex_type(data_from[i][j], 0.0); #else data_to(i,j) = complex_type(data_from(i,j), 0.0); #endif } } } template void copyArray(const TComplexArray3D & data_from, TComplexArray3D & data_to, const size_t size1, const size_t size2, const size_t size3) { int size1_signed = static_cast(size1); int size2_signed = static_cast(size2); int size3_signed = static_cast(size3); #ifndef __clang__ #ifdef __USE_OPENMP #pragma omp parallel for #endif #endif for(int i = 0; i < size1_signed; ++i) { for(int j = 0; j < size2_signed; ++j) { for(int k = 0; k < size3_signed; ++k) { #ifdef __USE_SQUARE_BRACKETS_FOR_ELEMENT_ACCESS_OPERATOR data_to[i][j][k] = data_from[i][j][k]; #else data_to(i,j,k) = data_from(i,j,k); #endif } } } } template void copyArray(const TRealArray3D & data_from, TComplexArray3D & data_to, const size_t size1, const size_t size2, const size_t size3) { int size1_signed = static_cast(size1); int size2_signed = static_cast(size2); int size3_signed = static_cast(size3); // NOTE: user's complex type should have constructor like // "complex(real, imag)", where each of real and imag has // real type. #ifndef __clang__ #ifdef __USE_OPENMP #pragma omp parallel for #endif #endif for(int i = 0; i < size1_signed; ++i) { for(int j = 0; j < size2_signed; ++j) { for(int k = 0; k < size3_signed; ++k) { #ifdef __USE_SQUARE_BRACKETS_FOR_ELEMENT_ACCESS_OPERATOR data_to[i][j][k] = complex_type(data_from[i][j][k], 0.0); #else data_to(i,j,k) = complex_type(data_from(i,j,k), 0.0); #endif } } } } } // namespace copy_array } // namespace simple_fft #endif // __SIMPLE_FFT__COPY_ARRAY_HPP