我正在尝试将METIS库用于网格划分,这是我为有限元计算编写的Fortran程序的一部分。 METIS是用C编写的,但是应该可以在Fortran 90中正常工作。但是我一直遇到段错误。

一个潜在的问题是我为空指针提供了一些参数。其他一些人很难从fortran调用C函数来识别空指针对象。 here已解决该问题,我认为这不是我遇到的问题。

我认为问题在于让METIS更改起始数组索引;在C中,它是0,在Fortran中,它是1。有一个options数组传递给每个函数,如果希望使用Fortran约定,该数组应该具有一个字段METIS_OPTION_NUMBERING,您可以将其更改为1。否则,将导致C程序尝试访问索引0,从而给您段错误。

edunlop1 here的帖子表明,我只是制作了一个数组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输出。

最佳答案

用:

vwgt=>null()


代替

vwgt(:)=>null()


对于所有null(即vwgt,vsize,opts,tpwgts等)。问题在于vwgt(:)并未真正定义,而不是vwgt或vwgt(1)。如果仍然有问题,请使用调试器检查所有值。

我是第二段提到的线程中的OP。不幸的是,最终的解决方案是在答复的顶部(请参见时间戳)。希望有帮助。

08-15 23:36