我正在开发一个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