00001 SUBROUTINE ZLAGS2( UPPER, A1, A2, A3, B1, B2, B3, CSU, SNU, CSV,
00002 $ SNV, CSQ, SNQ )
00003
00004
00005
00006
00007
00008
00009
00010 LOGICAL UPPER
00011 DOUBLE PRECISION A1, A3, B1, B3, CSQ, CSU, CSV
00012 COMPLEX*16 A2, B2, SNQ, SNU, SNV
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 DOUBLE PRECISION ZERO, ONE
00086 PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 )
00087
00088
00089 DOUBLE PRECISION A, AUA11, AUA12, AUA21, AUA22, AVB12, AVB11,
00090 $ AVB21, AVB22, CSL, CSR, D, FB, FC, S1, S2,
00091 $ SNL, SNR, UA11R, UA22R, VB11R, VB22R
00092 COMPLEX*16 B, C, D1, R, T, UA11, UA12, UA21, UA22, VB11,
00093 $ VB12, VB21, VB22
00094
00095
00096 EXTERNAL DLASV2, ZLARTG
00097
00098
00099 INTRINSIC ABS, DBLE, DCMPLX, DCONJG, DIMAG
00100
00101
00102 DOUBLE PRECISION ABS1
00103
00104
00105 ABS1( T ) = ABS( DBLE( T ) ) + ABS( DIMAG( T ) )
00106
00107
00108
00109 IF( UPPER ) THEN
00110
00111
00112
00113
00114
00115
00116 A = A1*B3
00117 D = A3*B1
00118 B = A2*B1 - A1*B2
00119 FB = ABS( B )
00120
00121
00122
00123
00124 D1 = ONE
00125 IF( FB.NE.ZERO )
00126 $ D1 = B / FB
00127
00128
00129
00130
00131
00132
00133 CALL DLASV2( A, FB, D, S1, S2, SNR, CSR, SNL, CSL )
00134
00135 IF( ABS( CSL ).GE.ABS( SNL ) .OR. ABS( CSR ).GE.ABS( SNR ) )
00136 $ THEN
00137
00138
00139
00140
00141 UA11R = CSL*A1
00142 UA12 = CSL*A2 + D1*SNL*A3
00143
00144 VB11R = CSR*B1
00145 VB12 = CSR*B2 + D1*SNR*B3
00146
00147 AUA12 = ABS( CSL )*ABS1( A2 ) + ABS( SNL )*ABS( A3 )
00148 AVB12 = ABS( CSR )*ABS1( B2 ) + ABS( SNR )*ABS( B3 )
00149
00150
00151
00152 IF( ( ABS( UA11R )+ABS1( UA12 ) ).EQ.ZERO ) THEN
00153 CALL ZLARTG( -DCMPLX( VB11R ), DCONJG( VB12 ), CSQ, SNQ,
00154 $ R )
00155 ELSE IF( ( ABS( VB11R )+ABS1( VB12 ) ).EQ.ZERO ) THEN
00156 CALL ZLARTG( -DCMPLX( UA11R ), DCONJG( UA12 ), CSQ, SNQ,
00157 $ R )
00158 ELSE IF( AUA12 / ( ABS( UA11R )+ABS1( UA12 ) ).LE.AVB12 /
00159 $ ( ABS( VB11R )+ABS1( VB12 ) ) ) THEN
00160 CALL ZLARTG( -DCMPLX( UA11R ), DCONJG( UA12 ), CSQ, SNQ,
00161 $ R )
00162 ELSE
00163 CALL ZLARTG( -DCMPLX( VB11R ), DCONJG( VB12 ), CSQ, SNQ,
00164 $ R )
00165 END IF
00166
00167 CSU = CSL
00168 SNU = -D1*SNL
00169 CSV = CSR
00170 SNV = -D1*SNR
00171
00172 ELSE
00173
00174
00175
00176
00177 UA21 = -DCONJG( D1 )*SNL*A1
00178 UA22 = -DCONJG( D1 )*SNL*A2 + CSL*A3
00179
00180 VB21 = -DCONJG( D1 )*SNR*B1
00181 VB22 = -DCONJG( D1 )*SNR*B2 + CSR*B3
00182
00183 AUA22 = ABS( SNL )*ABS1( A2 ) + ABS( CSL )*ABS( A3 )
00184 AVB22 = ABS( SNR )*ABS1( B2 ) + ABS( CSR )*ABS( B3 )
00185
00186
00187
00188 IF( ( ABS1( UA21 )+ABS1( UA22 ) ).EQ.ZERO ) THEN
00189 CALL ZLARTG( -DCONJG( VB21 ), DCONJG( VB22 ), CSQ, SNQ,
00190 $ R )
00191 ELSE IF( ( ABS1( VB21 )+ABS( VB22 ) ).EQ.ZERO ) THEN
00192 CALL ZLARTG( -DCONJG( UA21 ), DCONJG( UA22 ), CSQ, SNQ,
00193 $ R )
00194 ELSE IF( AUA22 / ( ABS1( UA21 )+ABS1( UA22 ) ).LE.AVB22 /
00195 $ ( ABS1( VB21 )+ABS1( VB22 ) ) ) THEN
00196 CALL ZLARTG( -DCONJG( UA21 ), DCONJG( UA22 ), CSQ, SNQ,
00197 $ R )
00198 ELSE
00199 CALL ZLARTG( -DCONJG( VB21 ), DCONJG( VB22 ), CSQ, SNQ,
00200 $ R )
00201 END IF
00202
00203 CSU = SNL
00204 SNU = D1*CSL
00205 CSV = SNR
00206 SNV = D1*CSR
00207
00208 END IF
00209
00210 ELSE
00211
00212
00213
00214
00215
00216
00217 A = A1*B3
00218 D = A3*B1
00219 C = A2*B3 - A3*B2
00220 FC = ABS( C )
00221
00222
00223
00224
00225 D1 = ONE
00226 IF( FC.NE.ZERO )
00227 $ D1 = C / FC
00228
00229
00230
00231
00232
00233
00234 CALL DLASV2( A, FC, D, S1, S2, SNR, CSR, SNL, CSL )
00235
00236 IF( ABS( CSR ).GE.ABS( SNR ) .OR. ABS( CSL ).GE.ABS( SNL ) )
00237 $ THEN
00238
00239
00240
00241
00242 UA21 = -D1*SNR*A1 + CSR*A2
00243 UA22R = CSR*A3
00244
00245 VB21 = -D1*SNL*B1 + CSL*B2
00246 VB22R = CSL*B3
00247
00248 AUA21 = ABS( SNR )*ABS( A1 ) + ABS( CSR )*ABS1( A2 )
00249 AVB21 = ABS( SNL )*ABS( B1 ) + ABS( CSL )*ABS1( B2 )
00250
00251
00252
00253 IF( ( ABS1( UA21 )+ABS( UA22R ) ).EQ.ZERO ) THEN
00254 CALL ZLARTG( DCMPLX( VB22R ), VB21, CSQ, SNQ, R )
00255 ELSE IF( ( ABS1( VB21 )+ABS( VB22R ) ).EQ.ZERO ) THEN
00256 CALL ZLARTG( DCMPLX( UA22R ), UA21, CSQ, SNQ, R )
00257 ELSE IF( AUA21 / ( ABS1( UA21 )+ABS( UA22R ) ).LE.AVB21 /
00258 $ ( ABS1( VB21 )+ABS( VB22R ) ) ) THEN
00259 CALL ZLARTG( DCMPLX( UA22R ), UA21, CSQ, SNQ, R )
00260 ELSE
00261 CALL ZLARTG( DCMPLX( VB22R ), VB21, CSQ, SNQ, R )
00262 END IF
00263
00264 CSU = CSR
00265 SNU = -DCONJG( D1 )*SNR
00266 CSV = CSL
00267 SNV = -DCONJG( D1 )*SNL
00268
00269 ELSE
00270
00271
00272
00273
00274 UA11 = CSR*A1 + DCONJG( D1 )*SNR*A2
00275 UA12 = DCONJG( D1 )*SNR*A3
00276
00277 VB11 = CSL*B1 + DCONJG( D1 )*SNL*B2
00278 VB12 = DCONJG( D1 )*SNL*B3
00279
00280 AUA11 = ABS( CSR )*ABS( A1 ) + ABS( SNR )*ABS1( A2 )
00281 AVB11 = ABS( CSL )*ABS( B1 ) + ABS( SNL )*ABS1( B2 )
00282
00283
00284
00285 IF( ( ABS1( UA11 )+ABS1( UA12 ) ).EQ.ZERO ) THEN
00286 CALL ZLARTG( VB12, VB11, CSQ, SNQ, R )
00287 ELSE IF( ( ABS1( VB11 )+ABS1( VB12 ) ).EQ.ZERO ) THEN
00288 CALL ZLARTG( UA12, UA11, CSQ, SNQ, R )
00289 ELSE IF( AUA11 / ( ABS1( UA11 )+ABS1( UA12 ) ).LE.AVB11 /
00290 $ ( ABS1( VB11 )+ABS1( VB12 ) ) ) THEN
00291 CALL ZLARTG( UA12, UA11, CSQ, SNQ, R )
00292 ELSE
00293 CALL ZLARTG( VB12, VB11, CSQ, SNQ, R )
00294 END IF
00295
00296 CSU = SNR
00297 SNU = DCONJG( D1 )*CSR
00298 CSV = SNL
00299 SNV = DCONJG( D1 )*CSL
00300
00301 END IF
00302
00303 END IF
00304
00305 RETURN
00306
00307
00308
00309 END