Note
Subroutine that transforms forward a double real array. For speed reasons FFTW will always work on the same memory area, until the plans are destroyed of course. 1 FFT distributed on several threads
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
real(kind=R8), | intent(in), | dimension(1:long, 1:larg) | :: | tab_in |
array to transform |
|
complex(kind=R8), | intent(out), | dimension(1:long, 1:larg) | :: | tab_ou |
transformed array |
|
integer(kind=I4), | intent(in) | :: | long |
first 2D array dimension |
||
integer(kind=I4), | intent(in) | :: | larg |
second 2D array dimension |
||
integer(kind=I4), | intent(in), | optional | :: | planner_flag |
planning option, FFTW_ESTIMATE for example |
subroutine calc_fftw3_real_fwd(tab_in, tab_ou, long, larg, planner_flag) implicit none integer(kind=I4), intent(in ) :: long !! *first 2D array dimension* integer(kind=I4), intent(in ) :: larg !! *second 2D array dimension* real (kind=R8), dimension(1:long, 1:larg), intent(in ) :: tab_in !! *array to transform* complex(kind=R8), dimension(1:long, 1:larg), intent(out) :: tab_ou !! *transformed array* integer(kind=I4), intent(in), optional :: planner_flag !! *planning option, [[fftw3(module):FFTW_ESTIMATE]] for example* integer(kind=I4) :: plan_flag if ( .not. present(planner_flag) ) then plan_flag = FFTW_ESTIMATE else plan_flag = planner_flag endif if ( any( FFT_DIM(1:2) /= [long, larg] ) ) then if ( sum(FFT_DIM(1:2)) /= 0 ) call end_fftw3() call fftw_plan_with_nthreads(nthreads = omp_get_num_procs()) call init_fftw3_real(long = long, larg = larg, plan_flag = plan_flag) endif rea_f_i(1:long, 1:larg) = tab_in(1:long, 1:larg) call fftw_execute_dft_r2c(plan_f, rea_f_i(1:long, 1:larg), cmp_f_o(1:long, 1:larg)) tab_ou(1:long, 1:larg) = cmp_f_o(1:long, 1:larg) / sqrt(real(long*larg, kind=r8)) return endsubroutine calc_fftw3_real_fwd