Я хочу использовать современный интерфейс Fortran FFTW , но таким способом, который позволяет выполнять простые вызовы функций, такие как ifftshift (fft_c2c (vec) * exp (vec)) и так далее.Это мое понимание того, как это сделать (я также понимаю, что каждый новый звонок - это не самая эффективная вещь).В настоящее время этот код работает (возвращает правильные результаты);однако происходит утечка памяти, поэтому повторные вызовы приводят к потерям.Я не совсем уверен, где, хотя!Я надеялся, что ассоциация возвращаемой переменной `fft 'с единственной несвободной памятью не приведет к утечкам, но это, очевидно, неверно.Чего мне не хватает, и как мне лучше структурировать то, что я хочу сделать с правильным современным фортраном?Спасибо!
function fft_c2c(x) result(fft)
integer :: N
type(C_PTR) :: plan
complex(C_DOUBLE_COMPLEX), pointer :: fft(:)
complex(C_DOUBLE_COMPLEX), dimension(:), intent(in) :: x
! Use an auxiliary array that is allocated with fftw_alloc_complex
! to ensure memory alignment for performance, see FFTW docs
complex(C_DOUBLE_COMPLEX), pointer :: x_align(:)
type(C_PTR) :: p
N = size(x)
p = fftw_alloc_complex(int(N, C_SIZE_T))
call c_f_pointer(p, fft, [N]);
p = fftw_alloc_complex(int(N, C_SIZE_T))
call c_f_pointer(p, x_align, [N]);
plan = fftw_plan_dft_1d(N, x_align, fft, FFTW_FORWARD, FFTW_MEASURE);
! FFTW overwrites x_align and fft during planning process, so assign
! data here
x_align = x
call fftw_execute_dft(plan, x_align, fft);
call fftw_free(p);
end function fft_c2c