Я пытаюсь вызвать подпрограмму в цикле.Эта подпрограмма имеет локальную структуру.Ниже приведен код, который я использую:
! Test local coarray in procedure called in a loop.
!
program main
use, intrinsic :: iso_fortran_env, only : input_unit, output_unit, error_unit
implicit none
! Variable declaration.
integer :: me, ti
integer :: GHOST_WIDTH, TSTART, TSTEPS
sync all
! Initialize.
GHOST_WIDTH = 1
TSTART = 0
TSTEPS = 100000
me = this_image()
! Iterate.
do ti = TSTART + 1, TSTART + TSTEPS
call Aldeal( GHOST_WIDTH )
if ( me == 1 ) write( output_unit, * ) ti
end do
if ( me == 1 ) write( output_unit, * ) "All done!"
contains
subroutine Aldeal( width )
integer, intent(in) :: width
integer, allocatable, codimension[:] :: shell1_Co, shell2_Co, shell3_Co
allocate( shell1_Co[*], shell2_Co[*], shell3_Co[*] )
deallocate( shell1_Co, shell2_Co, shell3_Co )
return
end subroutine Aldeal
end program main
Прямо сейчас подпрограмма не делает ничего, кроме выделения локального coarray и освобождения его.Но даже при этом программа выдает мне следующую ошибку после некоторых итераций:
forrtl: severe (174): SIGSEGV, segmentation fault occurred
In coarray image 1
Image PC Routine Line Source
coarray_main 0000000000406063 Unknown Unknown Unknown
libpthread-2.17.s 00007F21D8B845F0 Unknown Unknown Unknown
libicaf.so 00007F21D90970D5 for_rtl_ICAF_CO_D Unknown Unknown
coarray_main 0000000000405054 main_IP_aldeal_ 37 coarray_main.f90
coarray_main 0000000000404AEC MAIN__ 23 coarray_main.f90
coarray_main 0000000000404A22 Unknown Unknown Unknown
libc-2.17.so 00007F21D85C5505 __libc_start_main Unknown Unknown
coarray_main 0000000000404929 Unknown Unknown Unknown
Abort(0) on node 0 (rank 0 in comm 496): application called MPI_Abort(comm=0x84000003, 0) - process 0
И такая же ошибка повторяется и для других изображений.
Строка 23 равна call Aldeal( GHOST_WIDTH )
внутри цикла do основной программы.И строка 37 соответствует оператору deallocate( shell1_Co, shell2_Co, shell3_Co )
в подпрограмме.
Кроме того, если я удаляю оператор deallocate из подпрограммы, она выдает ту же ошибку, но на этот раз номер строки в операторе ошибки составляет 23 и 39Строка 39 соответствует выражению end subroutine Aldeal
.
Я не могу понять, что именно я делаю неправильно.Пожалуйста, помогите.
PS Я использую Centos 7 с Intel (R) Parallel Studio XE 2019 Обновление 4 для Linux.