I use the file transient.mtx from the SuiteSparse Matrix Collection, see https://suitesparse-collection-website.herokuapp.com/MM/Freescale/transient.tar.gz.

Then I try to define an incomplete LU factorization that I apply as a preconditioner as follows:

```
using MatrixMarket: mmread
using Random: seed!
using IncompleteLU: ilu
A = mmread("transient.mtx");
M = ilu(A);
seed!(1);
b = rand(A.n);
sum(isnan.(M \ b))
```

and the result I get is 9. What is wrong with IncompleteLU?

I just ran the same code again, and this time I got no NaN and I can successfully use M as a preconditioner for GMRES. The behavior of IncompleteLU.ilu does not seem to be deterministic.

The following fix seems to work:

```
using MatrixMarket: mmread
using Random: seed!
using IncompleteLU: ilu
using LinearAlgebra: I
A = mmread("transient.mtx");
dA = 10^-6
M = ilu(A+dA*I);
seed!(1);
b = rand(A.n);
sum(isnan.(M \ b))
```

Then I get zero NaN, and I can successfully use M in GMRES.

The transient matrix has a zero on its diagonal, you need to apply a permutation first to insure that you will not have zero pivots for the ILU factorization.

An other alternative is to add a small multiple of I.

If you have CUDA.jl, they have a routine for CPU matrices, it’s `zfd`

and I use it before the computation of an ILU0 preconditioner: GPU support · Krylov.jl

It’s a copy of the `mc21`

algorithm for information.

1 Like

@nvenkov1

off-topic: If you use Suite Sparse Matrix Collection often, a Julia interface is available to easily download the matrices:

```
using SuiteSparseMatrixCollection, MatrixMarket, SparseArrays
ssmc = ssmc_db()
matrices = ssmc_matrices(ssmc, "Freescale", "transient")
paths = fetch_ssmc(matrices, format="MM")
path_transient = joinpath(paths[1], "transient.mtx")
M = MatrixMarket.mmread(path_transient)
```

1 Like