我编写了以下代码来使用 Fortran 和 C 调用 Metis,但仍然出现分段错误。代码的目标是对输入文件进行分区chanelElements
。
module metis_vars
use iso_c_binding
! Variables
integer :: ia, ic
integer(kind=c_int) :: ne, nn
integer(kind=c_int) :: ncommon, objval
integer(kind=c_int) :: nparts
integer(kind=c_int), allocatable, dimension(:) :: eptr, eind
integer(kind=c_int), allocatable, dimension(:) :: epart, npart
type(c_ptr) :: vwgt, vsize, tpwgts
integer :: opts(0:40)
interface
subroutine METIS_PartMeshDual(ne,nn,eptr,eind,vwgt,vsize,ncommon,nparts,tpwgts,opts, &
objval,epart,npart)bind(C, name="METIS_PartMeshDual")
!subroutine METIS_PartMeshDual(ne,nn,eptr,eind,vwgt,vsize,nparts,tpwgts,opts,objval,epart,npart) &
! bind(C, name="METIS_PartMeshDual")
! use binding module
use iso_c_binding
! declare variables with C++ types semantics
integer(kind=c_int) :: ne, nn, ncommon, objval, nparts
integer(kind=c_int), dimension(*) :: eptr, eind
integer(kind=c_int), dimension(*) :: epart, npart
type(c_ptr), value :: vwgt, vsize, tpwgts
integer(kind=c_int) :: opts(0:40)
! printf('Hi');
end subroutine METIS_PartMeshDual
end interface
end module
主程序是
program METIS_PART_1
use iso_c_binding
use metis_vars
implicit none
open(unit=15, file="chanelData.dat")
open(unit=1, file='channelElements.mesh')
read(1,*), ne
!ne = 2000
nn = ne * 8
allocate( eptr(ne+1), eind(8*ne) )
allocate( epart(ne), npart(nn) )
do ic=1,ne
ia = (ic-1) * 8 + 1
read(1,*), eind(ia:ia+7)
write(15,*), eind(ia:ia+7)
! print*, eind(ia:ia+7)
eptr(ic) = ia
! write(15,*),' ia: ', ia
enddo
close(15)
close(1)
nparts = 4
ncommon = 2
vwgt = c_null_ptr
vsize = c_null_ptr
tpwgts = c_null_ptr
!opts = c_null_ptr
opts = 0
opts(0) = 1
opts(7) = 1
! opts(0) = 1
! opts(7) = 1
print*, ' -----------------------'
print*, ' ne: ', ne
print*, ' nn: ', nn
call METIS_PartMeshDual(ne,nn,eptr,eind,vwgt,vsize,ncommon,nparts,tpwgts, &
opts,objval,epart,npart)
! call METIS_PartMeshDual(ne,nn,eptr,eind,vwgt,vsize,nparts,tpwgts,opts,objval,&
! epart,npart)
print*, ' objval: ', objval
end program METIS_PART_1
我编译使用并得到错误:
fobeidat@envenio05:~/Metis/metis-5.1.0/graphs$ gfortran test3.f90 libmetis.a
fobeidat@envenio05:~/Metis/metis-5.1.0/graphs$ ./a.out
-----------------------
ne: 2000
nn: 16000
Segmentation fault (core dumped)