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


SYNOPSIS

       SUBROUTINE DSTEBZ( 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

           DOUBLE         PRECISION ABSTOL, VL, VU

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

           DOUBLE         PRECISION D( * ), E( * ), W( * ), WORK(
                          * )


PURPOSE

       DSTEBZ 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.

               The order of the tridiagonal matrix T.  N >= 0.

       VL      (input) DOUBLE PRECISION
               VU      (input) DOUBLE PRECISION 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) DOUBLE PRECISION
               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*DLAMCH('S'), not zero.

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

       E       (input) DOUBLE PRECISION 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) DOUBLE PRECISION array, dimension (N)
               On exit, the first M elements of  W  will  contain
               the eigenvalues.  (DSTEBZ 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

               specifies  to which block (from 1 to the number of
               blocks) the eigenvalue W(i) belongs.  (DSTEBZ  may
               use the remaining N-M elements as workspace.)

       ISPLIT  (output) INTEGER array, dimension (N)
               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) DOUBLE PRECISION 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  DOUBLE PRECISION, 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

               larger floating point number.)

       FUDGE   DOUBLE PRECISION, default = 2
               A  "fudge  factor"  to widen the Gershgorin inter­
               vals.  Ideally, a value of 1 should work,  but  on
               machines  with sloppy arithmetic, this needs to be
               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