ctrevc - compute some or all of the right and/or left eigenvectors of a complex upper triangular matrix T
SUBROUTINE CTREVC( SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR, * LDVR, MM, M, WORK, RWORK, INFO) CHARACTER * 1 SIDE, HOWMNY COMPLEX T(LDT,*), VL(LDVL,*), VR(LDVR,*), WORK(*) INTEGER N, LDT, LDVL, LDVR, MM, M, INFO LOGICAL SELECT(*) REAL RWORK(*)
SUBROUTINE CTREVC_64( SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR, * LDVR, MM, M, WORK, RWORK, INFO) CHARACTER * 1 SIDE, HOWMNY COMPLEX T(LDT,*), VL(LDVL,*), VR(LDVR,*), WORK(*) INTEGER*8 N, LDT, LDVL, LDVR, MM, M, INFO LOGICAL*8 SELECT(*) REAL RWORK(*)
SUBROUTINE TREVC( SIDE, HOWMNY, SELECT, [N], T, [LDT], VL, [LDVL], * VR, [LDVR], MM, M, [WORK], [RWORK], [INFO]) CHARACTER(LEN=1) :: SIDE, HOWMNY COMPLEX, DIMENSION(:) :: WORK COMPLEX, DIMENSION(:,:) :: T, VL, VR INTEGER :: N, LDT, LDVL, LDVR, MM, M, INFO LOGICAL, DIMENSION(:) :: SELECT REAL, DIMENSION(:) :: RWORK
SUBROUTINE TREVC_64( SIDE, HOWMNY, SELECT, [N], T, [LDT], VL, [LDVL], * VR, [LDVR], MM, M, [WORK], [RWORK], [INFO]) CHARACTER(LEN=1) :: SIDE, HOWMNY COMPLEX, DIMENSION(:) :: WORK COMPLEX, DIMENSION(:,:) :: T, VL, VR INTEGER(8) :: N, LDT, LDVL, LDVR, MM, M, INFO LOGICAL(8), DIMENSION(:) :: SELECT REAL, DIMENSION(:) :: RWORK
#include <sunperf.h>
void ctrevc(char side, char howmny, logical *select, int n, complex *t, int ldt, complex *vl, int ldvl, complex *vr, int ldvr, int mm, int *m, int *info);
void ctrevc_64(char side, char howmny, logical *select, long n, complex *t, long ldt, complex *vl, long ldvl, complex *vr, long ldvr, long mm, long *m, long *info);
ctrevc computes some or all of the right and/or left eigenvectors of a complex upper triangular matrix T.
The right eigenvector x and the left eigenvector y of T corresponding to an eigenvalue w are defined by:
T*x = w*x, y'*T = w*y'
where y' denotes the conjugate transpose of the vector y.
If all eigenvectors are requested, the routine may either return the matrices X and/or Y of right or left eigenvectors of T, or the products Q*X and/or Q*Y, where Q is an input unitary
matrix. If T was obtained from the Schur factorization of an original matrix A = Q*T*Q', then Q*X and Q*Y are the matrices of right or left eigenvectors of A.
= 'R': compute right eigenvectors only;
= 'L': compute left eigenvectors only;
= 'B': compute both right and left eigenvectors.
= 'A': compute all right and/or left eigenvectors;
= 'B': compute all right and/or left eigenvectors, and backtransform them using the input matrices supplied in VR and/or VL; = 'S': compute selected right and/or left eigenvectors, specified by the logical array SELECT.
SELECT(j)
must be set to .TRUE..
VL(i)
of VL is the eigenvector corresponding
to T(i,i).
if HOWMNY = 'B', the matrix Q*Y;
if HOWMNY = 'S', the left eigenvectors of T specified by
SELECT, stored consecutively in the columns
of VL, in the same order as their
eigenvalues.
If SIDE = 'R', VL is not referenced.
max(1,N)
if
SIDE = 'L' or 'B'; LDVL > = 1 otherwise.
VR(i)
of VR is the eigenvector corresponding
to T(i,i).
if HOWMNY = 'B', the matrix Q*X;
if HOWMNY = 'S', the right eigenvectors of T specified by
SELECT, stored consecutively in the columns
of VR, in the same order as their
eigenvalues.
If SIDE = 'L', VR is not referenced.
max(1,N)
if
SIDE = 'R' or 'B'; LDVR > = 1 otherwise.
dimension(2*N)
dimension(N)
= 0: successful exit
< 0: if INFO = -i, the i-th argument had an illegal value
The algorithm used in this program is basically backward (forward) substitution, with scaling to make the the code robust against possible overflow.
Each eigenvector is normalized so that the element of largest magnitude has magnitude 1; here the magnitude of a complex number (x,y) is taken to be |x| + |y|.