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