Contents


NAME

     shsein - use  inverse  iteration  to  find  specified  right
     and/or left eigenvectors of a real upper Hessenberg matrix H

SYNOPSIS

     SUBROUTINE SHSEIN(SIDE, EIGSRC, INITV, SELECT, N, H, LDH, WR, WI, VL,
           LDVL, VR, LDVR, MM, M, WORK, IFAILL, IFAILR, INFO)

     CHARACTER * 1 SIDE, EIGSRC, INITV
     INTEGER N, LDH, LDVL, LDVR, MM, M, INFO
     INTEGER IFAILL(*), IFAILR(*)
     LOGICAL SELECT(*)
     REAL H(LDH,*), WR(*), WI(*), VL(LDVL,*), VR(LDVR,*), WORK(*)

     SUBROUTINE SHSEIN_64(SIDE, EIGSRC, INITV, SELECT, N, H, LDH, WR, WI,
           VL, LDVL, VR, LDVR, MM, M, WORK, IFAILL, IFAILR, INFO)

     CHARACTER * 1 SIDE, EIGSRC, INITV
     INTEGER*8 N, LDH, LDVL, LDVR, MM, M, INFO
     INTEGER*8 IFAILL(*), IFAILR(*)
     LOGICAL*8 SELECT(*)
     REAL H(LDH,*), WR(*), WI(*), VL(LDVL,*), VR(LDVR,*), WORK(*)

  F95 INTERFACE
     SUBROUTINE HSEIN(SIDE, EIGSRC, INITV, SELECT, [N], H, [LDH], WR, WI,
            VL, [LDVL], VR, [LDVR], MM, M, [WORK], IFAILL, IFAILR, [INFO])

     CHARACTER(LEN=1) :: SIDE, EIGSRC, INITV
     INTEGER :: N, LDH, LDVL, LDVR, MM, M, INFO
     INTEGER, DIMENSION(:) :: IFAILL, IFAILR
     LOGICAL, DIMENSION(:) :: SELECT
     REAL, DIMENSION(:) :: WR, WI, WORK
     REAL, DIMENSION(:,:) :: H, VL, VR

     SUBROUTINE HSEIN_64(SIDE, EIGSRC, INITV, SELECT, [N], H, [LDH], WR,
            WI, VL, [LDVL], VR, [LDVR], MM, M, [WORK], IFAILL, IFAILR, [INFO])

     CHARACTER(LEN=1) :: SIDE, EIGSRC, INITV
     INTEGER(8) :: N, LDH, LDVL, LDVR, MM, M, INFO
     INTEGER(8), DIMENSION(:) :: IFAILL, IFAILR
     LOGICAL(8), DIMENSION(:) :: SELECT
     REAL, DIMENSION(:) :: WR, WI, WORK
     REAL, DIMENSION(:,:) :: H, VL, VR

  C INTERFACE
     #include <sunperf.h>
     void shsein(char side, char eigsrc, char initv, int *select,
               int  n,  float  *h, int ldh, float *wr, float *wi,
               float *vl, int ldvl, float *vr, int ldvr, int  mm,
               int *m, int *ifaill, int *ifailr, int *info);

     void shsein_64(char side,  char  eigsrc,  char  initv,  long
               *select,  long  n,  float *h, long ldh, float *wr,
               float *wi, float *vl, long ldvl, float  *vr,  long
               ldvr,   long  mm,  long  *m,  long  *ifaill,  long
               *ifailr, long *info);

PURPOSE

     shsein uses inverse iteration to find specified right and/or
     left eigenvectors of a real upper Hessenberg matrix H.

     The right eigenvector x and the left eigenvector  y  of  the
     matrix H corresponding to an eigenvalue w are defined by:

                  H * x = w * x,     y**h * H = w * y**h

     where y**h denotes the conjugate transpose of the vector y.

