dtgexc - reorder the generalized real Schur decomposition of a real matrix pair (A,B) using an orthogonal equivalence transformation (A, B) = Q * (A, B) * Z',
SUBROUTINE DTGEXC( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z, LDZ, * IFST, ILST, WORK, LWORK, INFO) INTEGER N, LDA, LDB, LDQ, LDZ, IFST, ILST, LWORK, INFO LOGICAL WANTQ, WANTZ DOUBLE PRECISION A(LDA,*), B(LDB,*), Q(LDQ,*), Z(LDZ,*), WORK(*)
SUBROUTINE DTGEXC_64( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z, * LDZ, IFST, ILST, WORK, LWORK, INFO) INTEGER*8 N, LDA, LDB, LDQ, LDZ, IFST, ILST, LWORK, INFO LOGICAL*8 WANTQ, WANTZ DOUBLE PRECISION A(LDA,*), B(LDB,*), Q(LDQ,*), Z(LDZ,*), WORK(*)
SUBROUTINE TGEXC( WANTQ, WANTZ, N, A, [LDA], B, [LDB], Q, [LDQ], Z, * [LDZ], IFST, ILST, [WORK], [LWORK], [INFO]) INTEGER :: N, LDA, LDB, LDQ, LDZ, IFST, ILST, LWORK, INFO LOGICAL :: WANTQ, WANTZ REAL(8), DIMENSION(:) :: WORK REAL(8), DIMENSION(:,:) :: A, B, Q, Z
SUBROUTINE TGEXC_64( WANTQ, WANTZ, N, A, [LDA], B, [LDB], Q, [LDQ], * Z, [LDZ], IFST, ILST, [WORK], [LWORK], [INFO]) INTEGER(8) :: N, LDA, LDB, LDQ, LDZ, IFST, ILST, LWORK, INFO LOGICAL(8) :: WANTQ, WANTZ REAL(8), DIMENSION(:) :: WORK REAL(8), DIMENSION(:,:) :: A, B, Q, Z
#include <sunperf.h>
void dtgexc(logical wantq, logical wantz, int n, double *a, int lda, double *b, int ldb, double *q, int ldq, double *z, int ldz, int *ifst, int *ilst, int *info);
void dtgexc_64(logical wantq, logical wantz, long n, double *a, long lda, double *b, long ldb, double *q, long ldq, double *z, long ldz, long *ifst, long *ilst, long *info);
dtgexc reorders the generalized real Schur decomposition of a real matrix pair (A,B) using an orthogonal equivalence transformation
so that the diagonal block of (A, B) with row index IFST is moved to row ILST.
(A, B) must be in generalized real Schur canonical form (as returned by SGGES), i.e. A is block upper triangular with 1-by-1 and 2-by-2 diagonal blocks. B is upper triangular.
Optionally, the matrices Q and Z of generalized Schur vectors are updated.
Q(in) * A(in) * Z(in)' = Q(out) * A(out) * Z(out)' Q(in) * B(in) * Z(in)' = Q(out) * B(out) * Z(out)'
.FALSE.: do not update Q.
.FALSE.: do not update Z.
WORK(1)
returns the optimal LWORK.
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.
=0: successful exit.
<0: if INFO = -i, the i-th argument had an illegal value.
=1: The transformed matrix pair (A, B) would be too far from generalized Schur form; the problem is ill- conditioned. (A, B) may have been partially reordered, and ILST points to the first row of the current position of the block being moved.
Based on contributions by
Bo Kagstrom and Peter Poromaa, Department of Computing Science, Umea University, S-901 87 Umea, Sweden.
[1] B. Kagstrom; A Direct Method for Reordering Eigenvalues in the Generalized Real Schur Form of a Regular Matrix Pair (A, B), in M.S. Moonen et al (eds), Linear Algebra for Large Scale and Real-Time Applications, Kluwer Academic Publ. 1993, pp 195-218.