stgevc(3P) Sun Performance Library stgevc(3P)NAMEstgevc - compute some or all of the right and/or left generalized
eigenvectors of a pair of real upper triangular matrices (A,B) that was
obtained from the generalized Schur factorization of an original pair
of real nonsymmetric matrices. B is upper triangular and A is a block
upper triangular, where the diagonal blocks are either 1-by-1 or
2-by-2.
SYNOPSIS
SUBROUTINE STGEVC(SIDE, HOWMNY, SELECT, N, A, LDA, B, LDB, VL, LDVL,
VR, LDVR, MM, M, WORK, INFO)
CHARACTER * 1 SIDE, HOWMNY
INTEGER N, LDA, LDB, LDVL, LDVR, MM, M, INFO
LOGICAL SELECT(*)
REAL A(LDA,*), B(LDB,*), VL(LDVL,*), VR(LDVR,*), WORK(*)
SUBROUTINE STGEVC_64(SIDE, HOWMNY, SELECT, N, A, LDA, B, LDB, VL,
LDVL, VR, LDVR, MM, M, WORK, INFO)
CHARACTER * 1 SIDE, HOWMNY
INTEGER*8 N, LDA, LDB, LDVL, LDVR, MM, M, INFO
LOGICAL*8 SELECT(*)
REAL A(LDA,*), B(LDB,*), VL(LDVL,*), VR(LDVR,*), WORK(*)
F95 INTERFACE
SUBROUTINE TGEVC(SIDE, HOWMNY, SELECT, N, A, [LDA], B, [LDB], VL,
[LDVL], VR, [LDVR], MM, M, [WORK], [INFO])
CHARACTER(LEN=1) :: SIDE, HOWMNY
INTEGER :: N, LDA, LDB, LDVL, LDVR, MM, M, INFO
LOGICAL, DIMENSION(:) :: SELECT
REAL, DIMENSION(:) :: WORK
REAL, DIMENSION(:,:) :: A, B, VL, VR
SUBROUTINE TGEVC_64(SIDE, HOWMNY, SELECT, N, A, [LDA], B, [LDB], VL,
[LDVL], VR, [LDVR], MM, M, [WORK], [INFO])
CHARACTER(LEN=1) :: SIDE, HOWMNY
INTEGER(8) :: N, LDA, LDB, LDVL, LDVR, MM, M, INFO
LOGICAL(8), DIMENSION(:) :: SELECT
REAL, DIMENSION(:) :: WORK
REAL, DIMENSION(:,:) :: A, B, VL, VR
C INTERFACE
#include <sunperf.h>
void stgevc(char side, char howmny, int *select, int n, float *a, int
lda, float *b, int ldb, float *vl, int ldvl, float *vr, int
ldvr, int mm, int *m, int *info);
void stgevc_64(char side, char howmny, long *select, long n, float *a,
long lda, float *b, long ldb, float *vl, long ldvl, float
*vr, long ldvr, long mm, long *m, long *info);
PURPOSEstgevc computes some or all of the right and/or left generalized eigen‐
vectors of a pair of real upper triangular matrices (A,B) that was
obtained from the generalized Schur factorization of an original pair
of real nonsymmetric matrices (AO,BO). B is upper triangular and A is
a block upper triangular, where the diagonal blocks are either 1-by-1
or 2-by-2.
The right generalized eigenvector x and the left generalized eigenvec‐
tor y of (A,B) corresponding to a generalized eigenvalue w are defined
by:
(A - wB) * x = 0 and y**H * (A - wB) = 0
where y**H denotes the conjugate tranpose of y.
If an eigenvalue w is determined by zero diagonal elements of both A
and B, a unit vector is returned as the corresponding eigenvector.
If all eigenvectors are requested, the routine may either return the
matrices X and/or Y of right or left eigenvectors of (A,B), or the
products Z*X and/or Q*Y, where Z and Q are input orthogonal matrices.
If (A,B) was obtained from the generalized real-Schur factorization of
an original pair of matrices
(A0,B0) = (Q*A*Z**H,Q*B*Z**H),
then Z*X and Q*Y are the matrices of right or left eigenvectors of A.
A must be block upper triangular, with 1-by-1 and 2-by-2 diagonal
blocks. Corresponding to each 2-by-2 diagonal block is a complex con‐
jugate pair of eigenvalues and eigenvectors; only one
eigenvector of the pair is computed, namely the one corresponding to
the eigenvalue with positive imaginary part.
ARGUMENTS
SIDE (input)
= 'R': compute right eigenvectors only;
= 'L': compute left eigenvectors only;
= 'B': compute both right and left eigenvectors.
HOWMNY (input)
= 'A': compute all right and/or left eigenvectors;
= 'B': compute all right and/or left eigenvectors, and back‐
transform 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 (input)
If HOWMNY='S', SELECT specifies the eigenvectors to be com‐
puted. If HOWMNY='A' or 'B', SELECT is not referenced. To
select the real eigenvector corresponding to the real eigen‐
value w(j), SELECT(j) must be set to .TRUE. To select the
complex eigenvector corresponding to a complex conjugate pair
w(j) and w(j+1), either SELECT(j) or SELECT(j+1) must be set
to .TRUE..
N (input) The order of the matrices A and B. N >= 0.
A (input) The upper quasi-triangular matrix A.
LDA (input)
The leading dimension of array A. LDA >= max(1, N).
B (input) The upper triangular matrix B. If A has a 2-by-2 diagonal
block, then the corresponding 2-by-2 block of B must be diag‐
onal with positive elements.
LDB (input)
The leading dimension of array B. LDB >= max(1,N).
VL (input/output)
On entry, if SIDE = 'L' or 'B' and HOWMNY = 'B', VL must con‐
tain an N-by-N matrix Q (usually the orthogonal matrix Q of
left Schur vectors returned by SHGEQZ). On exit, if SIDE =
'L' or 'B', VL contains: if HOWMNY = 'A', the matrix Y of
left eigenvectors of (A,B); if HOWMNY = 'B', the matrix Q*Y;
if HOWMNY = 'S', the left eigenvectors of (A,B) specified by
SELECT, stored consecutively in the columns of VL, in the
same order as their eigenvalues. If SIDE = 'R', VL is not
referenced.
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.
LDVL (input)
The leading dimension of array VL. LDVL >= max(1,N) if SIDE
= 'L' or 'B'; LDVL >= 1 otherwise.
VR (input/output)
On entry, if SIDE = 'R' or 'B' and HOWMNY = 'B', VR must con‐
tain an N-by-N matrix Q (usually the orthogonal matrix Z of
right Schur vectors returned by SHGEQZ). On exit, if SIDE =
'R' or 'B', VR contains: if HOWMNY = 'A', the matrix X of
right eigenvectors of (A,B); if HOWMNY = 'B', the matrix Z*X;
if HOWMNY = 'S', the right eigenvectors of (A,B) specified by
SELECT, stored consecutively in the columns of VR, in the
same order as their eigenvalues. If SIDE = 'L', VR is not
referenced.
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.
LDVR (input)
The leading dimension of the array VR. LDVR >= max(1,N) if
SIDE = 'R' or 'B'; LDVR >= 1 otherwise.
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 actually
used to store the eigenvectors. If HOWMNY = 'A' or 'B', M is
set to N. Each selected real eigenvector occupies one column
and each selected complex eigenvector occupies two columns.
WORK (workspace)
dimension(6*N)
INFO (output)
= 0: successful exit.
< 0: if INFO = -i, the i-th argument had an illegal value.
> 0: the 2-by-2 block (INFO:INFO+1) does not have a complex
eigenvalue.
FURTHER DETAILS
Allocation of workspace:
---------- -- ---------
WORK( j ) = 1-norm of j-th column of A, above the diagonal
WORK( N+j ) = 1-norm of j-th column of B, above the diagonal
WORK( 2*N+1:3*N ) = real part of eigenvector
WORK( 3*N+1:4*N ) = imaginary part of eigenvector
WORK( 4*N+1:5*N ) = real part of back-transformed eigenvector
WORK( 5*N+1:6*N ) = imaginary part of back-transformed eigenvector
Rowwise vs. columnwise solution methods:
------- -- ---------- -------- -------
Finding a generalized eigenvector consists basically of solving the
singular triangular system
(A - w B) x = 0 (for right) or: (A - w B)**H y = 0 (for left)
Consider finding the i-th right eigenvector (assume all eigenvalues are
real). The equation to be solved is:
0 = sum C(j,k) v(k) = sum C(j,k) v(k) for j = i,. . .,1
k=j k=j
where C = (A - w B) (The components v(i+1:n) are 0.)
The "rowwise" method is:
(1) v(i) := 1
for j = i-1,. . .,1:
i
(2) compute s = - sum C(j,k) v(k) and
k=j+1
(3) v(j) := s / C(j,j)
Step 2 is sometimes called the "dot product" step, since it is an inner
product between the j-th row and the portion of the eigenvector that
has been computed so far.
The "columnwise" method consists basically in doing the sums for all
the rows in parallel. As each v(j) is computed, the contribution of
v(j) times the j-th column of C is added to the partial sums. Since
FORTRAN arrays are stored columnwise, this has the advantage that at
each step, the elements of C that are accessed are adjacent to one
another, whereas with the rowwise method, the elements accessed at a
step are spaced LDA (and LDB) words apart.
When finding left eigenvectors, the matrix in question is the transpose
of the one in storage, so the rowwise method then actually accesses
columns of A and B at each step, and so is the preferred method.
6 Mar 2009 stgevc(3P)