ztrevc - compute some or all of the right and/or left eigenvectors of a complex upper triangular matrix T
SUBROUTINE ZTREVC( SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR, * LDVR, MM, M, WORK, RWORK, INFO) CHARACTER * 1 SIDE, HOWMNY DOUBLE COMPLEX T(LDT,*), VL(LDVL,*), VR(LDVR,*), WORK(*) INTEGER N, LDT, LDVL, LDVR, MM, M, INFO LOGICAL SELECT(*) DOUBLE PRECISION RWORK(*)
SUBROUTINE ZTREVC_64( SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR, * LDVR, MM, M, WORK, RWORK, INFO) CHARACTER * 1 SIDE, HOWMNY DOUBLE COMPLEX T(LDT,*), VL(LDVL,*), VR(LDVR,*), WORK(*) INTEGER*8 N, LDT, LDVL, LDVR, MM, M, INFO LOGICAL*8 SELECT(*) DOUBLE PRECISION RWORK(*)
SUBROUTINE TREVC( SIDE, HOWMNY, SELECT, [N], T, [LDT], VL, [LDVL], * VR, [LDVR], MM, M, [WORK], [RWORK], [INFO]) CHARACTER(LEN=1) :: SIDE, HOWMNY COMPLEX(8), DIMENSION(:) :: WORK COMPLEX(8), DIMENSION(:,:) :: T, VL, VR INTEGER :: N, LDT, LDVL, LDVR, MM, M, INFO LOGICAL, DIMENSION(:) :: SELECT REAL(8), 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(8), DIMENSION(:) :: WORK COMPLEX(8), DIMENSION(:,:) :: T, VL, VR INTEGER(8) :: N, LDT, LDVL, LDVR, MM, M, INFO LOGICAL(8), DIMENSION(:) :: SELECT REAL(8), DIMENSION(:) :: RWORK
#include <sunperf.h>
void ztrevc(char side, char howmny, logical *select, int n, doublecomplex *t, int ldt, doublecomplex *vl, int ldvl, doublecomplex *vr, int ldvr, int mm, int *m, int *info);
void ztrevc_64(char side, char howmny, logical *select, long n, doublecomplex *t, long ldt, doublecomplex *vl, long ldvl, doublecomplex *vr, long ldvr, long mm, long *m, long *info);
ztrevc 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|.