254 SUBROUTINE zlaqr5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NSHFTS, S,
255 $ H, LDH, ILOZ, IHIZ, Z, LDZ, V, LDV, U, LDU, NV,
256 $ WV, LDWV, NH, WH, LDWH )
264 INTEGER IHIZ, ILOZ, KACC22, KBOT, KTOP, LDH, LDU, LDV,
265 $ LDWH, LDWV, LDZ, N, NH, NSHFTS, NV
269 COMPLEX*16 H( LDH, * ), S( * ), U( LDU, * ), V( LDV, * ),
270 $ WH( LDWH, * ), WV( LDWV, * ), Z( LDZ, * )
276 PARAMETER ( ZERO = ( 0.0d0, 0.0d0 ),
277 $ one = ( 1.0d0, 0.0d0 ) )
278 DOUBLE PRECISION RZERO, RONE
279 PARAMETER ( = 0.0d0, rone = 1.0d0 )
283DOUBLE PRECISION, H21, H22, , SAFMIN, SCL,
284 $ smlnum, tst1, tst2, ulp
285 INTEGER I2, I4, INCOL, J, JBOT, JCOL, JLEN,
286 $ JROW, JTOP, K, K1, KDU, KMS, KRCOL,
287 $ m, m22, mbot, mtop, nbmps, ndcol,
292 DOUBLE PRECISION DLAMCH
297 INTRINSIC abs, dble, dconjg, dimag,
max,
min, mod
307 DOUBLE PRECISION CABS1
310 cabs1( cdum ) = abs( dble( cdum ) ) + abs( dimag( cdum ) )
328 ns = nshfts - mod( nshfts, 2 )
332 safmin = dlamch(
'SAFE MINIMUM' )
333 safmax = rone / safmin
334 CALL dlabad( safmin, safmax )
335 ulp = dlamch(
'PRECISION' )
336 smlnum = safmin*( dble( n ) / ulp )
341 accum = ( kacc22.EQ.1 ) .OR. ( kacc22.EQ.2 )
346 $ h( ktop+2, ktop ) = zero
358 DO 180 incol = ktop - 2*nbmps + 1, kbot - 2, 2*nbmps
363 jtop =
max( ktop, incol )
364 ELSE IF( wantt )
THEN
372 $
CALL zlaset(
'ALL', kdu, kdu, zero, one, u, ldu )
386 DO 145 krcol = incol,
min( incol+2*nbmps-1, kbot-2 )
395 mtop =
max( 1, ( ktop-krcol ) / 2+1 )
396 mbot =
min( nbmps, ( kbot-krcol-1 ) / 2 )
398 bmp22 = ( mbot.LT.nbmps ) .AND. ( krcol+2*( m22-1 ) ).EQ.
409 k = krcol + 2*( m22-1 )
410 IF( k.EQ.ktop-1 )
THEN
411 CALL zlaqr1( 2, h( k+1, k+1 ), ldh, s( 2*m22-1 ),
412 $ s( 2*m22 ), v( 1, m22 ) )
414 CALL zlarfg( 2, beta, v( 2, m22 ), 1, v( 1, m22 ) )
417 v( 2, m22 ) = h( k+2, k )
418 CALL zlarfg( 2, beta, v( 2, m22 ), 1, v( 1, m22 ) )
427 DO 30 j = jtop,
min( kbot, k+3 )
428 refsum = v( 1, m22 )*( h( j, k+1 )+v( 2, m22 )*
430 h( j, k+1 ) = h( j, k+1 ) - refsum
431 h( j, k+2 ) = h( j, k+2 ) -
432 $ refsum*dconjg( v( 2, m22 ) )
439 jbot =
min( ndcol, kbot )
440 ELSE IF( wantt )
THEN
446 refsum = dconjg( v( 1, m22 ) )*
447 $ ( h( k+1, j )+dconjg( v( 2, m22 ) )*
449 h( k+1, j ) = h( k+1, j ) - refsum
450 h( k+2, j ) = h( k+2, j ) - refsum*v( 2, m22 )
463 IF( h( k+1, k ).NE.zero )
THEN
464 tst1 = cabs1( h( k, k ) ) + cabs1( h( k+1, k+1 ) )
465 IF( tst1.EQ.rzero )
THEN
467 $ tst1 = tst1 + cabs1( h( k, k-1 ) )
469 $ tst1 = tst1 + cabs1( h( k, k-2 ) )
471 $ tst1 = tst1 + cabs1( h( k, k-3 ) )
473 $ tst1 = tst1 + cabs1( h( k+2, k+1 ) )
475 $ tst1 = tst1 + cabs1( h( k+3, k+1 ) )
477 $ tst1 = tst1 + cabs1( h( k+4, k+1 ) )
480 $ .LE.
max( smlnum, ulp*tst1 ) )
THEN
481 h12 =
max( cabs1( h( k+1, k ) ),
482 $ cabs1( h( k, k+1 ) ) )
483 h21 =
min( cabs1( h( k+1, k ) ),
484 $ cabs1( h( k, k+1 ) ) )
485 h11 =
max( cabs1( h( k+1, k+1 ) ),
486 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
487 h22 =
min( cabs1( h( k+1, k+1 ) ),
488 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
490 tst2 = h22*( h11 / scl )
492 IF( tst2.EQ.rzero .OR. h21*( h12 / scl ).LE.
493 $
max( smlnum, ulp*tst2 ) )h( k+1, k ) = zero
502 DO 50 j =
max( 1, ktop-incol ), kdu
504 $ v( 2, m22 )*u( j, kms+2 ) )
505 u( j, kms+1 ) = u( j, kms+1 ) - refsum
506 u( j, kms+2 ) = u( j, kms+2 ) -
507 $ refsum*dconjg( v( 2, m22 ) )
509 ELSE IF( wantz )
THEN
511 refsum = v( 1, m22 )*( z( j, k+1 )+v( 2, m22 )*
513 z( j, k+1 ) = z( j, k+1 ) - refsum
514 z( j, k+2 ) = z( j, k+2 ) -
515 $ refsum*dconjg( v( 2, m22 ) )
522 DO 80 m = mbot, mtop, -1
523 k = krcol + 2*( m-1 )
524 IF( k.EQ.ktop-1 )
THEN
525 CALL zlaqr1( 3, h( ktop, ktop ), ldh, s( 2*m-1 ),
526 $ s( 2*m ), v( 1, m ) )
528 CALL zlarfg( 3, alpha, v( 2, m ), 1, v( 1, m ) )
535 refsum = v( 1, m )*v( 3, m )*h( k+3, k+2 )
536 h( k+3, k ) = -refsum
537 h( k+3, k+1 ) = -refsum*dconjg( v( 2, m ) )
538 h( k+3, k+2 ) = h( k+3, k+2 ) -
539 $ refsum*dconjg( v( 3, m ) )
545 v( 2, m ) = h( k+2, k )
546 v( 3, m ) = h( k+3, k )
547 CALL zlarfg( 3, beta, v( 2, m ), 1, v( 1, m ) )
554 IF( h( k+3, k ).NE.zero .OR. h( k+3, k+1 ).NE.
555 $ zero .OR. h( k+3, k+2 ).EQ.zero )
THEN
570 CALL zlaqr1( 3, h( k+1, k+1 ), ldh, s( 2*m-1 ),
573 CALL zlarfg( 3, alpha, vt( 2 ), 1, vt( 1 ) )
574 refsum = dconjg( vt( 1 ) )*
575 $ ( h( k+1, k )+dconjg( vt( 2 ) )*
578 IF( cabs1( h( k+2, k )-refsum*vt( 2 ) )+
579 $ cabs1( refsum*vt( 3 ) ).GT.ulp*
580 $ ( cabs1( h( k, k ) )+cabs1( h( k+1,
581 $ k+1 ) )+cabs1( h( k+2, k+2 ) ) ) )
THEN
597 h( k+1, k ) = h( k+1, k ) - refsum
613 DO 70 j = jtop,
min( kbot, k+3 )
614 refsum = v( 1, m )*( h( j, k+1 )+v( 2, m )*
615 $ h( j, k+2 )+v( 3, m )*h( j, k+3 ) )
616 h( j, k+1 ) = h( j, k+1 ) - refsum
617 h( j, k+2 ) = h( j, k+2 ) -
618 $ refsum*dconjg( v( 2, m ) )
619 h( j, k+3 ) = h( j, k+3 ) -
620 $ refsum*dconjg( v( 3, m ) )
626 refsum = dconjg( v( 1, m ) )*( h( k+1, k+1 )
627 $ +dconjg( v( 2, m ) )*h( k+2, k+1 )
628 $ +dconjg( v( 3, m ) )*h( k+3, k+1 ) )
629 h( k+1, k+1 ) = h( k+1, k+1 ) - refsum
630 h( k+2, k+1 ) = h( k+2, k+1 ) - refsum*v( 2, m )
631 h( k+3, k+1 ) = h( k+3, k+1 ) - refsum*v( 3, m )
644 IF( h( k+1, k ).NE.zero )
THEN
645 tst1 = cabs1( h( k, k ) ) + cabs1( h( k+1, k+1 ) )
646 IF( tst1.EQ.rzero )
THEN
648 $ tst1 = tst1 + cabs1( h( k, k-1 ) )
650 $ tst1 = tst1 + cabs1( h( k, k-2 ) )
652 $ tst1 = tst1 + cabs1( h( k, k-3 ) )
654 $ tst1 = tst1 + cabs1( h( k+2, k+1 ) )
656 $ tst1 = tst1 + cabs1( h( k+3, k+1 ) )
658 $ tst1 = tst1 + cabs1( h( k+4, k+1 ) )
660 IF( cabs1( h( k+1, k ) ).LE.
max( smlnum, ulp*tst1 ) )
662 h12 =
max( cabs1( h( k+1, k ) ),
663 $ cabs1( h( k, k+1 ) ) )
664 h21 =
min( cabs1( h( k+1, k ) ),
665 $ cabs1( h( k, k+1 ) ) )
666 h11 =
max( cabs1( h( k+1, k+1 ) ),
667 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
668 h22 =
min( cabs1( h( k+1, k+1 ) ),
669 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
671 tst2 = h22*( h11 / scl )
673 IF( tst2.EQ.rzero .OR. h21*( h12 / scl ).LE.
674 $
max( smlnum, ulp*tst2 ) )h( k+1, k ) = zero
682 jbot =
min( ndcol, kbot )
683 ELSE IF( wantt )
THEN
689 DO 100 m = mbot, mtop, -1
690 k = krcol + 2*( m-1 )
691 DO 90 j =
max( ktop, krcol + 2*m ), jbot
692 refsum = dconjg( v( 1, m ) )*
693 $ ( h( k+1, j )+dconjg( v( 2, m ) )*
694 $ h( k+2, j )+dconjg( v( 3, m ) )*h( k+3, j ) )
695 h( k+1, j ) = h( k+1, j ) - refsum
696 h( k+2, j ) = h( k+2, j ) - refsum*v( 2, m )
697 h( k+3, j ) = h( k+3, j ) - refsum*v( 3, m )
709 DO 120 m = mbot, mtop, -1
710 k = krcol + 2*( m-1 )
712 i2 =
max( 1, ktop-incol )
713 i2 =
max( i2, kms-(krcol-incol)+1 )
714 i4 =
min( kdu, krcol + 2*( mbot-1 ) - incol + 5 )
716 refsum = v( 1, m )*( u( j, kms+1 )+v( 2, m )*
717 $ u( j, kms+2 )+v( 3, m )*u( j, kms+3 ) )
718 u( j, kms+1 ) = u( j, kms+1 ) - refsum
719 u( j, kms+2 ) = u( j, kms+2 ) -
720 $ refsum*dconjg( v( 2, m ) )
721 u( j, kms+3 ) = u( j, kms+3 ) -
722 $ refsum*dconjg( v( 3, m ) )
725 ELSE IF( wantz )
THEN
731 DO 140 m = mbot, mtop, -1
732 k = krcol + 2*( m-1 )
733 DO 130 j = iloz, ihiz
734 refsum = v( 1, m )*( z( j, k+1 )+v( 2, m )*
735 $ z( j, k+2 )+v( 3, m )*z( j, k+3 ) )
736 z( j, k+1 ) = z( j, k+1 ) - refsum
737 z( j, k+2 ) = z( j, k+2 ) -
738 $ refsum*dconjg( v( 2, m ) )
739 z( j, k+3 ) = z( j, k+3 ) -
740 $ refsum*dconjg( v( 3, m ) )
761 k1 =
max( 1, ktop-incol )
762 nu = ( kdu-
max( 0, ndcol-kbot ) ) - k1 + 1
766 DO 150 jcol =
min( ndcol, kbot ) + 1, jbot, nh
767 jlen =
min( nh, jbot-jcol+1 )
768 CALL zgemm(
'C',
'N', nu, jlen, nu, one, u( k1, k1 ),
769 $ ldu, h( incol+k1, jcol ), ldh, zero, wh,
771 CALL zlacpy(
'ALL', nu, jlen, wh, ldwh,
772 $ h( incol+k1, jcol ), ldh )
777 DO 160 jrow = jtop,
max( ktop, incol ) - 1, nv
778 jlen =
min( nv,
max( ktop,
779 CALL zgemm(
'N',
'N', jlen, nu, nu, one,
780 $ h( jrow, incol+k1 ), ldh, u( k1, k1 ),
781 $ ldu, zero, wv, ldwv )
782 CALL zlacpy(
'ALL', jlen, nu, wv, ldwv,
783 $ h( jrow, incol+k1 ), ldh )
789 DO 170 jrow = iloz, ihiz, nv
790 jlen =
min( nv, ihiz-jrow+1 )
791 CALL zgemm(
'N',
'N', jlen, nu, nu, one,
792 $ z( jrow, incol+k1 ), ldz, u( k1, k1 ),
793 $ ldu, zero, wv, ldwv )
794 CALL zlacpy(
'ALL', jlen, nu, wv, ldwv,
795 $ z( jrow, incol+k1 ), ldz )