我试图使用METIS库网格划分,因为我已经有限元计算写Fortran程序的一部分。 METIS用C语言编写,但它应该工作的很好的Fortran 90,但我不断收到赛格故障。
一个潜在的打嗝是,有哪个我给空指针的几个参数。 其他一些人也遇到了麻烦,从FORTRAN获得调用C函数来识别一个空指针对象。 这是写给在这里 ,我不认为这是我遇到的问题。
我认为这个问题是越来越METIS改变的起始数组索引; 用C是0,Fortran语言是1.这里有一个options
数组传递到每一个这是应该有一个字段功能METIS_OPTION_NUMBERING
您改为1
,如果你想在Fortran的约定。 那么如果不这样做将导致C程序试图访问索引0,给你赛格故障。
通过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的输出,如果这是有帮助的。