Параллельное БПФ с БПФ в Фортране падает
Моя цель состоит в том, чтобы распараллелить последовательный код FFTW, написанный на Фортране, который сообщает нам конечное распределение деформаций в материале. Мне нужно только распараллелить прямое преобразование Фурье и обратное преобразование, чтобы оно оставалось таким, как есть. Возможно ли это сделать в первую очередь? Я пытался сделать это, но получил некоторые ошибки сегментации. Я действительно могу вставить весь код, но это 1600 строк, но я приложу, где ошибка не устранена.
Предположим, инициализация других тривиальных переменных и требуемых заголовков.
complex ( C_DOUBLE_COMPLEX ) , dimension ( : , : , : ), pointer :: in_forward !> @var Array input in FFT
complex ( C_DOUBLE_COMPLEX ) , dimension ( : , : , : ), pointer :: out_forward !> @var Array output in FFT
complex ( C_DOUBLE_COMPLEX ) , dimension ( : , : , : ), allocatable :: in_backward !> @var Array input of FFT-1
complex ( C_DOUBLE_COMPLEX ) , dimension ( : , : , : ), allocatable :: out_backward !> @var Array output for FFT-1
ALLOCATE delta(3,3,npts1,npts2,local_npts3))
integer (kind = i4b ) :: plan_forward
integer (kind = i4b ) :: plan_backward
integer :: AllocateStatus
CALL MPI_INIT(ier)
CALL fftw_mpi_init
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, IER)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, IER)
ur0=0
open(ur0,file='elfft.in',status='old')
read(ur0,'(a)') prosa
read(ur0,*),npts1,npts2,npts3
npts1_c = npts1
npts2_c = npts2
npts3_c = npts3
alloc_local = fftw_mpi_local_size_3d(npts3_c, npts2_c, npts1_c, MPI_COMM_WORLD, local_npts3_c, local_j_offset_c)
local_npts3 = local_npts3_c
local_j_offset = local_j_offset_c
cdata = fftw_alloc_complex(alloc_local)
CALL C_F_POINTER(cdata, in_forward, [npts1_c, npts2_c, local_npts3_c])
do vii=1,3
do vjj=1,3
in_forward(:,:,:) = CMPLX(delta(vii,vjj,:,:,:),0)
if (imicro == 1 .and. iter == 1 .and. vii == 1 .and. vjj == 1 ) then
plan = fftw_mpi_plan_dft_3d(local_npts3_c,npts2_c,npts1_c, in_forward , out_forward, MPI_COMM_WORLD, FFTW_FORWARD, FFTW_ESTIMATE)
print *, 'successful plan creation for forward'
endif
call fftw_mpi_execute_dft( plan,in_forward, out_forward )
.
.
call fftw_destroy_plan(plan)
call fftw_free(cdata)
После компиляции и запуска программы я получаю эту ошибку. Я все еще чувствую, что сделал что-то неполное и хочу иметь лучшее понимание. Так что, если кто-то может предложить мне какой-нибудь пример исходного кода или справочный материал, было бы здорово.
Error in `./a.out': munmap_chunk(): invalid pointer successful plan creation for forward
successful plan creation for forward
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.