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
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 )
double precision function dlamch(CMACH)
DLAMCH
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
ZGEMM
subroutine ztrmm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
ZTRMM
subroutine zlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine zlarfg(N, ALPHA, X, INCX, TAU)
ZLARFG generates an elementary reflector (Householder matrix).
subroutine zlaqr1(N, H, LDH, S1, S2, V)
ZLAQR1 sets a scalar multiple of the first column of the product of 2-by-2 or 3-by-3 matrix H and spe...