Hermitian tridiagonal eigensolvers

Implementation

Elemental provides a collection of routines for both full and partial solutions of the Hermitian eigenvalue problem

\[T Z = Z \Lambda,\]

where T is a given Hermitian tridiagonal matrix, and unitary Z and real diagonal \(\Lambda\) are sought.

Note that the tridiagonal matrix is defined via its real main diagonal, d, and (possibly complex) subdiagonal, dSub.

Computing eigenvalues

Compute the set of eigenvalues of the Hermitian tridiagonal matrix T determined by the subset structure (the default is to compute all eigenvalues).

C++ API

void HermitianTridiagEig(Matrix<Base<F>> &d, Matrix<F> &dSub, Matrix<Base<F>> &w, SortType sort = ASCENDING, const HermitianEigSubset<Base<F>> subset = HermitianEigSubset<Base<F>>())
void HermitianTridiagEig(const AbstractDistMatrix<Base<F>> &d, const AbstractDistMatrix<F> &dSub, AbstractDistMatrix<Base<F>> &w, SortType sort = ASCENDING, const HermitianEigSubset<Base<F>> subset = HermitianEigSubset<Base<F>>())

C API

ElError ElHermitianTridiagEig_s(ElMatrix_s d, ElMatrix_s dSub, ElMatrix_s w, ElSortType sort)
ElError ElHermitianTridiagEig_d(ElMatrix_d d, ElMatrix_d dSub, ElMatrix_d w, ElSortType sort)
ElError ElHermitianTridiagEig_c(ElMatrix_s d, ElMatrix_c dSub, ElMatrix_s w, ElSortType sort)
ElError ElHermitianTridiagEig_z(ElMatrix_d d, ElMatrix_z dSub, ElMatrix_d w, ElSortType sort)
ElError ElHermitianTridiagEigDist_s(ElConstDistMatrix_s d, ElConstDistMatrix_s dSub, ElDistMatrix_s w, ElSortType sort)
ElError ElHermitianTridiagEigDist_d(ElConstDistMatrix_d d, ElConstDistMatrix_d dSub, ElDistMatrix_d w, ElSortType sort)
ElError ElHermitianTridiagEigDist_c(ElConstDistMatrix_s d, ElConstDistMatrix_c dSub, ElDistMatrix_s w, ElSortType sort)
ElError ElHermitianTridiagEigDist_z(ElConstDistMatrix_d d, ElConstDistMatrix_z dSub, ElDistMatrix_d w, ElSortType sort)

Return the full set of eigenvalues

ElError ElHermitianTridiagEigPartial_s(ElMatrix_s d, ElMatrix_s dSub, ElMatrix_s w, ElSortType sort, ElHermitianEigSubset_s subset)
ElError ElHermitianTridiagEigPartial_d(ElMatrix_d d, ElMatrix_d dSub, ElMatrix_d w, ElSortType sort, ElHermitianEigSubset_d subset)
ElError ElHermitianTridiagEigPartial_c(ElMatrix_s d, ElMatrix_c dSub, ElMatrix_s w, ElSortType sort, ElHermitianEigSubset_s subset)
ElError ElHermitianTridiagEigPartial_z(ElMatrix_d d, ElMatrix_z dSub, ElMatrix_d w, ElSortType sort, ElHermitianEigSubset_d subset)
ElError ElHermitianTridiagEigPartialDist_s(ElConstDistMatrix_s d, ElConstDistMatrix_s dSub, ElDistMatrix_s w, ElSortType sort, ElHermitianEigSubset_s subset)
ElError ElHermitianTridiagEigPartialDist_d(ElConstDistMatrix_d d, ElConstDistMatrix_d dSub, ElDistMatrix_d w, ElSortType sort, ElHermitianEigSubset_d subset)
ElError ElHermitianTridiagEigPartialDist_c(ElConstDistMatrix_s d, ElConstDistMatrix_c dSub, ElDistMatrix_s w, ElSortType sort, ElHermitianEigSubset_s subset)
ElError ElHermitianTridiagEigPartialDist_z(ElConstDistMatrix_d d, ElConstDistMatrix_z dSub, ElDistMatrix_d w, ElSortType sort, ElHermitianEigSubset_d subset)

Return a subset of the eigenvalues

Computing eigenpairs

Compute the set of eigenpairs of the Hermitian tridiagonal matrix T determined by the subset structure (the default is to compute all eigenpairs) via PMRRR.

C++ API

void HermitianTridiagEig(Matrix<Base<F>> &d, Matrix<F> &dSub, Matrix<Base<F>> &w, Matrix<F> &Z, SortType sort = ASCENDING, const HermitianEigSubset<Base<F>> subset = HermitianEigSubset<Base<F>>())
void HermitianTridiagEig(const AbstractDistMatrix<Base<F>> &d, const AbstractDistMatrix<F> &dSub, AbstractDistMatrix<Base<F>> &w, AbstractDistMatrix<F> &Z, SortType sort = ASCENDING, const HermitianEigSubset<Base<F>> subset = HermitianEigSubset<Base<F>>())

C API

