254 SUBROUTINE claqr5( 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 H( LDH, * ), S( * ), U( LDU, * ), V( LDV, * ),
270 $ WH( LDWH, * ), WV( LDWV, * ), Z( LDZ, * )
276 PARAMETER ( ZERO = ( 0.0e0, 0.0e0 ),
277 $ one = ( 1.0e0, 0.0e0 ) )
279 PARAMETER ( RZERO = 0.0e0, rone = 1.0e0 )
282 COMPLEX , BETA, CDUM, REFSUM
283 REAL H11, H12, H21, H22, SAFMAX, SAFMIN, SCL,
284 $ smlnum, tst1, tst2, ulp
285 INTEGER I2, I4, INCOL, J, JBOT, JCOL, JLEN,
286 $ JROW, JTOP, K, K1, KDU, KMS, KRCOL,
297 INTRINSIC abs, aimag, conjg,
max,
min, mod, real
310 cabs1( cdum ) = abs( real( cdum ) ) + abs( aimag( cdum ) )
328 ns = nshfts - mod( nshfts, 2 )
332 safmin = slamch(
'SAFE MINIMUM' )
333 safmax = rone / safmin
334 CALL slabad( safmin, safmax )
335 ulp = slamch(
'PRECISION' )
336 smlnum = safmin*( real( 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 claset(
'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.
409 k = krcol + 2*( m22-1 )
410 IF( k.EQ.ktop-1 )
THEN
411 CALL claqr1( 2, h( k+1, k+1 ), ldh, s( 2*m22-1 ),
412 $ s( 2*m22 ), v( 1, m22 ) )
414 CALL clarfg( 2, beta, v( 2, m22 ), 1, v( 1, m22 ) )
417 v( 2, m22 ) = h( k+2, k )
418 CALL clarfg( 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*conjg( v( 2, m22 ) )
439 jbot =
min( ndcol, kbot )
440 ELSE IF( wantt )
THEN
446 refsum = conjg( v( 1, m22 ) )*
447 $ ( h( k+1, j )+conjg( 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
479 IF( cabs1( h( k+1, k ) )
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
503 refsum = v( 1, m22 )*( u( j, kms+1 )+
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*conjg( 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*conjg( 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 claqr1( 3, h( ktop, ktop ), ldh, s( 2*m-1 ),
526 $ s( 2*m ), 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*conjg( v( 2, m ) )
538 h( k+3, k+2 ) = h( k+3, k+2 ) -
539 $ refsum*conjg( v( 3, m ) )
545 v( 2, m ) = h( k+2, k )
546 v( 3, m ) = h( k+3, k )
547 CALL clarfg( 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 claqr1( 3, h( k+1, k+1 ), ldh, s( 2*m-1 ),
574 refsum = conjg( vt( 1 ) )*
575 $ ( h( k+1, k )+conjg( 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
616 h( j, k+1 ) = h( j, k+1 ) - refsum
617 h( j, k+2 ) = h( j, k+2 ) -
618 $ refsum*conjg( v( 2, m ) )
619 h( j, k+3 ) = h( j, k+3 ) -
620 $ refsum*conjg( v( 3, m ) )
626 refsum = conjg( v( 1, m ) )*( h( k+1, k+1 )
627 $ +conjg( v( 2, m ) )*h( k+2, k+1 )
628 $ +conjg( 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
650 $ tst1 = tst1 + cabs1( h( k, k-2 ) )
652 $ tst1 = tst1 + cabs1( h( k, k-3 ) )
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 ) )
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
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 = conjg( v( 1, m ) )*
693 $ ( h( k+1, j )+conjg( v( 2, m ) )*
694 $ h( k+2, j )+conjg( 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*conjg( v( 2, m ) )
721 u( j, kms+3 ) = u( j, kms+3 ) -
722 $ refsum*conjg( 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*conjg( v( 2, m ) )
739 z( j, k+3 ) = z( j, k+3 ) -
740 $ refsum*conjg( 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 cgemm(
'C',
'N', nu, jlen, nu, one, u( k1, k1 ),
769 $ ldu, h( incol+k1, jcol ), ldh, zero, wh,
771 CALL clacpy(
'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, incol )-jrow )
779 CALL cgemm(
'N',
'N', jlen, nu, nu, one,
780 $ h( jrow, incol+k1 ), ldh, u( k1, k1 ),
781 $ ldu, zero, wv, ldwv )
782 CALL clacpy'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 cgemm(
'N',
'N', jlen, nu, nu, one,
792 $ z( jrow, incol+k1 ), ldz, u( k1, k1 ),
793 $ ldu, zero, wv, ldwv )
794 CALL clacpy(
'ALL', jlen, nu, wv, ldwv,
795 $ z( jrow, incol+k1 ), ldz )