Const N = 3, Nnz = N * N, Tol = 0.0000000001 '1.0e-10
Dim A(Nnz - 1) As Complex, Ia(N) As Long, Ja(Nnz - 1) As Long
Sub Matvec(N As Long, X() As Complex, Y() As Complex)
Call CsrZusmv("N", N, N, Cmplx(1), A(), Ia(), Ja(), X(), Cmplx(0), Y())
End Sub
Sub MatvecTrans(N As Long, X() As Complex, Y() As Complex)
Call CsrZusmv("C", N, N, Cmplx(1), A(), Ia(), Ja(), X(), Cmplx(0), Y())
End Sub
Sub Psolve(N As Long, B() As Complex, X() As Complex)
Dim I As Long
For I = 0 To N - 1
X(I) = B(I)
Next
End Sub
Sub PsolveTrans(N As Long, B() As Complex, X() As Complex)
Dim I As Long
For I = 0 To N - 1
X(I) = B(I)
Next
End Sub
Sub ChkConv(N As Long, X() As Complex, Res As Double, Iter As Long, IChk As Long)
If Res < Tol Then
IChk = 1
Else
IChk = 0
End If
End Sub
Sub Ex_ZBicg_s()
Dim B(N - 1) As Complex, X(N - 1) As Complex
Dim Iter As Long, Res As Double, Info As Long
A(0) = Cmplx(0.78, 0.16): A(1) = Cmplx(-0.9, -1.46): A(2) = Cmplx(0.48, -1.08): A(3) = Cmplx(0.73, 0.63): A(4) = Cmplx(1.58, -1.24): A(5) = Cmplx(-0.41, -0.91): A(6) = Cmplx(0.23, -1.37): A(7) = Cmplx(0.79, 0.64): A(8) = Cmplx(-0.73, -1.5)
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) = Cmplx(0.2126, -0.2904): B(1) = Cmplx(-0.3028, 0.3346): B(2) = Cmplx(-1.2905, -1.0346)
Call ZBicg_s(N, AddressOf Matvec, AddressOf MatvecTrans, AddressOf Psolve, AddressOf PsolveTrans, AddressOf ChkConv, B(), X(), Info, Iter, Res)
Debug.Print "X ="
Debug.Print "(" + CStr(Creal(X(0))) + "," + CStr(Cimag(X(0))) + ")"
Debug.Print "(" + CStr(Creal(X(1))) + "," + CStr(Cimag(X(1))) + ")"
Debug.Print "(" + CStr(Creal(X(2))) + "," + CStr(Cimag(X(2))) + ")"
Debug.Print "Iter =" + Str(Iter) + ", Res =" + Str(Res) + ", Info =" + Str(Info)
End Sub