# ?larre

Given the tridiagonal matrix T, sets small off-diagonal elements to zero and for each unreduced block Ti, finds base representations and eigenvalues.

## Syntax

call slarre( range, n, vl, vu, il, iu, d, e, e2, rtol1, rtol2, spltol, nsplit, isplit, m, w, werr, wgap, iblock, indexw, gers, pivmin, work, iwork, info )

call dlarre( range, n, vl, vu, il, iu, d, e, e2, rtol1, rtol2, spltol, nsplit, isplit, m, w, werr, wgap, iblock, indexw, gers, pivmin, work, iwork, info )

• mkl.fi

## Description

To find the desired eigenvalues of a given real symmetric tridiagonal matrix T, the routine sets any "small" off-diagonal elements to zero, and for each unreduced block Ti, it finds

• a suitable shift at one end of the block spectrum

• the base representation, Ti - σi*I = Li*Di*LiT, and

• eigenvalues of each Li*Di*LiT.

The representations and eigenvalues found are then used by ?stemr to compute the eigenvectors of a symmetric tridiagonal matrix. The accuracy varies depending on whether bisection is used to find a few eigenvalues or the dqds algorithm (subroutine ?lasq2) to compute all and discard any unwanted one. As an added benefit, ?larre also outputs the n Gerschgorin intervals for the matrices Li*Di*LiT.

## Input Parameters

range

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 eigenvalues of the entire matrix will be found.

n

INTEGER. The order of the matrix. n > 0.

vl, vu

REAL for slarre

DOUBLE PRECISION for dlarre

If range='V', the lower and upper bounds for the eigenvalues. Eigenvalues less than or equal to vl, or greater than vu, are not returned. vl < vu.

il, iu

INTEGER.

If range='I', the indices (in ascending order) of the smallest and largest eigenvalues to be returned. 1 ≤ iliun.

d

REAL for slarre

DOUBLE PRECISION for dlarre

Array, DIMENSION (n).

The n diagonal elements of the diagonal matrices T.

e

REAL for slarre

DOUBLE PRECISION for dlarre

Array, DIMENSION (n). The first (n-1) entries contain the subdiagonal elements of the tridiagonal matrix T; e(n) need not be set.

e2

REAL for slarre

DOUBLE PRECISION for dlarre

Array, DIMENSION (n). The first (n-1) entries contain the squares of the subdiagonal elements of the tridiagonal matrix T; e2(n) need not be set.

rtol1, rtol2

REAL for slarre

DOUBLE PRECISION for dlarre

Parameters for bisection. An interval [LEFT,RIGHT] has converged if `RIGHT-LEFT.LT.MAX( rtol1*gap, rtol2*max(|LEFT|,|RIGHT|) )`.

spltol

REAL for slarre

DOUBLE PRECISION for dlarre

The threshold for splitting.

work

REAL for slarre

DOUBLE PRECISION for dlarre

Workspace array, DIMENSION (6*n).

iwork

INTEGER.

Workspace array, DIMENSION (5*n).

## Output Parameters

vl, vu

On exit, if range='I' or ='A', contain the bounds on the desired part of the spectrum.

d

On exit, the n diagonal elements of the diagonal matrices Di .

e

On exit, the subdiagonal elements of the unit bidiagonal matrices Li . The entries e( isplit( i) ), 1 ≤ insplit, contain the base points sigmai on output.

e2

On exit, the entries e2( isplit( i) ), 1 ≤ insplit, have been set to zero.

nsplit

INTEGER. The number of blocks T splits into. `1 ≤ nsplit ≤ n`.

isplit

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`.

m

INTEGER. The total number of eigenvalues (of all the Li*Di*LiT) found.

w

REAL for slarre

DOUBLE PRECISION for dlarre

Array, DIMENSION (n). The first m elements contain the eigenvalues. The eigenvalues of each of the blocks, Li*Di*LiT, are sorted in ascending order. The routine may use the remaining n-m elements as workspace.

werr

REAL for slarre

DOUBLE PRECISION for dlarre

Array, DIMENSION (n). The error bound on the corresponding eigenvalue in w.

wgap

REAL for slarre

DOUBLE PRECISION for dlarre

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 the left gap is stored.

iblock

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.

indexw

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 the second block.

gers

REAL for slarre

DOUBLE PRECISION for dlarre

Array, DIMENSION (2*n). The n Gerschgorin intervals (the i-th Gerschgorin interval is `(gers(2*i-1), gers(2*i))`.

pivmin

REAL for slarre

DOUBLE PRECISION for dlarre

The minimum pivot in the Sturm sequence for T .

info

INTEGER.

If `info = 0`: successful exit

If `info > 0`: A problem occured in ?larre. If `info = 5`, the Rayleigh Quotient Iteration failed to converge to full accuracy.

If `info < 0`: One of the called subroutines signaled an internal problem. Inspection of the corresponding parameter info for further information is required.

• If `info = -1`, there is a problem in ?larrd

• If `info = -2`, no base representation could be found in maxtry iterations. Increasing maxtry and recompilation might be a remedy.

• If `info = -3`, there is a problem in ?larrb when computing the refined root representation for ?lasq2.

• If `info = -4`, there is a problem in ?larrb when preforming bisection on the desired part of the spectrum.

• If `info = -5`, there is a problem in ?lasq2.

• If `info = -6`, there is a problem in ?lasq2.