laebz#

Functions

void slaebz(
    const INT           ijob,
    const INT           nitmax,
    const INT           n,
    const INT           mmax,
    const INT           minp,
    const INT           nbmin,
    const f32           abstol,
    const f32           reltol,
    const f32           pivmin,
    const f32* restrict D,
    const f32* restrict E,
    const f32* restrict E2,
          INT* restrict nval,
          f32* restrict AB,
          f32* restrict C,
          INT*          mout,
          INT* restrict NAB,
          f32* restrict work,
          INT* restrict iwork,
          INT*          info
);
void slaebz(const INT ijob, const INT nitmax, const INT n, const INT mmax, const INT minp, const INT nbmin, const f32 abstol, const f32 reltol, const f32 pivmin, const f32 *restrict D, const f32 *restrict E, const f32 *restrict E2, INT *restrict nval, f32 *restrict AB, f32 *restrict C, INT *mout, INT *restrict NAB, f32 *restrict work, INT *restrict iwork, INT *info)#

SLAEBZ contains the iteration loops which compute and use the function N(w), which is the count of eigenvalues of a symmetric tridiagonal matrix T less than or equal to its argument w.

It performs a choice of two types of loops:

IJOB=1, followed by IJOB=2: It takes as input a list of intervals and returns a list of sufficiently small intervals whose union contains the same eigenvalues as the union of the original intervals. The input intervals are (AB(j,1),AB(j,2)], j=0,…,MINP-1. The output interval (AB(j,1),AB(j,2)] will contain eigenvalues NAB(j,1)+1,…,NAB(j,2), where 0 <= j < MOUT.

IJOB=3: It performs a binary search in each input interval (AB(j,1),AB(j,2)] for a point w(j) such that N(w(j))=NVAL(j), and uses C(j) as the starting point of the search. If such a w(j) is found, then on output AB(j,1)=AB(j,2)=w. If no such w(j) is found, then on output (AB(j,1),AB(j,2)] will be a small interval containing the point where N(w) jumps through NVAL(j), unless that point lies outside the initial interval.

Note that the intervals are in all cases half-open intervals, i.e., of the form (a,b], which includes b but not a.

Parameters

in
ijob

Specifies what is to be done: = 1: Compute NAB for the initial intervals. = 2: Perform bisection iteration to find eigenvalues. = 3: Perform bisection iteration to invert N(w). Other values will cause SLAEBZ to return with info=-1.

in
nitmax

The maximum number of “levels” of bisection to be performed.

in
n

The dimension of the tridiagonal matrix T. n >= 1.

in
mmax

The maximum number of intervals.

in
minp

The initial number of intervals.

in
nbmin

The smallest number of intervals that should be processed using a vector loop. If zero, then only the scalar loop will be used.

in
abstol

The minimum (absolute) width of an interval.

in
reltol

The minimum relative width of an interval.

in
pivmin

The minimum absolute value of a “pivot” in the Sturm sequence loop.

in
D

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

in
E

Double precision array, dimension (n). The offdiagonal elements of T in positions 0..n-2.

in
E2

Double precision array, dimension (n). The squares of the offdiagonal elements of T.

inout
nval

Integer array, dimension (minp). If ijob=1 or 2, not referenced. If ijob=3, the desired values of N(w).

inout
AB

Double precision array, dimension (mmax, 2), column-major. The endpoints of the intervals.

inout
C

Double precision array, dimension (mmax). If ijob=1, ignored. If ijob=2, workspace. If ijob=3, the starting search points.

out
mout

If ijob=1, the number of eigenvalues in the intervals. If ijob=2 or 3, the number of intervals output.

inout
NAB

Integer array, dimension (mmax, 2), column-major. The eigenvalue counts at the interval endpoints.

out
work

Double precision workspace, dimension (mmax).

out
iwork

Integer workspace, dimension (mmax).

out
info

  • = 0: All intervals converged.

  • = 1..MMAX: The last info intervals did not converge.

  • = MMAX+1: More than MMAX intervals were generated.