ARGUMENTS

     SIDE (input)
               = 'R': compute right eigenvectors only;
               = 'L': compute left eigenvectors only;
               = 'B': compute both right and left eigenvectors.

     EIGSRC (input)
               Specifies the source of  eigenvalues  supplied  in
               (WR,WI):
               = 'Q': the eigenvalues were  found  using  SHSEQR;
               thus,  if  H has zero subdiagonal elements, and so
               is block-triangular, then the j-th eigenvalue  can
               be  assumed  to be an eigenvalue of the block con-
               taining the j-th row/column.  This property allows
               SHSEIN  to  perform  inverse iteration on just one
               diagonal block.  = 'N': no assumptions are made on
               the  correspondence between eigenvalues and diago-
               nal blocks.  In this case, SHSEIN must always per-
               form inverse iteration using the whole matrix H.

     INITV (input)
               = 'N': no initial vectors are supplied;
               = 'U': user-supplied initial vectors are stored in
               the arrays VL and/or VR.
     SELECT (input/output)
               Specifies the  eigenvectors  to  be  computed.  To
               select  the  real  eigenvector  corresponding to a
               real eigenvalue WR(j), SELECT(j) must  be  set  to
               .TRUE..   To   select   the   complex  eigenvector
               corresponding    to    a    complex     eigenvalue
               (WR(j),WI(j)),      with     complex     conjugate
               (WR(j+1),WI(j+1)), either SELECT(j) or SELECT(j+1)
               or both must be set to

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

     H (input) The upper Hessenberg matrix H.

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

     WR (input/output)
               On entry, the real  and  imaginary  parts  of  the
               eigenvalues  of  H;  a  complex  conjugate pair of
               eigenvalues must be stored in consecutive elements
               of  WR  and WI.  On exit, WR may have been altered
               since close eigenvalues are perturbed slightly  in
               searching for independent eigenvectors.

     WI (input)
               See the description of WR.

     VL (input/output)
               On entry, if INITV = 'U' and SIDE = 'L' or 'B', VL
               must  contain  starting  vectors  for  the inverse
               iteration for the left eigenvectors; the  starting
               vector  for  each  eigenvector must be in the same
               column(s) in which the eigenvector will be stored.
               On  exit, if SIDE = 'L' or 'B', the left eigenvec-
               tors specified by SELECT will be  stored  consecu-
               tively  in the columns of VL, in the same order as
               their   eigenvalues.   A    complex    eigenvector
               corresponding to a complex eigenvalue is stored in
               two consecutive columns,  the  first  holding  the
               real  part  and the second the imaginary part.  If
               SIDE = 'R', VL is not referenced.

     LDVL (input)
               The leading dimension of the array  VL.   LDVL  >=
               max(1,N)  if  SIDE  = 'L' or 'B'; LDVL >= 1 other-
               wise.

     VR (input/output)
               On entry, if INITV = 'U' and SIDE = 'R' or 'B', VR
               must  contain  starting  vectors  for  the inverse
               iteration for the right eigenvectors; the starting
               vector  for  each  eigenvector must be in the same
               column(s) in which the eigenvector will be stored.
               On exit, if SIDE = 'R' or 'B', the right eigenvec-
               tors specified by SELECT will be  stored  consecu-
               tively  in the columns of VR, in the same order as
               their   eigenvalues.   A    complex    eigenvector
               corresponding to a complex eigenvalue is stored in
               two consecutive columns,  the  first  holding  the
               real  part  and the second the imaginary part.  If
               SIDE = 'L', VR is not referenced.

     LDVR (input)
               The leading dimension of the array  VR.   LDVR  >=
               max(1,N)  if  SIDE  = 'R' or 'B'; LDVR >= 1 other-
               wise.

     MM (input)
               The number of columns in the arrays VL and/or  VR.
               MM >= M.

     M (output)
               The number of columns in the arrays VL  and/or  VR
               required  to store the eigenvectors; each selected
               real eigenvector  occupies  one  column  and  each
               selected complex eigenvector occupies two columns.

     WORK (workspace)
               dimension((N+2)*N)

     IFAILL (output)
               If SIDE = 'L' or 'B', IFAILL(i) = j  >  0  if  the
               left   eigenvector   in  the  i-th  column  of  VL
               (corresponding to the eigenvalue w(j))  failed  to
               converge;  IFAILL(i)  =  0 if the eigenvector con-
               verged satisfactorily. If  the  i-th  and  (i+1)th
               columns  of  VL  hold  a complex eigenvector, then
               IFAILL(i) and IFAILL(i+1)  are  set  to  the  same
               value.  If SIDE = 'R', IFAILL is not referenced.
     IFAILR (output)
               If SIDE = 'R' or 'B', IFAILR(i) = j  >  0  if  the
               right   eigenvector  in  the  i-th  column  of  VR
               (corresponding to the eigenvalue w(j))  failed  to
               converge;  IFAILR(i)  =  0 if the eigenvector con-
               verged satisfactorily. If  the  i-th  and  (i+1)th
               columns  of  VR  hold  a complex eigenvector, then
               IFAILR(i) and IFAILR(i+1)  are  set  to  the  same
               value.  If SIDE = 'L', IFAILR is not referenced.

     INFO (output)
               = 0:  successful exit
               < 0:  if INFO = -i, the i-th argument had an ille-
               gal value
               > 0:  if INFO = i, i is the number of eigenvectors
               which  failed  to  converge; see IFAILL and IFAILR
               for further details.

FURTHER DETAILS

     Each eigenvector is normalized so that the element of  larg-
     est  magnitude has magnitude 1; here the magnitude of a com-
     plex number (x,y) is taken to be |x|+|y|.