Skip to content

Commit c82d513

Browse files
committed
An implementation of USYMLQR
1 parent 5c001fd commit c82d513

19 files changed

+741
-153
lines changed

docs/make.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ makedocs(
3838
"MINARES" => "examples/minares.md",
3939
"TriCG" => "examples/tricg.md",
4040
"TriMR" => "examples/trimr.md",
41+
"USYMLQR" => "examples/usymlqr.md",
4142
"BICGSTAB" => "examples/bicgstab.md",
4243
"DQGMRES" => "examples/dqgmres.md",
4344
"BLOCK-GMRES" => "examples/block_gmres.md",

docs/src/api.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ DqgmresSolver
3232
GmresSolver
3333
UsymlqSolver
3434
UsymqrSolver
35+
UsymlqrSolver
3536
TricgSolver
3637
TrimrSolver
3738
TrilqrSolver

docs/src/examples/usymlqr.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
```@example usymlqr
2+
using Krylov, LinearOperators, LDLFactorizations
3+
using LinearAlgebra, Printf, SparseArrays
4+
5+
# Identity matrix.
6+
eye(n::Int) = sparse(1.0 * I, n, n)
7+
8+
# Saddle-point systems
9+
n = m = 5
10+
A = [2^(i/j)*j + (-1)^(i-j) * n*(i-1) for i = 1:n, j = 1:n]
11+
b = ones(n)
12+
D = diagm(0 => [2.0 * i for i = 1:n])
13+
m, n = size(A)
14+
c = -b
15+
16+
# [D A] [x] = [b]
17+
# [Aᴴ 0] [y] [c]
18+
llt_D = cholesky(D)
19+
opD⁻¹ = LinearOperator(Float64, 5, 5, true, true, (y, v) -> ldiv!(y, llt_D, v))
20+
opH⁻¹ = BlockDiagonalOperator(opD⁻¹, eye(n))
21+
(x, y, stats) = usymlqr(A, b, c, M=opD⁻¹, sp=true)
22+
K = [D A; A' zeros(n,n)]
23+
B = [b; c]
24+
r = B - K * [x; y]
25+
resid = sqrt(dot(r, opH⁻¹ * r))
26+
@printf("USYMLQR: Relative residual: %8.1e\n", resid)
27+
```

docs/src/matrix_free.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ Some methods only require `A * v` products, whereas other ones also require `A'
4040
| CG, CR, CAR | CGLS, CRLS, CGNE, CRMR |
4141
| SYMMLQ, CG-LANCZOS, MINRES, MINRES-QLP, MINARES | LSLQ, LSQR, LSMR, LNLQ, CRAIG, CRAIGMR |
4242
| DIOM, FOM, DQGMRES, GMRES, FGMRES, BLOCK-GMRES | BiLQ, QMR, BiLQR, USYMLQ, USYMQR, TriLQR |
43-
| CGS, BICGSTAB | TriCG, TriMR |
43+
| CGS, BICGSTAB | TriCG, TriMR, USYMLQR |
4444
| CG-LANCZOS-SHIFT | CGLS-LANCZOS-SHIFT |
4545

4646
!!! info

docs/src/preconditioners.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ Methods concerned: [`CGNE`](@ref cgne), [`CRMR`](@ref crmr), [`LNLQ`](@ref lnlq)
111111

112112
### Saddle-point and symmetric quasi-definite systems
113113

114-
[`TriCG`](@ref tricg) and [`TriMR`](@ref trimr) can take advantage of the structure of Hermitian systems $Kz = d$ with the 2x2 block structure
114+
[`TriCG`](@ref tricg), [`TriMR`](@ref trimr) and [`USYMLQR`](@ref usymlqr) can take advantage of the structure of Hermitian systems $Kz = d$ with the 2x2 block structure
115115
```math
116116
\begin{bmatrix} \tau E & \phantom{-}A \\ A^H & \nu F \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} b \\ c \end{bmatrix},
117117
```

docs/src/processes.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ T_{k,k+1} =
294294

295295
The function [`saunders_simon_yip`](@ref saunders_simon_yip(::Any, ::AbstractVector{FC}, ::AbstractVector{FC}, ::Int) where FC <: (Union{Complex{T}, T} where T <: AbstractFloat)) returns $V_{k+1}$, $\beta_1$, $T_{k+1,k}$, $U_{k+1}$, $\bar{\gamma}_1$ and $T_{k,k+1}^H$.
296296

297-
Related methods: [`USYMLQ`](@ref usymlq), [`USYMQR`](@ref usymqr), [`TriLQR`](@ref trilqr), [`TriCG`](@ref tricg) and [`TriMR`](@ref trimr).
297+
Related methods: [`USYMLQ`](@ref usymlq), [`USYMQR`](@ref usymqr), [`USYMLQR`](@ref usymlqr), [`TriLQR`](@ref trilqr), [`TriCG`](@ref tricg) and [`TriMR`](@ref trimr).
298298

299299
!!! note
300300
The Saunders-Simon-Yip is equivalent to the block-Lanczos process applied to $\begin{bmatrix} 0 & A \\ A^H & 0 \end{bmatrix}$ with initial matrix $\begin{bmatrix} b & 0 \\ 0 & c \end{bmatrix}$.

docs/src/solvers/sp_sqd.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,10 @@ tricg!
1515
trimr
1616
trimr!
1717
```
18+
19+
## USYMLQR
20+
21+
```@docs
22+
usymlqr!
23+
usymlqr
24+
```