Functions

void dlaebz(
    const INT           ijob,
    const INT           nitmax,
    const INT           n,
    const INT           mmax,
    const INT           minp,
    const INT           nbmin,
    const f64           abstol,
    const f64           reltol,
    const f64           pivmin,
    const f64* restrict D,
    const f64* restrict E,
    const f64* restrict E2,
          INT* restrict nval,
          f64* restrict AB,
          f64* restrict C,
          INT*          mout,
          INT* restrict NAB,
          f64* restrict work,
          INT* restrict iwork,
          INT*          info
);
void dlaebz(const INT ijob, const INT nitmax, const INT n, const INT mmax, const INT minp, const INT nbmin, const f64 abstol, const f64 reltol, const f64 pivmin, const f64 *restrict D, const f64 *restrict E, const f64 *restrict E2, INT *restrict nval, f64 *restrict AB, f64 *restrict C, INT *mout, INT *restrict NAB, f64 *restrict work, INT *restrict iwork, INT *info)#

DLAEBZ contains the iteration loops which compute and use the function N(w), which is the count of eigenvalues of a symmetric tridiagonal matrix T less than or equal to its argument w.

It performs a choice of two types of loops:

IJOB=1, followed by IJOB=2: It takes as input a list of intervals and returns a list of sufficiently small intervals whose union contains the same eigenvalues as the union of the original intervals. The input intervals are (AB(j,1),AB(j,2)], j=0,…,MINP-1. The output interval (AB(j,1),AB(j,2)] will contain eigenvalues NAB(j,1)+1,…,NAB(j,2), where 0 <= j < MOUT.

IJOB=3: It performs a binary search in each input interval (AB(j,1),AB(j,2)] for a point w(j) such that N(w(j))=NVAL(j), and uses C(j) as the starting point of the search. If such a w(j) is found, then on output AB(j,1)=AB(j,2)=w. If no such w(j) is found, then on output (AB(j,1),AB(j,2)] will be a small interval containing the point where N(w) jumps through NVAL(j), unless that point lies outside the initial interval.

Note that the intervals are in all cases half-open intervals, i.e., of the form (a,b], which includes b but not a.

Parameters

in
ijob

Specifies what is to be done: = 1: Compute NAB for the initial intervals. = 2: Perform bisection iteration to find eigenvalues. = 3: Perform bisection iteration to invert N(w). Other values will cause DLAEBZ to return with info=-1.

in
nitmax

The maximum number of “levels” of bisection to be performed.

in
n

The dimension of the tridiagonal matrix T. n >= 1.

in
mmax

The maximum number of intervals.

in
minp

The initial number of intervals.

in
nbmin

The smallest number of intervals that should be processed using a vector loop. If zero, then only the scalar loop will be used.

in
abstol

The minimum (absolute) width of an interval.

in
reltol

The minimum relative width of an interval.

in
pivmin

The minimum absolute value of a “pivot” in the Sturm sequence loop.

in
D

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

in
E

Double precision array, dimension (n). The offdiagonal elements of T in positions 0..n-2.

in
E2

Double precision array, dimension (n). The squares of the offdiagonal elements of T.

inout
nval

Integer array, dimension (minp). If ijob=1 or 2, not referenced. If ijob=3, the desired values of N(w).

inout
AB

Double precision array, dimension (mmax, 2), column-major. The endpoints of the intervals.

inout
C

Double precision array, dimension (mmax). If ijob=1, ignored. If ijob=2, workspace. If ijob=3, the starting search points.

out
mout

If ijob=1, the number of eigenvalues in the intervals. If ijob=2 or 3, the number of intervals output.

inout
NAB

Integer array, dimension (mmax, 2), column-major. The eigenvalue counts at the interval endpoints.

out
work

Double precision workspace, dimension (mmax).

out
iwork

Integer workspace, dimension (mmax).

out
info

  • = 0: All intervals converged.

  • = 1..MMAX: The last info intervals did not converge.

  • = MMAX+1: More than MMAX intervals were generated.