---
name: "larre"
section: "3"
platform: "linux"
package: "lapack-doc"
version: "3.12.1-2"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/larre"
---

# larre(3)

larre: step in stemr

## NAME

larre - larre: step in stemr

## SYNOPSIS

### Functions

subroutine **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)\
 **DLARRE** given the tridiagonal matrix T, sets small off-diagonal elements to zero and for each unreduced block Ti, finds base representations and eigenvalues.  subroutine **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)\
 **SLARRE** given the tridiagonal matrix T, sets small off-diagonal elements to zero and for each unreduced block Ti, finds base representations and eigenvalues.

## Detailed Description

## Function Documentation

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

**Purpose:**

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

**Parameters**

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

*N*

```
!>          N is INTEGER
!>          The order of the matrix. N > 0.
!>
```

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

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

*IL*

```
!>          IL is INTEGER
!>          If RANGE='I', the index of the
!>          smallest eigenvalue to be returned.
!>          1 <= IL <= IU <= N.
!>
```

*IU*

```
!>          IU is INTEGER
!>          If RANGE='I', the index of the
!>          largest eigenvalue to be returned.
!>          1 <= IL <= IU <= N.
!>
```

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

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

*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
!>
```

*RTOL1*

```
!>          RTOL1 is DOUBLE PRECISION
!>
```

*RTOL2*

```
!>          RTOL2 is DOUBLE PRECISION
!>           Parameters for bisection.
!>           An interval [LEFT,RIGHT] has converged if
!>           RIGHT-LEFT < MAX( RTOL1*GAP, RTOL2*MAX(|LEFT|,|RIGHT|) )
!>
```

*SPLTOL*

```
!>          SPLTOL is DOUBLE PRECISION
!>          The threshold for splitting.
!>
```

*NSPLIT*

```
!>          NSPLIT is INTEGER
!>          The number of blocks T splits into. 1 <= NSPLIT <= N.
!>
```

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

*M*

```
!>          M is INTEGER
!>          The total number of eigenvalues (of all L_i D_i L_i^T)
!>          found.
!>
```

*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).
!>
```

*WERR*

```
!>          WERR is DOUBLE PRECISION array, dimension (N)
!>          The error bound on the corresponding eigenvalue in W.
!>
```

*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
!>
```

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

*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
!>
```

