Skip to content

Commit b3d70c7

Browse files
committed
more docs
1 parent 847c505 commit b3d70c7

File tree

1 file changed

+15
-16
lines changed

1 file changed

+15
-16
lines changed

docs/src/index.md

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -375,17 +375,10 @@ identical defaults: each of the mentioned packages uses a slightly different def
375375
convergence criterion.
376376

377377

378-
## Status
379-
An overview of what we have, how it's done and what we're missing.
378+
## Implementation details
380379

381-
### Implementation details
382-
383-
- The method does not make assumptions about the type of the matrix; it is
384-
matrix-free.
385-
- Converged Ritz vectors are locked (or deflated).
386-
- We may do "purging" differently from ARPACK: in ArnoldiMethod.jl it is rather
387-
"unlocking", in the sense that converged but unwanted eigenvectors are retained
388-
in the search subspace instead of removed from it.
380+
- The method is "matrix-free", in the sense that only `mul!` needs to be
381+
implemented.
389382
- Important matrices and vectors are pre-allocated and operations on the
390383
Hessenberg matrix are in-place; Julia's garbage collector can sit back.
391384
- Krylov basis vectors are orthogonalized with repeated classical Gram-Schmidt
@@ -394,12 +387,18 @@ An overview of what we have, how it's done and what we're missing.
394387
- To compute the Schur decomposition of the Hessenberg matrix we use a dense
395388
QR algorithm written natively in Julia. It is based on implicit (or Francis)
396389
shifts and handles real arithmetic efficiently.
397-
- Locking and purging of Ritz vectors is done by reordering the Schur form,
398-
which is also implemented natively in Julia. In the real case it is done by
399-
casting tiny Sylvester equations to linear systems and solving them with
400-
complete pivoting.
390+
- Converged Ritz vectors close enough to the target are locked, converged
391+
Ritz vectors too far away from the target are purged (= removed from the
392+
search subspace). This is done by re-ordering the Schur form. In the real
393+
case it is done by casting tiny Sylvester equations to linear systems and
394+
solving them with complete pivoting (in pure Julia).
395+
- The Krylov-Schur restart is typically implemented by computing a Housholder
396+
reflector for the last row of the "perturbed" Hessenberg matrix. For
397+
stability, ArnoldiMethod.jl uses Given's rotations to zero out this row,
398+
which is more stable, given that the row may contain number of vastly different
399+
orders of magnitude -- they correspond to residuals, which can be tiny or large.
401400
- Shrinking the size of the Krylov subspace and changing its basis is done by
402401
accumulating all rotations and reflections in a unitary matrix `Q`, and then
403402
simply computing the matrix-matrix product `V := V * Q`, where `V` is the
404-
original orthonormal basis. This is not in-place in `V`, so we allocate a bit
405-
of scratch space ahead of time.
403+
original orthonormal basis. This is not in-place in `V`, so we need to
404+
allocate a temporary for V (once, ahead of time).

0 commit comments

Comments
 (0)