在为我之前提出的问题找到答案之前,我为非常小的网格(只有两个三角形)编写了非常简单的代码,如下所示在 fortran 中调用 C 函数。为了代码的简单。这里既没有使用接口模块,也没有使用 iso_c_binding(as possible)。和这篇文章很相似,还有一个错误。
program METIS_NoInterface
implicit none
integer :: ne, nn
integer, dimension(:), allocatable :: eptr, eind
integer, pointer :: vwgt=>null(), vsize=>null()
integer :: nparts
real, pointer :: tpwgts=>null()
integer, dimension(0:39) :: opts
integer :: objval
integer, dimension(:), allocatable :: epart, npart
! Input => 2 tri: too small mesh
!ne = 2
!nn = 4
!nparts = 2
!allocate(eptr(0:2), eind(0:5))
!eptr=[0, 3, 4]
!eind=[0,1,3,1,2,3]
! Output
!allocate(epart(0:1), npart(0:4))
! Input => 4 quad : reasonable result
ne = 4
nn = 9
nparts = 2
allocate(eptr(0:ne), eind(0:15))
eptr=[0,4,8,12,16]
eind=[0,1,8,7,1,2,3,8,3,4,5,8,5,6,7,8]
! Output
allocate(epart(0:ne-1), npart(0:nn-1))
! METIS function call
call METIS_SetDefaultOptions(opts)
!call METIS_PartMeshNodal(ne,ne,eptr,eind,vwgt,vsize,nparts,tpwgts,& !<=syntax error
call METIS_PartMeshNodal(ne,nn,eptr,eind,vwgt,vsize,nparts,tpwgts,&
opts,objval,epart,npart)
! Result print
write(*,*) epart
write(*,*) ''
write(*,*) npart
write(*,*) ''
end program
由于eind ,它给出了访问冲突错误。如果传递c_null_ptr而不是eind,它无论如何都会运行。数组eind的大小和元素个数是一致的。如何修复?=>已解决。谢谢!
我遇到的问题是调用 METIS_PartMeshNodal 时出现系统税错误,第二个参数是 ne,与第一个参数 ne 相同。应该是nn。
解决方案是将第二个参数替换为nn。上面的代码可以编译执行。
注意:由于 METIS 的方案,太小的网格可能没有合理的解决方案。
请参考另一篇文章以使用接口模块。