1 SUBROUTINE ZLANV2( A, B, C, D, RT1, RT2, CS, SN ) 2* 3* -- ScaLAPACK routine (version 1.7) -- 4* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., 5* Courant Institute, Argonne National Lab, and Rice University 6* May 28, 1999 7* 8* .. Scalar Arguments .. 9 DOUBLE PRECISION CS 10 COMPLEX*16 A, B, C, D, RT1, RT2, SN 11* .. 12* 13* Purpose 14* ======= 15* 16* ZLANV2 computes the Schur factorization of a complex 2-by-2 17* nonhermitian matrix in standard form: 18* 19* [ A B ] = [ CS -SN ] [ AA BB ] [ CS SN ] 20* [ C D ] [ SN CS ] [ 0 DD ] [-SN CS ] 21* 22* Arguments 23* ========= 24* 25* A (input/output) COMPLEX*16 26* B (input/output) COMPLEX*16 27* C (input/output) COMPLEX*16 28* D (input/output) COMPLEX*16 29* On entry, the elements of the input matrix. 30* On exit, they are overwritten by the elements of the 31* standardised Schur form. 32* 33* RT1 (output) COMPLEX*16 34* RT2 (output) COMPLEX*16 35* The two eigenvalues. 36* 37* CS (output) DOUBLE PRECISION 38* SN (output) COMPLEX*16 39* Parameters of the rotation matrix. 40* 41* Further Details 42* =============== 43* 44* Implemented by Mark R. Fahey, May 28, 1999 45* 46* ===================================================================== 47* 48* .. Parameters .. 49 DOUBLE PRECISION RZERO, HALF, RONE 50 PARAMETER ( RZERO = 0.0D+0, HALF = 0.5D+0, 51 $ RONE = 1.0D+0 ) 52 COMPLEX*16 ZERO, ONE 53 PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ), 54 $ ONE = ( 1.0D+0, 0.0D+0 ) ) 55* .. 56* .. Local Scalars .. 57 COMPLEX*16 AA, BB, DD, T, TEMP, TEMP2, U, X, Y 58* .. 59* .. External Functions .. 60 COMPLEX*16 ZLADIV 61 EXTERNAL ZLADIV 62* .. 63* .. External Subroutines .. 64 EXTERNAL ZLARTG 65* .. 66* .. Intrinsic Functions .. 67 INTRINSIC DBLE, DCMPLX, DCONJG, DIMAG, SQRT 68* .. 69* .. Executable Statements .. 70* 71* Initialize CS and SN 72* 73 CS = RONE 74 SN = ZERO 75* 76 IF( C.EQ.ZERO ) THEN 77 GO TO 10 78* 79 ELSE IF( B.EQ.ZERO ) THEN 80* 81* Swap rows and columns 82* 83 CS = RZERO 84 SN = ONE 85 TEMP = D 86 D = A 87 A = TEMP 88 B = -C 89 C = ZERO 90 GO TO 10 91 ELSE IF( ( A-D ).EQ.ZERO ) THEN 92 TEMP = SQRT( B*C ) 93 A = A + TEMP 94 D = D - TEMP 95 IF( ( B+C ).EQ.ZERO ) THEN 96 CS = SQRT( HALF ) 97 SN = DCMPLX( RZERO, RONE )*CS 98 ELSE 99 TEMP = SQRT( B+C ) 100 TEMP2 = ZLADIV( SQRT( B ), TEMP ) 101 CS = DBLE( TEMP2 ) 102 SN = ZLADIV( SQRT( C ), TEMP ) 103 END IF 104 B = B - C 105 C = ZERO 106 GO TO 10 107 ELSE 108* 109* Compute eigenvalue closest to D 110* 111 T = D 112 U = B*C 113 X = HALF*( A-T ) 114 Y = SQRT( X*X+U ) 115 IF( DBLE( X )*DBLE( Y )+DIMAG( X )*DIMAG( Y ).LT.RZERO ) 116 $ Y = -Y 117 T = T - ZLADIV( U, ( X+Y ) ) 118* 119* Do one QR step with exact shift T - resulting 2 x 2 in 120* triangular form. 121* 122 CALL ZLARTG( A-T, C, CS, SN, AA ) 123* 124 D = D - T 125 BB = CS*B + SN*D 126 DD = -DCONJG( SN )*B + CS*D 127* 128 A = AA*CS + BB*DCONJG( SN ) + T 129 B = -AA*SN + BB*CS 130 C = ZERO 131 D = T 132* 133 END IF 134* 135 10 CONTINUE 136* 137* Store eigenvalues in RT1 and RT2. 138* 139 RT1 = A 140 RT2 = D 141 RETURN 142* 143* End of ZLANV2 144* 145 END 146