LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
|
subroutine dstebz | ( | character | range, |
character | order, | ||
integer | n, | ||
double precision | vl, | ||
double precision | vu, | ||
integer | il, | ||
integer | iu, | ||
double precision | abstol, | ||
double precision, dimension( * ) | d, | ||
double precision, dimension( * ) | e, | ||
integer | m, | ||
integer | nsplit, | ||
double precision, dimension( * ) | w, | ||
integer, dimension( * ) | iblock, | ||
integer, dimension( * ) | isplit, | ||
double precision, dimension( * ) | work, | ||
integer, dimension( * ) | iwork, | ||
integer | info ) |
DSTEBZ
Download DSTEBZ + dependencies [TGZ] [ZIP] [TXT]
!> !> DSTEBZ 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. !> !> 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 , Report CS41, Computer Science Dept., Stanford !> University, July 21, 1966. !>
[in] | RANGE | !> RANGE is CHARACTER*1 !> = 'A': () all eigenvalues will be found. !> = 'V': () all eigenvalues in the half-open interval !> (VL, VU] will be found. !> = 'I': () the IL-th through IU-th eigenvalues (of the !> entire matrix) will be found. !> |
[in] | ORDER | !> ORDER is CHARACTER*1 !> = 'B': () the eigenvalues will be grouped by !> split-off block (see IBLOCK, ISPLIT) and !> ordered from smallest to largest within !> the block. !> = 'E': () !> the eigenvalues for the entire matrix !> will be ordered from smallest to !> largest. !> |
[in] | N | !> N is INTEGER !> The order of the tridiagonal matrix T. N >= 0. !> |
[in] | VL | !> VL is DOUBLE PRECISION !> !> If RANGE='V', the lower bound 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'. !> |
[in] | VU | !> VU is DOUBLE PRECISION !> !> If RANGE='V', the upper bound 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'. !> |
[in] | IL | !> IL is INTEGER !> !> If RANGE='I', the index of the !> smallest eigenvalue to be returned. !> 1 <= IL <= IU <= N, if N > 0; IL = 1 and IU = 0 if N = 0. !> Not referenced if RANGE = 'A' or 'V'. !> |
[in] | IU | !> IU is INTEGER !> !> If RANGE='I', the index of the !> largest eigenvalue to be returned. !> 1 <= IL <= IU <= N, if N > 0; IL = 1 and IU = 0 if N = 0. !> Not referenced if RANGE = 'A' or 'V'. !> |
[in] | ABSTOL | !> ABSTOL is 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. !> |
[in] | D | !> D is DOUBLE PRECISION array, dimension (N) !> The n diagonal elements of the tridiagonal matrix T. !> |
[in] | E | !> E is DOUBLE PRECISION array, dimension (N-1) !> The (n-1) off-diagonal elements of the tridiagonal matrix T. !> |
[out] | M | !> M is INTEGER !> The actual number of eigenvalues found. 0 <= M <= N. !> (See also the description of INFO=2,3.) !> |
[out] | NSPLIT | !> NSPLIT is INTEGER !> The number of diagonal blocks in the matrix T. !> 1 <= NSPLIT <= N. !> |
[out] | W | !> W is 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.) !> |
[out] | IBLOCK | !> IBLOCK is 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. (DSTEBZ may use the remaining N-M elements as !> workspace.) !> |
[out] | ISPLIT | !> ISPLIT is 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.) !> |
[out] | WORK | !> WORK is DOUBLE PRECISION array, dimension (4*N) !> |
[out] | IWORK | !> IWORK is INTEGER array, dimension (3*N) !> |
[out] | INFO | !> INFO is 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 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 , !> recompile, and try again. !> |
!> RELFAC DOUBLE PRECISION, default = 2.0e0 !> The relative tolerance. An interval (a,b] lies within !> if b-a < RELFAC*ulp*max(|a|,|b|), !> where is the machine precision (distance from 1 to !> the next larger floating point number.) !> !> FUDGE DOUBLE PRECISION, default = 2 !> A 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 accuracy of the solution. !>
Definition at line 268 of file dstebz.f.