docs/src/storage.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,9 @@ Each table summarizes the storage requirements of Krylov methods recommended to
9393

9494
#### Saddle-point and Hermitian quasi-definite systems
9595

96-
| Methods | [`TriCG`](@ref tricg) | [`TriMR`](@ref trimr) |
97-
|:--------:|:---------------------:|:---------------------:|
98-
| Storage | $6n + 6m$ | $8n + 8m$ |
96+
| Methods | [`TriCG`](@ref tricg) | [`TriMR`](@ref trimr) | [`USYMLQR`](@ref usymlqr) |
97+
|:--------:|:---------------------:|:---------------------:|:-------------------------:|
98+
| Storage | $6n + 6m$ | $8n + 8m$ | $Xn + Ym$ |
9999

100100
#### Generalized saddle-point and non-Hermitian partitioned systems
101101

src/Krylov.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ include("gpmr.jl")
3434

3535
include("usymlq.jl")
3636
include("usymqr.jl")
37+
include("usymlqr.jl")
3738
include("tricg.jl")
3839
include("trimr.jl")
3940
include("trilqr.jl")

src/krylov_solve.jl

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -7,40 +7,41 @@ function solve! end
77

88
# Krylov methods
99
for (KS, fun, fun2, args, def_args, optargs, def_optargs, kwargs, def_kwargs) in [
10-
(:LsmrSolver , :lsmr! , :lsmr , args_lsmr , def_args_lsmr , () , () , kwargs_lsmr , def_kwargs_lsmr )
11-
(:CgsSolver , :cgs! , :cgs , args_cgs , def_args_cgs , optargs_cgs , def_optargs_cgs , kwargs_cgs , def_kwargs_cgs )
12-
(:UsymlqSolver , :usymlq! , :usymlq , args_usymlq , def_args_usymlq , optargs_usymlq , def_optargs_usymlq , kwargs_usymlq , def_kwargs_usymlq )
13-
(:LnlqSolver , :lnlq! , :lnlq , args_lnlq , def_args_lnlq , () , () , kwargs_lnlq , def_kwargs_lnlq )
14-
(:BicgstabSolver , :bicgstab! , :bicgstab , args_bicgstab , def_args_bicgstab , optargs_bicgstab , def_optargs_bicgstab , kwargs_bicgstab , def_kwargs_bicgstab )
15-
(:CrlsSolver , :crls! , :crls , args_crls , def_args_crls , () , () , kwargs_crls , def_kwargs_crls )
16-
(:LsqrSolver , :lsqr! , :lsqr , args_lsqr , def_args_lsqr , () , () , kwargs_lsqr , def_kwargs_lsqr )
17-
(:MinresSolver , :minres! , :minres , args_minres , def_args_minres , optargs_minres , def_optargs_minres , kwargs_minres , def_kwargs_minres )
18-
(:MinaresSolver , :minares! , :minares , args_minares , def_args_minares , optargs_minares , def_optargs_minares , kwargs_minares , def_kwargs_minares )
19-
(:CgneSolver , :cgne! , :cgne , args_cgne , def_args_cgne , () , () , kwargs_cgne , def_kwargs_cgne )
20-
(:DqgmresSolver , :dqgmres! , :dqgmres , args_dqgmres , def_args_dqgmres , optargs_dqgmres , def_optargs_dqgmres , kwargs_dqgmres , def_kwargs_dqgmres )
21-
(:SymmlqSolver , :symmlq! , :symmlq , args_symmlq , def_args_symmlq , optargs_symmlq , def_optargs_symmlq , kwargs_symmlq , def_kwargs_symmlq )
22-
(:TrimrSolver , :trimr! , :trimr , args_trimr , def_args_trimr , optargs_trimr , def_optargs_trimr , kwargs_trimr , def_kwargs_trimr )
23-
(:UsymqrSolver , :usymqr! , :usymqr , args_usymqr , def_args_usymqr , optargs_usymqr , def_optargs_usymqr , kwargs_usymqr , def_kwargs_usymqr )
24-
(:BilqrSolver , :bilqr! , :bilqr , args_bilqr , def_args_bilqr , optargs_bilqr , def_optargs_bilqr , kwargs_bilqr , def_kwargs_bilqr )
25-
(:CrSolver , :cr! , :cr , args_cr , def_args_cr , optargs_cr , def_optargs_cr , kwargs_cr , def_kwargs_cr )
26-
(:CarSolver , :car! , :car , args_car , def_args_car , optargs_car , def_optargs_car , kwargs_car , def_kwargs_car )
27-
(:CraigmrSolver , :craigmr! , :craigmr , args_craigmr , def_args_craigmr , () , () , kwargs_craigmr , def_kwargs_craigmr )
28-
(:TricgSolver , :tricg! , :tricg , args_tricg , def_args_tricg , optargs_tricg , def_optargs_tricg , kwargs_tricg , def_kwargs_tricg )
29-
(:CraigSolver , :craig! , :craig , args_craig , def_args_craig , () , () , kwargs_craig , def_kwargs_craig )
30-
(:DiomSolver , :diom! , :diom , args_diom , def_args_diom , optargs_diom , def_optargs_diom , kwargs_diom , def_kwargs_diom )
31-
(:LslqSolver , :lslq! , :lslq , args_lslq , def_args_lslq , () , () , kwargs_lslq , def_kwargs_lslq )
32-
(:TrilqrSolver , :trilqr! , :trilqr , args_trilqr , def_args_trilqr , optargs_trilqr , def_optargs_trilqr , kwargs_trilqr , def_kwargs_trilqr )
33-
(:CrmrSolver , :crmr! , :crmr , args_crmr , def_args_crmr , () , () , kwargs_crmr , def_kwargs_crmr )
34-
(:CgSolver , :cg! , :cg , args_cg , def_args_cg , optargs_cg , def_optargs_cg , kwargs_cg , def_kwargs_cg )
35-
(:CglsSolver , :cgls! , :cgls , args_cgls , def_args_cgls , () , () , kwargs_cgls , def_kwargs_cgls )
36-
(:CgLanczosSolver, :cg_lanczos! , :cg_lanczos , args_cg_lanczos , def_args_cg_lanczos , optargs_cg_lanczos, def_optargs_cg_lanczos, kwargs_cg_lanczos , def_kwargs_cg_lanczos)
37-
(:BilqSolver , :bilq! , :bilq , args_bilq , def_args_bilq , optargs_bilq , def_optargs_bilq , kwargs_bilq , def_kwargs_bilq )
38-
(:MinresQlpSolver, :minres_qlp! , :minres_qlp , args_minres_qlp , def_args_minres_qlp , optargs_minres_qlp, def_optargs_minres_qlp, kwargs_minres_qlp , def_kwargs_minres_qlp)
39-
(:QmrSolver , :qmr! , :qmr , args_qmr , def_args_qmr , optargs_qmr , def_optargs_qmr , kwargs_qmr , def_kwargs_qmr )
40-
(:GmresSolver , :gmres! , :gmres , args_gmres , def_args_gmres , optargs_gmres , def_optargs_gmres , kwargs_gmres , def_kwargs_gmres )
41-
(:FgmresSolver , :fgmres! , :fgmres , args_fgmres , def_args_fgmres , optargs_fgmres , def_optargs_fgmres , kwargs_fgmres , def_kwargs_fgmres )
42-
(:FomSolver , :fom! , :fom , args_fom , def_args_fom , optargs_fom , def_optargs_fom , kwargs_fom , def_kwargs_fom )
43-
(:GpmrSolver , :gpmr! , :gpmr , args_gpmr , def_args_gpmr , optargs_gpmr , def_optargs_gpmr , kwargs_gpmr , def_kwargs_gpmr )
10+
(:LsmrSolver , :lsmr! , :lsmr , args_lsmr , def_args_lsmr , () , () , kwargs_lsmr , def_kwargs_lsmr )
11+
(:CgsSolver , :cgs! , :cgs , args_cgs , def_args_cgs , optargs_cgs , def_optargs_cgs , kwargs_cgs , def_kwargs_cgs )
12+
(:UsymlqSolver , :usymlq! , :usymlq , args_usymlq , def_args_usymlq , optargs_usymlq , def_optargs_usymlq , kwargs_usymlq , def_kwargs_usymlq )
13+
(:LnlqSolver , :lnlq! , :lnlq , args_lnlq , def_args_lnlq , () , () , kwargs_lnlq , def_kwargs_lnlq )
14+
(:BicgstabSolver , :bicgstab! , :bicgstab , args_bicgstab , def_args_bicgstab , optargs_bicgstab , def_optargs_bicgstab , kwargs_bicgstab , def_kwargs_bicgstab )
15+
(:CrlsSolver , :crls! , :crls , args_crls , def_args_crls , () , () , kwargs_crls , def_kwargs_crls )
16+
(:LsqrSolver , :lsqr! , :lsqr , args_lsqr , def_args_lsqr , () , () , kwargs_lsqr , def_kwargs_lsqr )
17+
(:MinresSolver , :minres! , :minres , args_minres , def_args_minres , optargs_minres , def_optargs_minres , kwargs_minres , def_kwargs_minres )
18+
(:MinaresSolver , :minares! , :minares , args_minares , def_args_minares , optargs_minares , def_optargs_minares , kwargs_minares , def_kwargs_minares )
19+
(:CgneSolver , :cgne! , :cgne , args_cgne , def_args_cgne , () , () , kwargs_cgne , def_kwargs_cgne )
20+
(:DqgmresSolver , :dqgmres! , :dqgmres , args_dqgmres , def_args_dqgmres , optargs_dqgmres , def_optargs_dqgmres , kwargs_dqgmres , def_kwargs_dqgmres )
21+
(:SymmlqSolver , :symmlq! , :symmlq , args_symmlq , def_args_symmlq , optargs_symmlq , def_optargs_symmlq , kwargs_symmlq , def_kwargs_symmlq )
22+
(:TrimrSolver , :trimr! , :trimr , args_trimr , def_args_trimr , optargs_trimr , def_optargs_trimr , kwargs_trimr , def_kwargs_trimr )
23+
(:UsymqrSolver , :usymqr! , :usymqr , args_usymqr , def_args_usymqr , optargs_usymqr , def_optargs_usymqr , kwargs_usymqr , def_kwargs_usymqr )
24+
(:BilqrSolver , :bilqr! , :bilqr , args_bilqr , def_args_bilqr , optargs_bilqr , def_optargs_bilqr , kwargs_bilqr , def_kwargs_bilqr )
25+
(:CrSolver , :cr! , :cr , args_cr , def_args_cr , optargs_cr , def_optargs_cr , kwargs_cr , def_kwargs_cr )
26+
(:CarSolver , :car! , :car , args_car , def_args_car , optargs_car , def_optargs_car , kwargs_car , def_kwargs_car )
27+
(:CraigmrSolver , :craigmr! , :craigmr , args_craigmr , def_args_craigmr , () , () , kwargs_craigmr , def_kwargs_craigmr )
28+
(:TricgSolver , :tricg! , :tricg , args_tricg , def_args_tricg , optargs_tricg , def_optargs_tricg , kwargs_tricg , def_kwargs_tricg )
29+
(:CraigSolver , :craig! , :craig , args_craig , def_args_craig , () , () , kwargs_craig , def_kwargs_craig )
30+
(:DiomSolver , :diom! , :diom , args_diom , def_args_diom , optargs_diom , def_optargs_diom , kwargs_diom , def_kwargs_diom )
31+
(:LslqSolver , :lslq! , :lslq , args_lslq , def_args_lslq , () , () , kwargs_lslq , def_kwargs_lslq )
32+
(:TrilqrSolver , :trilqr! , :trilqr , args_trilqr , def_args_trilqr , optargs_trilqr , def_optargs_trilqr , kwargs_trilqr , def_kwargs_trilqr )
33+
(:CrmrSolver , :crmr! , :crmr , args_crmr , def_args_crmr , () , () , kwargs_crmr , def_kwargs_crmr )
34+
(:CgSolver , :cg! , :cg , args_cg , def_args_cg , optargs_cg , def_optargs_cg , kwargs_cg , def_kwargs_cg )
35+
(:CglsSolver , :cgls! , :cgls , args_cgls , def_args_cgls , () , () , kwargs_cgls , def_kwargs_cgls )
36+
(:CgLanczosSolver, :cg_lanczos!, :cg_lanczos, args_cg_lanczos, def_args_cg_lanczos, optargs_cg_lanczos, def_optargs_cg_lanczos, kwargs_cg_lanczos, def_kwargs_cg_lanczos)
37+
(:BilqSolver , :bilq! , :bilq , args_bilq , def_args_bilq , optargs_bilq , def_optargs_bilq , kwargs_bilq , def_kwargs_bilq )
38+
(:MinresQlpSolver, :minres_qlp!, :minres_qlp, args_minres_qlp, def_args_minres_qlp, optargs_minres_qlp, def_optargs_minres_qlp, kwargs_minres_qlp, def_kwargs_minres_qlp)
39+
(:QmrSolver , :qmr! , :qmr , args_qmr , def_args_qmr , optargs_qmr , def_optargs_qmr , kwargs_qmr , def_kwargs_qmr )
40+
(:GmresSolver , :gmres! , :gmres , args_gmres , def_args_gmres , optargs_gmres , def_optargs_gmres , kwargs_gmres , def_kwargs_gmres )
41+
(:FgmresSolver , :fgmres! , :fgmres , args_fgmres , def_args_fgmres , optargs_fgmres , def_optargs_fgmres , kwargs_fgmres , def_kwargs_fgmres )
42+
(:FomSolver , :fom! , :fom , args_fom , def_args_fom , optargs_fom , def_optargs_fom , kwargs_fom , def_kwargs_fom )
43+
(:GpmrSolver , :gpmr! , :gpmr , args_gpmr , def_args_gpmr , optargs_gpmr , def_optargs_gpmr , kwargs_gpmr , def_kwargs_gpmr )
44+
(:UsymlqrSolver , :usymlqr! , :usymlqr , args_usymlqr , def_args_usymlqr , optargs_usymlqr , def_optargs_usymlqr , kwargs_usymlqr , def_kwargs_usymlqr )
4445
(:CgLanczosShiftSolver , :cg_lanczos_shift! , :cg_lanczos_shift , args_cg_lanczos_shift , def_args_cg_lanczos_shift , (), (), kwargs_cg_lanczos_shift , def_kwargs_cg_lanczos_shift )
4546
(:CglsLanczosShiftSolver, :cgls_lanczos_shift!, :cgls_lanczos_shift, args_cgls_lanczos_shift, def_args_cgls_lanczos_shift, (), (), kwargs_cgls_lanczos_shift, def_kwargs_cgls_lanczos_shift)
4647
]

0 commit comments

Comments
 (0)