KokkosFFT::irfft2
-
template<typename ExecutionSpace, typename InViewType, typename OutViewType>
void KokkosFFT::irfft2(const ExecutionSpace &exec_space, const InViewType &in, const OutViewType &out, KokkosFFT::Normalization norm = KokkosFFT::Normalization::backward, axis_type<2> axes = {-2, -1}, shape_type<2> s = {}) Inverse of rfft2.
- Template Parameters:
ExecutionSpace – The type of Kokkos execution space
InViewType – Input View type for the fft
OutViewType – Output View type for the fft
- Parameters:
exec_space – [in] Kokkos execution space
in – [in] Input data (complex)
out – [out] Output data (real)
norm – [in] How the normalization is applied (default, backward)
axes – [in] Axes over which FFT is performed (default, {-2, -1})
s – [in] Shape of the transformed axis of the output (default, {})
Note
The input must be a complex-valued view, and the output must be a real-valued view. The input length along the transform axis (axes[1]) is n/2 + 1, where n is the output length along that axis. If this condition is not met, the std::runtime_error exception will be thrown.
Examples
In this example, we use the 2D View with LayoutRight to avoid the internal transpose. This allows irfft2 to perform 2D 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 irfft2 usage in documentation
7/// x_hat = [[78, -6+6j, -6],
8/// [-24+13.8564j, 0, 0],
9/// [-24-13.8564j, 0, 0]]
10/// x = [[1, 2, 3, 4],
11/// [5, 6, 7, 8],
12/// [9, 10, 11, 12]]
13int main(int argc, char* argv[]) {
14 Kokkos::ScopeGuard guard(argc, argv);
15 using ExecutionSpace = Kokkos::DefaultExecutionSpace;
16 using View2D = Kokkos::View<double**, Kokkos::LayoutRight, ExecutionSpace>;
17 using ComplexView2D = Kokkos::View<Kokkos::complex<double>**,
18 Kokkos::LayoutRight, ExecutionSpace>;
19
20 const int n0 = 3, n1 = 4;
21
22 ComplexView2D x_hat("x_hat", n0, n1 / 2 + 1);
23 View2D x("x", n0, n1);
24 auto h_x_hat = Kokkos::create_mirror_view(x_hat);
25 h_x_hat(0, 0) = Kokkos::complex<double>(78, 0);
26 h_x_hat(0, 1) = Kokkos::complex<double>(-6, 6);
27 h_x_hat(0, 2) = Kokkos::complex<double>(-6, 0);
28 h_x_hat(1, 0) = Kokkos::complex<double>(-24, 13.8564);
29 h_x_hat(2, 0) = Kokkos::complex<double>(-24, -13.8564);
30 Kokkos::deep_copy(x_hat, h_x_hat);
31
32 ExecutionSpace exec;
33 KokkosFFT::irfft2(exec, x_hat, x);
34
35 auto h_x = Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace{}, x);
36 for (int i = 0; i < n0; ++i) {
37 for (int j = 0; j < n1; ++j) {
38 std::cout << " " << h_x(i, j);
39 }
40 std::cout << std::endl;
41 }
42
43 return 0;
44}
Expected output:
1 2 3 4
5 6 7 8
9 10 11 12