IndicesProblems - t-sakashita/rokko GitHub Wiki
添字の食い違いの問題
行列ストレージによらない一般論
言語間の相違
- C++ / C
- 添字:0〜99
- end_row = 100とするべき。
- Fortran
- 添字:1〜100
- end_row = 100とするべき。 対策
- 受け取った添字に、Fortranバインディングの中で1を足す。
localized_matrix
やdistributed_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側で気にする必要はない。