前に尋ねた質問に対する答えを見つける前に、 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 のスキームにより適切な解が得られない場合があります。インターフェイス モジュールを使用するには、別の投稿
を
参照してください。