|
|
◆ ssc_ic0()
| void ssc_ic0 |
( |
char |
uplo, |
|
|
int |
n, |
|
|
const double |
val[], |
|
|
const int |
colptr[], |
|
|
const int |
rowind[], |
|
|
int |
base, |
|
|
double |
val2[], |
|
|
int |
idiag[], |
|
|
double |
work[], |
|
|
int * |
info |
|
) |
| |
不完全コレスキー分解(フィルインなし) (IC0) (正定値対称行列) (CSC)
- 目的
- 連立一次方程式の正定値対称で疎な係数行列 A の不完全コレスキー分解(フィルインなし)を求める.
A = L * D * L^T + R または A = U^T * D * U + R
係数行列 A の要素が 0 であった場所がコレスキー分解後に 0 でなくなることをフィルインが生じるというが, それを避けるために上式の L または U ではそのような場所を強制的に 0 にすることにする. R はこの操作による完全なコレスキー分解との差分を表すが, R が大きくはないものとすると, この不完全分解を使って連立一次方程式を解いてもよい近似解になっていることが期待される. これを前処理行列 M として使用する. M = L * D * L^T または M = U^T * D * U
本ルーチンは val2[] に L または U および D を出力する. また, idiag[] に対角要素のインデックスを出力する. val2[] および idiag[] を ssc_ic_solve() が使用する.
- 引数
-
| [in] | uplo | 入力行列 A が上三角部分あるいは下三角部分のどちらを格納しているか指定する.
= "U": 上三角部分 (U^T*D*U と分解する).
= "L": 下三角部分 (L*D*L^T と分解する). |
| [in] | n | 行列 A の次数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る) |
| [in] | val[] | 配列 val[lval] (lval >= nnz) (nnz は行列 A の非ゼロ要素数)
行列 A の非ゼロ要素の値. (対角要素と下三角要素のみ参照する) |
| [in] | colptr[] | 配列 colptr[lcolptr] (lcolptr >= n + 1)
行列 A の列ポインタ. |
| [in] | rowind[] | 配列 rowind[lrowind] (lrowind >= nnz)
行列 A の行インデクス. |
| [in] | base | colptr[] および rowind[] のインデクス形式.
= 0: 0-ベース(C形式): 開始インデクス値が 0.
= 1: 1-ベース(Fortran形式): 開始インデクス値が 1. |
| [out] | val2[] | 配列 val2[lval2] (lval2 >= nnz)
下三角行列 L と対角行列 D の非ゼロ要素の値. (nnz は A の非ゼロ要素数と同じで, 値は A の下三角要素および対角要素と同じ場所に書き込まれる.) |
| [out] | idiag[] | 配列 idiag[lidiag] (lidiag >= n)
対角要素のインデックス. |
| [out] | work[] | 配列 work[lwork] (lwork >= n)
作業領域. (uplo = 'L' の場合には参照されない.) |
| [out] | info | = 0: 正常終了.
= i < 0: (-i)番目の入力パラメータの誤り.
= i > 0: 行列が特異である(i番目の対角要素が0). |
|