SSTEBZ  - compute the eigenvalues of a symmetric tridiago­
       nal matrix T


SYNOPSIS

       SUBROUTINE SSTEBZ( RANGE,  ORDER,  N,  VL,  VU,  IL,   IU,
                          ABSTOL,  D,  E,  M,  NSPLIT, W, IBLOCK,
                          ISPLIT, WORK, IWORK, INFO )

           CHARACTER      ORDER, RANGE

           INTEGER        IL, INFO, IU, M, N, NSPLIT

           REAL           ABSTOL, VL, VU

           INTEGER        IBLOCK( * ), ISPLIT( * ), IWORK( * )

           REAL           D( * ), E( * ), W( * ), WORK( * )


PURPOSE

       SSTEBZ computes the eigenvalues of a symmetric tridiagonal
       matrix T. The user may ask for all eigenvalues, all eigen­
       values 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 Tridiag­
       onal Matrix", Report CS41, Computer Science  Dept.,  Stan­
       ford
       University, July 21, 1966.


ARGUMENTS

       RANGE   (input) CHARACTER
               = '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.

       ORDER   (input) CHARACTER
               =  '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  small­
               est to largest.

       N       (input) INTEGER
               The order of the tridiagonal matrix T.  N >= 0.

               VU       (input)  REAL If RANGE='V', the lower and
               upper bounds of the interval to  be  searched  for
               eigenvalues.   Eigenvalues  less  than or equal to
               VL, or greater than VU, will not be returned.   VL
               < VU.  Not referenced if RANGE = 'A' or 'I'.

       IL      (input) INTEGER
               IU       (input) INTEGER If RANGE='I', the indices
               (in ascending order) of the smallest  and  largest
               eigenvalues  to  be returned.  1 <= IL <= IU <= N,
               if N > 0; IL = 1 and IU = 0 if N = 0.  Not  refer­
               enced if RANGE = 'A' or 'V'.

       ABSTOL  (input) REAL
               The  absolute  tolerance  for the eigenvalues.  An
               eigenvalue  (or  cluster)  is  considered  to   be
               located  if  it  has  been determined to lie in an
               interval whose width is ABSTOL or less.  If ABSTOL
               is  less  than or equal to zero, then ULP*|T| will
               be used, where |T| means the 1-norm of T.

               Eigenvalues will be computed most accurately  when
               ABSTOL  is  set  to  twice the underflow threshold
               2*SLAMCH('S'), not zero.

       D       (input) REAL array, dimension (N)
               The n diagonal elements of the tridiagonal  matrix
               T.

       E       (input) REAL array, dimension (N-1)
               The (n-1) off-diagonal elements of the tridiagonal
               matrix T.

       M       (output) INTEGER
               The actual number of eigenvalues found. 0 <= M  <=
               N.  (See also the description of INFO=2,3.)

       NSPLIT  (output) INTEGER
               The  number of diagonal blocks in the matrix T.  1
               <= NSPLIT <= N.

       W       (output) REAL array, dimension (N)
               On exit, the first M elements of  W  will  contain
               the eigenvalues.  (SSTEBZ may use the remaining N-
               M elements as workspace.)

       IBLOCK  (output) INTEGER array, dimension (N)
               At each row/column j where 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.)

               The  splitting  points,  at which T breaks up into
               submatrices.   The  first  submatrix  consists  of
               rows/columns   1   to  ISPLIT(1),  the  second  of
               rows/columns ISPLIT(1)+1 through ISPLIT(2),  etc.,
               and   the   NSPLIT-th   consists  of  rows/columns
               ISPLIT(NSPLIT-1)+1    through    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.)

       WORK    (workspace) REAL array, dimension (4*N)

       IWORK   (workspace) INTEGER array, dimension (3*N)

       INFO    (output) INTEGER
               = 0:  successful exit
               < 0:  if INFO = -i, the i-th argument had an ille­
               gal 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.  In some cases,  increasing
               the  PARAMETER "FUDGE" may make things work.  = 4:
               RANGE='I', and the Gershgorin  interval  initially
               used was too small.  No eigenvalues were computed.
               Probable cause: your machine has sloppy  floating-
               point  arithmetic.   Cure:  Increase the PARAMETER
               "FUDGE", recompile, and try again.


PARAMETERS

       RELFAC  REAL, default = 2.0e0
               The relative tolerance.  An  interval  (a,b]  lies
               within    "relative    tolerance"    if    b-a   <
               RELFAC*ulp*max(|a|,|b|),  where   "ulp"   is   the
               machine  precision  (distance  from  1 to the next
               larger floating point number.)

       FUDGE   REAL, default = 2
               A "fudge factor" to widen  the  Gershgorin  inter­
               vals.   Ideally,  a value of 1 should work, but on

               larger.   The  default  for publicly released ver­
               sions should be large enough to handle  the  worst
               machine  around.   Note that this has no effect on
               accuracy of the solution.


Man(1) output converted with man2html