GPMR
Krylov.gpmr
— Function(x, y, stats) = gpmr(A, B, b::AbstractVector{FC}, c::AbstractVector{FC}; memory::Int=20,
C=I, D=I, E=I, F=I, atol::T=√eps(T), rtol::T=√eps(T),
gsp::Bool=false, reorthogonalization::Bool=false,
itmax::Int=0, λ::FC=one(FC), μ::FC=one(FC),
verbose::Int=0, history::Bool=false,
ldiv::Bool=false, callback=solver->false)
T
is an AbstractFloat
such as Float32
, Float64
or BigFloat
. FC
is T
or Complex{T}
.
GPMR solves the unsymmetric partitioned linear system
[ λI A ] [ x ] = [ b ]
[ B μI ] [ y ] [ c ],
where λ and μ are real or complex numbers. A
can have any shape and B
has the shape of Aᵀ
. A
, B
, b
and c
must be all nonzero.
This implementation allows left and right block diagonal preconditioners
[ C ] [ λM A ] [ E ] [ E⁻¹x ] = [ Cb ]
[ D ] [ B μN ] [ F ] [ F⁻¹y ] [ Dc ],
and can solve
[ λM A ] [ x ] = [ b ]
[ B μN ] [ y ] [ c ]
when CE = M⁻¹
and DF = N⁻¹
.
By default, GPMR solves unsymmetric linear systems with λ = 1
and μ = 1
. If gsp = true
, λ = 1
, μ = 0
and the associated generalized saddle point system is solved. λ
and μ
are also keyword arguments that can be directly modified for more specific problems.
GPMR is based on the orthogonal Hessenberg reduction process and its relations with the block-Arnoldi process. The residual norm ‖rₖ‖ is monotonically decreasing in GPMR.
GPMR stops when itmax
iterations are reached or when ‖rₖ‖ ≤ atol + ‖r₀‖ * rtol
. atol
is an absolute tolerance and rtol
is a relative tolerance.
Full reorthogonalization is available with the reorthogonalization
option.
Additional details can be displayed if verbose mode is enabled (verbose > 0). Information will be displayed every verbose
iterations.
GPMR can be warm-started from initial guesses x0
and y0
with the method
(x, y, stats) = gpmr(A, B, b, c, x0, y0; kwargs...)
where kwargs
are the same keyword arguments as above.
The callback is called as callback(solver)
and should return true
if the main loop should terminate, and false
otherwise.
Reference
- A. Montoison and D. Orban, GPMR: An Iterative Method for Unsymmetric Partitioned Linear Systems, Cahier du GERAD G-2021-62, GERAD, Montréal, 2021.
Krylov.gpmr!
— Functionsolver = gpmr!(solver::GpmrSolver, A, B, b, c; kwargs...)
solver = gpmr!(solver::GpmrSolver, A, B, b, c, x0, y0; kwargs...)
where kwargs
are keyword arguments of gpmr
.
Note that the memory
keyword argument is the only exception. It's required to create a GpmrSolver
and can't be changed later.
See GpmrSolver
for more details about the solver
.