Skip to content

Commit 8c63893

Browse files
Merge pull request #234 from amontoison/update_krylov
Update the wrapper of Krylov.jl
2 parents fb4bb2d + 127970d commit 8c63893

File tree

6 files changed

+47
-16
lines changed

6 files changed

+47
-16
lines changed

Project.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ FastLapackInterface = "1"
2929
GPUArraysCore = "0.1"
3030
IterativeSolvers = "0.9.2"
3131
KLU = "0.3.0, 0.4"
32-
Krylov = "0.7.11, 0.8"
32+
Krylov = "0.9"
3333
KrylovKit = "0.5, 0.6"
3434
RecursiveFactorization = "0.2.8"
3535
Reexport = "1"

docs/src/solvers/solvers.md

+6-4
Original file line numberDiff line numberDiff line change
@@ -178,10 +178,12 @@ IterativeSolversJL(args...;
178178

179179
### Krylov.jl
180180

181-
- `KrylovJL_CG(args...;kwargs...)`: A generic CG implementation
182-
- `KrylovJL_GMRES(args...;kwargs...)`: A generic GMRES implementation
183-
- `KrylovJL_BICGSTAB(args...;kwargs...)`: A generic BICGSTAB implementation
184-
- `KrylovJL_MINRES(args...;kwargs...)`: A generic MINRES implementation
181+
- `KrylovJL_CG(args...;kwargs...)`: A generic CG implementation for Hermitian and positive definite linear systems
182+
- `KrylovJL_MINRES(args...;kwargs...)`: A generic MINRES implementation for Hermitian linear systems
183+
- `KrylovJL_GMRES(args...;kwargs...)`: A generic GMRES implementation for square non-Hermitian linear systems
184+
- `KrylovJL_BICGSTAB(args...;kwargs...)`: A generic BICGSTAB implementation for square non-Hermitian linear systems
185+
- `KrylovJL_LSMR(args...;kwargs...)`: A generic LSMR implementation for least-squares problems
186+
- `KrylovJL_CRAIGMR(args...;kwargs...)`: A generic CRAIGMR implementation for least-norm problems
185187

186188
The general algorithm is:
187189

src/LinearSolve.jl

+3-2
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,10 @@ export LUFactorization, SVDFactorization, QRFactorization, GenericFactorization,
7474

7575
export LinearSolveFunction
7676

77-
export KrylovJL, KrylovJL_CG, KrylovJL_GMRES, KrylovJL_BICGSTAB, KrylovJL_MINRES,
77+
export KrylovJL, KrylovJL_CG, KrylovJL_MINRES, KrylovJL_GMRES,
78+
KrylovJL_BICGSTAB, KrylovJL_LSMR, KrylovJL_CRAIGMR,
7879
IterativeSolversJL, IterativeSolversJL_CG, IterativeSolversJL_GMRES,
7980
IterativeSolversJL_BICGSTAB, IterativeSolversJL_MINRES,
80-
KrylovKitJL, KrylovKitJL_CG, KrylovKitJL_GMRES, KrylovJL_LSMR
81+
KrylovKitJL, KrylovKitJL_CG, KrylovKitJL_GMRES
8182

8283
end

src/default.jl

+6-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,12 @@ end
7171

7272
function defaultalg(A::SciMLBase.AbstractDiffEqOperator, b,
7373
assumptions::OperatorAssumptions{false})
74-
KrylovJL_LSMR()
74+
m, n = size(A)
75+
if m < n
76+
KrylovJL_CRAIGMR()
77+
else
78+
KrylovJL_LSMR()
79+
end
7580
end
7681

7782
# Handle ambiguity

src/iterative_wrappers.jl

+21-4
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,30 @@ function KrylovJL(args...; KrylovAlg = Krylov.gmres!,
1515
args, kwargs)
1616
end
1717

18-
KrylovJL_CG(args...; kwargs...) = KrylovJL(args...; KrylovAlg = Krylov.cg!, kwargs...)
19-
KrylovJL_GMRES(args...; kwargs...) = KrylovJL(args...; KrylovAlg = Krylov.gmres!, kwargs...)
20-
function KrylovJL_BICGSTAB(args...; kwargs...)
21-
KrylovJL(args...; KrylovAlg = Krylov.bicgstab!, kwargs...)
18+
function KrylovJL_CG(args...; kwargs...)
19+
KrylovJL(args...; KrylovAlg = Krylov.cg!, kwargs...)
2220
end
21+
2322
function KrylovJL_MINRES(args...; kwargs...)
2423
KrylovJL(args...; KrylovAlg = Krylov.minres!, kwargs...)
2524
end
2625

26+
function KrylovJL_GMRES(args...; kwargs...)
27+
KrylovJL(args...; KrylovAlg = Krylov.gmres!, kwargs...)
28+
end
29+
30+
function KrylovJL_BICGSTAB(args...; kwargs...)
31+
KrylovJL(args...; KrylovAlg = Krylov.bicgstab!, kwargs...)
32+
end
33+
2734
function KrylovJL_LSMR(args...; kwargs...)
2835
KrylovJL(args...; KrylovAlg = Krylov.lsmr!, kwargs...)
2936
end
3037

38+
function KrylovJL_CRAIGMR(args...; kwargs...)
39+
KrylovJL(args...; KrylovAlg = Krylov.craigmr!, kwargs...)
40+
end
41+
3142
function get_KrylovJL_solver(KrylovAlg)
3243
KS = if (KrylovAlg === Krylov.lsmr!)
3344
Krylov.LsmrSolver
@@ -89,6 +100,10 @@ function get_KrylovJL_solver(KrylovAlg)
89100
Krylov.QmrSolver
90101
elseif (KrylovAlg === Krylov.gmres!)
91102
Krylov.GmresSolver
103+
elseif (KrylovAlg === Krylov.fgmres!)
104+
Krylov.FgmresSolver
105+
elseif (KrylovAlg === Krylov.gpmr!)
106+
Krylov.GpmrSolver
92107
elseif (KrylovAlg === Krylov.fom!)
93108
Krylov.FomSolver
94109
end
@@ -105,6 +120,8 @@ function init_cacheval(alg::KrylovJL, A, b, u, Pl, Pr, maxiters::Int, abstol, re
105120
solver = if (alg.KrylovAlg === Krylov.dqgmres! ||
106121
alg.KrylovAlg === Krylov.diom! ||
107122
alg.KrylovAlg === Krylov.gmres! ||
123+
alg.KrylovAlg === Krylov.fgmres! ||
124+
alg.KrylovAlg === Krylov.gpmr! ||
108125
alg.KrylovAlg === Krylov.fom!)
109126
KS(A, b, memory)
110127
elseif (alg.KrylovAlg === Krylov.minres! ||

test/nonsquare.jl

+10-4
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,24 @@ using SparseArrays, LinearAlgebra
33

44
m, n = 13, 3
55

6-
A = rand(m, n);
7-
b = rand(m);
6+
A = rand(m, n)
7+
b = rand(m)
88
prob = LinearProblem(A, b)
99
res = A \ b
1010
@test solve(prob).u res
1111
@test solve(prob, QRFactorization()) res
1212
@test solve(prob, KrylovJL_LSMR()) res
1313

14-
A = sprand(m, n, 0.5);
15-
b = rand(m);
14+
A = sprand(m, n, 0.5)
15+
b = rand(m)
1616
prob = LinearProblem(A, b)
1717
res = A \ b
1818
@test solve(prob).u res
1919
@test solve(prob, QRFactorization()) res
2020
@test solve(prob, KrylovJL_LSMR()) res
21+
22+
A = sprand(n, m, 0.5)
23+
b = rand(n)
24+
prob = LinearProblem(A, b)
25+
res = Matrix(A) \ b
26+
@test solve(prob, KrylovJL_CRAIGMR()) res

0 commit comments

Comments
 (0)