LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
|
subroutine dlarre | ( | character | range, |
integer | n, | ||
double precision | vl, | ||
double precision | vu, | ||
integer | il, | ||
integer | iu, | ||
double precision, dimension( * ) | d, | ||
double precision, dimension( * ) | e, | ||
double precision, dimension( * ) | e2, | ||
double precision | rtol1, | ||
double precision | rtol2, | ||
double precision | spltol, | ||
integer | nsplit, | ||
integer, dimension( * ) | isplit, | ||
integer | m, | ||
double precision, dimension( * ) | w, | ||
double precision, dimension( * ) | werr, | ||
double precision, dimension( * ) | wgap, | ||
integer, dimension( * ) | iblock, | ||
integer, dimension( * ) | indexw, | ||
double precision, dimension( * ) | gers, | ||
double precision | pivmin, | ||
double precision, dimension( * ) | work, | ||
integer, dimension( * ) | iwork, | ||
integer | info ) |
DLARRE given the tridiagonal matrix T, sets small off-diagonal elements to zero and for each unreduced block Ti, finds base representations and eigenvalues.
Download DLARRE + dependencies [TGZ] [ZIP] [TXT]
!> !> To find the desired eigenvalues of a given real symmetric !> tridiagonal matrix T, DLARRE sets any off-diagonal !> elements to zero, and for each unreduced block T_i, it finds !> (a) a suitable shift at one end of the block's spectrum, !> (b) the base representation, T_i - sigma_i I = L_i D_i L_i^T, and !> (c) eigenvalues of each L_i D_i L_i^T. !> The representations and eigenvalues found are then used by !> DSTEMR to compute the eigenvectors of T. !> The accuracy varies depending on whether bisection is used to !> find a few eigenvalues or the dqds algorithm (subroutine DLASQ2) to !> compute all and then discard any unwanted one. !> As an added benefit, DLARRE also outputs the n !> Gerschgorin intervals for the matrices L_i D_i L_i^T. !>
[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] | N | !> N is INTEGER !> The order of the matrix. N > 0. !> |
[in,out] | VL | !> VL is DOUBLE PRECISION !> If RANGE='V', the lower bound for the eigenvalues. !> Eigenvalues less than or equal to VL, or greater than VU, !> will not be returned. VL < VU. !> If RANGE='I' or ='A', DLARRE computes bounds on the desired !> part of the spectrum. !> |
[in,out] | VU | !> VU is DOUBLE PRECISION !> If RANGE='V', the upper bound for the eigenvalues. !> Eigenvalues less than or equal to VL, or greater than VU, !> will not be returned. VL < VU. !> If RANGE='I' or ='A', DLARRE computes bounds on the desired !> part of the spectrum. !> |
[in] | IL | !> IL is INTEGER !> If RANGE='I', the index of the !> smallest eigenvalue to be returned. !> 1 <= IL <= IU <= N. !> |
[in] | IU | !> IU is INTEGER !> If RANGE='I', the index of the !> largest eigenvalue to be returned. !> 1 <= IL <= IU <= N. !> |
[in,out] | D | !> D is DOUBLE PRECISION array, dimension (N) !> On entry, the N diagonal elements of the tridiagonal !> matrix T. !> On exit, the N diagonal elements of the diagonal !> matrices D_i. !> |
[in,out] | E | !> E is DOUBLE PRECISION array, dimension (N) !> On entry, the first (N-1) entries contain the subdiagonal !> elements of the tridiagonal matrix T; E(N) need not be set. !> On exit, E contains the subdiagonal elements of the unit !> bidiagonal matrices L_i. The entries E( ISPLIT( I ) ), !> 1 <= I <= NSPLIT, contain the base points sigma_i on output. !> |
[in,out] | E2 | !> E2 is DOUBLE PRECISION array, dimension (N) !> On entry, the first (N-1) entries contain the SQUARES of the !> subdiagonal elements of the tridiagonal matrix T; !> E2(N) need not be set. !> On exit, the entries E2( ISPLIT( I ) ), !> 1 <= I <= NSPLIT, have been set to zero !> |
[in] | RTOL1 | !> RTOL1 is DOUBLE PRECISION !> |
[in] | RTOL2 | !> RTOL2 is DOUBLE PRECISION !> Parameters for bisection. !> An interval [LEFT,RIGHT] has converged if !> RIGHT-LEFT < MAX( RTOL1*GAP, RTOL2*MAX(|LEFT|,|RIGHT|) ) !> |
[in] | SPLTOL | !> SPLTOL is DOUBLE PRECISION !> The threshold for splitting. !> |
[out] | NSPLIT | !> NSPLIT is INTEGER !> The number of blocks T splits into. 1 <= NSPLIT <= N. !> |
[out] | ISPLIT | !> ISPLIT is INTEGER array, dimension (N) !> The splitting points, at which T breaks up into blocks. !> The first block 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. !> |
[out] | M | !> M is INTEGER !> The total number of eigenvalues (of all L_i D_i L_i^T) !> found. !> |
[out] | W | !> W is DOUBLE PRECISION array, dimension (N) !> The first M elements contain the eigenvalues. The !> eigenvalues of each of the blocks, L_i D_i L_i^T, are !> sorted in ascending order ( DLARRE may use the !> remaining N-M elements as workspace). !> |
[out] | WERR | !> WERR is DOUBLE PRECISION array, dimension (N) !> The error bound on the corresponding eigenvalue in W. !> |
[out] | WGAP | !> WGAP is DOUBLE PRECISION array, dimension (N) !> The separation from the right neighbor eigenvalue in W. !> The gap is only with respect to the eigenvalues of the same block !> as each block has its own representation tree. !> Exception: at the right end of a block we store the left gap !> |
[out] | IBLOCK | !> IBLOCK is INTEGER array, dimension (N) !> The indices of the blocks (submatrices) associated with the !> corresponding eigenvalues in W; IBLOCK(i)=1 if eigenvalue !> W(i) belongs to the first block from the top, =2 if W(i) !> belongs to the second block, etc. !> |
[out] | INDEXW | !> INDEXW is INTEGER array, dimension (N) !> The indices of the eigenvalues within each block (submatrix); !> for example, INDEXW(i)= 10 and IBLOCK(i)=2 imply that the !> i-th eigenvalue W(i) is the 10-th eigenvalue in block 2 !> |
[out] | GERS | !> GERS is DOUBLE PRECISION array, dimension (2*N) !> The N Gerschgorin intervals (the i-th Gerschgorin interval !> is (GERS(2*i-1), GERS(2*i)). !> |
[out] | PIVMIN | !> PIVMIN is DOUBLE PRECISION !> The minimum pivot in the Sturm sequence for T. !> |
[out] | WORK | !> WORK is DOUBLE PRECISION array, dimension (6*N) !> Workspace. !> |
[out] | IWORK | !> IWORK is INTEGER array, dimension (5*N) !> Workspace. !> |
[out] | INFO | !> INFO is INTEGER !> = 0: successful exit !> > 0: A problem occurred in DLARRE. !> < 0: One of the called subroutines signaled an internal problem. !> Needs inspection of the corresponding parameter IINFO !> for further information. !> !> =-1: Problem in DLARRD. !> = 2: No base representation could be found in MAXTRY iterations. !> Increasing MAXTRY and recompilation might be a remedy. !> =-3: Problem in DLARRB when computing the refined root !> representation for DLASQ2. !> =-4: Problem in DLARRB when preforming bisection on the !> desired part of the spectrum. !> =-5: Problem in DLASQ2. !> =-6: Problem in DLASQ2. !> |
!> !> The base representations are required to suffer very little !> element growth and consequently define all their eigenvalues to !> high relative accuracy. !>
Definition at line 299 of file dlarre.f.