|
|
◆ zgssv()
| void zgssv |
( |
char |
col_perm, |
|
|
double |
thresh, |
|
|
char |
sym_mode, |
|
|
int |
n, |
|
|
const doublecomplex |
val[], |
|
|
const int |
ptr[], |
|
|
const int |
ind[], |
|
|
int |
format, |
|
|
int |
base, |
|
|
int |
perm_c[], |
|
|
int |
perm_r[], |
|
|
int |
nrhs, |
|
|
int |
ldb, |
|
|
doublecomplex |
b[], |
|
|
double * |
rcond, |
|
|
int * |
info |
|
) |
| |
連立一次方程式 A*X = B を解く (複素疎行列, 直接法(SuperLU)) (シンプルドライバ)
- 目的
- 本ルーチンは LU 分解により連立一次方程式 A*X = B を解く. ただし, A は N x N 一般複素疎行列である. 処理ステップは以下のとおりである.
- A が圧縮列格納(CSC)形式の場合:
1.1. A の列の交換を行い A*Pc を作る. ただし, Pc は置換行列である.
1.2. ピボットの部分選択を行うガウス消去法により求められる置換行列 Prを用いて A を Pr*A*Pc = L*U の形に分解する. L は対角要素が 1 で非対角要素の大きさが 1 を上限とする下三角行列である. U は上三角行列である.
1.3. 連立一次方程式 A*X = B を A の分解形を用いて解く.
- A が圧縮行格納(CSR)形式の場合, 上記のアルゴリズムをAの転置に適用する:
2.1. A の転置の列(A の行)の交換を行い A^T*Pc を作る. ただし, Pc は置換行列である.
2.2. ピボットの部分選択を行うガウス消去法により求められる置換行列 Pr を用いて A を Pr*A^T*Pc = L*U の形に分解する. L は対角要素が 1 で非対角要素の大きさが 1 を上限とする下三角行列である. U は上三角行列である.
2.3. 連立一次方程式 A*X = B を A の分解形を用いて解く.
- 引数
-
| [in] | col_perm | フィルインを減らすための列の並べ替え方法を指定する.
= 'A': Approximate minimum degree (AMD) column ordering.
= 'N': 並べ替えをしない (Pc = I).
= 'M': A^T*A に対する Multiple minimum degree (MMD) ordering.
= 'P': A^T + A に対する Multiple minimum degree (MMD) ordering.
= 'U': ユーザー指定. |
| [in] | thresh | ピボットとして採用する対角要素の基準値. (0 <= thresh <= 1) |
| [in] | sym_mode | 対称モードを使用するかどうか指定する. 対称モードでは対角ピボットを優先し, A^T + A に基づく列交換アルゴリズムを使用する.
= 'N': 対称モードを使用しない.
= 'S': 対称モードを使用する. |
| [in] | n | 行列の次数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る) |
| [in] | val[] | 配列 val[lval] (lval >= nnz)
CSC/CSR形式の行列 A の非ゼロ要素の値. (nnz は非ゼロ要素数) |
| [in] | ptr[] | 配列 ptr[lptr] (lptr >= n + 1)
CSC/CSR形式の行列 A の列/行ポインタ. |
| [in] | ind[] | 配列 ind[lind] (lind >= nnz)
CSC/CSR形式の行列 A の行/列インデクス. (nnz は非ゼロ要素数) |
| [in] | format | 行列の格納形式.
= 0: CSR 形式.
= 1: CSC 形式. |
| [in] | base | ptr[] および ind[] のインデクス形式.
= 0: 0-ベース(C形式): 開始インデクス値が 0.
= 1: 1-ベース(Fortran形式): 開始インデクス値が 1. |
| [in,out] | perm_c[] | 配列 perm_c[lperm_c] (lperm_c >= n)
[in] オプション col_perm = 'U' の場合, 置換ベクトルを入力する. その他の場合, 本引数は出力用である.
[out] CSC形式の場合, 置換行列 Pc を表す列置換ベクトルである. perm_c[i] = j は「A の列 i は A*Pc では列 j である」ことを表す. CSR の場合, 同様に A^T の列(A の行)の交換を表す列置換ベクトルである.
入力された置換ベクトルは, perm_c[] の入力と Pc^T*A^T*A*Pc の消去ツリーを postordering する置換行列との積により上書きされるかもしれない. 消去ツリーが postordering 済であれば perm_c[] は変更されない. |
| [out] | perm_r[] | 配列 perm_r[lperm_r] (lperm_r >= n)
CSC形式の場合, ピボットの部分選択により求められる置換行列 Pr を表す行置換ベクトルである. perm_r[i] = j は「A の行 i は Pr*A では行 j である」ことを表す. CSR形式の場合, 同様に A^T の行(A の列)の交換を表す行置換ベクトルである. |
| [in] | nrhs | 右辺の数, すなわち, 行列Bの列数. (nrhs >= 0) (nrhs = 0 の場合, 処理を行わずに戻る) |
| [in] | ldb | 二次元配列b[][]の整合寸法. (ldb >= max(0, n)) |
| [in,out] | b[][] | 配列 b[lb][ldb] (lb >= nrhs)
[in] 右辺行列 B.
[out] 解行列 X. |
| [out] | rcond | 行列 A の条件数の逆数の推定値. |
| [out] | info | = 0: 正常終了.
< 0: (-info)番目の入力パラメータの誤り.
= -10000: SuperLUプログラムで回復不能なエラーが発生した.
= i > 0 かつ <= n: U(i, i) が 0 である. 分解を完了したが, U が特異であるため解を計算できなかった.
= i > n: メモリ割り当てエラーが起きた. i - n は割り当てバイト数を表す. |
- 出典
- SuperLU
|