2017-08-28 8 views
0

私は実際のデータの3D配列を持っています。これは、ある軸に沿ったDSTまたはDCTと、他の2つの軸に沿った通常のDFTで変換したいものです。結果は、この変換の係数を保持する3Dの複雑な配列でなければなりません。カスタム3D(パラレル)FFTW変換は可能ですか?

FFTW3パッケージがこのようなルーチンを並行して提供するかどうかは分かりますか? FFTW3は、3つの方向すべてにおいて単純な3D DFTのためのそのようなルーチンを提供する。

もしそうでなければ、それをC/C++で最良の方法で達成する方法についてのヒントがありますか?

私の素朴なアイデア:DST/DCTのアセンブリに続いて、折り返しルーチン内の第1軸に沿った2D実数から複素数への変換が続きます。そして、並列性を達成するために1D分解を考えることができる。 2Dはより良いはずですが、はるかに機能します。

PS: この変換は、Navier-Stokes方程式を解くためのスペクトル法で使用されます。

+0

あなたは[FFTPACK](http://www.netlib.org/fftpack/)を見ましたか(これは古い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ボリュームを通過する必要がありますか? この場合、お互いに1D fftsをやって、2つのfftsをopenmpで使うことができます。またはopenmpループでシングルスレッドfftsを使用します。注意:fftw_plan_initはスレッドセーフではありません。 –

関連する問題