Contents


NAME

     sggev - compute for  a  pair  of  N-by-N  real  nonsymmetric
     matrices (A,B)

SYNOPSIS

     SUBROUTINE SGGEV(JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR, ALPHAI,
           BETA, VL, LDVL, VR, LDVR, WORK, LWORK, INFO)

     CHARACTER * 1 JOBVL, JOBVR
     INTEGER N, LDA, LDB, LDVL, LDVR, LWORK, INFO
     REAL  A(LDA,*),  B(LDB,*),  ALPHAR(*),  ALPHAI(*),  BETA(*),
     VL(LDVL,*), VR(LDVR,*), WORK(*)

     SUBROUTINE SGGEV_64(JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR, ALPHAI,
           BETA, VL, LDVL, VR, LDVR, WORK, LWORK, INFO)

     CHARACTER * 1 JOBVL, JOBVR
     INTEGER*8 N, LDA, LDB, LDVL, LDVR, LWORK, INFO
     REAL  A(LDA,*),  B(LDB,*),  ALPHAR(*),  ALPHAI(*),  BETA(*),
     VL(LDVL,*), VR(LDVR,*), WORK(*)

  F95 INTERFACE
     SUBROUTINE GGEV(JOBVL, JOBVR, [N], A, [LDA], B, [LDB], ALPHAR,
            ALPHAI, BETA, VL, [LDVL], VR, [LDVR], [WORK], [LWORK], [INFO])

     CHARACTER(LEN=1) :: JOBVL, JOBVR
     INTEGER :: N, LDA, LDB, LDVL, LDVR, LWORK, INFO
     REAL, DIMENSION(:) :: ALPHAR, ALPHAI, BETA, WORK
     REAL, DIMENSION(:,:) :: A, B, VL, VR

     SUBROUTINE GGEV_64(JOBVL, JOBVR, [N], A, [LDA], B, [LDB], ALPHAR,
            ALPHAI, BETA, VL, [LDVL], VR, [LDVR], [WORK], [LWORK], [INFO])

     CHARACTER(LEN=1) :: JOBVL, JOBVR
     INTEGER(8) :: N, LDA, LDB, LDVL, LDVR, LWORK, INFO
     REAL, DIMENSION(:) :: ALPHAR, ALPHAI, BETA, WORK
     REAL, DIMENSION(:,:) :: A, B, VL, VR

  C INTERFACE
     #include <sunperf.h>

     void sggev(char jobvl, char jobvr, int n, float *a, int lda,
               float  *b,  int ldb, float *alphar, float *alphai,
               float *beta, float *vl, int ldvl, float  *vr,  int
               ldvr, int *info);
     void sggev_64(char jobvl, char jobvr, long n, float *a, long
               lda,  float  *b,  long  ldb,  float *alphar, float
               *alphai, float *beta, float *vl, long ldvl,  float
               *vr, long ldvr, long *info);

PURPOSE

     sggev computes  for  a  pair  of  N-by-N  real  nonsymmetric
     matrices  (A,B) the generalized eigenvalues, and optionally,
     the left and/or right generalized eigenvectors.

     A generalized eigenvalue for a pair of matrices (A,B)  is  a
     scalar  lambda or a ratio alpha/beta = lambda, such that A -
     lambda*B is singular. It is usually represented as the  pair
     (alpha,beta),  as  there  is a reasonable interpretation for
     beta=0, and even for both being zero.

     The right eigenvector v(j) corresponding to  the  eigenvalue
     lambda(j) of (A,B) satisfies

                      A * v(j) = lambda(j) * B * v(j).

     The left eigenvector u(j) corresponding  to  the  eigenvalue
     lambda(j) of (A,B) satisfies

                      u(j)**H * A  = lambda(j) * u(j)**H * B .

     where u(j)**H is the conjugate-transpose of u(j).

