234 RECURSIVE SUBROUTINE slaqz3( ILSCHUR, ILQ, ILZ, N, ILO, IHI, NW,
235 $ A, LDA, B, LDB, Q, LDQ, Z, LDZ, NS,
236 $ ND, ALPHAR, ALPHAI, BETA, QC, LDQC,
237 $ ZC, LDZC, WORK, LWORK, REC, INFO )
241 LOGICAL,
INTENT( IN ) :: ilschur, ilq, ilz
242 INTEGER,
INTENT( IN ) :: n, ilo, ihi, nw, lda, ldb, ldq, ldz,
243 $ ldqc, ldzc, lwork, rec
245 REAL,
INTENT( INOUT ) :: a( lda, * ), b( ldb, * ), q( ldq, * ),
246 $ z( ldz, * ), alphar( * ), alphai( * ), beta( * )
247 INTEGER,
INTENT( OUT ) :: ns, nd, info
248 REAL :: qc( ldqc, * ), zc( ldzc, * ), work( * )
251 REAL :: zero, one, half
252 PARAMETER( zero = 0.0, one = 1.0, half = 0.5 )
256 INTEGER :: jw, kwtop, kwbot, istopm, istartm, k, k2, stgexc_info,
257 $ ifst, ilst, lworkreq, qz_small_info
258 REAL :: s, smlnum, ulp, safmin, safmax, c1, s1, temp
268 jw =
min( nw, ihi-ilo+1 )
270 IF ( kwtop .EQ. ilo )
THEN
273 s = a( kwtop, kwtop-1 )
279 CALL stgexc( .true., .true., jw, a, lda, b, ldb, qc, ldqc, zc,
280 $ ldzc, ifst, ilst, work, -1, stgexc_info )
281 lworkreq = int( work( 1 ) )
282 CALL slaqz0(
'S',
'V',
'V', jw, 1, jw, a( kwtop, kwtop ), lda,
283 $ b( kwtop, kwtop ), ldb, alphar, alphai, beta, qc,
284 $ ldqc, zc, ldzc, work, -1, rec+1, qz_small_info )
285 lworkreq =
max( lworkreq, int( work( 1 ) )+2*jw**2 )
286 lworkreq =
max( lworkreq, n*nw, 2*nw**2+n )
287 IF ( lwork .EQ.-1 )
THEN
291 ELSE IF ( lwork .LT. lworkreq )
THEN
296 CALL xerbla(
'SLAQZ3', -info )
301 safmin =
'SAFE MINIMUM' )
303 CALL slabad( safmin, safmax )
304 ulp =
slamch(
'PRECISION' )
307 IF ( ihi .EQ. kwtop )
THEN
309 alphar( kwtop ) = a( kwtop, kwtop )
310 alphai( kwtop ) = zero
314 IF ( abs( s ) .LE.
max( smlnum, ulp*abs( a( kwtop,
318 IF ( kwtop .GT. ilo )
THEN
319 a( kwtop, kwtop-1 ) = zero
326 CALL slacpy(
'ALL', jw, jw, a( kwtop, kwtop ), lda, work, jw )
327 CALL slacpy(
'ALL', jw, jw, b( kwtop, kwtop ), ldb, work( jw**2+
331 CALL slaset(
'FULL', jw, jw, zero, one, qc, ldqc )
332 CALL slaset(
'FULL', jw, jw, zero, one, zc, ldzc )
333 CALL slaqz0(
'S',
'V',
'V', jw, 1, jw, a( kwtop, kwtop ), lda,
335 $ ldqc, zc, ldzc, work( 2*jw**2+1 ), lwork-2*jw**2,
336 $ rec+1, qz_small_info )
338 IF( qz_small_info .NE. 0 )
THEN
341 ns = jw-qz_small_info
342 CALL slacpy( 'all
', JW, JW, WORK, JW, A( KWTOP, KWTOP ), LDA )
343 CALL SLACPY( 'all
', JW, JW, WORK( JW**2+1 ), JW, B( KWTOP,
349.EQ..OR..EQ.
IF ( KWTOP ILO S ZERO ) THEN
355.LE.
DO WHILE ( K JW )
357.GE.
IF ( KWBOT-KWTOP+1 2 ) THEN
358.NE.
BULGE = A( KWBOT, KWBOT-1 ) ZERO
363 TEMP = ABS( A( KWBOT, KWBOT ) )+SQRT( ABS( A( KWBOT,
364 $ KWBOT-1 ) ) )*SQRT( ABS( A( KWBOT-1, KWBOT ) ) )
365.EQ.
IF( TEMP ZERO )THEN
368 IF ( MAX( ABS( S*QC( 1, KWBOT-KWTOP ) ), ABS( S*QC( 1,
369.LE.
$ KWBOT-KWTOP+1 ) ) ) MAX( SMLNUM,
377 CALL STGEXC( .TRUE., .TRUE., JW, A( KWTOP, KWTOP ),
378 $ LDA, B( KWTOP, KWTOP ), LDB, QC, LDQC,
379 $ ZC, LDZC, IFST, ILST, WORK, LWORK,
387 TEMP = ABS( A( KWBOT, KWBOT ) )
388.EQ.
IF( TEMP ZERO ) THEN
391.LE.
IF ( ( ABS( S*QC( 1, KWBOT-KWTOP+1 ) ) ) MAX( ULP*
392 $ TEMP, SMLNUM ) ) THEN
399 CALL STGEXC( .TRUE., .TRUE., JW, A( KWTOP, KWTOP ),
400 $ LDA, B( KWTOP, KWTOP ), LDB, QC, LDQC,
401 $ ZC, LDZC, IFST, ILST, WORK, LWORK,
416.LE.
DO WHILE ( K IHI )
418.LT.
IF ( K IHI ) THEN
419.NE.
IF ( A( K+1, K ) ZERO ) THEN
425 CALL SLAG2( A( K, K ), LDA, B( K, K ), LDB, SAFMIN,
426 $ BETA( K ), BETA( K+1 ), ALPHAR( K ),
427 $ ALPHAR( K+1 ), ALPHAI( K ) )
428 ALPHAI( K+1 ) = -ALPHAI( K )
432 ALPHAR( K ) = A( K, K )
434 BETA( K ) = B( K, K )
439.NE..AND..NE.
IF ( KWTOP ILO S ZERO ) THEN
441 A( KWTOP:KWBOT, KWTOP-1 ) = A( KWTOP, KWTOP-1 )*QC( 1,
443 DO K = KWBOT-1, KWTOP, -1
444 CALL SLARTG( A( K, KWTOP-1 ), A( K+1, KWTOP-1 ), C1, S1,
446 A( K, KWTOP-1 ) = TEMP
447 A( K+1, KWTOP-1 ) = ZERO
448 K2 = MAX( KWTOP, K-1 )
449 CALL SROT( IHI-K2+1, A( K, K2 ), LDA, A( K+1, K2 ), LDA, C1,
451 CALL SROT( IHI-( K-1 )+1, B( K, K-1 ), LDB, B( K+1, K-1 ),
453 CALL SROT( JW, QC( 1, K-KWTOP+1 ), 1, QC( 1, K+1-KWTOP+1 ),
461.GE.
DO WHILE ( K KWTOP )
462.GE..AND..NE.
IF ( ( K KWTOP+1 ) A( K+1, K-1 ) ZERO ) THEN
466 CALL SLAQZ2( .TRUE., .TRUE., K2, KWTOP, KWTOP+JW-1,
467 $ KWBOT, A, LDA, B, LDB, JW, KWTOP, QC,
468 $ LDQC, JW, KWTOP, ZC, LDZC )
478 CALL SLARTG( B( K2+1, K2+1 ), B( K2+1, K2 ), C1, S1,
480 B( K2+1, K2+1 ) = TEMP
482 CALL SROT( K2+2-ISTARTM+1, A( ISTARTM, K2+1 ), 1,
483 $ A( ISTARTM, K2 ), 1, C1, S1 )
484 CALL SROT( K2-ISTARTM+1, B( ISTARTM, K2+1 ), 1,
485 $ B( ISTARTM, K2 ), 1, C1, S1 )
486 CALL SROT( JW, ZC( 1, K2+1-KWTOP+1 ), 1, ZC( 1,
487 $ K2-KWTOP+1 ), 1, C1, S1 )
489 CALL SLARTG( A( K2+1, K2 ), A( K2+2, K2 ), C1, S1,
493 CALL SROT( ISTOPM-K2, A( K2+1, K2+1 ), LDA, A( K2+2,
494 $ K2+1 ), LDA, C1, S1 )
495 CALL SROT( ISTOPM-K2, B( K2+1, K2+1 ), LDB, B( K2+2,
496 $ K2+1 ), LDB, C1, S1 )
497 CALL SROT( JW, QC( 1, K2+1-KWTOP+1 ), 1, QC( 1,
498 $ K2+2-KWTOP+1 ), 1, C1, S1 )
503 CALL SLARTG( B( KWBOT, KWBOT ), B( KWBOT, KWBOT-1 ), C1,
505 B( KWBOT, KWBOT ) = TEMP
506 B( KWBOT, KWBOT-1 ) = ZERO
507 CALL SROT( KWBOT-ISTARTM, B( ISTARTM, KWBOT ), 1,
508 $ B( ISTARTM, KWBOT-1 ), 1, C1, S1 )
509 CALL SROT( KWBOT-ISTARTM+1, A( ISTARTM, KWBOT ), 1,
510 $ A( ISTARTM, KWBOT-1 ), 1, C1, S1 )
511 CALL SROT( JW, ZC( 1, KWBOT-KWTOP+1 ), 1, ZC( 1,
512 $ KWBOT-1-KWTOP+1 ), 1, C1, S1 )
529 IF ( ISTOPM-IHI > 0 ) THEN
530 CALL SGEMM( 't
', 'n
', JW, ISTOPM-IHI, JW, ONE, QC, LDQC,
531 $ A( KWTOP, IHI+1 ), LDA, ZERO, WORK, JW )
532 CALL SLACPY( 'all
', JW, ISTOPM-IHI, WORK, JW, A( KWTOP,
534 CALL SGEMM( 't
', 'n
', JW, ISTOPM-IHI, JW, ONE, QC, LDQC,
535 $ B( KWTOP, IHI+1 ), LDB, ZERO, WORK, JW )
536 CALL SLACPY( 'all
', JW, ISTOPM-IHI, WORK, JW, B( KWTOP,
540 CALL SGEMM( 'n
', 'n
', N, JW, JW, ONE, Q( 1, KWTOP ), LDQ, QC,
541 $ LDQC, ZERO, WORK, N )
542 CALL SLACPY( 'all
', N, JW, WORK, N, Q( 1, KWTOP ), LDQ )
545 IF ( KWTOP-1-ISTARTM+1 > 0 ) THEN
546 CALL SGEMM( 'n
', 'n
', KWTOP-ISTARTM, JW, JW, ONE, A( ISTARTM,
547 $ KWTOP ), LDA, ZC, LDZC, ZERO, WORK,
549 CALL SLACPY( 'all
', KWTOP-ISTARTM, JW, WORK, KWTOP-ISTARTM,
550 $ A( ISTARTM, KWTOP ), LDA )
551 CALL SGEMM( 'n
', 'n
', KWTOP-ISTARTM, JW, JW, ONE, B( ISTARTM,
552 $ KWTOP ), LDB, ZC, LDZC, ZERO, WORK,
554 CALL SLACPY( 'all
', KWTOP-ISTARTM, JW, WORK, KWTOP-ISTARTM,
555 $ B( ISTARTM, KWTOP ), LDB )
558 CALL SGEMM( 'n
', 'n
', N, JW, JW, ONE, Z( 1, KWTOP ), LDZ, ZC,
559 $ LDZC, ZERO, WORK, N )
560 CALL SLACPY( 'all
', N, JW, WORK, N, Z( 1, KWTOP ), LDZ )
recursive subroutine slaqz3(ilschur, ilq, ilz, n, ilo, ihi, nw, a, lda, b, ldb, q, ldq, z, ldz, ns, nd, alphar, alphai, beta, qc, ldqc, zc, ldzc, work, lwork, rec, info)
SLAQZ3
recursive subroutine slaqz0(wants, wantq, wantz, n, ilo, ihi, a, lda, b, ldb, alphar, alphai, beta, q, ldq, z, ldz, work, lwork, rec, info)
SLAQZ0