KokkosFFT::fftn
-
template<typename ExecutionSpace, typename InViewType, typename OutViewType, std::size_t DIM>
void KokkosFFT::fftn(const ExecutionSpace &exec_space, const InViewType &in, const OutViewType &out, axis_type<DIM> axes = KokkosFFT::Impl::index_sequence<int, DIM, -static_cast<int>(DIM)>(), KokkosFFT::Normalization norm = KokkosFFT::Normalization::backward, shape_type<DIM> s = {}) N-dimensional FFT in forward direction.
- Template Parameters:
ExecutionSpace – The type of Kokkos execution space
InViewType – Input View type for the fft
OutViewType – Output View type for the fft
DIM – The dimensionality of the fft
- Parameters:
exec_space – [in] Kokkos execution space
in – [in] Input data (real or complex)
out – [out] Output data (complex)
axes – [in] Axes over which FFT is performed (default, all axes)
norm – [in] How the normalization is applied (default, backward)
s – [in] Shape of the transformed axis of the output (default, {})
Note
For the real input, we internally convert it to complex and perform fftn on it.
Examples
In this example, we use the 3D View with LayoutRight to avoid the internal transpose. This allows fftn to perform 3D FFT on the outermost dimension without transpose.
1#include <iostream>
2#include <Kokkos_Core.hpp>
3#include <Kokkos_Complex.hpp>
4#include <KokkosFFT.hpp>
5
6/// \brief Example of fftn usage in documentation
7/// x = [[[1, 2],
8/// [3, 4]],
9/// [[5, 6],
10/// [7, 8]],
11/// [[9, 10],
12/// [11, 12]]]
13/// x_hat = [[[78, -6],
14/// [-12, 0]],
15/// [[-24+13.8564j, 0],
16/// [0, 0]],
17/// [[-24-13.8564j, 0],
18/// [0, 0]]]
19int main(int argc, char* argv[]) {
20 Kokkos::ScopeGuard guard(argc, argv);
21 using ExecutionSpace = Kokkos::DefaultExecutionSpace;
22 using View3D = Kokkos::View<Kokkos::complex<double>***, Kokkos::LayoutRight,
23 ExecutionSpace>;
24
25 const int n0 = 3, n1 = 2, n2 = 2;
26
27 View3D x("x", n0, n1, n2), x_hat("x_hat", n0, n1, n2);
28 auto h_x = Kokkos::create_mirror_view(x);
29 for (int i = 0; i < n0; ++i) {
30 for (int j = 0; j < n1; ++j) {
31 for (int k = 0; k < n2; ++k) {
32 h_x(i, j, k) = Kokkos::complex<double>(i * n1 * n2 + j * n2 + k + 1);
33 }
34 }
35 }
36 Kokkos::deep_copy(x, h_x);
37
38 ExecutionSpace exec;
39 KokkosFFT::fftn(exec, x, x_hat);
40
41 auto h_x_hat =
42 Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace{}, x_hat);
43 for (int i = 0; i < n0; ++i) {
44 for (int j = 0; j < n1; ++j) {
45 for (int k = 0; k < n2; ++k) {
46 std::cout << " " << h_x_hat(i, j, k);
47 }
48 std::cout << "\n";
49 }
50 if (i < n0 - 1) std::cout << "\n";
51 }
52 std::cout << std::endl;
53
54 return 0;
55}
Expected output:
(78,0) (-6,0)
(-12,0) (0,0)
(-24,13.8564) (0,0)
(0,0) (0,0)
(-24,-13.8564) (0,0)
(0,0) (0,0)