2012-02-27 58 views
0

我需要使用MPI在Fortran中對3D數組進行FFT。我一直在尋找的FFTW網站,我也試圖尋找在線的例子,但我只能找到這段代碼:用於3D複雜陣列的Fortran中的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變換。我的問題是:如何使用此代碼來計算3D數組的FFT變換?

回答

1

關於fftw_mpi_plan_dft_2d看看:

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

這是很明顯的是,必須有一個fftw_mpi_plan_dft_3d功能以及。當然對於fftw_mpi_local_size_2d也是如此。參數會稍微改變,但文檔將幫助你解決這個問題。

+0

我知道,但我想知道是否有經驗的人可能會對這些功能有所幫助。 – Brian 2012-02-27 13:21:39

+1

我很抱歉,但從您的問題中不明顯。 另外,如果你知道這些功能,你爲什麼不試一試。如果它不起作用,你總是可以回來尋求幫助。 – Azrael3000 2012-02-27 13:30:38

+0

請記住,FFTW僅支持1D MPI分解,因此您的域必須分片。如果您的網格具有多維分解,則可能必須將全部到全部與常規FFTS結合使用。 – Chiel 2015-01-28 07:49:46