gpt4 book ai didi

c - 从 Fortran 运行时 METIS 段错误

转载 作者:行者123 更新时间:2023-12-04 09:24:46 26 4
gpt4 key购买 nike

我正在尝试使用 METIS作为我为有限元计算编写的 Fortran 程序的一部分的网格划分库。 METIS 是用 C 编写的,但它应该与 Fortran 90 一起工作得很好。但我总是遇到段错误。

一个潜在的问题是有几个参数我给了空指针。其他一些人在从 fortran 调用 C 函数以识别空指针对象时遇到了麻烦。已解决 here我不认为这是我遇到的问题。

我认为问题在于让 METIS 更改起始数组索引;在 C 中它是 0,在 Fortran 中它是 1。有一个 options 数组传递给每个函数,它应该有一个字段 METIS_OPTION_NUMBERING,您将其更改为 1 如果你想要 Fortran 约定。如果不这样做,将导致 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 输出。

最佳答案

这可能没什么,但也许问题第二段中的链接帖子仍然是相关的。

Fortran 中的指针和 C 中的指针不是完全相同的概念,特别是当 Fortran 指针指向数组时。在 Fortran 中实现指向数组的指针需要存储额外的信息(数组边界或等效信息),超出存储在 C 指针(这只是数据的地址)中的信息。

(从技术上讲,除非 METIS_PartMeshDual 的相关虚拟参数定义具有可选或指针属性(如果它是被调用的 C 函数并且语言标准是 <= F2008,则不可能)然后在调用中对分离指针的引用Fortran 是非法的。同样 - 实现取决于将要发生的事情 - 我可以想象实现选项在哪里可以工作,哪里不会。)

请注意,在您链接到空指针声明的帖子中,作为解决方案的一部分从数组更改为标量(列表中的第一个回复 - 检查帖子的时间)。在作为问题的一部分发布的示例代码中,“空”事物的声明仍然显示数组。我怀疑声明中的更改会更改对 C api 的调用的“设置”和/或您的编译器的分离指针的外观。

最近,当从 Fortran 调用 C API 时,我更喜欢(在可能的情况下)使用 Fortran 2003 的 C 互操作性功能(BIND(C) 和 friend )为 C API 编写接口(interface) block 。这更加健壮并且避免了这种依赖于平台的问题。它确实需要一次性的前期工作以及支持 F2003 这方面的 Fortran 编译器。不厌其烦地为其 Fortran 用户提供此类接口(interface) block 的库供应商得到了我的大力支持和许多善意的想法。

关于c - 从 Fortran 运行时 METIS 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14078401/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com