Sub Ex_Cg_Ic0_Ssc()
Const N = 3, Nnz = 6, Tol = 0.0000000001 '1.0e-10
Dim A(Nnz - 1) As Double, Ia(N) As Long, Ja(Nnz - 1) As Long
Dim B(N - 1) As Double, X(N - 1) As Double
Dim XX(N - 1) As Double, YY(N - 1) As Double
Dim Iter As Long, Res As Double, IRev As Long, Info As Long
A(0) = 2.2: A(1) = -0.11: A(2) = 2.93: A(3) = -0.32: A(4) = 0.81: A(5) = 2.37
Ia(0) = 0: Ia(1) = 1: Ia(2) = 3: Ia(3) = 6
Ja(0) = 0: Ja(1) = 0: Ja(2) = 1: Ja(3) = 0: Ja(4) = 1: Ja(5) = 2
B(0) = -1.566: B(1) = -2.8425: B(2) = -1.1765
Dim M(Nnz - 1) As Double, Id(N - 1) As Long
Call
SscIc0(N, A(), Ia(), Ja(), M(), Id(), Info)
If Info <> 0 Then Debug.Print "Ic0 Info =" + Str(Info)
IRev = 0
Do
Call
Cg_r(N, B(), X(), Info, XX(), YY(), IRev, Iter, Res)
If IRev = 1 Then '- Matvec
Call
SscDusmv("U", N, 1, A(), Ia(), Ja(), XX(), 0, YY())
ElseIf IRev = 3 Then '- Psolve
Call
SscIcSolve(N, M(), Ia(), Ja(), Id(), YY(), XX(), Info)
If Info <> 0 Then Debug.Print "Ic0Solve Info =" + Str(Info)
ElseIf IRev = 10 Then '- Check convergence
If Res < Tol Then IRev = 11
End If
Loop While IRev <> 0
Debug.Print "X =", X(0), X(1), X(2)
Debug.Print "Iter = " + CStr(Iter) + ", Res = " + CStr(Res) + ", Info = " + CStr(Info)
End Sub
Sub SscDusmv(Uplo As String, N As Long, Alpha As Double, Val() As Double, Colptr() As Long, Rowind() As Long, X() As Double, Beta As Double, Y() As Double, Optional Info As Long, Optional Base As Long=-1, Optional IncX As Long=1, Optional IncY As Long=1)
y <- αAx + βy (CSC) (対称行列)
Sub Cg_r(N As Long, B() As Double, X() As Double, Info As Long, XX() As Double, YY() As Double, IRev As Long, Optional Iter As Long, Optional Res As Double, Optional MaxIter As Long=500)
共役勾配(CG)法による連立一次方程式 Ax = b の解 (正定値対称行列) (リバースコミュニケーション版)
Sub SscIc0(N As Long, Val() As Double, Colptr() As Long, Rowind() As Long, Val2() As Double, Idiag() As Long, Optional Info As Long, Optional ByVal Uplo As String="U", Optional Base As Long=-1)
不完全コレスキー分解(フィルインなし)(IC0)前処理のための初期化 (正定値対称行列) (CSC)
Sub SscIcSolve(N As Long, Val() As Double, Colptr() As Long, Rowind() As Long, Idiag() As Long, B() As Double, X() As Double, Optional Info As Long, Optional ByVal Uplo As String="U", Optional Base As Long=-1)
不完全コレスキー分解による前処理 (IC) (正定値対称行列) (CSC)