2012-02-27 11 views
0

MPIを使用してFortranで3D配列のFFTを作成する必要があります。私は、FFTWのウェブサイトを見てきたし、私はまた、オンラインの例を探してみましたが、私はこれだけのコードを見つけることができる:Fortranでの3D複合配列のMPI FFTW

use, intrinsic :: iso_c_binding 
    include 'fftw3-mpi.f03' 
    integer(C_INTPTR_T), parameter :: L = ... 
    integer(C_INTPTR_T), parameter :: M = ... 
    type(C_PTR) :: plan, cdata 
    complex(C_DOUBLE_COMPLEX), pointer :: data(:,:) 
    integer(C_INTPTR_T) :: i, j, alloc_local, local_M, local_j_offset 

! get local data size and allocate (note dimension reversal) 
    alloc_local = fftw_mpi_local_size_2d(M, L, MPI_COMM_WORLD, & 
             local_M, local_j_offset) 
    cdata = fftw_alloc_complex(alloc_local) 
    call c_f_pointer(cdata, data, [L,local_M]) 

! create MPI plan for in-place forward DFT (note dimension reversal) 
    plan = fftw_mpi_plan_dft_2d(M, L, data, data, MPI_COMM_WORLD, & 
           FFTW_FORWARD, FFTW_MEASURE) 

! initialize data to some function my_function(i,j) 
    do j = 1, local_M 
    do i = 1, L 
     data(i, j) = my_function(i, j + local_j_offset) 
    end do 
    end do 

! compute transform (as many times as desired) 
    call fftw_mpi_execute_dft(plan, data, data) 

    call fftw_destroy_plan(plan) 
    call fftw_free(cdata) 

このコードは、FFTは、2次元配列の変換を計算します。私の質問は:どのように私はこのコードを使用して3D配列のFFT変換を計算できますか?

http://www.fftw.org/doc/MPI-Plan-Creation.html

同様にfftw_mpi_plan_dft_3d機能がなければならないことは極めて明白である:fftw_mpi_plan_dft_2dについて

答えて

1

は見ています。もちろんfftw_mpi_local_size_2dの場合も同じです。引数はわずかに変更されますが、ドキュメンテーションはこれについてあなたを助けます。

+0

私は知っていますが、私はこれらの機能を経験した人が助けになるかどうか疑問に思っていました。 – Brian

+1

申し訳ありませんが、それはあなたの質問から明らかではありませんでした。 また、これらの機能について知っている場合は、なぜそれを試してみませんか?それが機能しない場合は、いつでも戻ってきて助けを求めることができます。 – Azrael3000

+0

FFTWは1D MPI分解のみをサポートしているため、ドメインをスライスで分割する必要があります。あなたのグリッドに多次元分解がある場合は、通常のFFTSと組み合わせてAll-to-Allを使用する必要があります。 – Chiel