从 FORTRAN 调用 METIS 时出现分段错误



我正在开发一个Fortran 90程序,并将其与METIS库链接。 我正在使用GNU Fortran 4.8.5和METIS 5.1.0。 我用以下命令编译我的Fortran程序:

-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手册中获取了邻接关系,这应该是非常基本的。

任何人都可以帮助我解决这个问题吗?

这是从 Fortran 调用 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                                                                     

相关内容

  • 没有找到相关文章

最新更新