Contents


NAME

     shseqr - compute the eigenvalues of a real upper  Hessenberg
     matrix  H  and,  optionally,  the  matrices T and Z from the
     Schur decomposition H = Z  T  Z**T,  where  T  is  an  upper
     quasi-triangular  matrix  (the  Schur  form),  and  Z is the
     orthogonal matrix of Schur vectors

SYNOPSIS

     SUBROUTINE SHSEQR(JOB, COMPZ, N, ILO, IHI, H, LDH, WR, WI, Z, LDZ,
           WORK, LWORK, INFO)

     CHARACTER * 1 JOB, COMPZ
     INTEGER N, ILO, IHI, LDH, LDZ, LWORK, INFO
     REAL H(LDH,*), WR(*), WI(*), Z(LDZ,*), WORK(*)

     SUBROUTINE SHSEQR_64(JOB, COMPZ, N, ILO, IHI, H, LDH, WR, WI, Z, LDZ,
           WORK, LWORK, INFO)

     CHARACTER * 1 JOB, COMPZ
     INTEGER*8 N, ILO, IHI, LDH, LDZ, LWORK, INFO
     REAL H(LDH,*), WR(*), WI(*), Z(LDZ,*), WORK(*)

  F95 INTERFACE
     SUBROUTINE HSEQR(JOB, COMPZ, N, ILO, IHI, H, [LDH], WR, WI, Z, [LDZ],
            [WORK], [LWORK], [INFO])

     CHARACTER(LEN=1) :: JOB, COMPZ
     INTEGER :: N, ILO, IHI, LDH, LDZ, LWORK, INFO
     REAL, DIMENSION(:) :: WR, WI, WORK
     REAL, DIMENSION(:,:) :: H, Z

     SUBROUTINE HSEQR_64(JOB, COMPZ, N, ILO, IHI, H, [LDH], WR, WI, Z,
            [LDZ], [WORK], [LWORK], [INFO])

     CHARACTER(LEN=1) :: JOB, COMPZ
     INTEGER(8) :: N, ILO, IHI, LDH, LDZ, LWORK, INFO
     REAL, DIMENSION(:) :: WR, WI, WORK
     REAL, DIMENSION(:,:) :: H, Z

  C INTERFACE
     #include <sunperf.h>

     void shseqr(char job, char compz, int n, int ilo,  int  ihi,
               float *h, int ldh, float *wr, float *wi, float *z,
               int ldz, int *info);
     void shseqr_64(char job, char compz, long n, long ilo,  long
               ihi,  float  *h,  long  ldh, float *wr, float *wi,
               float *z, long ldz, long *info);

PURPOSE

     shseqr computes the eigenvalues of a real  upper  Hessenberg
     matrix  H  and,  optionally,  the  matrices T and Z from the
     Schur decomposition H = Z  T  Z**T,  where  T  is  an  upper
     quasi-triangular  matrix  (the  Schur  form),  and  Z is the
     orthogonal matrix of Schur vectors.

     Optionally Z may be postmultiplied into an input  orthogonal
     matrix Q, so that this routine can give the Schur factoriza-
     tion of a matrix A which has been reduced to the  Hessenberg
     form  H  by  the  orthogonal  matrix  Q:   A  =  Q*H*Q**T  =
     (QZ)*T*(QZ)**T.

ARGUMENTS

     JOB (input)
               = 'E':  compute eigenvalues only;
               = 'S':  compute eigenvalues and the Schur form T.

     COMPZ (input)
               = 'N':  no Schur vectors are computed;
               = 'I':  Z is initialized to the  unit  matrix  and
               the  matrix Z of Schur vectors of H is returned; =
               'V':  Z must contain an  orthogonal  matrix  Q  on
               entry, and the product Q*Z is returned.

     N (input) The order of the matrix H.  N >= 0.

     ILO (input)
               It is assumed that H is already  upper  triangular
               in  rows  and columns 1:ILO-1 and IHI+1:N. ILO and
               IHI are normally set by a previous call to SGEBAL,
               and  then  passed to SGEHRD when the matrix output
               by SGEBAL is reduced to Hessenberg form. Otherwise
               ILO and IHI should be set to 1 and N respectively.
               1 <= ILO <= IHI <= N, if N > 0; ILO=1  and  IHI=0,
               if N=0.

     IHI (input)
               See the description of ILO.
     H (input/output)
               On entry, the upper Hessenberg matrix H.  On exit,
               if   JOB  =  'S',  H  contains  the  upper  quasi-
               triangular matrix T from the  Schur  decomposition
               (the   Schur   form);   2-by-2   diagonal   blocks
               (corresponding  to  complex  conjugate  pairs   of
               eigenvalues)  are  returned in standard form, with
               H(i,i) = H(i+1,i+1) and H(i+1,i)*H(i,i+1) < 0.  If
               JOB  =  'E',  the contents of H are unspecified on
               exit.

     LDH (input)
               The leading dimension  of  the  array  H.  LDH  >=
               max(1,N).

     WR (output)
               The real and imaginary parts, respectively, of the
               computed  eigenvalues. If two eigenvalues are com-
               puted as a complex conjugate pair, they are stored
               in consecutive elements of WR and WI, say the i-th
               and (i+1)th, with WI(i) > 0 and WI(i+1)  <  0.  If
               JOB  = 'S', the eigenvalues are stored in the same
               order  as  on  the  diagonal  of  the  Schur  form
               returned  in  H,  with  WR(i)  =  H(i,i)  and,  if
               H(i:i+1,i:i+1) is a 2-by-2 diagonal block, WI(i) =
               sqrt(H(i+1,i)*H(i,i+1)) and WI(i+1) = -WI(i).

     WI (output)
               See the description of WR.

     Z (input) If COMPZ = 'N': Z is not referenced.
               If COMPZ = 'I': on entry, Z need not be  set,  and
               on exit, Z contains the orthogonal matrix Z of the
               Schur vectors of H.  If COMPZ = 'V':  on  entry  Z
               must  contain an N-by-N matrix Q, which is assumed
               to be equal to the unit matrix except for the sub-
               matrix Z(ILO:IHI,ILO:IHI); on exit Z contains Q*Z.
               Normally Q is the orthogonal matrix  generated  by
               SORGHR  after  the call to SGEHRD which formed the
               Hessenberg matrix H.

     LDZ (input)
               The leading dimension of  the  array  Z.   LDZ  >=
               max(1,N)  if  COMPZ  = 'I' or 'V'; LDZ >= 1 other-
               wise.
     WORK (workspace)
               On exit, if INFO = 0, WORK(1) returns the  optimal
               LWORK.

     LWORK (input)
               The  dimension  of  the  array  WORK.   LWORK   >=
               max(1,N).

               If LWORK = -1, then a workspace query is  assumed;
               the  routine  only  calculates the optimal size of
               the WORK array, returns this value  as  the  first
               entry  of  the  WORK  array,  and no error message
               related to LWORK is issued by XERBLA.

     INFO (output)
               = 0:  successful exit
               < 0:  if INFO = -i, the i-th argument had an ille-
               gal value
               > 0:  if INFO = i, SHSEQR failed to compute all of
               the  eigenvalues  in  a  total  of  30*(IHI-ILO+1)
               iterations; elements 1:ilo-1 and i+1:n of  WR  and
               WI  contain those eigenvalues which have been suc-
               cessfully computed.