# Interface for Linear Solvers

The linear solver `ls`

must be a subtype of the abstract type `AbstractLinearSolver`

. It is then called as follows

Required methods | Brief description | |
---|---|---|

`ls(J, rhs; a₀ = 0, a₁ = 1, kwargs...)` | Compute the solution `sol` of the linear problem `(a₀ * I + a₁ * J) * sol = rhs` where `J` is the jacobian. Returns `(sol, success::Bool, itnumber)` where `itnumber` is the number of iterations for solving the problem. |

Two methods `_axpy`

and `_axpy_op`

are provided to help implementing this shift `a₀ * I + a₁ * J`

# Interface for Eigen Solvers

The linear solver `eig`

must be a subtype of the abstract type `AbstractEigenSolver`

. It is then called as follows

Required methods | Brief description | |
---|---|---|

`eig(J, nev::Int; kwargs...)` | Compute the `nev` eigen-elements with largest real part. Returns `(eigenvalues, eigenvectors, success:Bool, itnumber)` where `itnumber` is the number of iterations for completing the computation. `kwargs` can be used to send information about the algorithm (perform bisection,...). | |

`geteigenvector(eig, eigenvectors, i::Int)` | Returns the ith eigenvectors from the set of `eigenvectors` . |

# Interface for Bordered Linear Solvers

The bordered linear solver `bls`

must be a subtype of the abstract type `AbstractBorderedLinearSolver`

(which is itself a subtype of `AbstractLinearSolver`

). It is used to solve

\[\tag{BLS}\left[\begin{array}{ll} {\text{shift}\cdot I+J} & {dR} \\ {(\xi_u \cdot dz_u)^T} & {\xi_p \cdot dz_p} \end{array}\right] \cdot\left[\begin{array}{l} {dX} \\ {dl} \end{array}\right] = \left[\begin{array}{l} R \\ n \end{array}\right]\]

where $\xi_u,\xi_p\in\mathbb C$ and $dR,\xi_u\in\mathbb C^N$.

To work with PALC, the struct `bls`

must have the field `solver`

available even if this one is `nothing`

Required methods | Brief description | |
---|---|---|

`bls(J, dR, dzu, dzp, R, n, ξu::Number, ξp::Number; shift = nothing, kwargs...)` | Compute the solution `dX, dl` of the linear problem (BLS) where `J` is the jacobian and `dR, dzu` are vectors (not necessarily subtypes of `AbstractVector` ). `shift = nothing` is used in place of saying `shift=0` . Returns `(dX, dl, success::Bool, itnumber)` where `itnumber` is the number of iterations for solving the problem. |