我正在尝试使用METIS通过Fortran对网格进行分区,我在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字节
我不知道什么是错的或如何调试
答案 0 :(得分:1)
我终于发现eptr的分配大小是(nc),但它应该是(nc + 1),这是元素的数量+ 1
答案 1 :(得分:0)
通过Metis的源文件(版本5.1.0)快速查看显示问题:
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
数组可能存在问题
(正如你已经想到的那样)。