153 SUBROUTINE dlagv2( A, LDA, B, LDB, ALPHAR, ALPHAI, BETA, CSL,
163 DOUBLE PRECISION CSL, CSR, SNL, SNR
166 DOUBLE PRECISION A( LDA, * ), ALPHAI( 2 ), ALPHAR( 2 ),
167 $ B( LDB, * ), BETA( 2 )
173 DOUBLE PRECISION ZERO, ONE
174 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
177 DOUBLE PRECISION ANORM, ASCALE, BNORM, BSCALE, H1, H2, H3, QQ,
178 $ R, RR, SAFMIN, SCALE1, SCALE2, T, ULP, WI, WR1,
185 DOUBLE PRECISION DLAMCH, DLAPY2
186 EXTERNAL DLAMCH, DLAPY2
193 safmin = dlamch(
'S' )
198 anorm = max( abs( a( 1, 1 ) )+abs( a( 2, 1 ) ),
199 $ abs( a( 1, 2 ) )+abs( a( 2, 2 ) ), safmin )
201 a( 1, 1 ) = ascale*a( 1, 1 )
202 a( 1, 2 ) = ascale*a( 1, 2 )
203 a( 2, 1 ) = ascale*a( 2, 1 )
204 a( 2, 2 ) = ascale*a( 2, 2 )
208 bnorm = max( abs( b( 1, 1 ) ), abs( b( 1, 2 ) )+abs( b( 2, 2 ) ),
211 b( 1, 1 ) = bscale*b( 1, 1 )
212 b( 1, 2 ) = bscale*b( 1, 2 )
213 b( 2, 2 ) = bscale*b( 2, 2 )
217 IF( abs( a( 2, 1 ) ).LE.ulp )
THEN
228 ELSE IF( abs( b( 1, 1 ) ).LE.ulp )
THEN
229 CALL dlartg( a( 1, 1 ), a( 2, 1 ), csl, snl, r )
232 CALL drot( 2, a( 1, 1 ), lda, a( 2, 1 ), lda, csl, snl )
233 CALL drot( 2, b( 1, 1 ), ldb, b( 2, 1 ), ldb, csl, snl )
239 ELSE IF( abs( b( 2, 2 ) ).LE.ulp )
THEN
240 CALL dlartg( a( 2, 2 ), a( 2, 1 ), csr, snr, t )
242 CALL drot( 2, a( 1, 1 ), 1, a( 1, 2 ), 1, csr, snr )
243 CALL drot( 2, b( 1, 1 ), 1, b( 1, 2 ), 1, csr, snr )
255 CALL dlag2( a, lda, b, ldb, safmin, scale1, scale2, wr1,
259 IF( wi.EQ.zero )
THEN
263 h1 = scale1*a( 1, 1 ) - wr1*b( 1, 1 )
264 h2 = scale1*a( 1, 2 ) - wr1*b( 1, 2 )
265 h3 = scale1*a( 2, 2 ) - wr1*b( 2, 2 )
267 rr = dlapy2( h1, h2 )
268 qq = dlapy2( scale1*a( 2, 1 ), h3 )
275 CALL dlartg( h2, h1, csr, snr, t )
282 CALL dlartg( h3, scale1*a( 2, 1 ), csr, snr, t )
287 CALL drot( 2, a( 1, 1 ), 1, a( 1, 2 ), 1, csr, snr )
288 CALL drot( 2, b( 1, 1 ), 1, b( 1, 2 ), 1, csr, snr )
292 h1 = max( abs( a( 1, 1 ) )+abs( a( 1, 2 ) ),
293 $ abs( a( 2, 1 ) )+abs( a( 2, 2 ) ) )
294 h2 = max( abs( b( 1, 1 ) )+abs( b( 1, 2 ) ),
295 $ abs( b( 2, 1 ) )+abs( b( 2, 2 ) ) )
297 IF( ( scale1*h1 ).GE.abs( wr1 )*h2 )
THEN
301 CALL dlartg( b( 1, 1 ), b( 2, 1 ), csl, snl, r )
307 CALL dlartg( a( 1, 1 ), a( 2, 1 ), csl, snl, r )
311 CALL drot( 2, a( 1, 1 ), lda, a( 2, 1 ), lda, csl, snl )
312 CALL drot( 2, b( 1, 1 ), ldb, b( 2, 1 ), ldb, csl, snl )
322 CALL dlasv2( b( 1, 1 ), b( 1, 2 ), b( 2, 2 ), r, t, snr,
328 CALL drot( 2, a( 1, 1 ), lda, a( 2, 1 ), lda, csl, snl )
329 CALL drot( 2, b( 1, 1 ), ldb, b( 2, 1 ), ldb, csl, snl )
330 CALL drot( 2, a( 1, 1 ), 1, a( 1, 2 ), 1, csr, snr )
331 CALL drot( 2, b( 1, 1 ), 1, b( 1, 2 ), 1, csr, snr )
342 a( 1, 1 ) = anorm*a( 1, 1 )
343 a( 2, 1 ) = anorm*a( 2, 1 )
344 a( 1, 2 ) = anorm*a( 1, 2 )
345 a( 2, 2 ) = anorm*a( 2, 2 )
346 b( 1, 1 ) = bnorm*b( 1, 1 )
347 b( 2, 1 ) = bnorm*b( 2, 1 )
348 b( 1, 2 ) = bnorm*b( 1, 2 )
349 b( 2, 2 ) = bnorm*b( 2, 2 )
351 IF( wi.EQ.zero )
THEN
352 alphar( 1 ) = a( 1, 1 )
353 alphar( 2 ) = a( 2, 2 )
356 beta( 1 ) = b( 1, 1 )
357 beta( 2 ) = b( 2, 2 )
359 alphar( 1 ) = anorm*wr1 / scale1 / bnorm
360 alphai( 1 ) = anorm*wi / scale1 / bnorm
361 alphar( 2 ) = alphar( 1 )
362 alphai( 2 ) = -alphai( 1 )