传递数组时出现访问冲突错误

时间:2013-02-07 08:36:04

标签: c fortran fortran-iso-c-binding metis

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以使用接口模块。

0 个答案:

没有答案