KokkosFFT::irfftn
-
template<typename ExecutionSpace, typename InViewType, typename OutViewType, std::size_t DIM>
void KokkosFFT::irfftn(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 = {}) Inverse of rfftn.
- 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 (complex)
out – [out] Output data (real)
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
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[DIM-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 3D View with LayoutRight to avoid the internal transpose. This allows irfftn to perform 3-dimensional inverse 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 irfftn usage in documentation
7/// x_hat = [[[78, -6],
8/// [-12, 0]],
9/// [[-24+13.8564j, 0],
10/// [0, 0]],
11/// [[-24-13.8564j, 0],
12/// [0, 0]]]
13/// x = [[[1, 2],
14/// [3, 4]],
15/// [[5, 6],
16/// [7, 8]],
17/// [[9, 10],
18/// [11, 12]]]
19int main(int argc, char* argv[]) {
20 Kokkos::ScopeGuard guard(argc, argv);
21 using ExecutionSpace = Kokkos::DefaultExecutionSpace;
22 using View3D = Kokkos::View<double***, Kokkos::LayoutRight, ExecutionSpace>;
23 using ComplexView3D = Kokkos::View<Kokkos::complex<double>***,
24 Kokkos::LayoutRight, ExecutionSpace>;
25
26 const int n0 = 3, n1 = 2, n2 = 2;
27
28 ComplexView3D x_hat("x_hat", n0, n1, n2 / 2 + 1);
29 View3D x("x", n0, n1, n2);
30 auto h_x_hat = Kokkos::create_mirror_view(x_hat);
31 h_x_hat(0, 0, 0) = Kokkos::complex<double>(78, 0);
32 h_x_hat(0, 0, 1) = Kokkos::complex<double>(-6, 0);
33 h_x_hat(0, 1, 0) = Kokkos::complex<double>(-12, 0);
34 h_x_hat(1, 0, 0) = Kokkos::complex<double>(-24, 13.8564);
35 h_x_hat(2, 0, 0) = Kokkos::complex<double>(-24, -13.8564);
36 Kokkos::deep_copy(x_hat, h_x_hat);
37
38 ExecutionSpace exec;
39 KokkosFFT::irfftn(exec, x_hat, x);
40
41 auto h_x = Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace{}, x);
42 for (int i = 0; i < n0; ++i) {
43 for (int j = 0; j < n1; ++j) {
44 for (int k = 0; k < n2; ++k) {
45 std::cout << " " << h_x(i, j, k);
46 }
47 std::cout << std::endl;
48 }
49 std::cout << std::endl;
50 }
51
52 return 0;
53}
Expected output:
1 2
3 4
5 6
7 8
9 10
11 12