la_gegs

advertisement
!----------------------------------------------------------------!
! Purpose
! =======
!
! LA_GEGS computes for a pair of n-by-n real nonsymmetric matrices
! A, B: the generalized eigenvalues (alphar +/- alphai!i, beta),
! the real Schur form (A, B), and optionally left and/or right
! Schur vectors (VSL and VSR).
!
! (If only the generalized eigenvalues are needed, use the driver SGEGV
! instead.)
!
! A generalized eigenvalue for a pair of matrices (A,B) is, roughly
! speaking, a scalar w or a ratio alpha/beta = w, such that A - w*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. A good beginning reference is the book, "Matrix
! Computations", by G. Golub & C. van Loan (Johns Hopkins U. Press)
!
! The (generalized) Schur form of a pair of matrices is the result of
! multiplying both matrices on the left by one orthogonal matrix and
! both on the right by another orthogonal matrix, these two orthogonal
! matrices being chosen so as to bring the pair of matrices into
! (real) Schur form.
!
! A pair of matrices A, B is in generalized real Schur form if B is
! upper triangular with non-negative diagonal and A is block upper
! triangular with 1-by-1 and 2-by-2 blocks. 1-by-1 blocks correspond
! to real generalized eigenvalues, while 2-by-2 blocks of A will be
! "standardized" by making the corresponding elements of B have the
! form:
!
[ a 0 ]
!
[ 0 b ]
!
! and the pair of corresponding 2-by-2 blocks in A and B will
! have a complex conjugate pair of generalized eigenvalues.
!
! The left and right Schur vectors are the columns of VSL and VSR,
! respectively, where VSL and VSR are the orthogonal matrices
! which reduce A and B to Schur form:
!
! Schur form of (A,B) = ( (VSL)**T A (VSR), (VSL)**T B (VSR) )
!
! =========
!
!
SUBROUTINE LA_GEGS( A, B, <alpha>, BETA, VSL, VSR, INFO )
!
<type>(<wp>), INTENT(INOUT) :: A(:,:), B(:,:)
!
<type>(<wp>), INTENT(OUT), OPTIONAL :: <alpha'>, BETA(:)
!
<type>(<wp>), INTENT(OUT), OPTIONAL :: VSL(:,:), VSR(:,:)
!
INTEGER, INTENT(OUT), OPTIONAL :: INFO
!
where
!
<type>
::= REAL | COMPLEX
!
<wp>
::= KIND(1.0) | KIND(1.0D0)
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
<alpha> ::= ALPHAR, ALPHAI | ALPHA
<alpha'> ::= ALPHAR(:), ALPHAI(:) | ALPHA(:)
Arguments
=========
A
(input/output) REAL / COMPLEX array, shape (:,:),
SIZE(A,1) == SIZE(A,2) == n.
On entry, the first of the pair of matrices whose generalized
eigenvalues and (optionally) Schur vectors are to be
computed.
On exit, the generalized Schur form of A.
Note: to avoid overflow, the Frobenius norm of the matrix
A should be less than the overflow threshold.
B
(input/output) REAL / COMPLEX array, shape (:,:),
SIZE(rBA,1) == SIZE(rBA,2) == n.
On entry, the second of the pair of matrices whose
generalized eigenvalues and (optionally) Schur vectors are
to be computed.
On exit, the generalized Schur form of B.
Note: to avoid overflow, the Frobenius norm of the matrix
B should be less than the overflow threshold.
ALPHAR
ALPHAI
ALPHA
Only for the real case. Optional (output) REAL array,
shape (:), SIZE(ALPHA') == n. ALPHA ::= ALPHAR | ALPHAI
Only for the complex case. Optional (output) COMPLEX
array, shape (:), SIZE(ALPHAI) == n.
BETA Optional (output) REAL / COMPLEX array, shape (:),
SIZE(BETA) == n.
On exit, (ALPHAR(j) + ALPHAI(j)*i)/BETA(j), j=1,...,n, will
be the generalized eigenvalues. ALPHAR(j) + ALPHAI(j)*i,
j=1,...,n and BETA(j),j=1,...,n are the diagonals of the
complex Schur form (A,B) that would result if the 2-by-2
diagonal blocks of the real Schur form of (A,B) were further
reduced to triangular form using 2-by-2 complex unitary
transformations. 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).
VSL
Optional (output) REAL / COMPLEX array, shape (:,:),
SIZE(VSL,1) == SIZE(VSL,2) == n.
VSL will contain the left Schur vectors. (See "Purpose", above.)
VSR
Optional (output) REAL / COMPLEX array, shape (:,:),
SIZE(VSL,1) == SIZE(VSL,2) == n.
VSR will contain the right Schur vectors. (See "Purpose", above.)
!
! INFO (output) INTEGER
!
= 0: successful exit
!
< 0: if INFO = -i, the i-th argument had an illegal value.
!
= 1,...,n:
!
The QZ iteration failed. (A,B) are not in Schur
!
form, but ALPHAR(j), ALPHAI(j), and BETA(j) should
!
be correct for j=INFO+1,...,n.
!
> n: errors that usually indicate LAPACK problems:
!
=n+1: error return from LA_GGBAL
!
=n+2: error return from LA_GEQRF
!
=n+3: error return from LA_ORMQR
!
=n+4: error return from LA_ORGQR
!
=n+5: error return from LA_GGHRD
!
=n+6: error return from LA_HGEQZ (other than failed
!
iteration)
!
=n+7: error return from LA_GGBAK (computing VSL)
!
=n+8: error return from LA_GGBAK (computing VSR)
!
=n+9: error return from LA_LASCL (various places)
!
If INFO is not present and an error occurs, then the program is
!
terminated with an error message.
!-------------------------------------------------------------
Download