Accessing the coefficients of a preconditioner

Hi all,
I would like to access coefficients of a preconditioner constructed using the ILUZero package.
ILUZero returns an object of type ::ILU0Precon{Float64, Int64, Float64} which contains a sparse representations of both L and U. However, I wonder how to access these numbers? This object does not seem be indexable and I don’t know how to recover both L and U as two independent SparseMatrixCSC. Would someone have a clue?

Just a clue: you could just try to write a method like

upper(ilu)=SparseMatrixCSC(ilu.m, ilu.n,ilu.u_colptr, ilu.u_rowval, ilu.u_nzval)

Similar for lower. I would check if the backsubstitution would be the same.

1 Like

Thanks a lot! That does the job. By the way is there a way to list all fields in a structure of this type? I have tried both fieldnames and keys but non of these seem to apply to ::ILU0Precon{Float64, Int64, Float64}.

Call propertynames(object) on an object of that type (not on the type). (Some of the “fields” might actually be computed on the fly, and should still be listed by propertynames.)

1 Like

Thanks and, yes, it is good to check for the solves. Using both L and U in successive substitutions yields the expected result.

using LinearAlgebra, SparseArrays, ILUZero

upper(ilu) = SparseMatrixCSC(ilu.m, ilu.n, ilu.u_colptr, ilu.u_rowval, ilu.u_nzval)
lower(ilu) = SparseMatrixCSC(ilu.m, ilu.n, ilu.l_colptr, ilu.l_rowval, ilu.l_nzval)

let 
    # Generate matrix and rhs
    n        = 100
    cW       = -1.0*ones(n-1)
    cC       =  2.0*ones(n  ) ; cC[1] += 1; cC[end] += 1
    M        = SparseMatrixCSC(Tridiagonal(cW[:], cC[:], cW[:]))
    b        = 3.0*ones(n  )
    LU       = ilu0(M)
    # Standard solve 
    x1       = LU\b
    # Split matrix in L and U parts
    U        = upper(LU)
    L        = lower(LU) + I(n)
    x2       = U\(L\b)
    # Compare
    @show norm(x1-x2)
end
1 Like