通过FFTW进行2D DFT

时间:2019-04-11 12:21:29

标签: c fft fftw

我正在尝试将2D dft移至FFTW,但遇到了问题。

在我的旧代码中,我沿z执行1D C2C,然后沿x方向执行1D C2R。 现在,我正在尝试使用FFTW的2D C2R,但是我错过了一些东西,并且输出是不同的。

这是我尝试过的:

#include <mpi.h>
#include <fftw3-mpi.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

#define N 4

int main (int argv, char **argc)
{
int nz=N*2+1, nx=N+1;
int nxd=8, nzd=12;
int rank, size;
double *real;   
fftw_complex *complx, *data;
double t1, t2;
fftw_plan plan;
ptrdiff_t alloc_local, local_n0, local_0_start, alloc_local_data, local_n0_data, local_0_start_data;

MPI_Init (&argv, &argc);
fftw_mpi_init ();

MPI_Comm_rank (MPI_COMM_WORLD, &rank);
MPI_Comm_size (MPI_COMM_WORLD, &size);

alloc_local_data = fftw_mpi_local_size_2d (nz, nx, 
                                      MPI_COMM_WORLD, 
                                      &local_n0_data,  
                                      &local_0_start_data);
alloc_local = fftw_mpi_local_size_2d (nzd, nxd, 
                                      MPI_COMM_WORLD, 
                                      &local_n0,  
                                      &local_0_start);
data = fftw_alloc_complex(alloc_local);
real = (double*) fftw_malloc(sizeof(double) * 2*alloc_local);
complx = fftw_alloc_complex(alloc_local);

plan = fftw_mpi_plan_dft_c2r_2d (nzd,(nxd-1)*2, complx, real, 
                             MPI_COMM_WORLD, 
                                 FFTW_MEASURE);
/*plan_f = fftw_mpi_plan_dft_r2c_2d (nzd, nxd, complx, real,
                             MPI_COMM_WORLD, 
                                 FFTW_MEASURE);*/
// realitialize realput with some numbers   
for (int i = 0; i < local_n0_data; i++) {
    for (int k = 0; k < nz; k++) {
        data[k+i*nz][0] = 2*(k+(i+local_0_start_data)*(nz));
        data[k+i*nz][1] = 2*(k+(i+local_0_start_data)*(nz))+1;
    //  printf("[%d]complex[%d]= %f+I*%f\n",rank,k+i*(nz), data[k+i*(nz)][0], data[k+i*(nz)][1]  );
    }
    //printf("-----------------\n");
}

/*Move data inside nxd=8xnzd=12 array*/
for(int i=0; i < 5; i++){
    for(int k=0; k < 5; k++) {
        complx[i*nzd+k][0]=data[(k+nz/2)+i*nz][0];
        complx[i*nzd+k][1]=data[(k+nz/2)+i*nz][1];
        //printf("[%d]complex[%d]= %f+I*%f\n",rank,k+i*(nzd), complx[k+i*(nzd)][0], complx[k+i*(nzd)][1]  );
    }   
}
for(int i=0; i < 5; i++){
    for(int k=5; k < 8; k++) {
        complx[i*nzd+k][0]=0;
        complx[i*nzd+k][1]=0;
        //printf("[%d]complex[%d]= %f+I*%f\n",rank,k+i*(nzd), complx[k+i*(nzd)][0], complx[k+i*(nzd)][1]  );
    }   
}
for(int i=0; i < 5; i++){
    for(int k=8; k < nzd; k++) {
        complx[i*nzd+k][0]=data[(k-nz+1)+i*nz][0];
        complx[i*nzd+k][1]=data[(k-nz+1)+i*nz][1];
        //printf("[%d]complex[%d]= %f+I*%f\n",rank,k+i*(nzd), complx[k+i*(nzd)][0], complx[k+i*(nzd)][1]  );
    }   
}
for(int i=5; i < nxd;i++){
    for(int k=0; k<nzd;k++){
        complx[i*nzd+k][0]=0;
        complx[i*nzd+k][1]=0;
    }
}
/*for(int i=0;i<nxd;i++){
    for(int k=0; k< nzd;k++){
        printf("complx[%d]=%f+I*%f\n",i*nzd+k,complx[i*nzd+k][0],complx[i*nzd+k][1]);
    }
    printf("----------------\n");
}*/

/*transform*/
fftw_execute(plan);

for(int i=0;i<2*(nxd-1);i++){
    for(int k=0; k< nzd;k++){
        printf("real[%d]=%f\n",i*nzd+k,real[i*nzd+k]);
    }
    printf("----------------\n");
}

// Clean up and get complx
//free(real);   free(complx);   fftw_free(data);
fftw_destroy_plan (plan);
MPI_Finalize ();
return 0;
}

如您所见,我正在使用具有MPI支持的FFTW,但是目前我正在单核环境中工作,所以不必担心可能的数组绑定错误。

工作数组是8x12(nx,nz),其中填充了来自数组数据的值5x9。

我已经按照手册herehere

中的几个示例进行了操作。

任何建议都将受到欢迎!

0 个答案:

没有答案