Provided by: scalapack-doc_1.5-10_all bug

NAME

       PSSTEBZ - compute the eigenvalues of a symmetric tridiagonal matrix in parallel

SYNOPSIS

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

           CHARACTER       ORDER, RANGE

           INTEGER         ICTXT, IL, INFO, IU, LIWORK, LWORK, M, N, NSPLIT

           REAL            ABSTOL, VL, VU

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

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

PURPOSE

       PSSTEBZ computes the eigenvalues of a symmetric tridiagonal matrix in parallel.  The  user
       may  ask for all eigenvalues, all eigenvalues in the interval [VL, VU], or the eigenvalues
       indexed IL through IU. A static partitioning of work is done at the beginning  of  PSSTEBZ
       which results in all processes finding an (almost) equal number of eigenvalues.

       NOTE : It is assumed that the user is on an IEEE machine. If the user
              is not on an IEEE mchine, set the compile time flag NO_IEEE
              to 1 (in SLmake.inc). The features of IEEE arithmetic that
              are needed for the "fast" Sturm Count are : (a) infinity
              arithmetic (b) the sign bit of a double precision floating
              point number is assumed be in the 32nd or 64th bit position
              (c) the sign of negative zero.

       See  W.  Kahan  "Accurate  Eigenvalues  of  a  Symmetric Tridiagonal Matrix", Report CS41,
       Computer Science Dept., Stanford
       University, July 21, 1966.

ARGUMENTS

       ICTXT   (global input) INTEGER
               The BLACS context handle.

       RANGE   (global input) CHARACTER
               Specifies which eigenvalues are to be found.  =  'A':  ("All")    all  eigenvalues
               will be found.
               =  'V':  ("Value") all eigenvalues in the interval [VL, VU] will be found.  = 'I':
               ("Index") the IL-th through IU-th eigenvalues  (of  the  entire  matrix)  will  be
               found.

       ORDER   (global input) CHARACTER
               Specifies the order in which the eigenvalues and their block numbers are stored in
               W and IBLOCK.  = '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.

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

       VL      (global input) REAL
               If  RANGE='V',  the  lower  bound  of the interval to be searched for eigenvalues.
               Eigenvalues less than VL will not be returned.  Not  referenced  if  RANGE='A'  or
               'I'.

       VU      (global input) REAL
               If  RANGE='V',  the  upper  bound  of the interval to be searched for eigenvalues.
               Eigenvalues greater than VU will not be returned.  VU must  be  greater  than  VL.
               Not referenced if RANGE='A' or 'I'.

       IL      (global input) INTEGER
               If  RANGE='I',  the index (from smallest to largest) of the smallest eigenvalue to
               be returned.  IL must be at least 1.  Not referenced if RANGE='A' or 'V'.

       IU      (global input) INTEGER
               If RANGE='I', the index (from smallest to largest) of the largest eigenvalue to be
               returned.   IU  must  be  at  least  IL  and no greater than N.  Not referenced if
               RANGE='A' or 'V'.

       ABSTOL  (global 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 the underflow threshold  SLAMCH('U'),  not  zero.
               Note  : If eigenvectors are desired later by inverse iteration ( PSSTEIN ), ABSTOL
               should be set to 2*PSLAMCH('S').

       D       (global input) REAL array, dimension (N)
               The n diagonal elements of the tridiagonal  matrix  T.   To  avoid  overflow,  the
               matrix must be scaled so that its largest entry 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.

       E       (global input) REAL array, dimension (N-1)
               The  (n-1)  off-diagonal elements of the tridiagonal matrix T.  To avoid overflow,
               the matrix  must  be  scaled  so  that  its  largest  entry  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.

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

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

       W       (global output) REAL array, dimension (N)
               On exit, the first M elements of W contain the eigenvalues on all processes.

       IBLOCK  (global 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 IBLOCK(i) specifies which block (from
               1  to  the  number  of  blocks)  the  eigenvalue  W(i)  belongs to.  NOTE:  in the
               (theoretically impossible) event that bisection does not converge for some or  all
               eigenvalues,  INFO is set to 1 and the ones for which it did not are identified by
               a negative block number.

       ISPLIT  (global 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    (local workspace) REAL array, dimension ( MAX( 5*N, 7 ) )

       LWORK   (local input) INTEGER
               size  of  array  WORK must be >= MAX( 5*N, 7 ) If LWORK = -1, then LWORK is global
               input and a workspace query is assumed; the routine only  calculates  the  minimum
               and  optimal  size  for  all  work arrays. Each of these values is returned in the
               first entry of the corresponding work array, and no error  message  is  issued  by
               PXERBLA.

       IWORK   (local workspace) INTEGER array, dimension ( MAX( 4*N, 14 ) )

       LIWORK  (local input) INTEGER
               size  of array IWORK must be >= MAX( 4*N, 14, NPROCS ) If LIWORK = -1, then LIWORK
               is global input and a workspace query is assumed; the routine only calculates  the
               minimum  and optimal size for all work arrays. Each of these values is returned in
               the first entry of the corresponding work array, and no error message is issued by
               PXERBLA.

       INFO    (global output) INTEGER
               = 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  :  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
               arithmetic which is less accurate than PSLAMCH says.  = 2 : There  is  a  mismatch
               between the number of eigenvalues output and the number desired.  = 3 : RANGE='i',
               and the Gershgorin interval initially used  was  incorrect.  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.0
               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.0
               A "fudge factor" to widen the Gershgorin intervals.  Ideally, a value of 1  should
               work,  but  on  machines  with  sloppy  arithmetic,  this needs to be larger.  The
               default for publicly released versions should be large enough to handle the  worst
               machine around.  Note that this has no effect on the accuracy of the solution.