150 SUBROUTINE dlags2( UPPER, A1, A2, A3, B1, B2, B3, CSU, SNU, CSV,
159 DOUBLE PRECISION A1, A2, A3, B1, B2, B3, CSQ, CSU, CSV, SNQ,
166 DOUBLE PRECISION ZERO
167 parameter( zero = 0.0d+0 )
170 DOUBLE PRECISION A, AUA11, AUA12, AUA21, AUA22, AVB11, AVB12,
171 $ avb21, avb22, b, c, csl, csr, d, r, s1, s2,
172 $ snl, snr, ua11, ua11r, ua12, ua21, ua22, ua22r,
173 $ vb11, vb11r, vb12, vb21, vb22, vb22r
199 CALL dlasv2( a, b, d, s1, s2, snr, csr, snl, csl )
201 IF( abs( csl ).GE.abs( snl ) .OR. abs( csr ).GE.abs( snr ) )
208 ua12 = csl*a2 + snl*a3
211 vb12 = csr*b2 + snr*b3
213 aua12 = abs( csl )*abs( a2 ) + abs( snl )*abs( a3 )
214 avb12 = abs( csr )*abs( b2 ) + abs( snr )*abs( b3 )
218 IF( ( abs( ua11r )+abs( ua12 ) ).NE.zero )
THEN
219 IF( aua12 / ( abs( ua11r )+abs( ua12 ) ).LE.avb12 /
220 $ ( abs( vb11r )+abs( vb12 ) ) )
THEN
221 CALL dlartg( -ua11r, ua12, csq, snq, r )
223 CALL dlartg( -vb11r, vb12, csq, snq, r )
226 CALL dlartg( -vb11r, vb12, csq, snq, r )
240 ua22 = -snl*a2 + csl*a3
243 vb22 = -snr*b2 + csr*b3
245 aua22 = abs( snl )*abs( a2 ) + abs( csl )*abs( a3 )
246 avb22 = abs( snr )*abs( b2 ) + abs( csr )*abs( b3 )
250 IF( ( abs( ua21 )+abs( ua22 ) ).NE.zero )
THEN
251 IF( aua22 / ( abs( ua21 )+abs( ua22 ) ).LE.avb22 /
252 $ ( abs( vb21 )+abs( vb22 ) ) )
THEN
253 CALL dlartg( -ua21, ua22, csq, snq, r )
255 CALL dlartg( -vb21, vb22, csq, snq, r )
258 CALL dlartg( -vb21, vb22, csq, snq, r )
284 CALL dlasv2( a, c, d, s1, s2, snr, csr, snl, csl )
286 IF( abs( csr ).GE.abs( snr ) .OR. abs( csl ).GE.abs( snl ) )
292 ua21 = -snr*a1 + csr*a2
295 vb21 = -snl*b1 + csl*b2
298 aua21 = abs( snr )*abs( a1 ) + abs( csr )*abs( a2 )
299 avb21 = abs( snl )*abs( b1 ) + abs( csl )*abs( b2 )
303 IF( ( abs( ua21 )+abs( ua22r ) ).NE.zero )
THEN
304 IF( aua21 / ( abs( ua21 )+abs( ua22r ) ).LE.avb21 /
305 $ ( abs( vb21 )+abs( vb22r ) ) )
THEN
306 CALL dlartg( ua22r, ua21, csq, snq, r )
308 CALL dlartg( vb22r, vb21, csq, snq, r )
311 CALL dlartg( vb22r, vb21, csq, snq, r )
324 ua11 = csr*a1 + snr*a2
327 vb11 = csl*b1 + snl*b2
330 aua11 = abs( csr )*abs( a1 ) + abs( snr )*abs( a2 )
331 avb11 = abs( csl )*abs( b1 ) + abs( snl )*abs( b2 )
335 IF( ( abs( ua11 )+abs( ua12 ) ).NE.zero )
THEN
336 IF( aua11 / ( abs( ua11 )+abs( ua12 ) ).LE.avb11 /
337 $ ( abs( vb11 )+abs( vb12 ) ) )
THEN
338 CALL dlartg( ua12, ua11, csq, snq, r )
340 CALL dlartg( vb12, vb11, csq, snq, r )
343 CALL dlartg( vb12, vb11, csq, snq, r )
subroutine dlags2(upper, a1, a2, a3, b1, b2, b3, csu, snu, csv, snv, csq, snq)
DLAGS2 computes 2-by-2 orthogonal matrices U, V, and Q, and applies them to matrices A and B such tha...
subroutine dlartg(f, g, c, s, r)
DLARTG generates a plane rotation with real cosine and real sine.
subroutine dlasv2(f, g, h, ssmin, ssmax, snr, csr, snl, csl)
DLASV2 computes the singular value decomposition of a 2-by-2 triangular matrix.