SSTEBZ(l)		LAPACK routine (version	1.1)		    SSTEBZ(l)

NAME
  SSTEBZ - compute the eigenvalues of a	symmetric tridiagonal 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	eigenvalues in the half-open interval
  (VL, VU], or the IL-th through IU-th eigenvalues.

  See W. Kahan "Accurate Eigenvalues of	a Symmetric Tridiagonal	Matrix",
  Report CS41, Computer	Science	Dept., Stanford
  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 eigen-
	  values (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 smallest to largest.

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

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

  VU	  (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	  (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	  (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  (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.

  D	  (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	  (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	  (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,
	  IBLOCK(i) specifies which block (from	1 to the number	of blocks)
	  the eigenvalue W(i) belongs to.  (SSTEBZ 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) 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 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.  In some cases, increasing the	PARAMETER
	  "FUDGE" may make things work.	 = 4:	 RANGE='I', and	the Gershgo-
	  rin 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 intervals.  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.


Back to the listing of computational routines for eigenvalue problems