Befor找到the quesion我之前问过的答案,我为非常简单的sime网格(只有两个三角形)编写了非常简单的代码,以便在fortran中调用C函数。为了简化代码。这里既不使用接口模块也不使用iso_c_binding(尽可能)。它与this post非常相似,还有另一个错误。
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 和元素数的大小是一致的。怎么修好? =&GT;的解决。谢谢!
我遇到的问题是调用METIS_PartMeshNodal时出现systax错误,第二个参数是ne,它与第一个参数ne相同。应该是 nn 解决方案是将第二个参数替换为 nn 。上面的代码可以编译和执行。
注意:由于METIS计划,太小的网格可能没有合理的解决方案 请参考另一个post以使用接口模块。