0

在为我之前提出的问题找到答案之前,我为非常小的网格(只有两个三角形)编写了非常简单的代码,如下所示在 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 的方案,太小的网格可能没有合理的解决方案。
请参考另一篇文章以使用接口模块。

4

0 回答 0