version 1.13, 2012/12/14 12:30:34
|
version 1.21, 2023/08/07 08:39:40
|
Line 2
|
Line 2
|
* |
* |
* =========== DOCUMENTATION =========== |
* =========== DOCUMENTATION =========== |
* |
* |
* Online html documentation available at |
* Online html documentation available at |
* http://www.netlib.org/lapack/explore-html/ |
* http://www.netlib.org/lapack/explore-html/ |
* |
* |
*> \htmlonly |
*> \htmlonly |
*> Download ZTGEX2 + dependencies |
*> Download ZTGEX2 + dependencies |
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ztgex2.f"> |
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ztgex2.f"> |
*> [TGZ]</a> |
*> [TGZ]</a> |
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ztgex2.f"> |
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ztgex2.f"> |
*> [ZIP]</a> |
*> [ZIP]</a> |
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ztgex2.f"> |
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ztgex2.f"> |
*> [TXT]</a> |
*> [TXT]</a> |
*> \endhtmlonly |
*> \endhtmlonly |
* |
* |
* Definition: |
* Definition: |
* =========== |
* =========== |
* |
* |
* SUBROUTINE ZTGEX2( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z, |
* SUBROUTINE ZTGEX2( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z, |
* LDZ, J1, INFO ) |
* LDZ, J1, INFO ) |
* |
* |
* .. Scalar Arguments .. |
* .. Scalar Arguments .. |
* LOGICAL WANTQ, WANTZ |
* LOGICAL WANTQ, WANTZ |
* INTEGER INFO, J1, LDA, LDB, LDQ, LDZ, N |
* INTEGER INFO, J1, LDA, LDB, LDQ, LDZ, N |
Line 29
|
Line 29
|
* COMPLEX*16 A( LDA, * ), B( LDB, * ), Q( LDQ, * ), |
* COMPLEX*16 A( LDA, * ), B( LDB, * ), Q( LDQ, * ), |
* $ Z( LDZ, * ) |
* $ Z( LDZ, * ) |
* .. |
* .. |
* |
* |
* |
* |
*> \par Purpose: |
*> \par Purpose: |
* ============= |
* ============= |
Line 76
|
Line 76
|
*> |
*> |
*> \param[in,out] A |
*> \param[in,out] A |
*> \verbatim |
*> \verbatim |
*> A is COMPLEX*16 arrays, dimensions (LDA,N) |
*> A is COMPLEX*16 array, dimensions (LDA,N) |
*> On entry, the matrix A in the pair (A, B). |
*> On entry, the matrix A in the pair (A, B). |
*> On exit, the updated matrix A. |
*> On exit, the updated matrix A. |
*> \endverbatim |
*> \endverbatim |
Line 89
|
Line 89
|
*> |
*> |
*> \param[in,out] B |
*> \param[in,out] B |
*> \verbatim |
*> \verbatim |
*> B is COMPLEX*16 arrays, dimensions (LDB,N) |
*> B is COMPLEX*16 array, dimensions (LDB,N) |
*> On entry, the matrix B in the pair (A, B). |
*> On entry, the matrix B in the pair (A, B). |
*> On exit, the updated matrix B. |
*> On exit, the updated matrix B. |
*> \endverbatim |
*> \endverbatim |
Line 102
|
Line 102
|
*> |
*> |
*> \param[in,out] Q |
*> \param[in,out] Q |
*> \verbatim |
*> \verbatim |
*> Q is COMPLEX*16 array, dimension (LDZ,N) |
*> Q is COMPLEX*16 array, dimension (LDQ,N) |
*> If WANTQ = .TRUE, on entry, the unitary matrix Q. On exit, |
*> If WANTQ = .TRUE, on entry, the unitary matrix Q. On exit, |
*> the updated matrix Q. |
*> the updated matrix Q. |
*> Not referenced if WANTQ = .FALSE.. |
*> Not referenced if WANTQ = .FALSE.. |
Line 142
|
Line 142
|
*> =0: Successful exit. |
*> =0: Successful exit. |
*> =1: The transformed matrix pair (A, B) would be too far |
*> =1: The transformed matrix pair (A, B) would be too far |
*> from generalized Schur form; the problem is ill- |
*> from generalized Schur form; the problem is ill- |
*> conditioned. |
*> conditioned. |
*> \endverbatim |
*> \endverbatim |
* |
* |
* Authors: |
* Authors: |
* ======== |
* ======== |
* |
* |
*> \author Univ. of Tennessee |
*> \author Univ. of Tennessee |
*> \author Univ. of California Berkeley |
*> \author Univ. of California Berkeley |
*> \author Univ. of Colorado Denver |
*> \author Univ. of Colorado Denver |
*> \author NAG Ltd. |
*> \author NAG Ltd. |
* |
|
*> \date September 2012 |
|
* |
* |
*> \ingroup complex16GEauxiliary |
*> \ingroup complex16GEauxiliary |
* |
* |
Line 190
|
Line 188
|
SUBROUTINE ZTGEX2( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z, |
SUBROUTINE ZTGEX2( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z, |
$ LDZ, J1, INFO ) |
$ LDZ, J1, INFO ) |
* |
* |
* -- LAPACK auxiliary routine (version 3.4.2) -- |
* -- LAPACK auxiliary routine -- |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
* September 2012 |
|
* |
* |
* .. Scalar Arguments .. |
* .. Scalar Arguments .. |
LOGICAL WANTQ, WANTZ |
LOGICAL WANTQ, WANTZ |
Line 218
|
Line 215
|
PARAMETER ( WANDS = .TRUE. ) |
PARAMETER ( WANDS = .TRUE. ) |
* .. |
* .. |
* .. Local Scalars .. |
* .. Local Scalars .. |
LOGICAL DTRONG, WEAK |
LOGICAL STRONG, WEAK |
INTEGER I, M |
INTEGER I, M |
DOUBLE PRECISION CQ, CZ, EPS, SA, SB, SCALE, SMLNUM, SS, SUM, |
DOUBLE PRECISION CQ, CZ, EPS, SA, SB, SCALE, SMLNUM, SUM, |
$ THRESH, WS |
$ THRESHA, THRESHB |
COMPLEX*16 CDUM, F, G, SQ, SZ |
COMPLEX*16 CDUM, F, G, SQ, SZ |
* .. |
* .. |
* .. Local Arrays .. |
* .. Local Arrays .. |
Line 248
|
Line 245
|
* |
* |
M = LDST |
M = LDST |
WEAK = .FALSE. |
WEAK = .FALSE. |
DTRONG = .FALSE. |
STRONG = .FALSE. |
* |
* |
* Make a local copy of selected block in (A, B) |
* Make a local copy of selected block in (A, B) |
* |
* |
Line 263
|
Line 260
|
SUM = DBLE( CONE ) |
SUM = DBLE( CONE ) |
CALL ZLACPY( 'Full', M, M, S, LDST, WORK, M ) |
CALL ZLACPY( 'Full', M, M, S, LDST, WORK, M ) |
CALL ZLACPY( 'Full', M, M, T, LDST, WORK( M*M+1 ), M ) |
CALL ZLACPY( 'Full', M, M, T, LDST, WORK( M*M+1 ), M ) |
CALL ZLASSQ( 2*M*M, WORK, 1, SCALE, SUM ) |
CALL ZLASSQ( M*M, WORK, 1, SCALE, SUM ) |
SA = SCALE*SQRT( SUM ) |
SA = SCALE*SQRT( SUM ) |
|
SCALE = DBLE( CZERO ) |
|
SUM = DBLE( CONE ) |
|
CALL ZLASSQ( M*M, WORK(M*M+1), 1, SCALE, SUM ) |
|
SB = SCALE*SQRT( SUM ) |
* |
* |
* THRES has been changed from |
* THRES has been changed from |
* THRESH = MAX( TEN*EPS*SA, SMLNUM ) |
* THRESH = MAX( TEN*EPS*SA, SMLNUM ) |
* to |
* to |
* THRESH = MAX( TWENTY*EPS*SA, SMLNUM ) |
* THRESH = MAX( TWENTY*EPS*SA, SMLNUM ) |
Line 274
|
Line 275
|
* "Bug" reported by Ondra Kamenik, confirmed by Julie Langou, fixed by |
* "Bug" reported by Ondra Kamenik, confirmed by Julie Langou, fixed by |
* Jim Demmel and Guillaume Revy. See forum post 1783. |
* Jim Demmel and Guillaume Revy. See forum post 1783. |
* |
* |
THRESH = MAX( TWENTY*EPS*SA, SMLNUM ) |
THRESHA = MAX( TWENTY*EPS*SA, SMLNUM ) |
|
THRESHB = MAX( TWENTY*EPS*SB, SMLNUM ) |
* |
* |
* Compute unitary QL and RQ that swap 1-by-1 and 1-by-1 blocks |
* Compute unitary QL and RQ that swap 1-by-1 and 1-by-1 blocks |
* using Givens rotations and perform the swap tentatively. |
* using Givens rotations and perform the swap tentatively. |
* |
* |
F = S( 2, 2 )*T( 1, 1 ) - T( 2, 2 )*S( 1, 1 ) |
F = S( 2, 2 )*T( 1, 1 ) - T( 2, 2 )*S( 1, 1 ) |
G = S( 2, 2 )*T( 1, 2 ) - T( 2, 2 )*S( 1, 2 ) |
G = S( 2, 2 )*T( 1, 2 ) - T( 2, 2 )*S( 1, 2 ) |
SA = ABS( S( 2, 2 ) ) |
SA = ABS( S( 2, 2 ) ) * ABS( T( 1, 1 ) ) |
SB = ABS( T( 2, 2 ) ) |
SB = ABS( S( 1, 1 ) ) * ABS( T( 2, 2 ) ) |
CALL ZLARTG( G, F, CZ, SZ, CDUM ) |
CALL ZLARTG( G, F, CZ, SZ, CDUM ) |
SZ = -SZ |
SZ = -SZ |
CALL ZROT( 2, S( 1, 1 ), 1, S( 1, 2 ), 1, CZ, DCONJG( SZ ) ) |
CALL ZROT( 2, S( 1, 1 ), 1, S( 1, 2 ), 1, CZ, DCONJG( SZ ) ) |
Line 295
|
Line 297
|
CALL ZROT( 2, S( 1, 1 ), LDST, S( 2, 1 ), LDST, CQ, SQ ) |
CALL ZROT( 2, S( 1, 1 ), LDST, S( 2, 1 ), LDST, CQ, SQ ) |
CALL ZROT( 2, T( 1, 1 ), LDST, T( 2, 1 ), LDST, CQ, SQ ) |
CALL ZROT( 2, T( 1, 1 ), LDST, T( 2, 1 ), LDST, CQ, SQ ) |
* |
* |
* Weak stability test: |S21| + |T21| <= O(EPS F-norm((S, T))) |
* Weak stability test: |S21| <= O(EPS F-norm((A))) |
|
* and |T21| <= O(EPS F-norm((B))) |
* |
* |
WS = ABS( S( 2, 1 ) ) + ABS( T( 2, 1 ) ) |
WEAK = ABS( S( 2, 1 ) ).LE.THRESHA .AND. |
WEAK = WS.LE.THRESH |
$ ABS( T( 2, 1 ) ).LE.THRESHB |
IF( .NOT.WEAK ) |
IF( .NOT.WEAK ) |
$ GO TO 20 |
$ GO TO 20 |
* |
* |
IF( WANDS ) THEN |
IF( WANDS ) THEN |
* |
* |
* Strong stability test: |
* Strong stability test: |
* F-norm((A-QL**H*S*QR, B-QL**H*T*QR)) <= O(EPS*F-norm((A, B))) |
* F-norm((A-QL**H*S*QR)) <= O(EPS*F-norm((A))) |
|
* and |
|
* F-norm((B-QL**H*T*QR)) <= O(EPS*F-norm((B))) |
* |
* |
CALL ZLACPY( 'Full', M, M, S, LDST, WORK, M ) |
CALL ZLACPY( 'Full', M, M, S, LDST, WORK, M ) |
CALL ZLACPY( 'Full', M, M, T, LDST, WORK( M*M+1 ), M ) |
CALL ZLACPY( 'Full', M, M, T, LDST, WORK( M*M+1 ), M ) |
Line 321
|
Line 326
|
10 CONTINUE |
10 CONTINUE |
SCALE = DBLE( CZERO ) |
SCALE = DBLE( CZERO ) |
SUM = DBLE( CONE ) |
SUM = DBLE( CONE ) |
CALL ZLASSQ( 2*M*M, WORK, 1, SCALE, SUM ) |
CALL ZLASSQ( M*M, WORK, 1, SCALE, SUM ) |
SS = SCALE*SQRT( SUM ) |
SA = SCALE*SQRT( SUM ) |
DTRONG = SS.LE.THRESH |
SCALE = DBLE( CZERO ) |
IF( .NOT.DTRONG ) |
SUM = DBLE( CONE ) |
|
CALL ZLASSQ( M*M, WORK(M*M+1), 1, SCALE, SUM ) |
|
SB = SCALE*SQRT( SUM ) |
|
STRONG = SA.LE.THRESHA .AND. SB.LE.THRESHB |
|
IF( .NOT.STRONG ) |
$ GO TO 20 |
$ GO TO 20 |
END IF |
END IF |
* |
* |