【发布时间】:2018-08-19 16:49:20
【问题描述】:
我正在开发一个 Fortran 90 程序并将其与 METIS 库链接。我正在使用 GNU Fortran 4.8.5 和 METIS 5.1.0。我编译我的 Fortran 程序:
-fdefault-real-8 -fdefault-integer-8
选项,以及在构建 METIS 时我指定:
#define IDXTYPEWIDTH 64
和
#define REALTYPEWIDTH 64
因此整数和实数的长度都应该合适。当我编译并运行以下程序时:
program Test_Metis
implicit none
integer :: nvtxs, & ! number of vertices
ncons, & ! number of connections
nparts = 2 ! requested number of partitions
integer, pointer :: vwgt =>null(), & ! weights of the vertices
vsize =>null(), & ! size of the vertices
adjwgt=>null(), & ! weights of the edges
mopts =>null(), & ! array of options
objval=>null() ! stores edgecut or comm. volume
real, pointer :: tpwgts=>null(), & ! desired weight for each partition
ubvec =>null() !
integer, allocatable :: xadj (:), & ! variabes for ...
adjncy(:), & ! ... compressed row storage
part (:) ! partition of the grid
nvtxs = 15
ncons = 22
allocate(xadj (nvtxs+1))
allocate(adjncy(ncons*2))
allocate(part (nvtxs))
xadj = (/ 0, 2, 5, 8, 11, 13, 16, 20, &
24, 28, 31, 33, 36, 39, 42, 44/)
adjncy=(/ 1, 5, 0, 2, 6, 1, 3, 7, 2, 4, 8, &
3, 9, 0, 6, 10, 1, 5, 7, 11, 2, 6, &
8, 12, 3, 7, 9, 13, 4, 8, 14, 5, 11, &
6, 10, 12, 7, 11, 13, 8, 12, 14, 9, 13/)
call METIS_PartGraphRecursive(nvtxs, & ! (in), int
ncons, & ! (in), int
xadj, & ! (in), int(:)
adjncy, & ! (in), int(:)
vwgt, & ! (in), int(:)
vsize, & ! (in), int(:)
adjwgt, & ! (in), int(:)
nparts, & ! (in), int(:)
tpwgts, & ! (in), real(:)
ubvec, & ! (in), real(:)
mopts, & ! (in), int(:)
objval, & ! (out) int(:)
part) ! (out) int(:)
end program
我遇到了分段错误。 (我从 METIS 手册中获取了邻接,这应该是非常基本的。)
谁能帮我解决这个问题?
【问题讨论】:
-
不查看 API 文档:您确定允许将参数(例如
ubvec)作为非关联指针吗? -
如果您使用 gfortran 的 -fdefault-* 选项来编译您的代码,那么您需要使用这些选项编译您与您的代码链接的所有库。这些选项破坏了 Fortran 的存储关联规则。如果您不使用这些选项会发生什么。
-
我倾向于相信this other question 可以解决您的问题。请检查。
-
亲爱的@francescalus:感谢您的回答。实际上,根据 API 文档,应该为例程未使用的数据发送空指针。我也在那里关注了你的链接和建议。使用 c_iso_binding、c_ptr 和 c_null_ptr 让我更进一步,但并没有解决所有问题。最终,我以 API 和所有工作所需的扩展形式发送所有参数。
-
亲爱的@evets 感谢您的回答,但我与 -fdefault 选项非常一致。我也非常小心地为浮点数和整数使用相同的长度。
标签: segmentation-fault fortran metis