使用Fortran和C调用Metis API
我使用Fortran和C编写了以下调用Metis的代码,但仍然出现分段错误。代码的目标是对输入文件使用Fortran和C调用Metis API,c,fortran,metis,C,Fortran,Metis,我使用Fortran和C编写了以下调用Metis的代码,但仍然出现分段错误。代码的目标是对输入文件chanelements进行分区 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 i
chanelements
进行分区
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)
您是否使用
-g-fbacktrace
(gfortran)进行编译以查看seg故障发生的位置?其中opts
声明为数组?实际上,你的变量在哪里声明的?嗨,凯尔,我刚刚添加了在第一篇文章中遗漏的参数声明。我使用以下方法进行编译:fobeidat@ubuntu:~/MetisApplication/graphs$gfortran-g-fbacktrace test3.f90/opt/metis/lib/libmetis。sofobeidat@ubuntu:~/MetisApplication/graphs$./a.out---------------------ne:2000 nn:16000程序接收信号11(SIGSEGV):分段故障。此错误的回溯:+/lib/libc.so.6(+0x33af0)[0x7f6ef19f8af0]+/opt/metis/lib/libmetis.so(libmetis_uucreategraphdual+0x3d)[0x7f6ef252b7dd]然后您就知道了:seg错误在libmetis/mesh.c
的子例程CreateGraphDual
中,而不是您的Fortran代码中。