0

前に尋ねた質問に対する答えを見つける前に、 Fortranで C 関数を呼び出すために、以下のように非常にシンプルなメッシュ (三角形が 2 つしかない) の非常に単純なコードを書きました。コードの簡素化のため。ここのインターフェースモジュールも iso_c_binding(可能な限り) もここでは使用されていません。この投稿と非常によく似ていますが、別のエラーがあります。

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のため、アクセス違反エラーが発生します。eindの代わりにc_null_ptrが渡された場合、とにかく実行されます。配列eindのサイズと要素数が一致しています。どうすれば修正できますか?=>解決しました。ありがとうございました!

私が抱えていた問題は、METIS_PartMeshNodal を呼び出す際の systax エラーでした。2 番目の引数は、1 番目の引数 ne と同じ ne でした。nnだったはずです。
解決策は、2 番目の引数をnnに置き換えることでした。上記のコードはコンパイルして実行できます。

注:メッシュが小さすぎると、METIS のスキームにより適切な解が得られない場合があります。インターフェイス モジュールを使用するには、別の投稿
を 参照してください。

4

0 に答える 0