IndicesProblems - t-sakashita/rokko GitHub Wiki

添字の食い違いの問題

行列ストレージによらない一般論

言語間の相違

  • C++ / C
    • 添字:0〜99
    • end_row = 100とするべき。
  • Fortran
    • 添字:1〜100
    • end_row = 100とするべき。 対策
  • 受け取った添字に、Fortranバインディングの中で1を足す。

localized_matrixdistributed_matrixについては、配列のポインタを取り出せるようにする。(Issue #209 ) オーバーヘッドを嫌うユーザは、このポインタを介して直接アクセスすれば良い。

CRSの場合

CRSの場合は、Rokkoインターフェースを用いてCRSにアクセスするしかない。(ポインタによる直接アクセスはできない。) 例として、100 x 100の行列を考える。

ライブラリ間の相違

  • start_rowについては、問題なし。
  • end_row
    • Anasazi: 99 (1を足して100とするべき)
    • SLEPc: 100

Fortran用バインディングでは、2種類用意する。

  • C++/C方式に準拠

    • 0〜99
    • start_row=0, end_row = 100
    • Heisenberg模型のように、C言語向け添字が便利な場合もある。)
    • _cを末尾につけた関数名。
      • rokko_distributed_crs_matrix_start_row_c
      • rokko_distributed_crs_matrix_end_row_c
      • rokko_distributed_crs_matrix_insert_c
  • Fortran方式

    • 1〜100
    • start_row=1, end_row = 100
    • _cなしの関数名。Fortran版のデフォルト版の意味。
      • rokko_distributed_crs_matrix_start_row
      • rokko_distributed_crs_matrix_end_row
      • rokko_distributed_crs_matrix_insert
    • rokko_distributed_crs_matrix_insertの中では、配列colsの全成分について、0スタートの添字となるように1を引いている。このオーバーヘッドがある。

matrix-freeの場合

  • Fortranバインディングにおいて、start_row, end_rowに1を足せばよいだけ。これも、C風とFortran風を用意する。
  • 入力ベクトルxと出力ベクトルyの添字については、Rokko側で気にする必要はない。