NAME

dstegr - (a) Compute T-sigma_i = L_i D_i L_i^T, such that L_i D_i L_i^T is a relatively robust representation


SYNOPSIS

  SUBROUTINE DSTEGR( JOBZ, RANGE, N, D, E, VL, VU, IL, IU, ABSTOL, M, 
 *      W, Z, LDZ, ISUPPZ, WORK, LWORK, IWORK, LIWORK, INFO)
  CHARACTER * 1 JOBZ, RANGE
  INTEGER N, IL, IU, M, LDZ, LWORK, LIWORK, INFO
  INTEGER ISUPPZ(*), IWORK(*)
  DOUBLE PRECISION VL, VU, ABSTOL
  DOUBLE PRECISION D(*), E(*), W(*), Z(LDZ,*), WORK(*)
  SUBROUTINE DSTEGR_64( JOBZ, RANGE, N, D, E, VL, VU, IL, IU, ABSTOL, 
 *      M, W, Z, LDZ, ISUPPZ, WORK, LWORK, IWORK, LIWORK, INFO)
  CHARACTER * 1 JOBZ, RANGE
  INTEGER*8 N, IL, IU, M, LDZ, LWORK, LIWORK, INFO
  INTEGER*8 ISUPPZ(*), IWORK(*)
  DOUBLE PRECISION VL, VU, ABSTOL
  DOUBLE PRECISION D(*), E(*), W(*), Z(LDZ,*), WORK(*)

F95 INTERFACE

  SUBROUTINE STEGR( JOBZ, RANGE, [N], D, E, VL, VU, IL, IU, ABSTOL, M, 
 *       W, Z, [LDZ], ISUPPZ, [WORK], [LWORK], [IWORK], [LIWORK], [INFO])
  CHARACTER(LEN=1) :: JOBZ, RANGE
  INTEGER :: N, IL, IU, M, LDZ, LWORK, LIWORK, INFO
  INTEGER, DIMENSION(:) :: ISUPPZ, IWORK
  REAL(8) :: VL, VU, ABSTOL
  REAL(8), DIMENSION(:) :: D, E, W, WORK
  REAL(8), DIMENSION(:,:) :: Z
  SUBROUTINE STEGR_64( JOBZ, RANGE, [N], D, E, VL, VU, IL, IU, ABSTOL, 
 *       M, W, Z, [LDZ], ISUPPZ, [WORK], [LWORK], [IWORK], [LIWORK], [INFO])
  CHARACTER(LEN=1) :: JOBZ, RANGE
  INTEGER(8) :: N, IL, IU, M, LDZ, LWORK, LIWORK, INFO
  INTEGER(8), DIMENSION(:) :: ISUPPZ, IWORK
  REAL(8) :: VL, VU, ABSTOL
  REAL(8), DIMENSION(:) :: D, E, W, WORK
  REAL(8), DIMENSION(:,:) :: Z

C INTERFACE

#include <sunperf.h>

void dstegr(char jobz, char range, int n, double *d, double *e, double vl, double vu, int il, int iu, double abstol, int *m, double *w, double *z, int ldz, int *isuppz, int *info);

void dstegr_64(char jobz, char range, long n, double *d, double *e, double vl, double vu, long il, long iu, double abstol, long *m, double *w, double *z, long ldz, long *isuppz, long *info);


PURPOSE

dstegr b) Compute the eigenvalues, lambda_j, of L_i D_i L_i^T to high relative accuracy by the dqds algorithm,

   (c) If there is a cluster of close eigenvalues, "choose" sigma_i
       close to the cluster, and go to step (a),
   (d) Given the approximate eigenvalue lambda_j of L_i D_i L_i^T,
       compute the corresponding eigenvector by forming a
       rank-revealing twisted factorization.

The desired accuracy of the output can be specified by the input parameter ABSTOL.

For more details, see ``A new O(n^2) algorithm for the symmetric tridiagonal eigenvalue/eigenvector problem'', by Inderjit Dhillon, Computer Science Division Technical Report No. UCB/CSD-97-971, UC Berkeley, May 1997.

Note 1 : Currently SSTEGR is only set up to find ALL the n eigenvalues and eigenvectors of T in O(n^2) time

Note 2 : Currently the routine SSTEIN is called when an appropriate sigma_i cannot be chosen in step (c) above. SSTEIN invokes modified Gram-Schmidt when eigenvalues are close.

Note 3 : SSTEGR works only on machines which follow ieee-754 floating-point standard in their handling of infinities and NaNs. Normal execution of SSTEGR may create NaNs and infinities and hence may abort due to a floating point exception in environments which do not conform to the ieee standard.


ARGUMENTS


FURTHER DETAILS

Based on contributions by

   Inderjit Dhillon, IBM Almaden, USA
   Osni Marques, LBNL/NERSC, USA