|
| TwoLevelPreconditioner (Parallel const &par, InputFile const &inp, std::vector< std::pair< int, int >> const &ll, Bspline const &s_bspline, CommandLine const &cmd) |
|
RadialIntegrals const & | rad () const |
| Get radial integrals. More...
|
|
void | precondition (const cArrayView r, cArrayView z) const |
| Precondition the equation. More...
|
|
void | setup () |
| Initialize the preconditioner. More...
|
|
void | update (double E) |
| Update the preconditioner for the next energy. More...
|
|
void | rhs (cArrayView chi, int ienergy, int instate) const |
| Return the right-hand side. More...
|
|
void | multiply (const cArrayView p, cArrayView q) const |
| Multiply by the matrix equation. More...
|
|
virtual void | CG_prec (int iblock, const cArrayView r, cArrayView z) const |
|
| SSORCGPreconditioner (Parallel const &par, InputFile const &inp, std::vector< std::pair< int, int >> const &ll, Bspline const &bspline, CommandLine const &cmd) |
|
| CGPreconditioner (Parallel const &par, InputFile const &inp, std::vector< std::pair< int, int >> const &ll, Bspline const &bspline, CommandLine const &cmd) |
|
virtual void | CG_mmul (int iblock, const cArrayView p, cArrayView q) const |
|
| NoPreconditioner (Parallel const &par, InputFile const &inp, std::vector< std::pair< int, int >> const &ll, Bspline const &bspline, CommandLine const &cmd) |
|
This preconditioner class is inspired by the method of multi-resolution in the finite difference computations. A high-order differential operator that gives rise to the multi-diagonal matrix is initially solved in low order. The result is then used as a preconditioner for the full, high-order method.
In the case of B-spline expansion, that is being used in Hex, the bandwidth of the resulting matrix is given by the order of the B-splines. Analogously to the just metioned method, we compute the solution in a sharper base (lower order), which is computationally less demanding. The algorithm works as follows:
- In every step we are solving the equation \( \mathbf{M}^{(s)}\mathbf{z}^{(s)} = \mathbf{r}^{(s)} \).
- The matrix \( \mathbf{M}^{(s)} \) is the diagonal block \( E\mathbf{S}^{(s)}\otimes\mathbf{S}^{(s)} - \mathbf{H}^{(s)} \). The symbol "s" stands for solution B-spline basis.
- But we want just to compute the simplified system \( \mathbf{M}^{(p)}\mathbf{z}^{(p)} = \mathbf{r}^{(p)} \). The symbol "p" stands for preconditioner B-spline basis.
- The matrices contained in \( \mathbf{M}^{(p)} \) are computed in a low-order B-spline basis; these are the matrices \( \mathbf{S}^{(p)} \), \( \mathbf{D}^{(p)} \) etc., whereas fhe original full-order matrices are \( \mathbf{S}^{(s)} \), \( \mathbf{D}^{(s)} \) etc.
- Before and after the solution of the simplified system we need to map the solutions between the bases. This is done by the equations
\[ \mathbf{S}^{(p)}\otimes\mathbf{S}^{(p)} \mathbf{r}^{(p)} = \mathbb{\Sigma}^{(p,q)} \otimes \mathbb{\Sigma}^{(p,q)} \mathbf{r}^{(q)} \]
- Together we have the sequence
\[ \mathbf{S}^{(p)}\otimes\mathbf{S}^{(p)} \mathbf{r}^{(p)} = \mathbb{\Sigma}^{(p,s)} \otimes \mathbb{\Sigma}^{(p,s)} \mathbf{r}^{(s)} \]
\[ \mathbf{M}^{(p)}\mathbf{z}^{(p)} = \mathbf{r}^{(p)} \]
\[ \mathbf{S}^{(s)}\otimes\mathbf{S}^{(s)} \mathbf{z}^{(s)} = \mathbb{\Sigma}^{(s,p)} \otimes \mathbb{\Sigma}^{(s,p)} \mathbf{z}^{(p)} \]
instead of the single equation
\[ \mathbf{M}^{(s)}\mathbf{z}^{(s)} = \mathbf{r}^{(s)} \ . \]
The transition overlap matrix \( \mathbb{\Sigma}^{(p,q)} \) is defined in components as
\[ \Sigma_{ij}^{(p,q)} = \int B_i^{(p)}(r) B_j^{(q)}(r) \mathrm{d}r \ . \]
The solution of transition equations can be recast into a matrix form of Kronecker product,
\[ \mathbf{S}^{(p)} \mathbf{R}^{(p)} \mathbf{S}^{(p)T} = \mathbb{\Sigma}^{(p,q)}\mathrm{Matrix}(\mathbf{r}^{(q)})\mathbb{\Sigma}^{(p,q)^T} \qquad\Rightarrow\qquad \mathbf{R}^{(p)} = \mathbf{S}^{(p)^{-1}} \mathbb{\Sigma}^{(p,q)} \mathrm{Matrix}(\mathbf{r}^{(q)}) \mathbb{\Sigma}^{(p,q)^T} \mathbf{S}^{(p)^{-T}} \]
where the word "Matrix" indicates that we want to split long vector into a square matrix. The resulting square matrix \( \mathbf{R} \) will then have the same structure.