|
1 | 1 | ## Krylov.jl
|
2 | 2 |
|
3 | 3 | struct KrylovJL{F,A,K} <: SciMLLinearSolveAlgorithm
|
4 |
| - solver::F |
| 4 | + KrylovAlg::F |
5 | 5 | args::A
|
6 | 6 | kwargs::K
|
7 | 7 | end
|
8 | 8 |
|
9 |
| -function KrylovJL(args...; solver = Krylov.gmres, kwargs...) |
10 |
| - return KrylovJL(solver, args, kwargs) |
| 9 | +function KrylovJL(args...; KrylovAlg = Krylov.gmres!, kwargs...) |
| 10 | + return KrylovJL(KrylovAlg, args, kwargs) |
11 | 11 | end
|
12 | 12 |
|
13 |
| -# place Krylov.CGsolver in LinearCache.cacheval for reuse |
14 |
| -function init_cacheval(prob::LinearProblem, alg::KrylovJL) |
15 |
| - if alg.solver === Krylov.cg! |
16 |
| - elseif alg.solver === Krylov.gmres! |
17 |
| - elseif alg.solver === Krylov.bicgstab! |
| 13 | +function init_cacheval(alg::KrylovJL, A, b, u) |
| 14 | + cacheval = if alg.KrylovAlg === Krylov.cg! |
| 15 | + CgSolver(A,b) |
| 16 | + elseif alg.KrylovAlg === Krylov.gmres! |
| 17 | + GmresSolver(A,b,20) |
| 18 | + elseif alg.KrylovAlg === Krylov.bicgstab! |
| 19 | + BicgstabSolver(A,b) |
| 20 | + else |
| 21 | + nothing |
18 | 22 | end
|
19 |
| - return |
| 23 | + return cacheval |
20 | 24 | end
|
21 | 25 |
|
22 |
| -# KrylovJL failing in-place |
23 |
| -function SciMLBase.solve(cache::LinearCache, alg::KrylovJL,args...;kwargs...) |
24 |
| - @unpack A, b, u, Pr, Pl = cache |
25 |
| - u, stats = alg.solver(A, b, args...; M=Pl, N=Pr, kwargs...) |
26 |
| - resid = A * u - b |
27 |
| - retcode = stats.solved ? :Success : :Failure |
28 |
| - return u |
| 26 | +function SciMLBase.solve(cache::LinearCache, alg::KrylovJL; kwargs...) |
| 27 | + @unpack A, b, u, Pr, Pl, cacheval = cache |
| 28 | + |
| 29 | + if cache.isfresh |
| 30 | + solver = init_cacheval(alg.KrylovAlg, A, b, u) |
| 31 | + solver.x = u |
| 32 | + cache = set_cacheval(cache, solver) |
| 33 | + end |
| 34 | + |
| 35 | + alg.solver(cacheval, A, b; M=Pl, N=Pr, alg.kwargs...) |
| 36 | + |
| 37 | + return cache.u |
29 | 38 | end
|
30 | 39 |
|
31 | 40 | KrylovJL_CG(args...;kwargs...) = KrylovJL(Krylov.cg!, args...; kwargs...)
|
|
0 commit comments