# How to promote a factorization?

I’m trying to promote an LU factorization in one precision to a higher
precision. The permutation vector does not map correctly and I can’t
figure out why.

Any ideas?

MWE:

``````julia> A=rand(Float32,3,3);

julia> AF=lu!(A);

julia> AF64=LU(Float64.(A), AF.p, AF.info);

julia> norm(AF64.L - AF.L)
0.00000e+00

julia> norm(AF64.U - AF.U)
0.00000e+00

julia> # so the factors look good, but

julia> AF.p
3-element Vector{Int64}:
2
1
3

julia> AF64.p
3-element Vector{Int64}:
1
2
3
``````

Too me these look like permutation vectors, for which `Int` should be perfect on 64-bit systems…

You want:

``````AF64=LU(Float64.(A), AF.ipiv, AF.info)
``````

(The `p` property is not actually stored, but rather is computed by `LinearAlgebra.ipiv2perm`.)

3 Likes

Sorry, I’m too stupid (I didn’t even realize the intent of original question). So what are you trying to do here: solving in `Float32` and pretending to have it solved in `Float64`?

I’m computing a factorization in low precision (Float16 is the target) and using that factorization as a preconditioner for GMRES in a higher precision (Float32 is the target). This only works right if I promote the factorization before I use it in the preconditioner.

I could define the preconditioiner via brute force using L, U, and P, but it is far cleaner if I can simply promote the factorization. @stevengj fixed me up, as he as done in the past.

1 Like

That’s it! Thanks.