有限要素計算用に作成した Fortran プログラムの一部として、メッシュ分割にMETISライブラリを使用しようとしています。METIS は C で書かれていますが、Fortran 90 で問題なく動作するはずです。
潜在的な問題の 1 つは、null ポインターを与えるいくつかの引数があることです。Fortran から C 関数を呼び出してヌル ポインター オブジェクトを認識するのに苦労した人もいます。それはここで対処されており、それが私が抱えている問題ではないと思います。
問題は、METIS が配列の開始インデックスを変更することだと思います。C では 0、Fortran では 1 です。すべての関数に渡される配列があり、Fortran 規則が必要な場合に変更するoptions
フィールドがあるはずです。そうしないと、C プログラムがインデックス 0 にアクセスしようとし、セグ フォールトが発生します。METIS_OPTION_NUMBERING
1
ここでの edunlop1 による投稿は、配列を作成するだけoptions
で、METIS と合意した規則によって、その配列のどの要素を 1 に設定してすべての番号を付け直すかを決定することを示唆しています。ただし、配列の長さと同様に、使用しているルーチンによって異なります。
とにかく、ここに私のコードがあります:
integer :: ndomains,ncommon,objval
integer :: options(0:40)
integer, dimension(:), allocatable :: eptr,eind
integer, pointer :: vwgt(:)=>null(), vsize(:)=>null(), opts(:)=>null()
real(kind=8), pointer :: tpwgts(:)=>null()
! Read in the mesh data
call getarg(1,meshname)
call readmesh(meshname)
allocate(color(ne),domain(nn))
allocate(eind(3*ne),eptr(ne+1))
do n=1,ne
eptr(n) = 1+3*(n-1)
do i=1,3
eind( eptr(n)+i-1 ) = elem(i,n)
enddo
enddo
! Try and call METIS
ncommon = 2
ndomains = 2
options = 0
options(0) = 1
options(8) = 1
call METIS_PartMeshDual(ne,nn,eptr,eind,vwgt,vsize, &
& ncommon,ndomains,tpwgts,options,objval,color,domain)
番号付けを変更するための METIS の関連コードは、ファイル libmetis/meshpart.c にあります。
/* renumber the mesh */
if (options && options[METIS_OPTION_NUMBERING] == 1) {
ChangeMesh2CNumbering(*ne, eptr, eind);
renumber = 1;
}
何かご意見は?役立つ場合は、Valgrind の出力を投稿できます。