2 Harwell Boeing形式を読み込む方法
nAGライブラリではHarwell Boeing形式の読み込みを直接はサポートしていません。 このためユーザ側で読み込みを行った上でnAGルーチンにデータを渡す必要があります。
Harwell Boeing形式で特筆するべき点は非ゼロ要素の行列内の位置(インデックス)の格納方法です。 通常スパース行列の格納においては非ゼロ要素のみがその対象となりますがHarwell Boeing形式においても非ゼロ要素のみが格納されています。 それぞれの非ゼロ要素は行列内での位置を示すために、対応する行インデックスが数値(1〜行列の最大行数の範囲)として直接与えられています。 列インデックスは直接ではなく行インデックスにおいての各列の開始位置を示すインデックスという形で「圧縮」された形で与えられています。
nAGルーチンには Harwell Boeing 形式と同様に圧縮された形(nAGドキュメント内ではCCS形式と呼ばれる)の列インデックスをそのまま受け取るものと、 圧縮されていない形(nAGドキュメント内ではCS形式及びSCS形式と呼ばれる)を受け取るものが存在します。
圧縮された形(CCS)を受け取るnAGルーチン(例えばF11MFF)を利用する場合には読み込んだデータをそのまま与える事が可能ですが、 圧縮されていない形(CS,SCS)を受け取るnAGルーチン(例えばF11DEF, F11JEF, F11DSF, F11JSF)を利用する場合には展開(非圧縮化)が必要です。
※尚、CCS形式、CS形式、SCS形式についての詳細は F11 Chapter Introduction をご参照ください。
2.1 CCS(圧縮カラム形式)からCS(SCS)(非圧縮カラム形式)への変換は簡単
列方向のインデックスの展開(圧縮された形式から圧縮されていない形式への変換)には 2つのステップが必要です。
- 列方向のインデックスの展開 (CCS形式からCS(SCS)形式への変換)
-
変換されたCS(SCS)形式をnAGルーチンが要求する順番に並べ替える
(※行方向のインデックス値が順次大きくなり、 且つ同じ行内では列方向のインデックス値が順次大きくなるように並べ替えます)
列方向のインデックスの展開
列方向のインデックスの展開は以下のFortranのコードセグメントが示すとおり簡単に行うことができます。
! 列方向のインデックスの展開を行うコードセグメント j = 1 DO i = 1, num_cols k = compressed_col_idx(i+1) - compressed_col_idx(i) IF (k>0) THEN col_idx(j:j+k-1) = i j = j + k END IF END DO ※compressed_col_idx = 圧縮された列方向のインデックス ※col_idx = 展開された列方向のインデックス
並べ替え
展開後に必要な並べ替えはnAGが提供するユーティリティールーチンを呼び出すだけで行う事ができます。 並べ替えを行うユーティリティールーチンは行列のタイプ毎に以下の4種類が提供されています。
行列タイプ | 並べ替えを行うnAGルーチン名 |
実非対称行列 | F11ZAF |
実対称行列 | F11ZBF |
複素非エルミート行列 | F11ZNF |
複素エルミート行列 | F11ZPF |
以下にCS形式の実非対称行列を行方向のインデックス値が順次大きくなり、 且つ同じ行内では列方向のインデックス値が順次大きくなるように並べ替える場合の例を示します。
! 行方向のインデックス値が順次大きくなり、且つ同じ行内では列方向のインデックス値が順次大きくなるように並べ替える ifail = 0 CALL f11zaf(n, nnz, values, rowIdx, colIdx, 'R', 'K', istr, iwork, ifail) ※integer n = 行列のオーダー ※integer nnz = 非ゼロ要素の数 ※double precision values(:) = 非ゼロ要素の値 ※rowIdx = 行方向のインデックス ※colIdx = 展開された列方向のインデックス ※integer istr(n+1), iwork(n) ※integer ifail
ナビゲーション:前へ 上へ 次へ