1

我正在尝试通过 Fortran 使用 METIS 对网格进行分区,我在 X64 Windows 7 系统上使用 Visual Studio 10.0 X64 构建了 lib 文件,我的程序如下:

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")

            ! use binding module
            use iso_c_binding
            ! declare variables with C++ types semantics
            integer(kind=c_int)               :: ne, nn, ncommon, objval
            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)

        end subroutine METIS_PartMeshDual

    end interface

end module

program METIS_PART_1

    use iso_c_binding
    use metis_vars

    implicit none

    open(unit=1, file='metis_test.mesh')

    read(1,*), ne

    nn = ne * 8

    allocate( eptr(ne), eind(8*ne) )
    allocate( epart(ne), npart(nn) )

    do ic=1,ne

        ia = (ic-1) * 8 + 1

        read(1,*), eind(ia:ia+7)

        eptr(ic) = ia

    enddo

    nparts = 4
    ncommon = 2

    vwgt   = c_null_ptr
    vsize  = c_null_ptr
    tpwgts = c_null_ptr
    opts(0)   = 1
    opts(7)   = 1

    call METIS_PartMeshDual(ne,nn,eptr,eind,vwgt,vsize,ncommon,nparts,tpwgts,opts,objval,epart,npart)

end program METIS_PART_1

我修改了所有输入数组并且它们是正确的(我已经使用 EXE 成功地分割了这个网格),但是,当我使用 API 时,我收到以下错误:

当前使用的内存:zu 字节 使用的最大内存:zu 字节 *** CreateGraphDual 的内存分配失败:nind。请求大小:zu 字节

我不知道出了什么问题或如何调试它

4

2 回答 2

1

终于发现eptr的分配大小是(nc),但应该是(nc+1),也就是元素个数+1

于 2013-07-11T15:41:27.670 回答
0

通过 Metis 的源文件(版本 5.1.0)快速 grep 揭示了问题:

    void CreateGraphDual(idx_t ne, idx_t nn, idx_t *eptr, idx_t *eind, idx_t ncommon, 
              idx_t **r_xadj, idx_t **r_adjncy)
    {
      ...
      idx_t *nptr, *nind;
      ...

      /* construct the node-element list first */
      nptr = ismalloc(nn+1, 0, "CreateGraphDual: nptr");
      nind = imalloc(eptr[ne], "CreateGraphDual: nind");
      ...

暗示数组可能有问题eptr(正如您已经发现的那样)。

于 2018-05-07T11:23:19.237 回答