Please can I ask for help with the 2D transform on 4D data? I have an array theta(x,y,dz,z) and need to do to the FFT over x and y, I have written for this an test code:
real :: Xin(x,y), Xout(x*y)
complex :: Yin(x,y), Yout(x*y)
dxT = x/2 + 1
L(1) = x
L(2) = y
strides_out(1) = 0
strides_out(2) = 1
strides_out(3) = dxT
do i=1,dz
do j = 1,z
Xin = theta(:,:,i,j)
StatusExp = DftiCreateDescriptor( FFT_HANDLE, DFTI_SINGLE,DFTI_REAL, 2, L )
StatusExp = DftiSetValue(FFT_HANDLE,DFTI_CONJUGATE_EVEN_STORAGE, DFTI_COMPLEX_COMPLEX)
StatusExp = DftiSetValue( FFT_HANDLE, DFTI_PLACEMENT, DFTI_NOT_INPLACE )
StatusExp = DftiSetValue(FFT_HANDLE, DFTI_OUTPUT_STRIDES, strides_out)
StatusExp = DftiCommitDescriptor(FFT_HANDLE)
StatusExp = DftiComputeForward(FFT_HANDLE, Xin(:,1), Yout)
do k=1,dxT
do l=1,y
thetaFFT(k,l) = Yout(k + (l-1)*dxT)
if(k>1) thetaFFT(x+2-k,l) = conjg(thetaFFT(k,l))
enddo
enddo
StatusExp = DftiFreeDescriptor(FFT_HANDLE)
enddo
enddo
!***************************************************************************
! Backward
L(1) = x
L(2) = y
strides_out(1) = 0
strides_out(2) = 1
strides_out(3) = x
do i=1,dz
do j = 1,z
Yin = thetaFFT(:,:,i,j)
StatusExp = DftiCreateDescriptor( FFT_HANDLE, DFTI_SINGLE,DFTI_REAL, 2, L )
StatusExp = DftiSetValue(FFT_HANDLE,DFTI_REAL_STORAGE, DFTI_REAL_REAL)
StatusExp = DftiSetValue( FFT_HANDLE, DFTI_PLACEMENT, DFTI_NOT_INPLACE )
StatusExp = DftiSetValue(FFT_HANDLE, DFTI_OUTPUT_STRIDES, strides_out)
StatusExp = DftiCommitDescriptor(FFT_HANDLE)
StatusExp = DftiComputeBackward(FFT_HANDLE, Yin(:,1), Xout)
do k=1,x
do l=1,y
theta(k,l) = Xout(ix + (l-1)*dxT)/(x*y)
enddo
enddo
StatusExp = DftiFreeDescriptor(FFT_HANDLE)
enddo
enddo
Why I don't get my testing array theta back when running this routine?
I send theta = 1., procedure with it forward and backward FFt and get back a theta containing random numbers about 2. What's wrong?
Many thanks for any idea