version 1.20, 2018/05/29 07:18:39
|
version 1.21, 2023/08/07 08:39:40
|
Line 153
|
Line 153
|
*> \author Univ. of Colorado Denver |
*> \author Univ. of Colorado Denver |
*> \author NAG Ltd. |
*> \author NAG Ltd. |
* |
* |
*> \date June 2017 |
|
* |
|
*> \ingroup complex16GEauxiliary |
*> \ingroup complex16GEauxiliary |
* |
* |
*> \par Further Details: |
*> \par Further Details: |
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.7.1) -- |
* -- 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..-- |
* June 2017 |
|
* |
* |
* .. 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 ) |
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 |
* |
* |