Discontinuous Galerkin Library
#include "dg/algorithm.h"
dg::ModifiedChebyshevPreconditioner< Matrix, ContainerType > Struct Template Reference

Approximate inverse Chebyshev Polynomial Preconditioner \( A^{-1} = \frac{c_0}{2} I + \sum_{k=1}^{r}c_kT_k( Z)\). More...

Public Types

using container_type = ContainerType
 
using value_type = get_value_type< ContainerType >
 value type of the ContainerType class More...
 

Public Member Functions

 ModifiedChebyshevPreconditioner (Matrix op, const ContainerType &copyable, value_type ev_min, value_type ev_max, unsigned degree)
 Construct the k-th Chebyshev Polynomial approximate. More...
 
template<class ContainerType0 , class ContainerType1 >
void symv (const ContainerType0 &x, ContainerType1 &y)
 

Detailed Description

template<class Matrix, class ContainerType>
struct dg::ModifiedChebyshevPreconditioner< Matrix, ContainerType >

Approximate inverse Chebyshev Polynomial Preconditioner \( A^{-1} = \frac{c_0}{2} I + \sum_{k=1}^{r}c_kT_k( Z)\).

This is the polynomial preconditioner as proposed by Dag and Semlyen, A New Preconditioned Conjugate Gradient Power Flow, IEEE Transactions on power Systems, 18, (2003) We have \( c_k = \sqrt{\lambda_\min\lambda_\max}^{-1} (\sqrt{\lambda_\min/\lambda_\max}-1)^k / (\sqrt{\lambda_\min/\lambda_\max }+ 1)^k\) and \( Z = 2 ( A - (\lambda_\max + \lambda_\min)I/2)/(\lambda_\max-\lambda_\min)\)

They propose to use \( \lambda_\min = \lambda_\max / (5r)\) where r is the degree of the polynomial

Note
This class can be used as a Preconditioner in the CG algorithm. The CG algorithm forms an approximation to the solution in the form \( x_{k+1} = x_0 + P_k(A) r_0\) where \( P_k\) is a polynomial of degree k, which is optimal in minimizing the A-norm. Thus a polynomial preconditioner cannot decrease the number of matrix-vector multiplications needed to achieve a certain accuracy. However, since polynomial preconditioners do not use scalar products they may offset the increased overhead if the dot product becomes a bottleneck for performance or scalability.
Template Parameters
MatrixPreferably a reference type
ContainerType

Member Typedef Documentation

◆ container_type

template<class Matrix , class ContainerType >
using dg::ModifiedChebyshevPreconditioner< Matrix, ContainerType >::container_type = ContainerType

◆ value_type

template<class Matrix , class ContainerType >
using dg::ModifiedChebyshevPreconditioner< Matrix, ContainerType >::value_type = get_value_type<ContainerType>

value type of the ContainerType class

Constructor & Destructor Documentation

◆ ModifiedChebyshevPreconditioner()

template<class Matrix , class ContainerType >
dg::ModifiedChebyshevPreconditioner< Matrix, ContainerType >::ModifiedChebyshevPreconditioner ( Matrix  op,
const ContainerType &  copyable,
value_type  ev_min,
value_type  ev_max,
unsigned  degree 
)
inline

Construct the k-th Chebyshev Polynomial approximate.

Parameters
opThe Matrix (copied, so maybe choose a reference type for shallow copying) will be called as dg::blas2::symv( op, x, y)
copyableA ContainerType must be copy-constructible from this
ev_minan estimate of the minimum Eigenvalue (It is important to get a good value here. The authors propose to use \( \lambda_\min = \lambda_\max / (5r)\) where r is the degree
ev_maxan estimate of the maximum Eigenvalue of \( A\) (must be larger than min_ev) Use EVE to get this value
degreedegree k of the Polynomial (5 should be a good number)

Member Function Documentation

◆ symv()

template<class Matrix , class ContainerType >
template<class ContainerType0 , class ContainerType1 >
void dg::ModifiedChebyshevPreconditioner< Matrix, ContainerType >::symv ( const ContainerType0 &  x,
ContainerType1 &  y 
)
inline

The documentation for this struct was generated from the following file: