--- rpl/lapack/lapack/dtgex2.f 2010/04/21 13:45:26 1.2 +++ rpl/lapack/lapack/dtgex2.f 2011/07/22 07:38:12 1.9 @@ -1,10 +1,10 @@ SUBROUTINE DTGEX2( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z, $ LDZ, J1, N1, N2, WORK, LWORK, INFO ) * -* -- LAPACK auxiliary routine (version 3.2) -- +* -- LAPACK auxiliary routine (version 3.3.1) -- * -- LAPACK is a software package provided by Univ. of Tennessee, -- * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2006 +* -- April 2011 -- * * .. Scalar Arguments .. LOGICAL WANTQ, WANTZ @@ -29,8 +29,8 @@ * 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)' +* Q(in) * A(in) * Z(in)**T = Q(out) * A(out) * Z(out)**T +* Q(in) * B(in) * Z(in)**T = Q(out) * B(out) * Z(out)**T * * * Arguments @@ -47,21 +47,21 @@ * N (input) INTEGER * The order of the matrices A and B. N >= 0. * -* A (input/output) DOUBLE PRECISION arrays, dimensions (LDA,N) +* A (input/output) DOUBLE PRECISION array, dimensions (LDA,N) * On entry, the matrix A in the pair (A, B). * On exit, the updated matrix A. * -* LDA (input) INTEGER +* LDA (input) INTEGER * The leading dimension of the array A. LDA >= max(1,N). * -* B (input/output) DOUBLE PRECISION arrays, dimensions (LDB,N) +* B (input/output) DOUBLE PRECISION array, dimensions (LDB,N) * On entry, the matrix B in the pair (A, B). * On exit, the updated matrix B. * -* LDB (input) INTEGER +* LDB (input) INTEGER * The leading dimension of the array B. LDB >= max(1,N). * -* Q (input/output) DOUBLE PRECISION array, dimension (LDZ,N) +* Q (input/output) DOUBLE PRECISION array, dimension (LDQ,N) * On entry, if WANTQ = .TRUE., the orthogonal matrix Q. * On exit, the updated matrix Q. * Not referenced if WANTQ = .FALSE.. @@ -134,8 +134,8 @@ * .. Parameters .. DOUBLE PRECISION ZERO, ONE PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 ) - DOUBLE PRECISION TEN - PARAMETER ( TEN = 1.0D+01 ) + DOUBLE PRECISION TWENTY + PARAMETER ( TWENTY = 2.0D+01 ) INTEGER LDST PARAMETER ( LDST = 4 ) LOGICAL WANDS @@ -205,7 +205,16 @@ CALL DLACPY( 'Full', M, M, T, LDST, WORK, M ) CALL DLASSQ( M*M, WORK, 1, DSCALE, DSUM ) DNORM = DSCALE*SQRT( DSUM ) - THRESH = MAX( TEN*EPS*DNORM, SMLNUM ) +* +* THRES has been changed from +* THRESH = MAX( TEN*EPS*SA, SMLNUM ) +* to +* THRESH = MAX( TWENTY*EPS*SA, SMLNUM ) +* on 04/01/10. +* "Bug" reported by Ondra Kamenik, confirmed by Julie Langou, fixed by +* Jim Demmel and Guillaume Revy. See forum post 1783. +* + THRESH = MAX( TWENTY*EPS*DNORM, SMLNUM ) * IF( M.EQ.2 ) THEN * @@ -250,7 +259,7 @@ IF( WANDS ) THEN * * Strong stability test: -* F-norm((A-QL'*S*QR, B-QL'*T*QR)) <= O(EPS*F-norm((A,B))) +* F-norm((A-QL**T*S*QR, B-QL**T*T*QR)) <= O(EPS*F-norm((A,B))) * CALL DLACPY( 'Full', M, M, A( J1, J1 ), LDA, WORK( M*M+1 ), $ M ) @@ -325,8 +334,8 @@ * * Compute orthogonal matrix QL: * -* QL' * LI = [ TL ] -* [ 0 ] +* QL**T * LI = [ TL ] +* [ 0 ] * where * LI = [ -L ] * [ SCALE * identity(N2) ] @@ -344,7 +353,7 @@ * * Compute orthogonal matrix RQ: * -* IR * RQ' = [ 0 TR], +* IR * RQ**T = [ 0 TR], * * where IR = [ SCALE * identity(N1), R ] * @@ -439,7 +448,7 @@ IF( WANDS ) THEN * * Strong stability test: -* F-norm((A-QL*S*QR', B-QL*T*QR')) <= O(EPS*F-norm((A,B))) +* F-norm((A-QL*S*QR**T, B-QL*T*QR**T)) <= O(EPS*F-norm((A,B))) * CALL DLACPY( 'Full', M, M, A( J1, J1 ), LDA, WORK( M*M+1 ), $ M )