248 SUBROUTINE zlaqr5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NSHFTS, S,
249 $ H, LDH, ILOZ, IHIZ, Z, LDZ, V, LDV, U, LDU, NV,
250 $ WV, LDWV, NH, WH, LDWH )
258 INTEGER IHIZ, ILOZ, KACC22, KBOT, KTOP, LDH, LDU, LDV,
259 $ LDWH, LDWV, LDZ, N, NH, NSHFTS, NV
263 COMPLEX*16 H( LDH, * ), S( * ), U( LDU, * ), V( LDV, * ),
264 $ WH( LDWH, * ), WV( LDWV, * ), Z( LDZ, * )
270 PARAMETER ( ZERO = ( 0.0d0, 0.0d0 ),
271 $ one = ( 1.0d0, 0.0d0 ) )
272 DOUBLE PRECISION RZERO, RONE
273 PARAMETER ( RZERO = 0.0d0, rone = 1.0d0 )
276 COMPLEX*16 ALPHA, BETA, CDUM, REFSUM
277 DOUBLE PRECISION H11, H12, H21, H22, SAFMAX, SAFMIN, SCL,
278 $ smlnum, tst1, tst2, ulp
279 INTEGER I2, I4, INCOL, J, J2, J4, JBOT, JCOL, JLEN,
280 $ JROW, JTOP, K, K1, KDU, KMS, KNZ, KRCOL, KZS,
281 $ m, m22, mbot, mend, mstart, mtop, nbmps, ndcol,
283 LOGICAL ACCUM, BLK22, BMP22
286 DOUBLE PRECISION DLAMCH
291 INTRINSIC abs, dble, dconjg, dimag, max, min, mod
301 DOUBLE PRECISION CABS1
304 cabs1( cdum ) = abs( dble( cdum ) ) + abs( dimag( cdum ) )
322 ns = nshfts - mod( nshfts, 2 )
326 safmin = dlamch(
'SAFE MINIMUM' )
327 safmax = rone / safmin
328 CALL dlabad( safmin, safmax )
329 ulp = dlamch(
'PRECISION' )
330 smlnum = safmin*( dble( n ) / ulp )
335 accum = ( kacc22.EQ.1 ) .OR. ( kacc22.EQ.2 )
339 blk22 = ( ns.GT.2 ) .AND. ( kacc22.EQ.2 )
344 $ h( ktop+2, ktop ) = zero
356 DO 210 incol = 3*( 1-nbmps ) + ktop - 1, kbot - 2, 3*nbmps - 2
359 $
CALL zlaset(
'ALL', kdu, kdu, zero, one, u, ldu )
373 DO 140 krcol = incol, min( incol+3*nbmps-3, kbot-2 )
382 mtop = max( 1, ( ( ktop-1 )-krcol+2 ) / 3+1 )
383 mbot = min( nbmps, ( kbot-krcol ) / 3 )
385 bmp22 = ( mbot.LT.nbmps ) .AND. ( krcol+3*( m22-1 ) ).EQ.
392 k = krcol + 3*( m-1 )
393 IF( k.EQ.ktop-1 )
THEN
394 CALL zlaqr1( 3, h( ktop, ktop ), ldh, s( 2*m-1 ),
395 $ s( 2*m ), v( 1, m ) )
397 CALL zlarfg( 3, alpha, v( 2, m ), 1, v( 1, m ) )
400 v( 2, m ) = h( k+2, k )
401 v( 3, m ) = h( k+3, k )
402 CALL zlarfg( 3, beta, v( 2, m ), 1, v( 1, m ) )
409 IF( h( k+3, k ).NE.zero .OR. h( k+3, k+1 ).NE.
410 $ zero .OR. h( k+3, k+2 ).EQ.zero )
THEN
425 CALL zlaqr1( 3, h( k+1, k+1 ), ldh, s( 2*m-1 ),
428 CALL zlarfg( 3, alpha, vt( 2 ), 1, vt( 1 ) )
429 refsum = dconjg( vt( 1 ) )*
430 $ ( h( k+1, k )+dconjg( vt( 2 ) )*
433 IF( cabs1( h( k+2, k )-refsum*vt( 2 ) )+
434 $ cabs1( refsum*vt( 3 ) ).GT.ulp*
435 $ ( cabs1( h( k, k ) )+cabs1( h( k+1,
436 $ k+1 ) )+cabs1( h( k+2, k+2 ) ) ) )
THEN
452 h( k+1, k ) = h( k+1, k ) - refsum
465 k = krcol + 3*( m22-1 )
467 IF( k.EQ.ktop-1 )
THEN
468 CALL zlaqr1( 2, h( k+1, k+1 ), ldh, s( 2*m22-1 ),
469 $ s( 2*m22 ), v( 1, m22 ) )
471 CALL zlarfg( 2, beta, v( 2, m22 ), 1, v( 1, m22 ) )
474 v( 2, m22 ) = h( k+2, k )
475 CALL zlarfg( 2, beta, v( 2, m22 ), 1, v( 1, m22 ) )
484 jbot = min( ndcol, kbot )
485 ELSE IF( wantt )
THEN
490 DO 30 j = max( ktop, krcol ), jbot
491 mend = min( mbot, ( j-krcol+2 ) / 3 )
493 k = krcol + 3*( m-1 )
494 refsum = dconjg( v( 1, m ) )*
495 $ ( h( k+1, j )+dconjg( v( 2, m ) )*
496 $ h( k+2, j )+dconjg( v( 3, m ) )*h( k+3, j ) )
497 h( k+1, j ) = h( k+1, j ) - refsum
498 h( k+2, j ) = h( k+2, j ) - refsum*v( 2, m )
499 h( k+3, j ) = h( k+3, j ) - refsum*v( 3, m )
503 k = krcol + 3*( m22-1 )
504 DO 40 j = max( k+1, ktop ), jbot
505 refsum = dconjg( v( 1, m22 ) )*
506 $ ( h( k+1, j )+dconjg( v( 2, m22 ) )*
508 h( k+1, j ) = h( k+1, j ) - refsum
509 h( k+2, j ) = h( k+2, j ) - refsum*v( 2, m22 )
518 jtop = max( ktop, incol )
519 ELSE IF( wantt )
THEN
525 IF( v( 1, m ).NE.zero )
THEN
526 k = krcol + 3*( m-1 )
527 DO 50 j = jtop, min( kbot, k+3 )
528 refsum = v( 1, m )*( h( j, k+1 )+v( 2, m )*
529 $ h( j, k+2 )+v( 3, m )*h( j, k+3 ) )
530 h( j, k+1 ) = h( j, k+1 ) - refsum
531 h( j, k+2 ) = h( j, k+2 ) -
532 $ refsum*dconjg( v( 2, m ) )
533 h( j, k+3 ) = h( j, k+3 ) -
534 $ refsum*dconjg( v( 3, m ) )
544 DO 60 j = max( 1, ktop-incol ), kdu
545 refsum = v( 1, m )*( u( j, kms+1 )+v( 2, m )*
546 $ u( j, kms+2 )+v( 3, m )*u( j, kms+3 ) )
547 u( j, kms+1 ) = u( j, kms+1 ) - refsum
548 u( j, kms+2 ) = u( j, kms+2 ) -
549 $ refsum*dconjg( v( 2, m ) )
550 u( j, kms+3 ) = u( j, kms+3 ) -
551 $ refsum*dconjg( v( 3, m ) )
553 ELSE IF( wantz )
THEN
560 refsum = v( 1, m )*( z( j, k+1 )+v( 2, m )*
561 $ z( j, k+2 )+v( 3, m )*z( j, k+3 ) )
562 z( j, k+1 ) = z( j, k+1 ) - refsum
563 z( j, k+2 ) = z( j, k+2 ) -
564 $ refsum*dconjg( v( 2, m ) )
565 z( j, k+3 ) = z( j, k+3 ) -
566 $ refsum*dconjg( v( 3, m ) )
574 k = krcol + 3*( m22-1 )
576 IF ( v( 1, m22 ).NE.zero )
THEN
577 DO 90 j = jtop, min( kbot, k+3 )
578 refsum = v( 1, m22 )*( h( j, k+1 )+v( 2, m22 )*
580 h( j, k+1 ) = h( j, k+1 ) - refsum
581 h( j, k+2 ) = h( j, k+2 ) -
582 $ refsum*dconjg( v( 2, m22 ) )
587 DO 100 j = max( 1, ktop-incol ), kdu
588 refsum = v( 1, m22 )*( u( j, kms+1 )+
589 $ v( 2, m22 )*u( j, kms+2 ) )
590 u( j, kms+1 ) = u( j, kms+1 ) - refsum
591 u( j, kms+2 ) = u( j, kms+2 ) -
592 $ refsum*dconjg( v( 2, m22 ) )
594 ELSE IF( wantz )
THEN
595 DO 110 j = iloz, ihiz
596 refsum = v( 1, m22 )*( z( j, k+1 )+v( 2, m22 )*
598 z( j, k+1 ) = z( j, k+1 ) - refsum
599 z( j, k+2 ) = z( j, k+2 ) -
600 $ refsum*dconjg( v( 2, m22 ) )
609 IF( krcol+3*( mstart-1 ).LT.ktop )
610 $ mstart = mstart + 1
614 IF( krcol.EQ.kbot-2 )
616 DO 120 m = mstart, mend
617 k = min( kbot-1, krcol+3*( m-1 ) )
628 IF( h( k+1, k ).NE.zero )
THEN
629 tst1 = cabs1( h( k, k ) ) + cabs1( h( k+1, k+1 ) )
630 IF( tst1.EQ.rzero )
THEN
632 $ tst1 = tst1 + cabs1( h( k, k-1 ) )
634 $ tst1 = tst1 + cabs1( h( k, k-2 ) )
636 $ tst1 = tst1 + cabs1( h( k, k-3 ) )
638 $ tst1 = tst1 + cabs1( h( k+2, k+1 ) )
640 $ tst1 = tst1 + cabs1( h( k+3, k+1 ) )
642 $ tst1 = tst1 + cabs1( h( k+4, k+1 ) )
644 IF( cabs1( h( k+1, k ) ).LE.max( smlnum, ulp*tst1 ) )
646 h12 = max( cabs1( h( k+1, k ) ),
647 $ cabs1( h( k, k+1 ) ) )
648 h21 = min( cabs1( h( k+1, k ) ),
649 $ cabs1( h( k, k+1 ) ) )
650 h11 = max( cabs1( h( k+1, k+1 ) ),
651 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
652 h22 = min( cabs1( h( k+1, k+1 ) ),
653 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
655 tst2 = h22*( h11 / scl )
657 IF( tst2.EQ.rzero .OR. h21*( h12 / scl ).LE.
658 $ max( smlnum, ulp*tst2 ) )h( k+1, k ) = zero
665 mend = min( nbmps, ( kbot-krcol-1 ) / 3 )
666 DO 130 m = mtop, mend
667 k = krcol + 3*( m-1 )
668 refsum = v( 1, m )*v( 3, m )*h( k+4, k+3 )
669 h( k+4, k+1 ) = -refsum
670 h( k+4, k+2 ) = -refsum*dconjg( v( 2, m ) )
671 h( k+4, k+3 ) = h( k+4, k+3 ) -
672 $ refsum*dconjg( v( 3, m ) )
691 IF( ( .NOT.blk22 ) .OR. ( incol.LT.ktop ) .OR.
692 $ ( ndcol.GT.kbot ) .OR. ( ns.LE.2 ) )
THEN
703 k1 = max( 1, ktop-incol )
704 nu = ( kdu-max( 0, ndcol-kbot ) ) - k1 + 1
708 DO 150 jcol = min( ndcol, kbot ) + 1, jbot, nh
709 jlen = min( nh, jbot-jcol+1 )
710 CALL zgemm(
'C',
'N', nu, jlen, nu, one, u( k1, k1 ),
711 $ ldu, h( incol+k1, jcol ), ldh, zero, wh,
713 CALL zlacpy(
'ALL', nu, jlen, wh, ldwh,
714 $ h( incol+k1, jcol ), ldh )
719 DO 160 jrow = jtop, max( ktop, incol ) - 1, nv
720 jlen = min( nv, max( ktop, incol )-jrow )
721 CALL zgemm(
'N',
'N', jlen, nu, nu, one,
722 $ h( jrow, incol+k1 ), ldh, u( k1, k1 ),
723 $ ldu, zero, wv, ldwv )
724 CALL zlacpy(
'ALL', jlen, nu, wv, ldwv,
725 $ h( jrow, incol+k1 ), ldh )
731 DO 170 jrow = iloz, ihiz, nv
732 jlen = min( nv, ihiz-jrow+1 )
733 CALL zgemm(
'N',
'N', jlen, nu, nu, one,
734 $ z( jrow, incol+k1 ), ldz, u( k1, k1 ),
735 $ ldu, zero, wv, ldwv )
736 CALL zlacpy(
'ALL', jlen, nu, wv, ldwv,
737 $ z( jrow, incol+k1 ), ldz )
755 kzs = ( j4-j2 ) - ( ns+1 )
760 DO 180 jcol = min( ndcol, kbot ) + 1, jbot, nh
761 jlen = min( nh, jbot-jcol+1 )
766 CALL zlacpy(
'ALL', knz, jlen, h( incol+1+j2, jcol ),
767 $ ldh, wh( kzs+1, 1 ), ldwh )
771 CALL zlaset(
'ALL', kzs, jlen, zero, zero, wh, ldwh )
772 CALL ztrmm(
'L',
'U',
'C',
'N', knz, jlen, one,
773 $ u( j2+1, 1+kzs ), ldu, wh( kzs+1, 1 ),
778 CALL zgemm(
'C',
'N', i2, jlen, j2, one, u, ldu,
779 $ h( incol+1, jcol ), ldh, one, wh, ldwh )
783 CALL zlacpy(
'ALL', j2, jlen, h( incol+1, jcol ), ldh,
784 $ wh( i2+1, 1 ), ldwh )
788 CALL ztrmm(
'L',
'L',
'C',
'N', j2, jlen, one,
789 $ u( 1, i2+1 ), ldu, wh( i2+1, 1 ), ldwh )
793 CALL zgemm(
'C',
'N', i4-i2, jlen, j4-j2, one,
794 $ u( j2+1, i2+1 ), ldu,
795 $ h( incol+1+j2, jcol ), ldh, one,
796 $ wh( i2+1, 1 ), ldwh )
800 CALL zlacpy(
'ALL', kdu, jlen, wh, ldwh,
801 $ h( incol+1, jcol ), ldh )
806 DO 190 jrow = jtop, max( incol, ktop ) - 1, nv
807 jlen = min( nv, max( incol, ktop )-jrow )
812 CALL zlacpy(
'ALL', jlen, knz, h( jrow, incol+1+j2 ),
813 $ ldh, wv( 1, 1+kzs ), ldwv )
817 CALL zlaset(
'ALL', jlen, kzs, zero, zero, wv, ldwv )
818 CALL ztrmm(
'R',
'U',
'N',
'N', jlen, knz, one,
819 $ u( j2+1, 1+kzs ), ldu, wv( 1, 1+kzs ),
824 CALL zgemm(
'N',
'N', jlen, i2, j2, one,
825 $ h( jrow, incol+1 ), ldh, u, ldu, one, wv,
830 CALL zlacpy(
'ALL', jlen, j2, h( jrow, incol+1 ), ldh,
831 $ wv( 1, 1+i2 ), ldwv )
835 CALL ztrmm(
'R',
'L',
'N',
'N', jlen, i4-i2, one,
836 $ u( 1, i2+1 ), ldu, wv( 1, 1+i2 ), ldwv )
840 CALL zgemm(
'N',
'N', jlen, i4-i2, j4-j2, one,
841 $ h( jrow, incol+1+j2 ), ldh,
842 $ u( j2+1, i2+1 ), ldu, one, wv( 1, 1+i2 ),
847 CALL zlacpy(
'ALL', jlen, kdu, wv, ldwv,
848 $ h( jrow, incol+1 ), ldh )
854 DO 200 jrow = iloz, ihiz, nv
855 jlen = min( nv, ihiz-jrow+1 )
860 CALL zlacpy(
'ALL', jlen, knz,
861 $ z( jrow, incol+1+j2 ), ldz,
862 $ wv( 1, 1+kzs ), ldwv )
866 CALL zlaset(
'ALL', jlen, kzs, zero, zero, wv,
868 CALL ztrmm(
'R',
'U',
'N',
'N', jlen, knz, one,
869 $ u( j2+1, 1+kzs ), ldu, wv( 1, 1+kzs ),
874 CALL zgemm(
'N',
'N', jlen, i2, j2, one,
875 $ z( jrow, incol+1 ), ldz, u, ldu, one,
880 CALL zlacpy(
'ALL', jlen, j2, z( jrow, incol+1 ),
881 $ ldz, wv( 1, 1+i2 ), ldwv )
885 CALL ztrmm(
'R',
'L',
'N',
'N', jlen, i4-i2, one,
886 $ u( 1, i2+1 ), ldu, wv( 1, 1+i2 ),
891 CALL zgemm(
'N',
'N', jlen, i4-i2, j4-j2, one,
892 $ z( jrow, incol+1+j2 ), ldz,
893 $ u( j2+1, i2+1 ), ldu, one,
894 $ wv( 1, 1+i2 ), ldwv )
898 CALL zlacpy(
'ALL', jlen, kdu, wv, ldwv,
899 $ z( jrow, incol+1 ), ldz )