158 SUBROUTINE zlags2( UPPER, A1, A2, A3, B1, B2, B3, CSU, SNU, CSV,
168 DOUBLE PRECISION A1, A3, B1, B3, CSQ, CSU, CSV
169 COMPLEX*16 A2, B2, SNQ, SNU, SNV
175 DOUBLE PRECISION ZERO, ONE
176 parameter ( zero = 0.0d+0, one = 1.0d+0 )
179 DOUBLE PRECISION A, AUA11, AUA12, AUA21, AUA22, AVB12, AVB11,
180 $ avb21, avb22, csl, csr, d, fb, fc, s1, s2,
181 $ snl, snr, ua11r, ua22r, vb11r, vb22r
182 COMPLEX*16 B, C, D1, R, T, UA11, UA12, UA21, UA22, VB11,
189 INTRINSIC abs, dble, dcmplx, dconjg, dimag
192 DOUBLE PRECISION ABS1
195 abs1( t ) = abs( dble( t ) ) + abs( dimag( t ) )
223 CALL dlasv2( a, fb, d, s1, s2, snr, csr, snl, csl )
225 IF( abs( csl ).GE.abs( snl ) .OR. abs( csr ).GE.abs( snr ) )
232 ua12 = csl*a2 + d1*snl*a3
235 vb12 = csr*b2 + d1*snr*b3
237 aua12 = abs( csl )*abs1( a2 ) + abs( snl )*abs( a3 )
238 avb12 = abs( csr )*abs1( b2 ) + abs( snr )*abs( b3 )
242 IF( ( abs( ua11r )+abs1( ua12 ) ).EQ.zero )
THEN
243 CALL zlartg( -dcmplx( vb11r ), dconjg( vb12 ), csq, snq,
245 ELSE IF( ( abs( vb11r )+abs1( vb12 ) ).EQ.zero )
THEN
246 CALL zlartg( -dcmplx( ua11r ), dconjg( ua12 ), csq, snq,
248 ELSE IF( aua12 / ( abs( ua11r )+abs1( ua12 ) ).LE.avb12 /
249 $ ( abs( vb11r )+abs1( vb12 ) ) )
THEN
250 CALL zlartg( -dcmplx( ua11r ), dconjg( ua12 ), csq, snq,
253 CALL zlartg( -dcmplx( vb11r ), dconjg( vb12 ), csq, snq,
267 ua21 = -dconjg( d1 )*snl*a1
268 ua22 = -dconjg( d1 )*snl*a2 + csl*a3
270 vb21 = -dconjg( d1 )*snr*b1
271 vb22 = -dconjg( d1 )*snr*b2 + csr*b3
273 aua22 = abs( snl )*abs1( a2 ) + abs( csl )*abs( a3 )
274 avb22 = abs( snr )*abs1( b2 ) + abs( csr )*abs( b3 )
278 IF( ( abs1( ua21 )+abs1( ua22 ) ).EQ.zero )
THEN
279 CALL zlartg( -dconjg( vb21 ), dconjg( vb22 ), csq, snq,
281 ELSE IF( ( abs1( vb21 )+abs( vb22 ) ).EQ.zero )
THEN
282 CALL zlartg( -dconjg( ua21 ), dconjg( ua22 ), csq, snq,
284 ELSE IF( aua22 / ( abs1( ua21 )+abs1( ua22 ) ).LE.avb22 /
285 $ ( abs1( vb21 )+abs1( vb22 ) ) )
THEN
286 CALL zlartg( -dconjg( ua21 ), dconjg( ua22 ), csq, snq,
289 CALL zlartg( -dconjg( vb21 ), dconjg( vb22 ), csq, snq,
324 CALL dlasv2( a, fc, d, s1, s2, snr, csr, snl, csl )
326 IF( abs( csr ).GE.abs( snr ) .OR. abs( csl ).GE.abs( snl ) )
332 ua21 = -d1*snr*a1 + csr*a2
335 vb21 = -d1*snl*b1 + csl*b2
338 aua21 = abs( snr )*abs( a1 ) + abs( csr )*abs1( a2 )
339 avb21 = abs( snl )*abs( b1 ) + abs( csl )*abs1( b2 )
343 IF( ( abs1( ua21 )+abs( ua22r ) ).EQ.zero )
THEN
344 CALL zlartg( dcmplx( vb22r ), vb21, csq, snq, r )
345 ELSE IF( ( abs1( vb21 )+abs( vb22r ) ).EQ.zero )
THEN
346 CALL zlartg( dcmplx( ua22r ), ua21, csq, snq, r )
347 ELSE IF( aua21 / ( abs1( ua21 )+abs( ua22r ) ).LE.avb21 /
348 $ ( abs1( vb21 )+abs( vb22r ) ) )
THEN
349 CALL zlartg( dcmplx( ua22r ), ua21, csq, snq, r )
351 CALL zlartg( dcmplx( vb22r ), vb21, csq, snq, r )
355 snu = -dconjg( d1 )*snr
357 snv = -dconjg( d1 )*snl
364 ua11 = csr*a1 + dconjg( d1 )*snr*a2
365 ua12 = dconjg( d1 )*snr*a3
367 vb11 = csl*b1 + dconjg( d1 )*snl*b2
368 vb12 = dconjg( d1 )*snl*b3
370 aua11 = abs( csr )*abs( a1 ) + abs( snr )*abs1( a2 )
371 avb11 = abs( csl )*abs( b1 ) + abs( snl )*abs1( b2 )
375 IF( ( abs1( ua11 )+abs1( ua12 ) ).EQ.zero )
THEN
376 CALL zlartg( vb12, vb11, csq, snq, r )
377 ELSE IF( ( abs1( vb11 )+abs1( vb12 ) ).EQ.zero )
THEN
378 CALL zlartg( ua12, ua11, csq, snq, r )
379 ELSE IF( aua11 / ( abs1( ua11 )+abs1( ua12 ) ).LE.avb11 /
380 $ ( abs1( vb11 )+abs1( vb12 ) ) )
THEN
381 CALL zlartg( ua12, ua11, csq, snq, r )
383 CALL zlartg( vb12, vb11, csq, snq, r )
387 snu = dconjg( d1 )*csr
389 snv = dconjg( d1 )*csl
subroutine zlags2(UPPER, A1, A2, A3, B1, B2, B3, CSU, SNU, CSV, SNV, CSQ, SNQ)
ZLAGS2
subroutine dlasv2(F, G, H, SSMIN, SSMAX, SNR, CSR, SNL, CSL)
DLASV2 computes the singular value decomposition of a 2-by-2 triangular matrix.
subroutine zlartg(F, G, CS, SN, R)
ZLARTG generates a plane rotation with real cosine and complex sine.