300 RECURSIVE SUBROUTINE slaqz0( WANTS, WANTQ, WANTZ, N, ILO, IHI, A,
301 $ LDA, B, LDB, ALPHAR, ALPHAI, BETA,
302 $ Q, LDQ, Z, LDZ, WORK, LWORK, REC,
307 CHARACTER,
INTENT( IN ) :: wants, wantq, wantz
308 INTEGER,
INTENT( IN ) :: n, ilo, ihi, lda, ldb, ldq, ldz, lwork,
311 INTEGER,
INTENT( OUT ) :: info
313 REAL,
INTENT( INOUT ) :: a( lda, * ), b( ldb, * ), q( ldq, * ),
314 $ z( ldz, * ), alphar( * ), alphai( * ), beta( * ), work( * )
318 PARAMETER( zero = 0.0, one = 1.0, half = 0.5 )
321 REAL :: smlnum, ulp, eshift, safmin, safmax, c1, s1, temp,
swap
322 INTEGER :: istart, istop, iiter, maxit, istart2, k, ld, nshifts,
323 $ nblock, nw, nmin, nibble, n_undeflated, n_deflated,
324 $ ns, sweep_info, shiftpos, lworkreq, k2, istartm,
325 $ istopm, iwants, iwantq, iwantz, norm_info, aed_info,
326 $ nwr, nbr, nsr, itemp1, itemp2, rcost, i
327 LOGICAL :: ilschur, , ilz
328 CHARACTER :: jbcmpz*3
334 LOGICAL,
EXTERNAL ::
lsame
335 INTEGER,
EXTERNAL ::
ilaenv
340 IF(
lsame( wants,
'E' ) )
THEN
343 ELSE IF(
lsame'S'THEN
350 IF(
lsame( wantq,
'N' ) )
THEN
353 ELSE IF(
lsame( wantq,
'V' ) )
THEN
356 ELSE IF(
lsame( wantq,
'I' ) )
THEN
363 IF(
lsame( wantz,
'N' ) )
THEN
366 ELSE IF(
lsame( wantz,
'V' ) )
THEN
369 ELSE IF(
lsame( wantz,
'I' ) )
THEN
379 IF( iwants.EQ.0 )
THEN
381 ELSE IF( iwantq.EQ.0 )
THEN
383 ELSE IF( iwantz.EQ.0 )
THEN
385 ELSE IF( n.LT.0 )
THEN
387 ELSE IF( ilo.LT.1 )
THEN
389 ELSE IF( ihi.GT.n .OR. ihi.LT.ilo-1 )
THEN
391 ELSE IF( lda.LT.n )
THEN
393 ELSE IF( ldb.LT.n )
THEN
395 ELSE IF( ldq.LT.1 .OR. ( ilq .AND. ldq.LT.n ) )
THEN
397 ELSE IF( ldz.LT.1 .OR. ( ilz .AND. ldz.LT.n ) )
THEN
401 CALL xerbla(
'SLAQZ0', -info )
409 work( 1 ) = real( 1 )
416 jbcmpz( 1:1 ) = wants
417 jbcmpz( 2:2 ) = wantq
418 jbcmpz( 3:3 ) = wantz
420 nmin =
ilaenv( 12,
'SLAQZ0', jbcmpz, n, ilo, ihi, lwork )
422 nwr =
ilaenv( 13,
'SLAQZ0', jbcmpz, n, ilo, ihi, lwork )
424 nwr =
min( ihi-ilo+1, ( n-1 ) / 3, nwr )
426 nibble =
ilaenv( 14,
'SLAQZ0', jbcmpz, n, ilo, ihi, lwork )
428 nsr =
ilaenv( 15,
'SLAQZ0', jbcmpz, n, ilo, ihi, lwork )
429 nsr =
min( nsr, ( n+6 ) / 9, ihi-ilo )
430 nsr =
max( 2, nsr-mod( nsr, 2 ) )
432 rcost =
ilaenv( 17,
'SLAQZ0', jbcmpz, n, ilo, ihi, lwork )
433 itemp1 = int( nsr/sqrt( 1+2*nsr/( real( rcost )/100*n ) ) )
434 itemp1 = ( ( itemp1-1 )/4 )*4+4
437 IF( n .LT. nmin .OR. rec .GE. 2 )
THEN
438 CALL shgeqz( wants, wantq, wantz, n, ilo, ihi, a, lda, b, ldb,
439 $ alphar, alphai, beta, q, ldq, z, ldz, work,
449 nw =
max( nwr, nmin )
450 CALL slaqz3( ilschur, ilq, ilz, n, ilo, ihi, nw, a, lda, b, ldb,
451 $ q, ldq, z, ldz, n_undeflated, n_deflated, alphar,
452 $ alphai, beta, work, nw, work, nw, work, -1, rec,
454 itemp1 = int( work( 1 ) )
456 CALL slaqz4( ilschur, ilq, ilz, n, ilo, ihi, nsr, nbr, alphar,
457 $ alphai, beta, a, lda, b, ldb, q, ldq, z, ldz, work,
458 $ nbr, work, nbr, work, -1, sweep_info )
459 itemp2 = int( work( 1 ) )
461 lworkreq =
max( itemp1+2*nw**2, itemp2+2*nbr**2 )
462 IF ( lwork .EQ.-1 )
THEN
463 work( 1 ) = real( lworkreq )
465 ELSE IF ( lwork .LT. lworkreq )
THEN
469 CALL xerbla(
'SLAQZ0', info )
475 IF( iwantq.EQ.3 )
CALL slaset(
'FULL', n, n, zero, one, q, ldq )
476 IF( iwantz.EQ.3 )
CALL slaset(
'FULL', n, n, zero, one, z, ldz )
479 safmin =
slamch( 'safe minimum
' )
481 CALL SLABAD( SAFMIN, SAFMAX )
482 ULP = SLAMCH( 'precision
' )
483 SMLNUM = SAFMIN*( REAL( N )/ULP )
487 MAXIT = 3*( IHI-ILO+1 )
491.GE.
IF( IITER MAXIT ) THEN
495.GE.
IF ( ISTART+1 ISTOP ) THEN
501.LE.
IF ( ABS( A( ISTOP-1, ISTOP-2 ) ) MAX( SMLNUM,
502 $ ULP*( ABS( A( ISTOP-1, ISTOP-1 ) )+ABS( A( ISTOP-2,
503 $ ISTOP-2 ) ) ) ) ) THEN
504 A( ISTOP-1, ISTOP-2 ) = ZERO
508.LE.
ELSE IF ( ABS( A( ISTOP, ISTOP-1 ) ) MAX( SMLNUM,
509 $ ULP*( ABS( A( ISTOP, ISTOP ) )+ABS( A( ISTOP-1,
510 $ ISTOP-1 ) ) ) ) ) THEN
511 A( ISTOP, ISTOP-1 ) = ZERO
517.LE.
IF ( ABS( A( ISTART+2, ISTART+1 ) ) MAX( SMLNUM,
518 $ ULP*( ABS( A( ISTART+1, ISTART+1 ) )+ABS( A( ISTART+2,
519 $ ISTART+2 ) ) ) ) ) THEN
520 A( ISTART+2, ISTART+1 ) = ZERO
524.LE.
ELSE IF ( ABS( A( ISTART+1, ISTART ) ) MAX( SMLNUM,
525 $ ULP*( ABS( A( ISTART, ISTART ) )+ABS( A( ISTART+1,
526 $ ISTART+1 ) ) ) ) ) THEN
527 A( ISTART+1, ISTART ) = ZERO
533.GE.
IF ( ISTART+1 ISTOP ) THEN
539 DO K = ISTOP, ISTART+1, -1
540.LE.
IF ( ABS( A( K, K-1 ) ) MAX( SMLNUM, ULP*( ABS( A( K,
541 $ K ) )+ABS( A( K-1, K-1 ) ) ) ) ) THEN
560.GE.
DO WHILE ( KISTART2 )
562.LT.
IF( K ISTOP ) THEN
563 TEMP = TEMP+ABS( B( K, K+1 ) )
565.GT.
IF( K ISTART2 ) THEN
566 TEMP = TEMP+ABS( B( K-1, K ) )
569.LT.
IF( ABS( B( K, K ) ) MAX( SMLNUM, ULP*TEMP ) ) THEN
573 DO K2 = K, ISTART2+1, -1
574 CALL SLARTG( B( K2-1, K2 ), B( K2-1, K2-1 ), C1, S1,
577 B( K2-1, K2-1 ) = ZERO
579 CALL SROT( K2-2-ISTARTM+1, B( ISTARTM, K2 ), 1,
580 $ B( ISTARTM, K2-1 ), 1, C1, S1 )
581 CALL SROT( MIN( K2+1, ISTOP )-ISTARTM+1, A( ISTARTM,
582 $ K2 ), 1, A( ISTARTM, K2-1 ), 1, C1, S1 )
584 CALL SROT( N, Z( 1, K2 ), 1, Z( 1, K2-1 ), 1, C1,
588.LT.
IF( K2ISTOP ) THEN
589 CALL SLARTG( A( K2, K2-1 ), A( K2+1, K2-1 ), C1,
592 A( K2+1, K2-1 ) = ZERO
594 CALL SROT( ISTOPM-K2+1, A( K2, K2 ), LDA, A( K2+1,
595 $ K2 ), LDA, C1, S1 )
596 CALL SROT( ISTOPM-K2+1, B( K2, K2 ), LDB, B( K2+1,
597 $ K2 ), LDB, C1, S1 )
599 CALL SROT( N, Q( 1, K2 ), 1, Q( 1, K2+1 ), 1,
606.LT.
IF( ISTART2ISTOP )THEN
607 CALL SLARTG( A( ISTART2, ISTART2 ), A( ISTART2+1,
608 $ ISTART2 ), C1, S1, TEMP )
609 A( ISTART2, ISTART2 ) = TEMP
610 A( ISTART2+1, ISTART2 ) = ZERO
612 CALL SROT( ISTOPM-( ISTART2+1 )+1, A( ISTART2,
613 $ ISTART2+1 ), LDA, A( ISTART2+1,
614 $ ISTART2+1 ), LDA, C1, S1 )
615 CALL SROT( ISTOPM-( ISTART2+1 )+1, B( ISTART2,
616 $ ISTART2+1 ), LDB, B( ISTART2+1,
617 $ ISTART2+1 ), LDB, C1, S1 )
619 CALL SROT( N, Q( 1, ISTART2 ), 1, Q( 1,
620 $ ISTART2+1 ), 1, C1, S1 )
632.GE.
IF ( ISTART2 ISTOP ) THEN
643.LT.
IF ( ISTOP-ISTART2+1 NMIN ) THEN
647.LT.
IF ( ISTOP-ISTART+1 NMIN ) THEN
658 CALL SLAQZ3( ILSCHUR, ILQ, ILZ, N, ISTART2, ISTOP, NW, A, LDA,
659 $ B, LDB, Q, LDQ, Z, LDZ, N_UNDEFLATED, N_DEFLATED,
660 $ ALPHAR, ALPHAI, BETA, WORK, NW, WORK( NW**2+1 ),
661 $ NW, WORK( 2*NW**2+1 ), LWORK-2*NW**2, REC,
664 IF ( N_DEFLATED > 0 ) THEN
665 ISTOP = ISTOP-N_DEFLATED
670.OR.
IF ( 100*N_DEFLATED > NIBBLE*( N_DEFLATED+N_UNDEFLATED )
671.LT.
$ ISTOP-ISTART2+1 NMIN ) THEN
679 NS = MIN( NSHIFTS, ISTOP-ISTART2 )
680 NS = MIN( NS, N_UNDEFLATED )
681 SHIFTPOS = ISTOP-N_DEFLATED-N_UNDEFLATED+1
686 DO I = SHIFTPOS, SHIFTPOS+N_UNDEFLATED-1, 2
687.NE.
IF( ALPHAI( I )-ALPHAI( I+1 ) ) THEN
690 ALPHAR( I ) = ALPHAR( I+1 )
691 ALPHAR( I+1 ) = ALPHAR( I+2 )
695 ALPHAI( I ) = ALPHAI( I+1 )
696 ALPHAI( I+1 ) = ALPHAI( I+2 )
700 BETA( I ) = BETA( I+1 )
701 BETA( I+1 ) = BETA( I+2 )
706.EQ.
IF ( MOD( LD, 6 ) 0 ) THEN
710 IF( ( REAL( MAXIT )*SAFMIN )*ABS( A( ISTOP,
711.LT.
$ ISTOP-1 ) )ABS( A( ISTOP-1, ISTOP-1 ) ) ) THEN
712 ESHIFT = A( ISTOP, ISTOP-1 )/B( ISTOP-1, ISTOP-1 )
714 ESHIFT = ESHIFT+ONE/( SAFMIN*REAL( MAXIT ) )
716 ALPHAR( SHIFTPOS ) = ONE
717 ALPHAR( SHIFTPOS+1 ) = ZERO
718 ALPHAI( SHIFTPOS ) = ZERO
719 ALPHAI( SHIFTPOS+1 ) = ZERO
720 BETA( SHIFTPOS ) = ESHIFT
721 BETA( SHIFTPOS+1 ) = ESHIFT
728 CALL SLAQZ4( ILSCHUR, ILQ, ILZ, N, ISTART2, ISTOP, NS, NBLOCK,
729 $ ALPHAR( SHIFTPOS ), ALPHAI( SHIFTPOS ),
730 $ BETA( SHIFTPOS ), A, LDA, B, LDB, Q, LDQ, Z, LDZ,
731 $ WORK, NBLOCK, WORK( NBLOCK**2+1 ), NBLOCK,
732 $ WORK( 2*NBLOCK**2+1 ), LWORK-2*NBLOCK**2,
743 80 CALL SHGEQZ( WANTS, WANTQ, WANTZ, N, ILO, IHI, A, LDA, B, LDB,
744 $ ALPHAR, ALPHAI, BETA, Q, LDQ, Z, LDZ, WORK, LWORK,
subroutine slaqz4(ilschur, ilq, ilz, n, ilo, ihi, nshifts, nblock_desired, sr, si, ss, a, lda, b, ldb, q, ldq, z, ldz, qc, ldqc, zc, ldzc, work, lwork, info)
SLAQZ4
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