XLPack 7.0
XLPack Numerical Library (C API) Reference Manual
Loading...
Searching...
No Matches

◆ zheevx()

void zheevx ( char  jobz,
char  range,
char  uplo,
int  n,
int  lda,
doublecomplex  a[],
double  vl,
double  vu,
int  il,
int  iu,
double  abstol,
int *  m,
double  w[],
int  ldz,
doublecomplex  z[],
doublecomplex  work[],
int  lwork,
double  rwork[],
int  iwork[],
int  ifail[],
int *  info 
)

(Expert driver) Eigenvalues and eigenvectors of a Hermitian matrix

Purpose
This routine computes all or selected eigenvalues and, optionally, eigenvectors of a Hermitian matrix A. Eigenvalues and eigenvectors can be selected by specifying either a range of values or a range of indices for the desired eigenvalues.
If all eigenvalues and eigenvectors are desired, it uses a QL or QR method. If selected eigenvalues and eigenvectors are desired, it uses a bisection and inverse iteration method.
Parameters
[in]jobz= 'N': Compute eigenvalues only.
= 'V': Compute eigenvalues and eigenvectors.
[in]range= 'A': All eigenvalues will be found.
= 'V': All eigenvalues in the half-open interval (vl, vu] will be found.
= 'I': The il-th through iu-th eigenvalues will be found.
[in]uplo= 'U': Upper triangle of A is stored.
= 'L': Lower triangle of A is stored.
[in]nOrder of the matrix A. (n >= 0) (If n = 0, returns without computation)
[in]ldaLeading dimension of the two dimensional array a[][]. (lda >= max(1, n))
[in,out]a[][]Array a[la][lda] (la >= n)
[in] The Hermitian matrix A. If uplo = 'U', the leading n x n upper triangular part of a[][] contains the upper triangular part of the matrix A. If uplo = 'L', the leading n x n lower triangular part of a[][] contains the lower triangular part of the matrix A.
[out] The lower triangle (if uplo = 'L') or the upper triangle (if uplo = 'U') of a[][], including the diagonal, is destroyed.
[in]vlrange = 'V': The lower bound of the interval to be searched for eigenvalues. (vl < vu)
range = 'A' or 'I': Not referenced.
[in]vurange = 'V': The upper bound of the interval to be searched for eigenvalues. (vl < vu)
range = 'A' or 'I': Not referenced.
[in]ilrange = 'I': The index of the smallest eigenvalue to be returned. (1 <= il <= iu <= n, if n > 0; il = 1 and iu = 0 if n = 0)
range = 'A' or 'V': Not referenced.
[in]iurange = 'I': The index of the largest eigenvalues to be returned. (1 <= il <= iu <= n, if n > 0; il = 1 and iu = 0 if n = 0)
range = 'A' or 'V': Not referenced.
[in]abstolThe absolute error tolerance for the eigenvalues.
An approximate eigenvalue is accepted as converged when it is determined to lie in an interval [a, b] of width less than or equal to abstol + eps * max(|a|, |b|), where eps is the machine precision. If abstol is less than or equal to zero, then eps*|T| will be used in its place, where |T| is the 1-norm of the tridiagonal matrix obtained by reducing A to tridiagonal form.
Eigenvalues will be computed most accurately when abstol is set to twice the underflow threshold 2*dlamch('S'), not zero. If this routine returns with info > 0, indicating that some eigenvectors did not converge, try setting abstol to 2*dlamch('S').
See "Computing Small Singular Values of Bidiagonal Matrices with Guaranteed High Relative Accuracy," by Demmel and Kahan, LAPACK Working Note #3.
[out]mThe total number of eigenvalues found. (0 <= m <= n)
If range = 'A', m = n, and if range = 'I', m = iu - il + 1.
[out]w[]Array w[lw] (lw >= n)
On normal exit, the first m elements contain the selected eigenvalues in ascending order.
[in]ldzLeading dimension of the two dimensional array z[][]. (ldz >= 1 if jobz = 'N', ldz >= max(1, n) if jobz = 'V')
[out]z[][]Array z[lz][ldz] (lz >= max(1, m))
jobz = 'V': If info = 0, the first m rows of z[][] contain the orthonormal eigenvectors of the matrix A corresponding to the selected eigenvalues, with the i-th row of z[][] holding the eigenvector associated with w[i]. If an eigenvector fails to converge, then that row of z[][] contains the latest approximation to the eigenvector, and the index of the eigenvector is returned in ifail[].
jobz = 'N': z[][] is not referenced.
Note: The user must ensure that at least max(1, m) rows are supplied in the array z[][]; if range = 'V', the exact value of m is not known in advance and an upper bound must be used.
[out]work[]Array work[lwork]
Work array.
On exit, if info = 0, work[0] returns the optimal lwork.
[in]lworkThe size of work[]. (lwork >= 1 when n <= 1, lwork >= 2*n otherwise)
For optimal efficiency, lwork >= (nb + 1)*n, where nb is the optimal blocksize.
If lwork = -1, then a workspace query is assumed. The routine only calculates the optimal size of the work[] array, and returns the value in work[0].
[out]rwork[]Array rwork[lrwork] (lrwork >= 7*n)
Work array.
[out]iwork[]Array iwork[liwork] (liwork >= 5*n)
Work array.
[out]ifail[]Array ifail[lifail] (lifail >= n)
jobz = 'V': If info = 0, the first m elements of ifail[] are zero. If info > 0, then ifail[] contains the indices of the eigenvectors that failed to converge.
jobz = 'N': ifail[] is not referenced.
[out]info= 0: Successful exit
= -1: The argument jobz had an illegal value (jobz != 'V' nor 'N')
= -2: The argument range had an illegal value (range != 'A', 'V' nor 'I')
= -3: The argument uplo had an illegal value (uplo != 'U' nor 'L')
= -4: The argument n had an illegal value (n < 0)
= -5: The argument lda had an illegal value (lda < max(1, n))
= -8: The argument vu had an illegal value (vu <= vl)
= -9: The argument il had an illegal value (il < 1 or il > n)
= -10: The argument iu had an illegal value (iu < min(n, il) or iu > n)
= -14: The argument ldz had an illegal value (ldz too small)
= -17: The argument lwork had an illegal value (lwork too small)
= i > 0: i eigenvectors failed to converge. Their indices are stored in array ifail[]
Reference
LAPACK