larrd#

Functions

void slarrd(
    const char* range,
    const char* order,
    const INT   n,
    const f32   vl,
    const f32   vu,
    const INT   il,
    const INT   iu,
    const f32*  gers,
    const f32   reltol,
    const f32*  D,
    const f32*  E,
    const f32*  E2,
    const f32   pivmin,
    const INT   nsplit,
    const INT*  isplit,
          INT*  m,
          f32*  W,
          f32*  werr,
          f32*  wl,
          f32*  wu,
          INT*  iblock,
          INT*  indexw,
          f32*  work,
          INT*  iwork,
          INT*  info
);
void slarrd(const char *range, const char *order, const INT n, const f32 vl, const f32 vu, const INT il, const INT iu, const f32 *gers, const f32 reltol, const f32 *D, const f32 *E, const f32 *E2, const f32 pivmin, const INT nsplit, const INT *isplit, INT *m, f32 *W, f32 *werr, f32 *wl, f32 *wu, INT *iblock, INT *indexw, f32 *work, INT *iwork, INT *info)#

SLARRD computes the eigenvalues of a symmetric tridiagonal matrix T to suitable accuracy.

This is an auxiliary code to be called from SSTEMR. 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 “Accurate Eigenvalues of a Symmetric Tridiagonal

Matrix”, Report CS41, Computer Science Dept., Stanford University, July 21, 1966.

Parameters

in
range

= ‘A’: all eigenvalues will be found. = ‘V’: all eigenvalues in (VL, VU] will be found. = ‘I’: the IL-th through IU-th eigenvalues will be found.

in
order

= ‘B’: eigenvalues grouped by split-off block. = ‘E’: eigenvalues ordered smallest to largest.

in
n

The order of the tridiagonal matrix T. n >= 0.

in
vl

Lower bound of interval (if range=’V’).

in
vu

Upper bound of interval (if range=’V’). vl < vu.

in
il

Index (0-based) of smallest eigenvalue to return (if range=’I’).

in
iu

Index (0-based) of largest eigenvalue to return (if range=’I’).

in
gers

Double precision array, dimension (2*n). The N Gerschgorin intervals: (gers[2*i], gers[2*i+1]).

in
reltol

The minimum relative width of an interval.

in
D

Double precision array, dimension (n). The diagonal elements of the tridiagonal matrix T.

in
E

Double precision array, dimension (n-1). The off-diagonal elements of T.

in
E2

Double precision array, dimension (n-1). The squared off-diagonal elements of T.

in
pivmin

The minimum pivot allowed in the Sturm sequence.

in
nsplit

The number of diagonal blocks in T.

in
isplit

Integer array, dimension (n). The splitting points (0-based block boundaries).

out
m

The actual number of eigenvalues found.

out
W

Double precision array, dimension (n). The eigenvalue approximations.

out
werr

Double precision array, dimension (n). The error bounds on eigenvalues.

out
wl

Lower bound of interval containing wanted eigenvalues.

out
wu

Upper bound of interval containing wanted eigenvalues.

out
iblock

Integer array, dimension (n). Block number (0-based) for each eigenvalue.

out
indexw

Integer array, dimension (n). Local index (0-based) within block for each eigenvalue.

out
work

Double precision workspace, dimension (4*n).

out
iwork

Integer workspace, dimension (3*n).

out
info

  • = 0: successful exit.

  • < 0: if info = -i, the i-th argument had an illegal value.

  • > 0: some eigenvalues failed to converge or were not computed.

Functions

void dlarrd(
    const char* range,
    const char* order,
    const INT   n,
    const f64   vl,
    const f64   vu,
    const INT   il,
    const INT   iu,
    const f64*  gers,
    const f64   reltol,
    const f64*  D,
    const f64*  E,
    const f64*  E2,
    const f64   pivmin,
    const INT   nsplit,
    const INT*  isplit,
          INT*  m,
          f64*  W,
          f64*  werr,
          f64*  wl,
          f64*  wu,
          INT*  iblock,
          INT*  indexw,
          f64*  work,
          INT*  iwork,
          INT*  info
);
void dlarrd(const char *range, const char *order, const INT n, const f64 vl, const f64 vu, const INT il, const INT iu, const f64 *gers, const f64 reltol, const f64 *D, const f64 *E, const f64 *E2, const f64 pivmin, const INT nsplit, const INT *isplit, INT *m, f64 *W, f64 *werr, f64 *wl, f64 *wu, INT *iblock, INT *indexw, f64 *work, INT *iwork, INT *info)#

DLARRD computes the eigenvalues of a symmetric tridiagonal matrix T to suitable accuracy.

This is an auxiliary code to be called from DSTEMR. 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 “Accurate Eigenvalues of a Symmetric Tridiagonal

Matrix”, Report CS41, Computer Science Dept., Stanford University, July 21, 1966.

Parameters

in
range

= ‘A’: all eigenvalues will be found. = ‘V’: all eigenvalues in (VL, VU] will be found. = ‘I’: the IL-th through IU-th eigenvalues will be found.

in
order

= ‘B’: eigenvalues grouped by split-off block. = ‘E’: eigenvalues ordered smallest to largest.

in
n

The order of the tridiagonal matrix T. n >= 0.

in
vl

Lower bound of interval (if range=’V’).

in
vu

Upper bound of interval (if range=’V’). vl < vu.

in
il

Index (0-based) of smallest eigenvalue to return (if range=’I’).

in
iu

Index (0-based) of largest eigenvalue to return (if range=’I’).

in
gers

Double precision array, dimension (2*n). The N Gerschgorin intervals: (gers[2*i], gers[2*i+1]).

in
reltol

The minimum relative width of an interval.

in
D

Double precision array, dimension (n). The diagonal elements of the tridiagonal matrix T.

in
E

Double precision array, dimension (n-1). The off-diagonal elements of T.

in
E2

Double precision array, dimension (n-1). The squared off-diagonal elements of T.

in
pivmin

The minimum pivot allowed in the Sturm sequence.

in
nsplit

The number of diagonal blocks in T.

in
isplit

Integer array, dimension (n). The splitting points (0-based block boundaries).

out
m

The actual number of eigenvalues found.

out
W

Double precision array, dimension (n). The eigenvalue approximations.

out
werr

Double precision array, dimension (n). The error bounds on eigenvalues.

out
wl

Lower bound of interval containing wanted eigenvalues.

out
wu

Upper bound of interval containing wanted eigenvalues.

out
iblock

Integer array, dimension (n). Block number (0-based) for each eigenvalue.

out
indexw

Integer array, dimension (n). Local index (0-based) within block for each eigenvalue.

out
work

Double precision workspace, dimension (4*n).

out
iwork

Integer workspace, dimension (3*n).

out
info

  • = 0: successful exit.

  • < 0: if info = -i, the i-th argument had an illegal value.

  • > 0: some eigenvalues failed to converge or were not computed.