ARGUMENTS

     JOBVL (input)
               = 'N':  do not compute the left generalized eigen-
               vectors;
               = 'V':  compute the left generalized eigenvectors.

     JOBVR (input)
               = 'N':   do  not  compute  the  right  generalized
               eigenvectors;
               = 'V':  compute the  right  generalized  eigenvec-
               tors.

     N (input) The order of the matrices A, B, VL, and VR.  N  >=
               0.

     A (input/output)
               On entry, the matrix A  in  the  pair  (A,B).   On
               exit, A has been overwritten.

     LDA (input)
               The leading dimension of A.  LDA >= max(1,N).

     B (input/output)
               On entry, the matrix B  in  the  pair  (A,B).   On
               exit, B has been overwritten.

     LDB (input)
               The leading dimension of B.  LDB >= max(1,N).

     ALPHAR (output)
               On  exit,   (ALPHAR(j)   +   ALPHAI(j)*i)/BETA(j),
               j=1,...,N,  will  be  the generalized eigenvalues.
               If ALPHAI(j) is zero, then the j-th eigenvalue  is
               real;  if  positive,  then  the  j-th and (j+1)-st
               eigenvalues are a  complex  conjugate  pair,  with
               ALPHAI(j+1) negative.

               Note:   the   quotients   ALPHAR(j)/BETA(j)    and
               ALPHAI(j)/BETA(j)  may  easily over- or underflow,
               and BETA(j) may even  be  zero.   Thus,  the  user
               should   avoid   naively   computing   the   ratio
               alpha/beta.  However, ALPHAR and  ALPHAI  will  be
               always  less  than  and  usually  comparable  with
               norm(A) in magnitude, and BETA  always  less  than
               and usually comparable with norm(B).

     ALPHAI (output)
               See the description for ALPHAR.

     BETA (output)
               See the description for ALPHAR.

     VL (input)
               If JOBVL = 'V', the  left  eigenvectors  u(j)  are
               stored  one after another in the columns of VL, in
               the same order as their eigenvalues. If  the  j-th
               eigenvalue  is real, then u(j) = VL(:,j), the j-th
               column of VL. If the j-th and (j+1)-th eigenvalues
               form   a  complex  conjugate  pair,  then  u(j)  =
               VL(:,j)+i*VL(:,j+1)   and   u(j+1)   =    VL(:,j)-
               i*VL(:,j+1).   Each  eigenvector will be scaled so
               the    largest     component     have     abs(real
               part)+abs(imag.  part)=1.  Not referenced if JOBVL
               = 'N'.

     LDVL (input)
               The leading dimension of the matrix VL. LDVL >= 1,
               and if JOBVL = 'V', LDVL >= N.

     VR (input)
               If JOBVR = 'V', the right  eigenvectors  v(j)  are
               stored  one after another in the columns of VR, in
               the same order as their eigenvalues. If  the  j-th
               eigenvalue  is real, then v(j) = VR(:,j), the j-th
               column of VR. If the j-th and (j+1)-th eigenvalues
               form   a  complex  conjugate  pair,  then  v(j)  =
               VR(:,j)+i*VR(:,j+1)   and   v(j+1)   =    VR(:,j)-
               i*VR(:,j+1).   Each  eigenvector will be scaled so
               the    largest     component     have     abs(real
               part)+abs(imag.  part)=1.  Not referenced if JOBVR
               = 'N'.

     LDVR (input)
               The leading dimension of the matrix VR. LDVR >= 1,
               and if JOBVR = 'V', LDVR >= N.

     WORK (workspace)
               On exit, if INFO = 0, WORK(1) returns the  optimal
               LWORK.

     LWORK (input)
               The  dimension  of  the  array  WORK.   LWORK   >=
               max(1,8*N).  For good performance, LWORK must gen-
               erally be larger.

               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.
               = 1,...,N:  The QZ iteration failed.  No eigenvec-
               tors   have   been   calculated,   but  ALPHAR(j),
               ALPHAI(j),  and  BETA(j)  should  be  correct  for
               j=INFO+1,...,N.   > N:  =N+1: other than QZ itera-
               tion failed in SHGEQZ.
               =N+2: error return from STGEVC.