SSTEDC  -  compute all eigenvalues and, optionally, eigen­
       vectors of a symmetric tridiagonal matrix using the divide
       and conquer method


SYNOPSIS

       SUBROUTINE SSTEDC( COMPZ,  N,  D,  E, Z, LDZ, WORK, LWORK,
                          IWORK, LIWORK, INFO )

           CHARACTER      COMPZ

           INTEGER        INFO, LDZ, LIWORK, LWORK, N

           INTEGER        IWORK( * )

           REAL           D( * ), E( * ), WORK( * ), Z( LDZ, * )


PURPOSE

       SSTEDC computes all eigenvalues and, optionally, eigenvec­
       tors  of  a  symmetric tridiagonal matrix using the divide
       and conquer method. The eigenvectors of  a  full  or  band
       real  symmetric matrix can also be found if SSYTRD or SSP­
       TRD or SSBTRD has been  used  to  reduce  this  matrix  to
       tridiagonal form.

       This code makes very mild assumptions about floating point
       arithmetic. It will work on machines with a guard digit in
       add/subtract,  or  on  those binary machines without guard
       digits which subtract like the Cray X-MP, Cray Y-MP,  Cray
       C-90, or Cray-2.  It could conceivably fail on hexadecimal
       or decimal machines without guard digits, but we  know  of
       none.  See SLAED3 for details.


ARGUMENTS

       COMPZ   (input) CHARACTER*1
               = 'N':  Compute eigenvalues only.
               = 'I':  Compute eigenvectors of tridiagonal matrix
               also.
               = 'V':  Compute  eigenvectors  of  original  dense
               symmetric  matrix  also.  On entry, Z contains the
               orthogonal matrix  used  to  reduce  the  original
               matrix to tridiagonal form.

       N       (input) INTEGER
               The dimension of the symmetric tridiagonal matrix.
               N >= 0.

       D       (input/output) REAL array, dimension (N)
               On entry, the diagonal elements of the tridiagonal
               matrix.   On exit, if INFO = 0, the eigenvalues in
               ascending order.

               On entry, the subdiagonal elements of the tridiag­
               onal matrix.  On exit, E has been destroyed.

       Z       (input/output) REAL array, dimension (LDZ,N)
               On  entry,  if  COMPZ  =  'V', then Z contains the
               orthogonal matrix used in the reduction to  tridi­
               agonal  form.  On exit, if INFO = 0, then if COMPZ
               = 'V', Z contains the orthonormal eigenvectors  of
               the original symmetric matrix, and if COMPZ = 'I',
               Z contains the  orthonormal  eigenvectors  of  the
               symmetric  tridiagonal  matrix.   If  COMPZ = 'N',
               then Z is not referenced.

       LDZ     (input) INTEGER
               The leading dimension of the array Z.  LDZ  >=  1.
               If eigenvectors are desired, then LDZ >= max(1,N).

       WORK    (workspace/output) REAL array,
               dimension (LWORK) On exit, if INFO  =  0,  WORK(1)
               returns the optimal LWORK.

       LWORK   (input) INTEGER
               The  dimension  of the array WORK.  If COMPZ = 'N'
               or N <= 1 then LWORK must be at least 1.  If COMPZ
               =  'V' and N > 1 then LWORK must be at least ( 1 +
               3*N + 2*N*lg N + 3*N**2 ), where lg( N ) =  small­
               est integer k such that 2**k >= N.  If COMPZ = 'I'
               and N > 1 then LWORK must be at least ( 1 + 4*N  +
               N**2 ).

               If  LWORK = -1, then a workspace query is assumed;
               the routine only calculates the  optimal  size  of
               the  WORK  array,  returns this value as the first
               entry of the WORK  array,  and  no  error  message
               related to LWORK is issued by XERBLA.

       IWORK   (workspace/output) INTEGER array, dimension
               (LIWORK)
               On exit, if INFO = 0, IWORK(1) returns the optimal
               LIWORK.

       LIWORK  (input) INTEGER
               The  dimension of the array IWORK.  If COMPZ = 'N'
               or N <= 1 then LIWORK must  be  at  least  1.   If
               COMPZ = 'V' and N > 1 then LIWORK must be at least
               ( 6 + 6*N + 5*N*lg N ).  If COMPZ = 'I' and N >  1
               then LIWORK must be at least ( 3 + 5*N ).

               If LIWORK = -1, then a workspace query is assumed;
               the routine only calculates the  optimal  size  of
               the  IWORK  array, returns this value as the first
               entry of the IWORK array,  and  no  error  message
               related to LIWORK is issued by XERBLA.

               = 0:  successful exit.
               < 0:  if INFO = -i, the i-th argument had an ille­
               gal value.
               > 0:  The algorithm failed to  compute  an  eigen­
               value while working on the submatrix lying in rows
               and columns INFO/(N+1) through mod(INFO,N+1).


FURTHER DETAILS

       Based on contributions by
          Jeff Rutter, Computer Science Division,  University  of
       California
          at Berkeley, USA
       Modified by Francoise Tisseur, University of Tennessee.


Man(1) output converted with man2html