252 SUBROUTINE claqr5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NSHFTS,
254 $ H, LDH, ILOZ, IHIZ, Z, LDZ, V, LDV, U, LDU, NV,
255 $ WV, LDWV, NH, WH, LDWH )
263 INTEGER IHIZ, ILOZ, KACC22, KBOT, KTOP, LDH, LDU, LDV,
264 $ LDWH, LDWV, LDZ, N, NH, NSHFTS, NV
268 COMPLEX H( LDH, * ), S( * ), U( LDU, * ), V( LDV, * ),
269 $ WH( LDWH, * ), WV( LDWV, * ), Z( LDZ, * )
275 PARAMETER ( ZERO = ( 0.0e0, 0.0e0 ),
276 $ one = ( 1.0e0, 0.0e0 ) )
278 parameter( rzero = 0.0e0, rone = 1.0e0 )
281 COMPLEX ALPHA, BETA, CDUM, REFSUM, T1, T2, T3
282 REAL H11, H12, H21, H22, SAFMAX, SAFMIN, SCL,
283 $ SMLNUM, TST1, TST2, ULP
284 INTEGER I2, I4, INCOL, J, JBOT, JCOL, JLEN,
285 $ jrow, jtop, k, k1, kdu, kms, krcol,
286 $ m, m22, mbot, mtop, nbmps, ndcol,
296 INTRINSIC abs, aimag, conjg, max, min, mod, real
309 cabs1( cdum ) = abs( real( cdum ) ) + abs( aimag( cdum ) )
327 ns = nshfts - mod( nshfts, 2 )
331 safmin = slamch(
'SAFE MINIMUM' )
332 safmax = rone / safmin
333 ulp = slamch(
'PRECISION' )
334 smlnum = safmin*( real( n ) / ulp )
339 accum = ( kacc22.EQ.1 ) .OR. ( kacc22.EQ.2 )
344 $ h( ktop+2, ktop ) = zero
356 DO 180 incol = ktop - 2*nbmps + 1, kbot - 2, 2*nbmps
361 jtop = max( ktop, incol )
362 ELSE IF( wantt )
THEN
370 $
CALL claset(
'ALL', kdu, kdu, zero, one, u, ldu )
384 DO 145 krcol = incol, min( incol+2*nbmps-1, kbot-2 )
393 mtop = max( 1, ( ktop-krcol ) / 2+1 )
394 mbot = min( nbmps, ( kbot-krcol-1 ) / 2 )
396 bmp22 = ( mbot.LT.nbmps ) .AND. ( krcol+2*( m22-1 ) ).EQ.
407 k = krcol + 2*( m22-1 )
408 IF( k.EQ.ktop-1 )
THEN
409 CALL claqr1( 2, h( k+1, k+1 ), ldh, s( 2*m22-1 ),
410 $ s( 2*m22 ), v( 1, m22 ) )
412 CALL clarfg( 2, beta, v( 2, m22 ), 1, v( 1, m22 ) )
415 v( 2, m22 ) = h( k+2, k )
416 CALL clarfg( 2, beta, v( 2, m22 ), 1, v( 1, m22 ) )
426 t2 = t1*conjg( v( 2, m22 ) )
427 DO 30 j = jtop, min( kbot, k+3 )
428 refsum = h( j, k+1 ) + v( 2, m22 )*h( j, k+2 )
429 h( j, k+1 ) = h( j, k+1 ) - refsum*t1
430 h( j, k+2 ) = h( j, k+2 ) - refsum*t2
437 jbot = min( ndcol, kbot )
438 ELSE IF( wantt )
THEN
443 t1 = conjg( v( 1, m22 ) )
446 refsum = h( k+1, j ) +
447 $ conjg( v( 2, m22 ) )*h( k+2, j )
448 h( k+1, j ) = h( k+1, j ) - refsum*t1
449 h( k+2, j ) = h( k+2, j ) - refsum*t2
462 IF( h( k+1, k ).NE.zero )
THEN
463 tst1 = cabs1( h( k, k ) ) + cabs1( h( k+1, k+1 ) )
464 IF( tst1.EQ.rzero )
THEN
466 $ tst1 = tst1 + cabs1( h( k, k-1 ) )
468 $ tst1 = tst1 + cabs1( h( k, k-2 ) )
470 $ tst1 = tst1 + cabs1( h( k, k-3 ) )
472 $ tst1 = tst1 + cabs1( h( k+2, k+1 ) )
474 $ tst1 = tst1 + cabs1( h( k+3, k+1 ) )
476 $ tst1 = tst1 + cabs1( h( k+4, k+1 ) )
478 IF( cabs1( h( k+1, k ) )
479 $ .LE.max( smlnum, ulp*tst1 ) )
THEN
480 h12 = max( cabs1( h( k+1, k ) ),
481 $ cabs1( h( k, k+1 ) ) )
482 h21 = min( cabs1( h( k+1, k ) ),
483 $ cabs1( h( k, k+1 ) ) )
484 h11 = max( cabs1( h( k+1, k+1 ) ),
485 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
486 h22 = min( cabs1( h( k+1, k+1 ) ),
487 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
489 tst2 = h22*( h11 / scl )
491 IF( tst2.EQ.rzero .OR. h21*( h12 / scl ).LE.
492 $ max( smlnum, ulp*tst2 ) )h( k+1, k ) = zero
501 DO 50 j = max( 1, ktop-incol ), kdu
502 refsum = v( 1, m22 )*( u( j, kms+1 )+
503 $ v( 2, m22 )*u( j, kms+2 ) )
504 u( j, kms+1 ) = u( j, kms+1 ) - refsum
505 u( j, kms+2 ) = u( j, kms+2 ) -
506 $ refsum*conjg( v( 2, m22 ) )
508 ELSE IF( wantz )
THEN
510 refsum = v( 1, m22 )*( z( j, k+1 )+v( 2, m22 )*
512 z( j, k+1 ) = z( j, k+1 ) - refsum
513 z( j, k+2 ) = z( j, k+2 ) -
514 $ refsum*conjg( v( 2, m22 ) )
521 DO 80 m = mbot, mtop, -1
522 k = krcol + 2*( m-1 )
523 IF( k.EQ.ktop-1 )
THEN
524 CALL claqr1( 3, h( ktop, ktop ), ldh, s( 2*m-1 ),
525 $ s( 2*m ), v( 1, m ) )
527 CALL clarfg( 3, alpha, v( 2, m ), 1, v( 1, m ) )
535 t2 = t1*conjg( v( 2, m ) )
536 t3 = t1*conjg( v( 3, m ) )
537 refsum = v( 3, m )*h( k+3, k+2 )
538 h( k+3, k ) = -refsum*t1
539 h( k+3, k+1 ) = -refsum*t2
540 h( k+3, k+2 ) = h( k+3, k+2 ) - refsum*t3
546 v( 2, m ) = h( k+2, k )
547 v( 3, m ) = h( k+3, k )
548 CALL clarfg( 3, beta, v( 2, m ), 1, v( 1, m ) )
555 IF( h( k+3, k ).NE.zero .OR. h( k+3, k+1 ).NE.
556 $ zero .OR. h( k+3, k+2 ).EQ.zero )
THEN
571 CALL claqr1( 3, h( k+1, k+1 ), ldh, s( 2*m-1 ),
574 CALL clarfg( 3, alpha, vt( 2 ), 1, vt( 1 ) )
575 t1 = conjg( vt( 1 ) )
578 refsum = h( k+1, k )+conjg( vt( 2 ) )*h( k+2, k )
580 IF( cabs1( h( k+2, k )-refsum*t2 )+
581 $ cabs1( refsum*t3 ).GT.ulp*
582 $ ( cabs1( h( k, k ) )+cabs1( h( k+1,
583 $ k+1 ) )+cabs1( h( k+2, k+2 ) ) ) )
THEN
599 h( k+1, k ) = h( k+1, k ) - refsum*t1
616 t2 = t1*conjg( v( 2, m ) )
617 t3 = t1*conjg( v( 3, m ) )
618 DO 70 j = jtop, min( kbot, k+3 )
619 refsum = h( j, k+1 ) + v( 2, m )*h( j, k+2 )
620 $ + v( 3, m )*h( j, k+3 )
621 h( j, k+1 ) = h( j, k+1 ) - refsum*t1
622 h( j, k+2 ) = h( j, k+2 ) - refsum*t2
623 h( j, k+3 ) = h( j, k+3 ) - refsum*t3
629 t1 = conjg( v( 1, m ) )
632 refsum = h( k+1, k+1 ) + conjg( v( 2, m ) )*h( k+2, k+1 )
633 $ + conjg( v( 3, m ) )*h( k+3, k+1 )
634 h( k+1, k+1 ) = h( k+1, k+1 ) - refsum*t1
635 h( k+2, k+1 ) = h( k+2, k+1 ) - refsum*t2
636 h( k+3, k+1 ) = h( k+3, k+1 ) - refsum*t3
649 IF( h( k+1, k ).NE.zero )
THEN
650 tst1 = cabs1( h( k, k ) ) + cabs1( h( k+1, k+1 ) )
651 IF( tst1.EQ.rzero )
THEN
653 $ tst1 = tst1 + cabs1( h( k, k-1 ) )
655 $ tst1 = tst1 + cabs1( h( k, k-2 ) )
657 $ tst1 = tst1 + cabs1( h( k, k-3 ) )
659 $ tst1 = tst1 + cabs1( h( k+2, k+1 ) )
661 $ tst1 = tst1 + cabs1( h( k+3, k+1 ) )
663 $ tst1 = tst1 + cabs1( h( k+4, k+1 ) )
665 IF( cabs1( h( k+1, k ) ).LE.max( smlnum, ulp*tst1 ) )
667 h12 = max( cabs1( h( k+1, k ) ),
668 $ cabs1( h( k, k+1 ) ) )
669 h21 = min( cabs1( h( k+1, k ) ),
670 $ cabs1( h( k, k+1 ) ) )
671 h11 = max( cabs1( h( k+1, k+1 ) ),
672 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
673 h22 = min( cabs1( h( k+1, k+1 ) ),
674 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
676 tst2 = h22*( h11 / scl )
678 IF( tst2.EQ.rzero .OR. h21*( h12 / scl ).LE.
679 $ max( smlnum, ulp*tst2 ) )h( k+1, k ) = zero
687 jbot = min( ndcol, kbot )
688 ELSE IF( wantt )
THEN
694 DO 100 m = mbot, mtop, -1
695 k = krcol + 2*( m-1 )
696 t1 = conjg( v( 1, m ) )
699 DO 90 j = max( ktop, krcol + 2*m ), jbot
700 refsum = h( k+1, j ) + conjg( v( 2, m ) )*
701 $ h( k+2, j ) + conjg( v( 3, m ) )*h( k+3, j )
702 h( k+1, j ) = h( k+1, j ) - refsum*t1
703 h( k+2, j ) = h( k+2, j ) - refsum*t2
704 h( k+3, j ) = h( k+3, j ) - refsum*t3
716 DO 120 m = mbot, mtop, -1
717 k = krcol + 2*( m-1 )
719 i2 = max( 1, ktop-incol )
720 i2 = max( i2, kms-(krcol-incol)+1 )
721 i4 = min( kdu, krcol + 2*( mbot-1 ) - incol + 5 )
723 t2 = t1*conjg( v( 2, m ) )
724 t3 = t1*conjg( v( 3, m ) )
726 refsum = u( j, kms+1 ) + v( 2, m )*u( j, kms+2 )
727 $ + v( 3, m )*u( j, kms+3 )
728 u( j, kms+1 ) = u( j, kms+1 ) - refsum*t1
729 u( j, kms+2 ) = u( j, kms+2 ) - refsum*t2
730 u( j, kms+3 ) = u( j, kms+3 ) - refsum*t3
733 ELSE IF( wantz )
THEN
739 DO 140 m = mbot, mtop, -1
740 k = krcol + 2*( m-1 )
742 t2 = t1*conjg( v( 2, m ) )
743 t3 = t1*conjg( v( 3, m ) )
744 DO 130 j = iloz, ihiz
745 refsum = z( j, k+1 ) + v( 2, m )*z( j, k+2 )
746 $ + v( 3, m )*z( j, k+3 )
747 z( j, k+1 ) = z( j, k+1 ) - refsum*t1
748 z( j, k+2 ) = z( j, k+2 ) - refsum*t2
749 z( j, k+3 ) = z( j, k+3 ) - refsum*t3
770 k1 = max( 1, ktop-incol )
771 nu = ( kdu-max( 0, ndcol-kbot ) ) - k1 + 1
775 DO 150 jcol = min( ndcol, kbot ) + 1, jbot, nh
776 jlen = min( nh, jbot-jcol+1 )
777 CALL cgemm(
'C',
'N', nu, jlen, nu, one, u( k1, k1 ),
778 $ ldu, h( incol+k1, jcol ), ldh, zero, wh,
780 CALL clacpy(
'ALL', nu, jlen, wh, ldwh,
781 $ h( incol+k1, jcol ), ldh )
786 DO 160 jrow = jtop, max( ktop, incol ) - 1, nv
787 jlen = min( nv, max( ktop, incol )-jrow )
788 CALL cgemm(
'N',
'N', jlen, nu, nu, one,
789 $ h( jrow, incol+k1 ), ldh, u( k1, k1 ),
790 $ ldu, zero, wv, ldwv )
791 CALL clacpy(
'ALL', jlen, nu, wv, ldwv,
792 $ h( jrow, incol+k1 ), ldh )
798 DO 170 jrow = iloz, ihiz, nv
799 jlen = min( nv, ihiz-jrow+1 )
800 CALL cgemm(
'N',
'N', jlen, nu, nu, one,
801 $ z( jrow, incol+k1 ), ldz, u( k1, k1 ),
802 $ ldu, zero, wv, ldwv )
803 CALL clacpy(
'ALL', jlen, nu, wv, ldwv,
804 $ z( jrow, incol+k1 ), ldz )