从Fortran语言运行时METIS赛格故障(METIS seg faults when run f

2019-07-17 16:04发布

我试图使用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的输出,如果这是有帮助的。

Answer 1:

使用:

vwgt=>null() 

代替

vwgt(:)=>null()

对所有空值(即vwgt的vsize,选择采用,tpwgts等)。 问题是,vwgt(:)心不是真正的定义,而不是仅仅vwgt或vwgt(1)。 如果你还有问题,那么使用调试器来检查所有值。

我是在第2段中提到的线程OP。 最终的解决方案是在不幸的答复(见时间标记)的顶部。 希望帮助。



Answer 2:

有没有可能是这一点,但也许是问题的第二项链接后仍然是恰当的。

用Fortran一个指针和在C语言的指针都不太相同的概念, 特别如果Fortran指针是一个数组 。 一个指针的Fortran中的阵列的实施需要存储以外,存储在C指针附加信息(数组边界或等效物)(其是数据的仅仅是地址)。

(在技术上,除非METIS_PartMeshDual相关伪参数定义具有可选的或指针属性(不可能的,如果它是被称作C函数和语言标准是<= F2008),则在在Fortran调用解离的指针的参考文献中是非法再次 - 依赖实现以会发生什么 - 我能想象的实施方案,其中,将工作和它不会)

请注意,在您链接到空指针的声明后,从被排列改为标量作为解决方案的一部分(第一个回复列表 - 检查岗位的时间)。 在示例代码张贴的“空”的东西的声明仍然显示阵列的问题的一部分。 我怀疑在声明的变化而变化的“建立”呼叫到C API和/或什么是分离的指针看起来像你的编译器。

这些天来,从Fortran语言调用C API的时候我喜欢(如果可能)写一个使用Fortran 2003的公司的C互操作性功能(BIND(C)和朋友)的C API接口块。 这是更为稳健和避免这类平台相关的问题。 它需要的是一次性的前期工作,也是一个Fortran编译支持F2003的这一方面。 库供应商那去为自己的Fortran用户提供这样的接口模块的麻烦得到一个大的滴答声和大量的从我亲切的思念。



Answer 3:

Fortran数组大小比C.更灵活可以使Fortran数组0指数的,或任何你想要的起始索引。

real, dimension (0:N-1) :: array
real, dimension (:), allocatable :: group
allocate (group (0:N-1))

如果关于起始索引莫名其妙分歧的问题也许这会有所帮助。



文章来源: METIS seg faults when run from Fortran