156 SUBROUTINE clags2( UPPER, A1, A2, A3, B1, B2, B3, CSU, SNU, CSV,
165 REAL A1, A3, B1, B3, CSQ, CSU, CSV
166 COMPLEX A2, B2, SNQ, SNU, SNV
173 parameter( zero = 0.0e+0, one = 1.0e+0 )
176 REAL A, AUA11, AUA12, AUA21, AUA22, AVB11, AVB12,
177 $ avb21, avb22, csl, csr, d, fb, fc, s1, s2, snl,
178 $ snr, ua11r, ua22r, vb11r, vb22r
179 COMPLEX B, C, D1, R, T, UA11, UA12, UA21, UA22, VB11,
186 INTRINSIC abs, aimag, cmplx, conjg, real
192 abs1( t ) = abs( real( t ) ) + abs( aimag( t ) )
220 CALL slasv2( a, fb, d, s1, s2, snr, csr, snl, csl )
222 IF( abs( csl ).GE.abs( snl ) .OR. abs( csr ).GE.abs( snr ) )
229 ua12 = csl*a2 + d1*snl*a3
232 vb12 = csr*b2 + d1*snr*b3
234 aua12 = abs( csl )*abs1( a2 ) + abs( snl )*abs( a3 )
235 avb12 = abs( csr )*abs1( b2 ) + abs( snr )*abs( b3 )
239 IF( ( abs( ua11r )+abs1( ua12 ) ).EQ.zero )
THEN
240 CALL clartg( -cmplx( vb11r ), conjg( vb12 ), csq, snq,
242 ELSE IF( ( abs( vb11r )+abs1( vb12 ) ).EQ.zero )
THEN
243 CALL clartg( -cmplx( ua11r ), conjg( ua12 ), csq, snq,
245 ELSE IF( aua12 / ( abs( ua11r )+abs1( ua12 ) ).LE.avb12 /
246 $ ( abs( vb11r )+abs1( vb12 ) ) )
THEN
247 CALL clartg( -cmplx( ua11r ), conjg( ua12 ), csq, snq,
250 CALL clartg( -cmplx( vb11r ), conjg( vb12 ), csq, snq,
264 ua21 = -conjg( d1 )*snl*a1
265 ua22 = -conjg( d1 )*snl*a2 + csl*a3
267 vb21 = -conjg( d1 )*snr*b1
268 vb22 = -conjg( d1 )*snr*b2 + csr*b3
270 aua22 = abs( snl )*abs1( a2 ) + abs( csl )*abs( a3 )
271 avb22 = abs( snr )*abs1( b2 ) + abs( csr )*abs( b3 )
275 IF( ( abs1( ua21 )+abs1( ua22 ) ).EQ.zero )
THEN
276 CALL clartg( -conjg( vb21 ), conjg( vb22 ), csq, snq, r )
277 ELSE IF( ( abs1( vb21 )+abs( vb22 ) ).EQ.zero )
THEN
278 CALL clartg( -conjg( ua21 ), conjg( ua22 ), csq, snq, r )
279 ELSE IF( aua22 / ( abs1( ua21 )+abs1( ua22 ) ).LE.avb22 /
280 $ ( abs1( vb21 )+abs1( vb22 ) ) )
THEN
281 CALL clartg( -conjg( ua21 ), conjg( ua22 ), csq, snq, r )
283 CALL clartg( -conjg( vb21 ), conjg( vb22 ), csq, snq, r )
317 CALL slasv2( a, fc, d, s1, s2, snr, csr, snl, csl )
319 IF( abs( csr ).GE.abs( snr ) .OR. abs( csl ).GE.abs( snl ) )
325 ua21 = -d1*snr*a1 + csr*a2
328 vb21 = -d1*snl*b1 + csl*b2
331 aua21 = abs( snr )*abs( a1 ) + abs( csr )*abs1( a2 )
332 avb21 = abs( snl )*abs( b1 ) + abs( csl )*abs1( b2 )
336 IF( ( abs1( ua21 )+abs( ua22r ) ).EQ.zero )
THEN
337 CALL clartg( cmplx( vb22r ), vb21, csq, snq, r )
338 ELSE IF( ( abs1( vb21 )+abs( vb22r ) ).EQ.zero )
THEN
339 CALL clartg( cmplx( ua22r ), ua21, csq, snq, r )
340 ELSE IF( aua21 / ( abs1( ua21 )+abs( ua22r ) ).LE.avb21 /
341 $ ( abs1( vb21 )+abs( vb22r ) ) )
THEN
342 CALL clartg( cmplx( ua22r ), ua21, csq, snq, r )
344 CALL clartg( cmplx( vb22r ), vb21, csq, snq, r )
348 snu = -conjg( d1 )*snr
350 snv = -conjg( d1 )*snl
357 ua11 = csr*a1 + conjg( d1 )*snr*a2
358 ua12 = conjg( d1 )*snr*a3
360 vb11 = csl*b1 + conjg( d1 )*snl*b2
361 vb12 = conjg( d1 )*snl*b3
363 aua11 = abs( csr )*abs( a1 ) + abs( snr )*abs1( a2 )
364 avb11 = abs( csl )*abs( b1 ) + abs( snl )*abs1( b2 )
368 IF( ( abs1( ua11 )+abs1( ua12 ) ).EQ.zero )
THEN
369 CALL clartg( vb12, vb11, csq, snq, r )
370 ELSE IF( ( abs1( vb11 )+abs1( vb12 ) ).EQ.zero )
THEN
371 CALL clartg( ua12, ua11, csq, snq, r )
372 ELSE IF( aua11 / ( abs1( ua11 )+abs1( ua12 ) ).LE.avb11 /
373 $ ( abs1( vb11 )+abs1( vb12 ) ) )
THEN
374 CALL clartg( ua12, ua11, csq, snq, r )
376 CALL clartg( vb12, vb11, csq, snq, r )
380 snu = conjg( d1 )*csr
382 snv = conjg( d1 )*csl
subroutine clags2(upper, a1, a2, a3, b1, b2, b3, csu, snu, csv, snv, csq, snq)
CLAGS2
subroutine clartg(f, g, c, s, r)
CLARTG generates a plane rotation with real cosine and complex sine.
subroutine slasv2(f, g, h, ssmin, ssmax, snr, csr, snl, csl)
SLASV2 computes the singular value decomposition of a 2-by-2 triangular matrix.