*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)).
!>
```

*PIVMIN*

```
!>          PIVMIN is DOUBLE PRECISION
!>          The minimum pivot in the Sturm sequence for T.
!>
```

*WORK*

```
!>          WORK is DOUBLE PRECISION array, dimension (6*N)
!>          Workspace.
!>
```

*IWORK*

```
!>          IWORK is INTEGER array, dimension (5*N)
!>          Workspace.
!>
```

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

**Author**

Univ. of Tennessee

Univ. of California Berkeley

Univ. of Colorado Denver

NAG Ltd.

**Further Details:**

```
!>
!>  The base representations are required to suffer very little
!>  element growth and consequently define all their eigenvalues to
!>  high relative accuracy.
!>
```

**Contributors:**

Beresford Parlett, University of California, Berkeley, USA \
 Jim Demmel, University of California, Berkeley, USA \
 Inderjit Dhillon, University of Texas, Austin, USA \
 Osni Marques, LBNL/NERSC, USA \
 Christof Voemel, University of California, Berkeley, USA \

Definition at line **301** of file **dlarre.f**.

### subroutine slarre (character range, integer n, real vl, real vu, integer il, integer iu, real, dimension( \* ) d, real, dimension( \* ) e, real, dimension( \* ) e2, real rtol1, real rtol2, real spltol, integer nsplit, integer, dimension( \* ) isplit, integer m, real, dimension( \* ) w, real, dimension( \* ) werr, real, dimension( \* ) wgap, integer, dimension( \* ) iblock, integer, dimension( \* ) indexw, real, dimension( \* ) gers, real pivmin, real, dimension( \* ) work, integer, dimension( \* ) iwork, integer info)

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

**Purpose:**

```
!>
!> To find the desired eigenvalues of a given real symmetric
!> tridiagonal matrix T, SLARRE 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
!> SSTEMR 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 SLASQ2) to
!> compute all and then discard any unwanted one.
!> As an added benefit, SLARRE also outputs the n
!> Gerschgorin intervals for the matrices L_i D_i L_i^T.
!>
```

**Parameters**

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

*N*

```
!>          N is INTEGER
!>          The order of the matrix. N > 0.
!>
```

*VL*

```
!>          VL is REAL
!>          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', SLARRE computes bounds on the desired
!>          part of the spectrum.
!>
```

*VU*

```
!>          VU is REAL
!>          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', SLARRE computes bounds on the desired
!>          part of the spectrum.
!>
```

*IL*

```
!>          IL is INTEGER
!>          If RANGE='I', the index of the
!>          smallest eigenvalue to be returned.
!>          1 <= IL <= IU <= N.
!>
```

*IU*

```
!>          IU is INTEGER
!>          If RANGE='I', the index of the
!>          largest eigenvalue to be returned.
!>          1 <= IL <= IU <= N.
!>
```

*D*

```
!>          D is REAL 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.
!>
```

*E*

```
!>          E is REAL 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.
!>
```

*E2*

```
!>          E2 is REAL 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
!>
```

*RTOL1*

```
!>          RTOL1 is REAL
!>
```

*RTOL2*

```
!>          RTOL2 is REAL
!>           Parameters for bisection.
!>           An interval [LEFT,RIGHT] has converged if
!>           RIGHT-LEFT < MAX( RTOL1*GAP, RTOL2*MAX(|LEFT|,|RIGHT|) )
!>
```

*SPLTOL*

```
!>          SPLTOL is REAL
!>          The threshold for splitting.
!>
```

*NSPLIT*

```
!>          NSPLIT is INTEGER
!>          The number of blocks T splits into. 1 <= NSPLIT <= N.
!>
```

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

*M*

```
!>          M is INTEGER
!>          The total number of eigenvalues (of all L_i D_i L_i^T)
!>          found.
!>
```

*W*

```
!>          W is REAL 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 ( SLARRE may use the
!>          remaining N-M elements as workspace).
!>
```

*WERR*

```
!>          WERR is REAL array, dimension (N)
!>          The error bound on the corresponding eigenvalue in W.
!>
```

*WGAP*

```
!>          WGAP is REAL 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
!>
```

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

*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
!>
```

*GERS*

```
!>          GERS is REAL array, dimension (2*N)
!>          The N Gerschgorin intervals (the i-th Gerschgorin interval
!>          is (GERS(2*i-1), GERS(2*i)).
!>
```

*PIVMIN*

```
!>          PIVMIN is REAL
!>          The minimum pivot in the Sturm sequence for T.
!>
```

*WORK*

```
!>          WORK is REAL array, dimension (6*N)
!>          Workspace.
!>
```

*IWORK*

```
!>          IWORK is INTEGER array, dimension (5*N)
!>          Workspace.
!>
```

*INFO*

```
!>          INFO is INTEGER
!>          = 0:  successful exit
!>          > 0:  A problem occurred in SLARRE.
!>          < 0:  One of the called subroutines signaled an internal problem.
!>                Needs inspection of the corresponding parameter IINFO
!>                for further information.
!>
!>          =-1:  Problem in SLARRD.
!>          = 2:  No base representation could be found in MAXTRY iterations.
!>                Increasing MAXTRY and recompilation might be a remedy.
!>          =-3:  Problem in SLARRB when computing the refined root
!>                representation for SLASQ2.
!>          =-4:  Problem in SLARRB when preforming bisection on the
!>                desired part of the spectrum.
!>          =-5:  Problem in SLASQ2.
!>          =-6:  Problem in SLASQ2.
!>
```

**Author**

Univ. of Tennessee

Univ. of California Berkeley

Univ. of Colorado Denver

NAG Ltd.

**Further Details:**

```
!>
!>  The base representations are required to suffer very little
!>  element growth and consequently define all their eigenvalues to
!>  high relative accuracy.
!>
```

**Contributors:**

Beresford Parlett, University of California, Berkeley, USA \
 Jim Demmel, University of California, Berkeley, USA \
 Inderjit Dhillon, University of Texas, Austin, USA \
 Osni Marques, LBNL/NERSC, USA \
 Christof Voemel, University of California, Berkeley, USA \

Definition at line **301** of file **slarre.f**.

## Author

Generated automatically by Doxygen for LAPACK from the source code.
