# How to pass a matrix free preconditioner to IterativeSolver of KrylovKit?

**URL:** <https://discourse.julialang.org/t/how-to-pass-a-matrix-free-preconditioner-to-iterativesolver-of-krylovkit/63315>\
**Category:** General Usage\
**Tags:** package\
**Created:** [June 21, 2021, 4:37pm UTC](https://discourse.julialang.org/t/how-to-pass-a-matrix-free-preconditioner-to-iterativesolver-of-krylovkit/63315 "2021-06-21T16:37:52Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![FredericN](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fredericn/32/21170_2.png) [@FredericN](https://discourse.julialang.org/u/FredericN)\
**Post date:** [June 21, 2021, 4:37pm UTC](https://discourse.julialang.org/t/how-to-pass-a-matrix-free-preconditioner-to-iterativesolver-of-krylovkit/63315/1 "2021-06-21T16:37:52Z")

</div>

Say I have a matrix A and a linear function P that takes as argument a vector and returns a vector of the same size. How can I use a preconditioned conjugate gradient from IterativeSolver.jl of KrylovKit.jl for solving Ax=b preconditioned by P?

---

<div class="post-metadata">

**Author:** ![vlc](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vlc/32/4705_2.png) [@vlc](https://discourse.julialang.org/u/vlc)\
**Post date:** [June 21, 2021, 7:47pm UTC](https://discourse.julialang.org/t/how-to-pass-a-matrix-free-preconditioner-to-iterativesolver-of-krylovkit/63315/2 "2021-06-21T19:47:40Z")

</div>

Hi Frédéric,

One way to achieve this would be create a type that wraps your function, say the identity function

```julia
foo(x) = x

```

then create a type to wrap your function

```julia
struct MyPreconditioner{F}
	fun::F
end
P = MyPreconditioner(foo)

```

and finally add whatever method IterativeSolver.jl or KrylovKit.jl will need :

```julia
using LinearAlgebra
LinearAlgebra.ldiv!(y, P::MyPreconditioner, x) = y .= P.fun(x)

```

---

<div class="post-metadata">

**Author:** ![stevengj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevengj/32/71_2.png) [@stevengj](https://discourse.julialang.org/u/stevengj)\
**Post date:** [June 21, 2021, 8:02pm UTC](https://discourse.julialang.org/t/how-to-pass-a-matrix-free-preconditioner-to-iterativesolver-of-krylovkit/63315/3 "2021-06-21T20:02:12Z")

</div>

> [@vlc](#):
>
> whatever method IterativeSolver.jl

IterativeSolvers.jl requires `ldiv!` and `\`: [Preconditioning · IterativeSolvers.jl](https://iterativesolvers.julialinearalgebra.org/dev/preconditioning/)

KrylovKit.jl doesn’t currently support preconditioning ([Preconditionning · Issue #7 · Jutho/KrylovKit.jl · GitHub](https://github.com/Jutho/KrylovKit.jl/issues/7)).

---

<div class="post-metadata">

**Author:** ![FredericN](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fredericn/32/21170_2.png) [@FredericN](https://discourse.julialang.org/u/FredericN)\
**Post date:** [June 22, 2021, 7:57am UTC](https://discourse.julialang.org/t/how-to-pass-a-matrix-free-preconditioner-to-iterativesolver-of-krylovkit/63315/4 "2021-06-22T07:57:29Z")

</div>

many thanks!

---

<div class="post-metadata">

**Author:** ![FredericN](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fredericn/32/21170_2.png) [@FredericN](https://discourse.julialang.org/u/FredericN)\
**Post date:** [June 22, 2021, 7:57am UTC](https://discourse.julialang.org/t/how-to-pass-a-matrix-free-preconditioner-to-iterativesolver-of-krylovkit/63315/5 "2021-06-22T07:57:56Z")

</div>

Thanks

---

<div class="post-metadata">

**Author:** ![rveltz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rveltz/32/2707_2.png) [@rveltz](https://discourse.julialang.org/u/rveltz)\
**Post date:** [June 22, 2021, 8:27am UTC](https://discourse.julialang.org/t/how-to-pass-a-matrix-free-preconditioner-to-iterativesolver-of-krylovkit/63315/6 "2021-06-22T08:27:14Z")

</div>

You can easily use left preconditioning in KrylovKit, see [here](https://github.com/rveltz/BifurcationKit.jl/blob/master/src/LinearSolver.jl#L193)

---

<div class="post-metadata">

**Author:** ![erny123](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/erny123/32/52255_2.png) [@erny123](https://discourse.julialang.org/u/erny123)\
**Post date:** [February 14, 2024, 8:04pm UTC](https://discourse.julialang.org/t/how-to-pass-a-matrix-free-preconditioner-to-iterativesolver-of-krylovkit/63315/7 "2024-02-14T20:04:54Z")

</div>

Only thing I would add is that some methods of IterativeSolvers.jl require you to also define the following in-place `ldiv!`:

`LinearAlgebra.ldiv!(P::MyPreconditioner, X) = X.= P.fun(X) #or whatever solver you choose`
