2017-08-28 48 views
0

我有一个真实数据的3D数组,我想用一个轴上的DST或DCT和另外两个轴上的常规DFT进行转换。结果应该是一个包含这个转换系数的3D复数组。自定义3D(并行)FFTW转换可能吗?

你知道FFTW3软件包是否提供了这样一个例程 - 可能并行 - 开箱即用? FFTW3为所有三个方向上的简单3D DFT提供了这样的程序。

如果不是,你可能会对如何在C/C++中实现它的最佳方式有所暗示吗?

我天真的想法:DST/DCT的组装,然后在一些包装程序中沿着第一个轴进行2D实 - 复变换。然后,可以想到一维分解来实现并行性。二维将更好,但更多的工作。

PS: 该变换用于求解Navier-Stokes方程的谱方法。

+0

你看过[FFTPACK](http://www.netlib.org/fftpack/)(注意这是一个旧的Fortran库,足够老,我认为它仍然是FORTRAN ....) –

+0

谢谢您的帮助。是的,我确实这么做了。但是,FFTPACK比FFTW慢一点。此外,FFTW已经为所需的转换提供了所有构建模块,因此它只是如何组装它的问题。 – mrdy

+0

@DavidBowling你是什么意思到老了? http://www.2decomp.org/,https://github.com/sdsc/p3dfft,... –

回答

0

你的天真想法是要走的路。个别维度可以独立转换。

+0

是的,你是对的,这个事实被FFT的并行实现所使用。但我不明白这对我的问题有什么帮助。 – mrdy

+0

我已经为C++中的3D复杂构建了所有这些。我也需要漂浮和双精度。 https://github.com/kvahed/codeare/blob/master/src/matrix/ft/FFTWTraits.hpp https://github.com/kvahed/codeare/blob/master/src/matrix/ft/DFT。 hpp 但是它与你感兴趣的不同,因为所有3个维度对我来说都很复杂。你必须经历许多3D卷吗? 在这种情况下,你可以使用openmp在eachother和2D fft之后进行一维fft。或者你在openmp循环中使用单线程的fft。小心:fftw_plan_init不是线程安全的。 –