136 SUBROUTINE dlaexc( WANTQ, N, T, LDT, Q, LDQ, J1, N1, N2, WORK,
145 INTEGER INFO, J1, LDQ, LDT, N, N1, N2
148 DOUBLE PRECISION ( LDQ, * ), T( LDT, * ), WORK( * )
154 DOUBLE PRECISION ZERO, ONE
155 parameter( zero = 0.0d+0, one = 1.0d+0 )
157 parameter( ten = 1.0d+1 )
159 parameter( ldd = 4, ldx = 2 )
162 INTEGER IERR, J2, J3, J4, K, ND
163 DOUBLE PRECISION CS, DNORM, EPS, SCALE, SMLNUM, SN, T11, T22,
164 $ t33, tau, tau1, tau2, temp, thresh, wi1, wi2,
168 DOUBLE PRECISION D( LDD, 4 ), U( 3 ), U1( 3 ), ( 3 ),
172 DOUBLE PRECISION DLAMCH, DLANGE
173 EXTERNAL dlamch, dlange
188 IF( n.EQ.0 .OR. n1.EQ.
197 IF( n1.EQ.1 .AND. n2.EQ.1 )
THEN
206 CALL dlartg( t( j1, j2 ), t22-t11, cs, sn, temp )
211 $
CALL drot( n-j1-1, t( j1, j3 ), ldt, t( j2, j3 ), ldt, cs,
213 CALL drot( j1-1, t( 1, j1 ), 1, t( 1, j2 ), 1, cs, sn )
222 CALL drot( n, q( 1, j1 ), 1, q( 1, j2 ), 1, cs, sn )
233 CALL dlacpy(
'Full', nd, nd, t( j1, j1 ), ldt, d, ldd )
234 dnorm = dlange(
'Max', nd, nd, d, ldd, work )
240 smlnum = dlamch(
'S' ) / eps
241 thresh =
max( ten*eps*dnorm, smlnum )
245 CALL dlasy2( .false., .false., -1, n1, n2, d, ldd,
246 $ d( n1+1, n1+1 ), ldd, d( 1, n1+1 ), ldd, scale, x,
252 GO TO ( 10, 20, 30 )k
263 CALL dlarfg( 3, u( 3 ), u, 1, tau )
269 CALL dlarfx(
'L', 3, 3, u, tau, d, ldd, work )
270 CALL dlarfx(
'R', 3, 3, u, tau, d, ldd, work )
274 IF(
max( abs( d( 3, 1 ) ), abs( d( 3, 2 ) ), abs( d( 3,
275 $ 3 )-t11 ) ).GT.thresh )
GO TO 50
279 CALL dlarfx(
'L', 3, n-j1+1, u, tau, t( j1, j1 ), ldt, work )
280 CALL dlarfx(
'R', j2, 3, u, tau, t( 1, j1 ), ldt, work )
290 CALL dlarfx(
'R', n, 3, u, tau, q( 1, j1 ), ldq, work )
305 CALL dlarfg( 3, u( 1 ), u( 2 ), 1, tau )
311 CALL dlarfx(
'L', 3, 3, u, tau, d, ldd, work )
312 CALL dlarfx(
'R', 3, 3, u, tau, d, ldd, work )
316 IF(
max( abs( d( 2, 1 ) ), abs( d( 3, 1 ) ), abs( d( 1,
317 $ 1 )-t33 ) ).GT.thresh )
GO TO 50
321 CALL dlarfx( 'r
', J3, 3, U, TAU, T( 1, J1 ), LDT, WORK )
322 CALL DLARFX( 'l
', 3, N-J1, U, TAU, T( J1, J2 ), LDT, WORK )
332 CALL DLARFX( 'r
', N, 3, U, TAU, Q( 1, J1 ), LDQ, WORK )
349 CALL DLARFG( 3, U1( 1 ), U1( 2 ), 1, TAU1 )
352 TEMP = -TAU1*( X( 1, 2 )+U1( 2 )*X( 2, 2 ) )
353 U2( 1 ) = -TEMP*U1( 2 ) - X( 2, 2 )
354 U2( 2 ) = -TEMP*U1( 3 )
356 CALL DLARFG( 3, U2( 1 ), U2( 2 ), 1, TAU2 )
361 CALL DLARFX( 'l
', 3, 4, U1, TAU1, D, LDD, WORK )
362 CALL DLARFX( 'r
', 4, 3, U1, TAU1, D, LDD, WORK )
363 CALL DLARFX( 'l
', 3, 4, U2, TAU2, D( 2, 1 ), LDD, WORK )
364 CALL DLARFX( 'r
', 4, 3, U2, TAU2, D( 1, 2 ), LDD, WORK )
368 IF( MAX( ABS( D( 3, 1 ) ), ABS( D( 3, 2 ) ), ABS( D( 4, 1 ) ),
369.GT.
$ ABS( D( 4, 2 ) ) )THRESH )GO TO 50
373 CALL DLARFX( 'l
', 3, N-J1+1, U1, TAU1, T( J1, J1 ), LDT, WORK )
374 CALL DLARFX( 'r
', J4, 3, U1, TAU1, T( 1, J1 ), LDT, WORK )
375 CALL DLARFX( 'l
', 3, N-J1+1, U2, TAU2, T( J2, J1 ), LDT, WORK )
376 CALL DLARFX( 'r
', J4, 3, U2, TAU2, T( 1, J2 ), LDT, WORK )
387 CALL DLARFX( 'r
', N, 3, U1, TAU1, Q( 1, J1 ), LDQ, WORK )
388 CALL DLARFX( 'r
', N, 3, U2, TAU2, Q( 1, J2 ), LDQ, WORK )
397 CALL DLANV2( T( J1, J1 ), T( J1, J2 ), T( J2, J1 ),
398 $ T( J2, J2 ), WR1, WI1, WR2, WI2, CS, SN )
399 CALL DROT( N-J1-1, T( J1, J1+2 ), LDT, T( J2, J1+2 ), LDT,
401 CALL DROT( J1-1, T( 1, J1 ), 1, T( 1, J2 ), 1, CS, SN )
403 $ CALL DROT( N, Q( 1, J1 ), 1, Q( 1, J2 ), 1, CS, SN )
412 CALL DLANV2( T( J3, J3 ), T( J3, J4 ), T( J4, J3 ),
413 $ T( J4, J4 ), WR1, WI1, WR2, WI2, CS, SN )
415 $ CALL DROT( N-J3-1, T( J3, J3+2 ), LDT, T( J4, J3+2 ),
417 CALL DROT( J3-1, T( 1, J3 ), 1, T( 1, J4 ), 1, CS, SN )
419 $ CALL DROT( N, Q( 1, J3 ), 1, Q( 1, J4 ), 1, CS, SN )
subroutine dlasy2(ltranl, ltranr, isgn, n1, n2, tl, ldtl, tr, ldtr, b, ldb, scale, x, ldx, xnorm, info)
DLASY2 solves the Sylvester matrix equation where the matrices are of order 1 or 2.