Параллельное БПФ с БПФ в Фортране падает

Моя цель состоит в том, чтобы распараллелить последовательный код 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.

0 ответов

Другие вопросы по тегам