sstebz - compute the eigenvalues of a symmetric tridiagonal matrix T
SUBROUTINE SSTEBZ( RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL, D, E, M, * NSPLIT, W, IBLOCK, ISPLIT, WORK, IWORK, INFO) CHARACTER * 1 RANGE, ORDER INTEGER N, IL, IU, M, NSPLIT, INFO INTEGER IBLOCK(*), ISPLIT(*), IWORK(*) REAL VL, VU, ABSTOL REAL D(*), E(*), W(*), WORK(*)
SUBROUTINE SSTEBZ_64( RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL, D, E, * M, NSPLIT, W, IBLOCK, ISPLIT, WORK, IWORK, INFO) CHARACTER * 1 RANGE, ORDER INTEGER*8 N, IL, IU, M, NSPLIT, INFO INTEGER*8 IBLOCK(*), ISPLIT(*), IWORK(*) REAL VL, VU, ABSTOL REAL D(*), E(*), W(*), WORK(*)
SUBROUTINE STEBZ( RANGE, ORDER, [N], VL, VU, IL, IU, ABSTOL, D, E, * M, NSPLIT, W, IBLOCK, ISPLIT, [WORK], [IWORK], [INFO]) CHARACTER(LEN=1) :: RANGE, ORDER INTEGER :: N, IL, IU, M, NSPLIT, INFO INTEGER, DIMENSION(:) :: IBLOCK, ISPLIT, IWORK REAL :: VL, VU, ABSTOL REAL, DIMENSION(:) :: D, E, W, WORK
SUBROUTINE STEBZ_64( RANGE, ORDER, [N], VL, VU, IL, IU, ABSTOL, D, * E, M, NSPLIT, W, IBLOCK, ISPLIT, [WORK], [IWORK], [INFO]) CHARACTER(LEN=1) :: RANGE, ORDER INTEGER(8) :: N, IL, IU, M, NSPLIT, INFO INTEGER(8), DIMENSION(:) :: IBLOCK, ISPLIT, IWORK REAL :: VL, VU, ABSTOL REAL, DIMENSION(:) :: D, E, W, WORK
#include <sunperf.h>
void sstebz(char range, char order, int n, float vl, float vu, int il, int iu, float abstol, float *d, float *e, int *m, int *nsplit, float *w, int *iblock, int *isplit, int *info);
void sstebz_64(char range, char order, long n, float vl, float vu, long il, long iu, float abstol, float *d, float *e, long *m, long *nsplit, float *w, long *iblock, long *isplit, long *info);
sstebz computes the eigenvalues of a symmetric tridiagonal matrix T. The user may ask for all eigenvalues, all eigenvalues in the half-open interval (VL, VU], or the IL-th through IU-th eigenvalues.
To avoid overflow, the matrix must be scaled so that its
largest element is no greater than overflow**(1/2) *
underflow**(1/4) in absolute value, and for greatest
accuracy, it should not be much smaller than that.
See W. Kahan ``Accurate Eigenvalues of a Symmetric Tridiagonal Matrix'', Report CS41, Computer Science Dept., Stanford
University, July 21, 1966.
= 'A': ("All") all eigenvalues will be found.
= 'V': ("Value") all eigenvalues in the half-open interval (VL, VU] will be found. = 'I': ("Index") the IL-th through IU-th eigenvalues (of the entire matrix) will be found.
= 'B': ("By Block") the eigenvalues will be grouped by split-off block (see IBLOCK, ISPLIT) and ordered from smallest to largest within the block. = 'E': ("Entire matrix") the eigenvalues for the entire matrix will be ordered from smallest to largest.
Eigenvalues will be computed most accurately when ABSTOL is set to twice the underflow threshold 2*SLAMCH('S'), not zero.
E(j)
is zero or small, the
matrix T is considered to split into a block diagonal
matrix. On exit, if INFO = 0, IBLOCK(i)
specifies to which
block (from 1 to the number of blocks) the eigenvalue W(i)
belongs. (SSTEBZ may use the remaining N-M elements as
workspace.)
ISPLIT(NSPLIT)
=N.
(Only the first NSPLIT elements will actually be used, but
since the user cannot know a priori what value NSPLIT will
have, N words must be reserved for ISPLIT.)
dimension(4*N)
dimension(3*N)
= 0: successful exit
< 0: if INFO = -i, the i-th argument had an illegal value
> 0: some or all of the eigenvalues failed to converge or
were not computed:
=1 or 3: Bisection failed to converge for some eigenvalues; these eigenvalues are flagged by a negative block number. The effect is that the eigenvalues may not be as accurate as the absolute and relative tolerances. This is generally caused by unexpectedly inaccurate arithmetic. =2 or 3: RANGE ='I' only: Not all of the eigenvalues IL:IU were found.
Effect: M < IU+1-IL
Cause: non-monotonic arithmetic, causing the Sturm sequence to be non-monotonic. Cure: recalculate, using RANGE ='A', and pick
out eigenvalues IL:IU. = 4: RANGE ='I', and the Gershgorin interval initially used was too small. No eigenvalues were computed.