ElError ElHermitianTridiagEigPair_s(ElMatrix_s d, ElMatrix_s dSub, ElMatrix_s w, ElMatrix_s Z, ElSortType sort)
ElError ElHermitianTridiagEigPair_d(ElMatrix_d d, ElMatrix_d dSub, ElMatrix_d w, ElMatrix_d Z, ElSortType sort)
ElError ElHermitianTridiagEigPair_c(ElMatrix_s d, ElMatrix_c dSub, ElMatrix_s w, ElMatrix_c Z, ElSortType sort)
ElError ElHermitianTridiagEigPair_z(ElMatrix_d d, ElMatrix_z dSub, ElMatrix_d w, ElMatrix_z Z, ElSortType sort)
ElError ElHermitianTridiagEigPairDist_s(ElConstDistMatrix_s d, ElConstDistMatrix_s dSub, ElDistMatrix_s w, ElDistMatrix_s Z, ElSortType sort)
ElError ElHermitianTridiagEigPairDist_d(ElConstDistMatrix_d d, ElConstDistMatrix_d dSub, ElDistMatrix_d w, ElDistMatrix_d Z, ElSortType sort)
ElError ElHermitianTridiagEigPairDist_c(ElConstDistMatrix_s d, ElConstDistMatrix_c dSub, ElDistMatrix_s w, ElDistMatrix_c Z, ElSortType sort)
ElError ElHermitianTridiagEigPairDist_z(ElConstDistMatrix_d d, ElConstDistMatrix_z dSub, ElDistMatrix_d w, ElDistMatrix_z Z, ElSortType sort)

Return the full set of eigenvalues

ElError ElHermitianTridiagEigPairPartial_s(ElMatrix_s d, ElMatrix_s dSub, ElMatrix_s w, ElMatrix_s Z, ElSortType sort, ElHermitianEigSubset_s subset)
ElError ElHermitianTridiagEigPairPartial_d(ElMatrix_d d, ElMatrix_d dSub, ElMatrix_d w, ElMatrix_d Z, ElSortType sort, ElHermitianEigSubset_d subset)
ElError ElHermitianTridiagEigPairPartial_c(ElMatrix_s d, ElMatrix_c dSub, ElMatrix_s w, ElMatrix_c Z, ElSortType sort, ElHermitianEigSubset_s subset)
ElError ElHermitianTridiagEigPairPartial_z(ElMatrix_d d, ElMatrix_z dSub, ElMatrix_d w, ElMatrix_z Z, ElSortType sort, ElHermitianEigSubset_d subset)
ElError ElHermitianTridiagEigPairPartialDist_s(ElConstDistMatrix_s d, ElConstDistMatrix_s dSub, ElDistMatrix_s w, ElDistMatrix_s Z, ElSortType sort, ElHermitianEigSubset_s subset)
ElError ElHermitianTridiagEigPairPartialDist_d(ElConstDistMatrix_d d, ElConstDistMatrix_d dSub, ElDistMatrix_d w, ElDistMatrix_d Z, ElSortType sort, ElHermitianEigSubset_d subset)
ElError ElHermitianTridiagEigPairPartialDist_c(ElConstDistMatrix_s d, ElConstDistMatrix_c dSub, ElDistMatrix_s w, ElDistMatrix_c Z, ElSortType sort, ElHermitianEigSubset_s subset)
ElError ElHermitianTridiagEigPairPartialDist_z(ElConstDistMatrix_d d, ElConstDistMatrix_z dSub, ElDistMatrix_d w, ElDistMatrix_z Z, ElSortType sort, ElHermitianEigSubset_d subset)

Return a subset of the eigenvalues

Subset computation

The HermitianEigSubset<Real> structure is used to control subset computation, and, when not explicitly manipulated, defaults to a request for the entire set of eigenvalues or eigenpairs.

C++ API

template<>
type HermitianEigSubset<Real>
bool indexSubset
Int lowerIndex
Int upperIndex

If indexSubset is true, then the eigenvalues/pairs with indices (inclusively) between lowerIndex and upperIndex will be found.

bool rangeSubset
Real lowerBound
Real upperBound

Alternatively, if rangeSubset is true, then the eigenvalues/pairs within the numerical range \((lowerBound,upperBound]\) will be found.

template<>
type HermitianEigSubset<Base<F>>

A particular case where the datatype is the base of the potentially complex type F.

C API

HermitianEigSubset_s
bool indexSubset
Int lowerIndex
Int upperIndex

If indexSubset is true, then the eigenvalues/pairs with indices (inclusively) between lowerIndex and upperIndex will be found.

bool rangeSubset
float lowerBound
float upperBound

Alternatively, if rangeSubset is true, then the eigenvalues/pairs within the numerical range \((lowerBound,upperBound]\) will be found.

HermitianEigSubset_d
bool indexSubset
Int lowerIndex
Int upperIndex

If indexSubset is true, then the eigenvalues/pairs with indices (inclusively) between lowerIndex and upperIndex will be found.

bool rangeSubset
double lowerBound
double upperBound

Alternatively, if rangeSubset is true, then the eigenvalues/pairs within the numerical range \((lowerBound,upperBound]\) will be found.