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