Purpose
To reduce 2*nb columns and rows of a real (k+2n)-by-(k+2n) matrix H: [ op(A) G ] H = [ ], [ Q op(B) ] so that elements in the first nb columns below the k-th subdiagonal of the (k+n)-by-n matrix op(A), in the first nb columns and rows of the n-by-n matrix Q and in the first nb rows above the diagonal of the n-by-(k+n) matrix op(B) are zero. The reduction is performed by orthogonal symplectic transformations UU'*H*VV and matrices U, V, YA, YB, YG, YQ, XA, XB, XG, and XQ are returned so that [ op(Aout)+U*YA'+XA*V' G+U*YG'+XG*V' ] UU' H VV = [ ]. [ Qout+U*YQ'+XQ*V' op(Bout)+U*YB'+XB*V' ] This is an auxiliary routine called by MB04TB.Specification
SUBROUTINE MB03XU( LTRA, LTRB, N, K, NB, A, LDA, B, LDB, G, LDG, $ Q, LDQ, XA, LDXA, XB, LDXB, XG, LDXG, XQ, LDXQ, $ YA, LDYA, YB, LDYB, YG, LDYG, YQ, LDYQ, CSL, $ CSR, TAUL, TAUR, DWORK ) C .. Scalar Arguments .. LOGICAL LTRA, LTRB INTEGER K, LDA, LDB, LDG, LDQ, LDXA, LDXB, LDXG, LDXQ, $ LDYA, LDYB, LDYG, LDYQ, N, NB C .. Array Arguments .. DOUBLE PRECISION A(LDA,*), B(LDB,*), CSL(*), CSR(*), DWORK(*), $ G(LDG,*), Q(LDQ,*), TAUL(*), TAUR(*), $ XA(LDXA,*), XB(LDXB,*), XG(LDXG,*), XQ(LDXQ,*), $ YA(LDYA,*), YB(LDYB,*), YG(LDYG,*), YQ(LDYQ,*)Arguments
Mode Parameters
LTRA LOGICAL Specifies the form of op( A ) as follows: = .FALSE.: op( A ) = A; = .TRUE.: op( A ) = A'. LTRB LOGICAL Specifies the form of op( B ) as follows: = .FALSE.: op( B ) = B; = .TRUE.: op( B ) = B'.Input/Output Parameters
N (input) INTEGER The order of the matrix Q. N >= 0. K (input) INTEGER The offset of the reduction. Elements below the K-th subdiagonal in the first NB columns of op(A) are reduced to zero. K >= 0. NB (input) INTEGER The number of columns/rows to be reduced. N > NB >= 0. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) if LTRA = .FALSE. (LDA,K+N) if LTRA = .TRUE. On entry with LTRA = .FALSE., the leading (K+N)-by-N part of this array must contain the matrix A. On entry with LTRA = .TRUE., the leading N-by-(K+N) part of this array must contain the matrix A. On exit with LTRA = .FALSE., the leading (K+N)-by-N part of this array contains the matrix Aout and, in the zero parts, information about the elementary reflectors used to compute the reduction. On exit with LTRA = .TRUE., the leading N-by-(K+N) part of this array contains the matrix Aout and in the zero parts information about the elementary reflectors. LDA INTEGER The leading dimension of the array A. LDA >= MAX(1,K+N), if LTRA = .FALSE.; LDA >= MAX(1,N), if LTRA = .TRUE.. B (input/output) DOUBLE PRECISION array, dimension (LDB,K+N) if LTRB = .FALSE. (LDB,N) if LTRB = .TRUE. On entry with LTRB = .FALSE., the leading N-by-(K+N) part of this array must contain the matrix B. On entry with LTRB = .TRUE., the leading (K+N)-by-N part of this array must contain the matrix B. On exit with LTRB = .FALSE., the leading N-by-(K+N) part of this array contains the matrix Bout and, in the zero parts, information about the elementary reflectors used to compute the reduction. On exit with LTRB = .TRUE., the leading (K+N)-by-N part of this array contains the matrix Bout and in the zero parts information about the elementary reflectors. LDB INTEGER The leading dimension of the array B. LDB >= MAX(1,N), if LTRB = .FALSE.; LDB >= MAX(1,K+N), if LTRB = .TRUE.. G (input/output) DOUBLE PRECISION array, dimension (LDG,N) On entry, the leading N-by-N part of this array must contain the matrix G. On exit, the leading N-by-N part of this array contains the matrix Gout. LDG INTEGER The leading dimension of the array G. LDG >= MAX(1,N). Q (input/output) DOUBLE PRECISION array, dimension (LDQ,N) On entry, the leading N-by-N part of this array must contain the matrix Q. On exit, the leading N-by-N part of this array contains the matrix Qout and in the zero parts information about the elementary reflectors used to compute the reduction. LDQ INTEGER The leading dimension of the array Q. LDQ >= MAX(1,N). XA (output) DOUBLE PRECISION array, dimension (LDXA,2*NB) On exit, the leading N-by-(2*NB) part of this array contains the matrix XA. LDXA INTEGER The leading dimension of the array XA. LDXA >= MAX(1,N). XB (output) DOUBLE PRECISION array, dimension (LDXB,2*NB) On exit, the leading (K+N)-by-(2*NB) part of this array contains the matrix XB. LDXB INTEGER The leading dimension of the array XB. LDXB >= MAX(1,K+N). XG (output) DOUBLE PRECISION array, dimension (LDXG,2*NB) On exit, the leading (K+N)-by-(2*NB) part of this array contains the matrix XG. LDXG INTEGER The leading dimension of the array XG. LDXG >= MAX(1,K+N). XQ (output) DOUBLE PRECISION array, dimension (LDXQ,2*NB) On exit, the leading N-by-(2*NB) part of this array contains the matrix XQ. LDXQ INTEGER The leading dimension of the array XQ. LDXQ >= MAX(1,N). YA (output) DOUBLE PRECISION array, dimension (LDYA,2*NB) On exit, the leading (K+N)-by-(2*NB) part of this array contains the matrix YA. LDYA INTEGER The leading dimension of the array YA. LDYA >= MAX(1,K+N). YB (output) DOUBLE PRECISION array, dimension (LDYB,2*NB) On exit, the leading N-by-(2*NB) part of this array contains the matrix YB. LDYB INTEGER The leading dimension of the array YB. LDYB >= MAX(1,N). YG (output) DOUBLE PRECISION array, dimension (LDYG,2*NB) On exit, the leading (K+N)-by-(2*NB) part of this array contains the matrix YG. LDYG INTEGER The leading dimension of the array YG. LDYG >= MAX(1,K+N). YQ (output) DOUBLE PRECISION array, dimension (LDYQ,2*NB) On exit, the leading N-by-(2*NB) part of this array contains the matrix YQ. LDYQ INTEGER The leading dimension of the array YQ. LDYQ >= MAX(1,N). CSL (output) DOUBLE PRECISION array, dimension (2*NB) On exit, the first 2NB elements of this array contain the cosines and sines of the symplectic Givens rotations applied from the left-hand side used to compute the reduction. CSR (output) DOUBLE PRECISION array, dimension (2*NB) On exit, the first 2NB-2 elements of this array contain the cosines and sines of the symplectic Givens rotations applied from the right-hand side used to compute the reduction. TAUL (output) DOUBLE PRECISION array, dimension (NB) On exit, the first NB elements of this array contain the scalar factors of some of the elementary reflectors applied form the left-hand side. TAUR (output) DOUBLE PRECISION array, dimension (NB) On exit, the first NB-1 elements of this array contain the scalar factors of some of the elementary reflectors applied form the right-hand side.Workspace
DWORK DOUBLE PRECISION array, dimension (5*NB)Method
For details regarding the representation of the orthogonal symplectic matrices UU and VV within the arrays A, B, CSL, CSR, Q, TAUL and TAUR see the description of MB04TB. The contents of A, B, G and Q on exit are illustrated by the following example with op(A) = A, op(B) = B, n = 5, k = 2 and nb = 2: ( a r r a a ) ( g g g r r g g ) ( a r r a a ) ( g g g r r g g ) ( r r r r r ) ( r r r r r r r ) A = ( u2 r r r r ), G = ( r r r r r r r ), ( u2 u2 r a a ) ( g g g r r g g ) ( u2 u2 r a a ) ( g g g r r g g ) ( u2 u2 r a a ) ( g g g r r g g ) ( t t v1 v1 v1 ) ( r r r r r v2 v2 ) ( u1 t t v1 v1 ) ( r r r r r r v2 ) Q = ( u1 u1 r q q ), B = ( b b b r r b b ). ( u1 u1 r q q ) ( b b b r r b b ) ( u1 u1 r q q ) ( b b b r r b b ) where a, b, g and q denote elements of the original matrices, r denotes a modified element, t denotes a scalar factor of an applied elementary reflector, ui and vi denote elements of the matrices U and V, respectively.Numerical Aspects
The algorithm requires ( 16*K + 32*N + 42 )*N*NB + ( 16*K + 112*N - 208/3*NB - 69 )*NB*NB - 29/3*NB floating point operations and is numerically backward stable.References
[1] Benner, P., Mehrmann, V., and Xu, H. A numerically stable, structure preserving method for computing the eigenvalues of real Hamiltonian or symplectic pencils. Numer. Math., Vol. 78 (3), pp. 329-358, 1998. [2] Kressner, D. Block algorithms for orthogonal symplectic factorizations. BIT Numerical Mathematics, 43 (4), pp. 775-790, 2003.Further Comments
NoneExample
Program Text
NoneProgram Data
NoneProgram Results
None