BDTREXC(3) ScaLAPACK routine of NEC Numeric Library Collection BDTREXC(3) NAME BDTREXC - reorders the real Schur factorization of a real matrix A = Q*T*Q**T, so that the diagonal block of T with row index IFST is moved to row ILST SYNOPSIS SUBROUTINE BDTREXC( N, T, LDT, IFST, ILST, NITRAF, ITRAF, NDTRAF, DTRAF, WORK, INFO ) INTEGER IFST, ILST, INFO, LDT, N, NDTRAF, NITRAF INTEGER ITRAF( * ) DOUBLE PRECISION DTRAF( * ), T( LDT, * ), WORK( * ) PURPOSE BDTREXC reorders the real Schur factorization of a real matrix A = Q*T*Q**T, so that the diagonal block of T with row index IFST is moved to row ILST. The real Schur form T is reordered by an orthogonal similarity trans- formation Z**T*T*Z. In contrast to the LAPACK routine DTREXC, the orthogonal matrix Z is not explicitly constructed but represented by paramaters contained in the arrays ITRAF and DTRAF, see further details. T must be in Schur canonical form (as returned by DHSEQR), that is, block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; each 2-by-2 diagonal block has its diagonal elements equal and its off-diag- onal elements of opposite sign. ARGUMENTS N (input) INTEGER The order of the matrix T. N >= 0. T (input/output) DOUBLE PRECISION array, dimension (LDT,N) On entry, the upper quasi-triangular matrix T, in Schur Schur canonical form. On exit, the reordered upper quasi-triangular matrix, again in Schur canonical form. LDT (input) INTEGER The leading dimension of the array T. LDT >= max(1,N). IFST (input/output) INTEGER ILST (input/output) INTEGER Specify the reordering of the diagonal blocks of T. The block with row index IFST is moved to row ILST, by a sequence of transpositions between adjacent blocks. On exit, if IFST pointed on entry to the second row of a 2-by-2 block, it is changed to point to the first row; ILST always points to the first row of the block in its final position (which may differ from its input value by +1 or -1). 1 <= IFST <= N; 1 <= ILST <= N. NITRAF (input/output) INTEGER On entry, length of the array ITRAF. As a minimum requirement, NITRAF >= max(1,|ILST-IFST|). If there are 2-by-2 blocks in T then NITRAF must be larger; a safe choice is NITRAF >= max(1,2*|ILST-IFST|). On exit, actual length of the array ITRAF. ITRAF (output) INTEGER array, length NITRAF List of parameters for representing the transformation matrix Z, see further details. NDTRAF (input/output) INTEGER On entry, length of the array DTRAF. As a minimum requirement, NDTRAF >= max(1,2*|ILST-IFST|). If there are 2-by-2 blocks in T then NDTRAF must be larger; a safe choice is NDTRAF >= max(1,5*|ILST-IFST|). On exit, actual length of the array DTRAF. DTRAF (output) DOUBLE PRECISION array, length NDTRAF List of parameters for representing the transformation matrix Z, see further details. WORK (workspace) DOUBLE PRECISION array, dimension (N) INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value = 1: two adjacent blocks were too close to swap (the problem is very ill-conditioned); T may have been partially reordered, and ILST points to the first row of the current position of the block being moved. = 2: the 2 by 2 block to be reordered split into two 1 by 1 blocks and the second block failed to swap with an adjacent block. ILST points to the first row of the current position of the whole block being moved. FURTHER DETAILS The orthogonal transformation matrix Z is a product of NITRAF elemen- tary orthogonal transformations. The parameters defining these trans- formations are stored in the arrays ITRAF and DTRAF as follows: Consider the i-th transformation acting on rows/columns POS, POS+1, ... If this transformation is (1) a Givens rotation with cosine C and sine S then ITRAF(i) = POS, DTRAF(j) = C, DTRAF(j+1) = S; (2) a Householder reflector H = I - tau * v * v' with v = [ 1; v2; v3 ] then ITRAF(i) = N + POS, DTRAF(j) = tau, DTRAF(j+1) = v2, DTRAF(j+2) = v3; (3) a Householder reflector H = I - tau * v * v' with v = [ v1; v2; 1 ] then ITRAF(i) = 2*N + POS, DTRAF(j) = v1, DTRAF(j+1) = v2, DTRAF(j+2) = tau; Note that the parameters in DTRAF are stored consecutively. ScaLAPACK routine 31 October 2017 BDTREXC(3)