Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Fortran和C调用Metis API_C_Fortran_Metis - Fatal编程技术网

使用Fortran和C调用Metis API

使用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

我使用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
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代码中。