void convo2d() { /*ID FFT Row wise*/ for (i = 0; i<MAXN; i++) { fft1d(data1[i], MAXN, -1); fft1d(data2[i], MAXN, -1); } /*Transpose*/ for (i = 0; i < MAXN; i++) { for (j = i; j < MAXN; j++) { C_SWAP(data1[i][j], data1[j][i]); C_SWAP(data2[i][j], data2[j][i]); } } /*1D FFT Row wise (Transposed Column)*/ for (i = 0; i<MAXN; i++) { fft1d(data1[i], MAXN, -1); fft1d(data2[i], MAXN, -1); } /*Point Multiplication*/ for (i = 0; i < MAXN; i++) { for (j = 0; j < MAXN; j++) { data3[i][j].r = data1[i][j].r * data2[i][j].r - data1[i][j].i * data2[i][j].i; data3[i][j].i = data1[i][j].r * data2[i][j].i + data1[i][j].i * data2[i][j].r; } } /*1D IFFT Row wise*/ for (i = 0; i<MAXN; i++) { fft1d(data3[i], MAXN, 1); } /*Transpose*/ for (j = 0; j < MAXN; j++) { for (i = j; i < MAXN; i++) { C_SWAP(data3[i][j], data3[j][i]); } } /*1D IFFT Row wise (Transposed Column)*/ for (i = 0; i<MAXN; i++) { fft1d(data3[i], MAXN, 1); } }
//perform the fft in all directions void fft4d(complex *out,complex *in,int *dirs,int ncpp,double sign,int normalize) { //copy input in the output (if they differ!) if(out!=in) vector_copy(out,in); //perform the fft in each direction for(int mu=0;mu<NDIM;mu++) { //perform the 1d fft (slower dir) if(dirs[mu]) fft1d(out,out,ncpp*loc_vol/loc_size[mu],mu,sign,normalize); //for the time being we stick to transpose the data data_coordinate_order_shift(out,ncpp,mu); } }