Purpose
=======
LA_STEVX computes selected eigenvalues and, optionally, the
corresponding eigenvectors of a real symmetric tridiagonal matrix A.
Eigenvalues and eigenvectors can be selected by specifying either a
range of values or a range of indices for the desired eigenvalues.
=========
SUBROUTINE LA_STEVX( D, E, W, Z=z, VL=vl, VU=vu, &
IL=il, IU=iu, M=m, IFAIL=ifail, &
ABSTOL=abstol, INFO=info )
REAL(), INTENT(INOUT) :: D(:), E(:)
REAL(), INTENT(OUT) :: W(:)
REAL(), INTENT(OUT), OPTIONAL :: Z(:,:)
REAL(), INTENT(IN), OPTIONAL :: VL, VU
INTEGER, INTENT(IN), OPTIONAL :: IL, IU
INTEGER, INTENT(OUT), OPTIONAL :: M
INTEGER, INTENT(OUT), OPTIONAL :: IFAIL(:)
REAL(), INTENT(IN), OPTIONAL :: ABSTOL
INTEGER, INTENT(OUT), OPTIONAL :: INFO
where
::= KIND(1.0) | KIND(1.0D0)
Arguments
=========
D (input/output) REAL array, shape (:) with size(D) = n, where n
is the order of A.
On entry, the diagonal elements of the matrix A.
On exit, the original contents of D possibly multiplied by a
constant factor to avoid over/underflow in computing the
eigenvalues.
E (input/output) REAL array, shape (:) with size(E) = n.
On entry, the n-1 subdiagonal elements of A in E(1) to E(n-1).
E(n) need not be set.
On exit, the original contents of E possibly multiplied by a
constant factor to avoid over/underflow in computing the
eigenvalues.
W (output) REAL array with size(W) = n.
The first M elements contain the selected eigenvalues in
ascending order.
Z Optional (output) REAL or COMPLEX array, shape (:,:) with
size(Z,1) = n and size(Z,2) = M.
The first M columns of Z contain the orthonormal eigenvectors
of A corresponding to the selected eigenvalues, with the i-th
column of Z containing the eigenvector associated with the
eigenvalue in W(i) . If an eigenvector fails to converge, then
that column of Z contains the latest approximation to the
eigenvector, and the index of the eigenvector is returned in
IFAIL.
Note: The user must ensure that at least M columns are
supplied in the array Z. When the exact value of M is not
known in advance, an upper bound must be used. In all cases
M <= n.
VL,VU Optional (input) REAL.
The lower and upper bounds of the interval to be searched for
eigenvalues. VL < VU.
default values: VL = -HUGE() and VU = HUGE(), where
::= KIND(1.0) | KIND(1.0D0).
Note: Neither VL nor VU may be present if IL and/or IU is
present.
IL,IU Optional (input) INTEGER.
The indices of the smallest and largest eigenvalues to be
returned. The IL-th through IU-th eigenvalues will be found.
1 <= IL <= IU <= n.
Default values: IL = 1 and IU = n.
Note: Neither IL nor IU may be present if VL and/or VU is
present.
Note: All eigenvalues are calculated if none of the arguments
VL, VU, IL and IU are present.
M Optional (output) INTEGER.
The total number of eigenvalues found. 0 <= M <= n.
Note: If IL and IU are present then M = IU - IL + 1.
IFAIL Optional (output) INTEGER array, shape (:) with
size(IFAIL) = n.
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.
Note: If Z is present then IFAIL should also be present.
ABSTOL Optional (input) REAL.
The 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 + EPSILON(1.0_) * max(|a|,|b|),
where is the working precision. If ABSTOL <= 0, then
EPSILON(1.0_) * ||A||1 will be used in its place.
Eigenvalues will be computed most accurately when ABSTOL is
set to twice the underflow threshold
2 * LA_LAMCH(1.0_, 'Save minimum'), not zero.
Default value: 0.0_.
Note: If this routine returns with INFO > 0, then some
eigenvectors did not converge. Try setting ABSTOL to
2 * LA_LAMCH(1.0_, 'Save minimum').
INFO Optional (output) INTEGER
= 0: successful exit.
< 0: if INFO = -i, the i-th argument had an illegal value.
> 0: if INFO = i, then i eigenvectors failed to converge.
Their indices are stored in array IFAIL.
If INFO is not present and an error occurs, then the program
is terminated with an error message.