我正在尝试使用METIS库进行网格划分,作为我为有限元计算编写的 Fortran 程序的一部分。METIS 是用 C 语言编写的,但它应该可以在 Fortran 90 上正常工作。但我不断遇到段错误。
一个潜在的问题是我给出了一些空指针的参数。其他一些人在从 fortran 调用 C 函数以识别空指针对象时遇到了麻烦。这是在这里解决的,我认为这不是我遇到的问题。
我认为问题在于让 METIS 更改起始数组索引;在 C 中它是 0,在 Fortran 中它是 1。有一个数组传递给每个函数,如果你想要 Fortran 约定options
,它应该有一个METIS_OPTION_NUMBERING
你可以更改的字段。1
不这样做会导致 C 程序尝试访问索引 0,从而给您 seg 错误。
edunlop1在这里的帖子建议我只是创建一个数组options
,并且与 METIS 达成的一些约定确定该数组的哪个元素应该设置为 1,以便对所有内容重新编号。但这取决于您使用的例程,数组长度也会发生变化。
无论如何,这是我的代码:
integer :: ndomains,ncommon,objval
integer :: options(0:40)
integer, dimension(:), allocatable :: eptr,eind
integer, pointer :: vwgt(:)=>null(), vsize(:)=>null(), opts(:)=>null()
real(kind=8), pointer :: tpwgts(:)=>null()
! Read in the mesh data
call getarg(1,meshname)
call readmesh(meshname)
allocate(color(ne),domain(nn))
allocate(eind(3*ne),eptr(ne+1))
do n=1,ne
eptr(n) = 1+3*(n-1)
do i=1,3
eind( eptr(n)+i-1 ) = elem(i,n)
enddo
enddo
! Try and call METIS
ncommon = 2
ndomains = 2
options = 0
options(0) = 1
options(8) = 1
call METIS_PartMeshDual(ne,nn,eptr,eind,vwgt,vsize, &
& ncommon,ndomains,tpwgts,options,objval,color,domain)
METIS 中用于更改编号的相关代码位于文件 libmetis/meshpart.c 中:
/* renumber the mesh */
if (options && options[METIS_OPTION_NUMBERING] == 1) {
ChangeMesh2CNumbering(*ne, eptr, eind);
renumber = 1;
}
有什么想法吗?如果有帮助,我可以发布 Valgrind 输出。