2017-08-28 65 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不是線程安全的。 –