XLPack 7.0
XLPack Numerical Library (Excel VBA) Reference Manual
Loading...
Searching...
No Matches

◆ Diom_s()

Sub Diom_s ( N As  Long,
Matvec As  LongPtr,
Psolve As  LongPtr,
ChkConv As  LongPtr,
B() As  Double,
X() As  Double,
Optional Info As  Long,
Optional Iter As  Long,
Optional Res As  Double,
Optional M As  Long = 0,
Optional MaxIter As  Long = 500 
)

Solution of linear system Ax = b using direct incomplete orthogonalization method (DIOM) (Subroutine version)

Purpose
This routine solves the linear system Ax = b using the direct incomplete orthogonalization method (DIOM) with preconditioning.
Parameters
[in]NDimension of the matrix A. (N >= 0) (if N = 0, returns without computation)
[in]MatvecUser supplied subroutine which calculates the product of matrix A and vector x as follows.
Sub Matvec(N As Long, X() As Double, Y() As Double)
Compute A*x, and return in Y().
End Sub
[in]PsolveUser supplied subroutine which perform the preconditioner solve routine for the linear system M*x = b as follows, where M is a preconditioner metrix.
Sub Psolve(N As Long, B() As Double, X() As Double)
Solve M*x = b, and return solution in X().
End Sub
[in]ChkConvUser supplied subroutine which is called on every iteration for the convergence test as follows, where X() is the current approximate solution, Res is the current residual norm norm(b - A*x), and Iter is the current number of iterations. This routine can also be used to output the intermediate results.
Sub ChkConv(N As Long, X() As Double, Res As Double, Iter As Long, IChk As Long)
Set IChk = 1 if converged. Otherwise, set IChk = 0.
End Sub
[in]B()Array B(LB - 1) (LB >= N)
Right hand side vector b.
[in,out]X()Array X(LX - 1) (LX >= N)
[in] Initial guess of solution.
[out] Obtained approximate solution.
[out]Info(Optional)
= 0: Successful exit
= i < 0: The (-i)-th argument is invalid.
= 11: Maximum number of iterations exceeded.
= 12: Breakdown occurred.
[out]Iter(Optional)
Actual number of iterations performed for convergence.
[out]Res(Optional)
Final residual norm value norm(b - A*x).
[in]M(Optional)
Truncation parameter. (0 < M <= N) (default = min(64, N))
[in]MaxIter(Optional)
Maximum number of iterations. (MaxIter > 0) (default = 500)
Example Program
Solve the system of linear equations Ax = B, where
( 0.2 -0.11 -0.93 ) ( -0.3727 )
A = ( -0.32 0.81 0.37 ), B = ( 0.4319 )
( -0.8 -0.92 -0.29 ) ( -1.4247 )
Const N = 3, Nnz = N * N, Tol = 0.0000000001
Dim A(Nnz - 1) As Double, Ia(N) As Long, Ja(Nnz - 1) As Long
Sub Matvec(N As Long, X() As Double, Y() As Double)
Call CsrDusmv("N", N, N, 1, A(), Ia(), Ja(), X(), 0, Y())
End Sub
Sub Psolve(N As Long, B() As Double, X() As Double)
Dim I As Long
For I = 0 To N - 1
X(I) = B(I)
Next
End Sub
Sub ChkConv(N As Long, X() As Double, Res As Double, Iter As Long, IChk As Long)
If Res < Tol Then
IChk = 1
Else
IChk = 0
End If
End Sub
Sub Ex_Diom_s()
Dim B(N - 1) As Double, X(N - 1) As Double
Dim Iter As Long, Res As Double, Info As Long
A(0) = 0.2: A(1) = -0.11: A(2) = -0.93: A(3) = -0.32: A(4) = 0.81: A(5) = 0.37: A(6) = -0.8: A(7) = -0.92: A(8) = -0.29
Ia(0) = 0: Ia(1) = 3: Ia(2) = 6: Ia(3) = 9
Ja(0) = 0: Ja(1) = 1: Ja(2) = 2: Ja(3) = 0: Ja(4) = 1: Ja(5) = 2: Ja(6) = 0: Ja(7) = 1: Ja(8) = 2
B(0) = -0.3727: B(1) = 0.4319: B(2) = -1.4247
Call Diom_s(N, AddressOf Matvec, AddressOf Psolve, AddressOf ChkConv, B(), X(), Info, Iter, Res)
Debug.Print "X =", X(0), X(1), X(2)
Debug.Print "Iter = " + CStr(Iter) + ", Res = " + CStr(Res) + ", Info = " + CStr(Info)
End Sub
Sub CsrDusmv(Trans As String, M As Long, N As Long, Alpha As Double, Val() As Double, Rowptr() As Long, Colind() 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 or y <- αATx + βy (CSR)
Sub Diom_s(N As Long, Matvec As LongPtr, Psolve As LongPtr, ChkConv As LongPtr, B() As Double, X() As Double, Optional Info As Long, Optional Iter As Long, Optional Res As Double, Optional M As Long=0, Optional MaxIter As Long=500)
Solution of linear system Ax = b using direct incomplete orthogonalization method (DIOM) (Subroutine ...
Example Results
X = 0.860000000000001 0.639999999999999 0.51
Iter = 3, Res = 2.94792821573918E-16, Info = 0