31 using C = std::complex<T>;
41 const auto shape = a.shape();
42 const size_t NX = shape[0], NY = shape[1], NZ = shape[2];
45#pragma omp parallel for collapse(2)
46 for (
size_t i = 0; i < NX; ++i) {
47 for (
size_t j = 0; j < NY; ++j) {
49 for (
size_t k = 0; k < NZ; ++k)
50 sliceZ(k) = a(i, j, k);
54 for (
size_t k = 0; k < NZ; ++k)
55 a(i, j, k) = sliceZ(k);
59#pragma omp parallel for collapse(2)
60 for (
size_t i = 0; i < NX; ++i) {
61 for (
size_t k = 0; k < NZ; ++k) {
63 for (
size_t j = 0; j < NY; ++j)
64 sliceY(j) = a(i, j, k);
68 for (
size_t j = 0; j < NY; ++j)
69 a(i, j, k) = sliceY(j);
73#pragma omp parallel for collapse(2)
74 for (
size_t j = 0; j < NY; ++j) {
75 for (
size_t k = 0; k < NZ; ++k) {
77 for (
size_t i = 0; i < NX; ++i)
78 sliceX(i) = a(i, j, k);
82 for (
size_t i = 0; i < NX; ++i)
83 a(i, j, k) = sliceX(i);
96 const auto shape = a.shape();
97 const size_t NX = shape[0], NY = shape[1], NZ = shape[2];
100#pragma omp parallel for collapse(2)
101 for (
size_t j = 0; j < NY; ++j) {
102 for (
size_t k = 0; k < NZ; ++k) {
104 for (
size_t i = 0; i < NX; ++i)
105 sliceX(i) = a(i, j, k);
109 for (
size_t i = 0; i < NX; ++i)
110 a(i, j, k) = sliceX(i);
114#pragma omp parallel for collapse(2)
115 for (
size_t i = 0; i < NX; ++i) {
116 for (
size_t k = 0; k < NZ; ++k) {
118 for (
size_t j = 0; j < NY; ++j)
119 sliceY(j) = a(i, j, k);
123 for (
size_t j = 0; j < NY; ++j)
124 a(i, j, k) = sliceY(j);
128#pragma omp parallel for collapse(2)
129 for (
size_t i = 0; i < NX; ++i) {
130 for (
size_t j = 0; j < NY; ++j) {
132 for (
size_t k = 0; k < NZ; ++k)
133 sliceZ(k) = a(i, j, k);
137 for (
size_t k = 0; k < NZ; ++k)
138 a(i, j, k) = sliceZ(k);
141 const T norm = 1.0 / (NX * NY * NZ);
142#pragma omp parallel for collapse(3)
143 for (
size_t i = 0; i < NX; ++i)
144 for (
size_t j = 0; j < NY; ++j)
145 for (
size_t k = 0; k < NZ; ++k)
156 const std::size_t N = a.
size();
157 if (N <= 1 || (N & (N - 1)))
158 throw std::invalid_argument(
"SpectralFFT: size must be power of two");
162 std::vector<C> twiddles(N / 2);
163 const T sign = inverse ? T(+1) : T(-1);
164 constexpr T
pi = T(3.141592653589793238462643383279502884L);
165 for (std::size_t k = 0; k < N / 2; ++k)
166 twiddles[k] = {std::cos(sign * 2 *
pi * k / N), std::sin(sign * 2 *
pi * k / N)};
168 for (std::size_t len = 2; len <= N; len <<= 1) {
169 const std::size_t half = len >> 1;
170 const std::size_t step = N / len;
172#pragma omp parallel for schedule(static) if (len >= 64)
173 for (std::size_t i = 0; i < N; i += len) {
174 for (std::size_t j = 0; j < half; ++j) {
175 C t = a[i + j + half] * twiddles[j * step];
178 a[i + j + half] = u - t;
184 const T invN = T(1) / T(N);
185#pragma omp parallel for schedule(static)
186 for (std::size_t i = 0; i < N; ++i)
195 const std::size_t N = a.
size();
196 for (std::size_t i = 1, j = 0; i < N; ++i) {
197 std::size_t bit = N >> 1;
198 for (; j & bit; bit >>= 1)
202 std::swap(a[i], a[j]);
228 const size_t dim = 4;
232 for (
size_t i = 0; i < dim; ++i) {
233 for (
size_t j = 0; j < dim; ++j) {
234 result(i, j) = std::cos(
X(i) *
X(j)) * h;
static FrontendPluginRegistry::Add< TensoriumPluginAction > X("tensorium-dispatch", "Handle #pragma tensorium directives")
Register the plugin under the name "tensorium-dispatch".
Placeholder Chebyshev spectral method class.
Definition Spectral.hpp:213
static void compute(const VectorT &X, T h, Tensor2D &result)
Dummy computation using Chebyshev-like cosine weights.
Definition Spectral.hpp:227
Fast Fourier Transform (FFT) implementation using Cooley–Tukey algorithm.
Definition Spectral.hpp:27
static void forward_3D(Tensor< std::complex< T >, 3 > &a)
Definition Spectral.hpp:40
static void transform_impl(CVectorT &a, bool inverse)
Internal FFT implementation (shared by forward/backward)
Definition Spectral.hpp:155
static void backward_3D(Tensor< std::complex< T >, 3 > &a)
Definition Spectral.hpp:95
std::complex< T > C
Definition Spectral.hpp:31
static void backward(CVectorT &a)
Perform inverse FFT (in-place)
Definition Spectral.hpp:93
static void bit_reverse(CVectorT &a)
Bit-reversal permutation step.
Definition Spectral.hpp:194
static void forward(CVectorT &a)
Perform forward FFT (in-place)
Definition Spectral.hpp:38
void resize(const std::array< size_t, Rank > &dims)
Resize 2D tensor.
Definition Tensor.hpp:70
void fill(K value)
Fill tensor with a constant value.
Definition Tensor.hpp:125
size_t size() const
Definition Vector.hpp:76
Definition Derivate.hpp:24