Ошибка сегментации при вызове METIS из FORTRAN

Я занимаюсь разработкой программы на Fortran 90 и связываю ее с библиотеками METIS. Я использую GNU Fortran 4.8.5 и METIS 5.1.0. Я компилирую свою программу на Фортране:

-fdefault-real-8 -fdefault-integer-8

Варианты, а при сборке METIS я указывал:

#define IDXTYPEWIDTH 64 

а также

#define REALTYPEWIDTH 64 

следовательно длина как целых чисел, так и вещественных чисел должна соответствовать. Когда я компилирую и запускаю следующую программу:

program Test_Metis
implicit none
integer              :: nvtxs,          &  ! number of vertices
                        ncons,          &  ! number of connections          
                        nparts = 2         ! requested number of partitions
integer, pointer     :: vwgt  =>null(), &  ! weights of the vertices
                        vsize =>null(), &  ! size of the vertices
                        adjwgt=>null(), &  ! weights of the edges
                        mopts =>null(), &  ! array of options
                        objval=>null()     ! stores edgecut or comm. volume
real, pointer        :: tpwgts=>null(), &  ! desired weight for each partition
                        ubvec =>null()     ! 
integer, allocatable :: xadj  (:),      &  ! variabes for ...
                        adjncy(:),      &  ! ... compressed row storage
                        part  (:)          ! partition of the grid

nvtxs = 15
ncons = 22
allocate(xadj  (nvtxs+1))
allocate(adjncy(ncons*2))
allocate(part  (nvtxs))

xadj = (/ 0,  2,  5,  8, 11, 13, 16, 20,  &
         24, 28, 31, 33, 36, 39, 42, 44/)

adjncy=(/ 1,  5,  0,  2,  6,  1,  3,  7,  2,  4,  8,  &
          3,  9,  0,  6, 10,  1,  5,  7, 11,  2,  6,  &
          8, 12,  3,  7,  9, 13,  4,  8, 14,  5, 11,  &
          6, 10, 12,  7, 11, 13,  8, 12, 14,  9, 13/)

call METIS_PartGraphRecursive(nvtxs,     &  ! (in), int
                              ncons,     &  ! (in), int
                              xadj,      &  ! (in), int(:)
                              adjncy,    &  ! (in), int(:)
                              vwgt,      &  ! (in), int(:)
                              vsize,     &  ! (in), int(:)
                              adjwgt,    &  ! (in), int(:)
                              nparts,    &  ! (in), int(:)
                              tpwgts,    &  ! (in), real(:)
                              ubvec,     &  ! (in), real(:)
                              mopts,     &  ! (in), int(:)
                              objval,    &  ! (out) int(:)
                              part)         ! (out) int(:)
end program

Я получаю ошибку сегментации. (Я взял смежность из руководства METIS, это должно быть довольно просто.)

Может кто-нибудь помочь мне с этим вопросом?

1 ответ

Это минимум, необходимый для звонка в METIS из Фортрана:

program Test_Metis                                                              
use iso_c_binding                                                               
implicit none                                                                   
integer              :: nvtxs  = 15,       &  ! number of vertices              
                        nedgs  = 22,       &  ! number of edges                 
                        ncons  =  1,       &  ! number of constraints           
                        nparts =  2,       &  ! requested number of partitions  
                        objval,            &  ! return value from METIS call    
                        mopts(41)             ! array of options                
type(c_ptr)          :: vwgt  =c_null_ptr, &  ! weights of the vertices         
                        vsize =c_null_ptr, &  ! size of the vertices            
                        adjwgt=c_null_ptr     ! weights of the edges            
real                 :: ubvec                 !                                 
integer, allocatable :: xadj  (:),         &  ! variabes for ...                
                        adjncy(:),         &  ! ... compressed row storage         
                        part  (:)             ! partition of the grid           
real, allocatable    :: tpwgts(:)             ! desired weight for each partition

allocate(xadj  (nvtxs+1))                                                       
allocate(adjncy(nedgs*2))                                                       
allocate(part  (nvtxs))                                                         
allocate(tpwgts(nparts))                                                        

xadj = (/ 0,  2,  5,  8, 11, 13, 16, 20,  &                                     
         24, 28, 31, 33, 36, 39, 42, 44/)                                       
adjncy=(/ 1,  5,  0,  2,  6,  1,  3,  7,  2,  4,  8,  &                         
          3,  9,  0,  6, 10,  1,  5,  7, 11,  2,  6,  &                         
          8, 12,  3,  7,  9, 13,  4,  8, 14,  5, 11,  &                         
          6, 10, 12,  7, 11, 13,  8, 12, 14,  9, 13/)                           

tpwgts(:) =  1.0 / real(nparts)  ! all parts weigh the same                     
ubvec     =  1.001               ! this would be default by METIS anyway        
mopts(:)  = -1                   ! -1 is default value for all options          

call METIS_PartGraphRecursive(nvtxs,     &  ! (in), int                         
                              ncons,     &  ! (in), int                         
                              xadj,      &  ! (in), int(:)                      
                              adjncy,    &  ! (in), int(:)                      
                              vwgt,      &  ! (in), int(:)                      
                              vsize,     &  ! (in), int(:)                      
                              adjwgt,    &  ! (in), int(:)                      
                              nparts,    &  ! (in), int(:)                      
                              tpwgts,    &  ! (in), real(:)                     
                              ubvec,     &  ! (in), real(:)                     
                              mopts,     &  ! (in), int(:)                      
                              objval,    &  ! (out) int(:)                      
                              part)         ! (out) int(:)                      
end program                                                                     
Другие вопросы по тегам