281 SUBROUTINE chgeqz( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT,
282 $ ALPHA, BETA, Q, LDQ, Z, LDZ, WORK, LWORK,
290 CHARACTER COMPQ, COMPZ, JOB
291 INTEGER IHI, ILO, INFO, LDH, LDQ, LDT, LDZ, LWORK, N
295 COMPLEX ALPHA( * ), BETA( * ), H( LDH, * ),
296 $ q( ldq, * ), t( ldt, * ), work( * ),
304 PARAMETER ( CZERO = ( 0.0e+0, 0.0e+0 ),
305 $ cone = ( 1.0e+0, 0.0e+0 ) )
307 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
309 parameter( half = 0.5e+0 )
312 LOGICAL ILAZR2, ILAZRO, ILQ, ILSCHR, ILZ, LQUERY
313 INTEGER ICOMPQ, ICOMPZ, IFIRST, IFRSTM, IITER, ILAST,
314 $ ilastm, in, ischur, istart, j, jc, jch, jiter,
316 REAL ABSB, ANORM, ASCALE, ATOL, BNORM, BSCALE, BTOL,
317 $ C, SAFMIN, TEMP, TEMP2, TEMPR, ULP
318 COMPLEX ABI22, AD11, AD12, AD21, AD22, CTEMP, CTEMP2,
319 $ CTEMP3, ESHIFT, S, SHIFT, SIGNBC,
326 EXTERNAL cladiv, lsame, clanhs, slamch
332 INTRINSIC abs, aimag, cmplx, conjg, max, min, real, sqrt
338 abs1( x ) = abs( real( x ) ) + abs( aimag( x ) )
344 IF( lsame( job,
'E' ) )
THEN
347 ELSE IF( lsame( job,
'S' ) )
THEN
355 IF( lsame( compq,
'N' ) )
THEN
358 ELSE IF( lsame( compq,
'V' ) )
THEN
361 ELSE IF( lsame( compq,
'I' ) )
THEN
369 IF( lsame( compz,
'N' ) )
THEN
372 ELSE IF( lsame( compz,
'V' ) )
THEN
375 ELSE IF( lsame( compz,
'I' ) )
THEN
386 work( 1 ) = max( 1, n )
387 lquery = ( lwork.EQ.-1 )
388 IF( ischur.EQ.0 )
THEN
390 ELSE IF( icompq.EQ.0 )
THEN
392 ELSE IF( icompz.EQ.0 )
THEN
394 ELSE IF( n.LT.0 )
THEN
396 ELSE IF( ilo.LT.1 )
THEN
398 ELSE IF( ihi.GT.n .OR. ihi.LT.ilo-1 )
THEN
400 ELSE IF( ldh.LT.n )
THEN
402 ELSE IF( ldt.LT.n )
THEN
404 ELSE IF( ldq.LT.1 .OR. ( ilq .AND. ldq.LT.n ) )
THEN
406 ELSE IF( ldz.LT.1 .OR. ( ilz .AND. ldz.LT.n ) )
THEN
408 ELSE IF( lwork.LT.max( 1, n ) .AND. .NOT.lquery )
THEN
412 CALL xerbla(
'CHGEQZ', -info )
414 ELSE IF( lquery )
THEN
422 work( 1 ) = cmplx( 1 )
429 $
CALL claset(
'Full', n, n, czero, cone, q, ldq )
431 $
CALL claset(
'Full', n, n, czero, cone, z, ldz )
436 safmin = slamch(
'S' )
437 ulp = slamch(
'E' )*slamch(
'B' )
438 anorm = clanhs(
'F', in, h( ilo, ilo ), ldh, rwork )
439 bnorm = clanhs(
'F', in, t( ilo, ilo ), ldt, rwork )
440 atol = max( safmin, ulp*anorm )
441 btol = max( safmin, ulp*bnorm )
442 ascale = one / max( safmin, anorm )
443 bscale = one / max( safmin, bnorm )
449 absb = abs( t( j, j ) )
450 IF( absb.GT.safmin )
THEN
451 signbc = conjg( t( j, j ) / absb )
454 CALL cscal( j-1, signbc, t( 1, j ), 1 )
455 CALL cscal( j, signbc, h( 1, j ), 1 )
457 CALL cscal( 1, signbc, h( j, j ), 1 )
460 $
CALL cscal( n, signbc, z( 1, j ), 1 )
464 alpha( j ) = h( j, j )
465 beta( j ) = t( j, j )
498 maxit = 30*( ihi-ilo+1 )
500 DO 170 jiter = 1, maxit
515 IF( ilast.EQ.ilo )
THEN
518 IF( abs1( h( ilast, ilast-1 ) ).LE.max( safmin, ulp*(
519 $ abs1( h( ilast, ilast ) ) + abs1( h( ilast-1, ilast-1 )
521 h( ilast, ilast-1 ) = czero
526 IF( abs( t( ilast, ilast ) ).LE.max( safmin, ulp*(
527 $ abs( t( ilast - 1, ilast ) ) + abs( t( ilast-1, ilast-1 )
529 t( ilast, ilast ) = czero
535 DO 40 j = ilast - 1, ilo, -1
542 IF( abs1( h( j, j-1 ) ).LE.max( safmin, ulp*(
543 $ abs1( h( j, j ) ) + abs1( h( j-1, j-1 ) )
554 temp = abs( t( j, j + 1 ) )
556 $ temp = temp + abs( t( j - 1, j ) )
557 IF( abs( t( j, j ) ).LT.max( safmin,ulp*temp ) )
THEN
563 IF( .NOT.ilazro )
THEN
564 IF( abs1( h( j, j-1 ) )*( ascale*abs1( h( j+1,
565 $ j ) ) ).LE.abs1( h( j, j ) )*( ascale*atol ) )
575 IF( ilazro .OR. ilazr2 )
THEN
576 DO 20 jch = j, ilast - 1
577 ctemp = h( jch, jch )
578 CALL clartg( ctemp, h( jch+1, jch ), c, s,
580 h( jch+1, jch ) = czero
581 CALL crot( ilastm-jch, h( jch, jch+1 ), ldh,
582 $ h( jch+1, jch+1 ), ldh, c, s )
583 CALL crot( ilastm-jch, t( jch, jch+1 ), ldt,
584 $ t( jch+1, jch+1 ), ldt, c, s )
586 $
CALL crot( n, q( 1, jch ), 1, q( 1, jch+1 ), 1,
589 $ h( jch, jch-1 ) = h( jch, jch-1 )*c
591 IF( abs1( t( jch+1, jch+1 ) ).GE.btol )
THEN
592 IF( jch+1.GE.ilast )
THEN
599 t( jch+1, jch+1 ) = czero
607 DO 30 jch = j, ilast - 1
608 ctemp = t( jch, jch+1 )
609 CALL clartg( ctemp, t( jch+1, jch+1 ), c, s,
611 t( jch+1, jch+1 ) = czero
612 IF( jch.LT.ilastm-1 )
613 $
CALL crot( ilastm-jch-1, t( jch, jch+2 ), ldt,
614 $ t( jch+1, jch+2 ), ldt, c, s )
615 CALL crot( ilastm-jch+2, h( jch, jch-1 ), ldh,
616 $ h( jch+1, jch-1 ), ldh, c, s )
618 $
CALL crot( n, q( 1, jch ), 1, q( 1, jch+1 ), 1,
620 ctemp = h( jch+1, jch )
621 CALL clartg( ctemp, h( jch+1, jch-1 ), c, s,
623 h( jch+1, jch-1 ) = czero
624 CALL crot( jch+1-ifrstm, h( ifrstm, jch ), 1,
625 $ h( ifrstm, jch-1 ), 1, c, s )
626 CALL crot( jch-ifrstm, t( ifrstm, jch ), 1,
627 $ t( ifrstm, jch-1 ), 1, c, s )
629 $
CALL crot( n, z( 1, jch ), 1, z( 1, jch-1 ), 1,
634 ELSE IF( ilazro )
THEN
655 ctemp = h( ilast, ilast )
656 CALL clartg( ctemp, h( ilast, ilast-1 ), c, s,
657 $ h( ilast, ilast ) )
658 h( ilast, ilast-1 ) = czero
659 CALL crot( ilast-ifrstm, h( ifrstm, ilast ), 1,
660 $ h( ifrstm, ilast-1 ), 1, c, s )
661 CALL crot( ilast-ifrstm, t( ifrstm, ilast ), 1,
662 $ t( ifrstm, ilast-1 ), 1, c, s )
664 $
CALL crot( n, z( 1, ilast ), 1, z( 1, ilast-1 ), 1, c, s )
669 absb = abs( t( ilast, ilast ) )
670 IF( absb.GT.safmin )
THEN
671 signbc = conjg( t( ilast, ilast ) / absb )
672 t( ilast, ilast ) = absb
674 CALL cscal( ilast-ifrstm, signbc, t( ifrstm, ilast ), 1 )
675 CALL cscal( ilast+1-ifrstm, signbc, h( ifrstm, ilast ),
678 CALL cscal( 1, signbc, h( ilast, ilast ), 1 )
681 $
CALL cscal( n, signbc, z( 1, ilast ), 1 )
683 t( ilast, ilast ) = czero
685 alpha( ilast ) = h( ilast, ilast )
686 beta( ilast ) = t( ilast, ilast )
698 IF( .NOT.ilschr )
THEN
700 IF( ifrstm.GT.ilast )
712 IF( .NOT.ilschr )
THEN
722 IF( ( iiter / 10 )*10.NE.iiter )
THEN
731 u12 = ( bscale*t( ilast-1, ilast ) ) /
732 $ ( bscale*t( ilast, ilast ) )
733 ad11 = ( ascale*h( ilast-1, ilast-1 ) ) /
734 $ ( bscale*t( ilast-1, ilast-1 ) )
735 ad21 = ( ascale*h( ilast, ilast-1 ) ) /
736 $ ( bscale*t( ilast-1, ilast-1 ) )
737 ad12 = ( ascale*h( ilast-1, ilast ) ) /
738 $ ( bscale*t( ilast, ilast ) )
739 ad22 = ( ascale*h( ilast, ilast ) ) /
740 $ ( bscale*t( ilast, ilast ) )
741 abi22 = ad22 - u12*ad21
742 abi12 = ad12 - u12*ad11
745 ctemp = sqrt( abi12 )*sqrt( ad21 )
747 IF( ctemp.NE.zero )
THEN
748 x = half*( ad11-shift )
750 temp = max( temp, abs1( x ) )
751 y = temp*sqrt( ( x / temp )**2+( ctemp / temp )**2 )
752 IF( temp2.GT.zero )
THEN
753 IF( real( x / temp2 )*real( y )+
754 $ aimag( x / temp2 )*aimag( y ).LT.zero )y = -y
756 shift = shift - ctemp*cladiv( ctemp, ( x+y ) )
762 IF( ( iiter / 20 )*20.EQ.iiter .AND.
763 $ bscale*abs1(t( ilast, ilast )).GT.safmin )
THEN
764 eshift = eshift + ( ascale*h( ilast,
765 $ ilast ) )/( bscale*t( ilast, ilast ) )
767 eshift = eshift + ( ascale*h( ilast,
768 $ ilast-1 ) )/( bscale*t( ilast-1, ilast-1 ) )
775 DO 80 j = ilast - 1, ifirst + 1, -1
777 ctemp = ascale*h( j, j ) - shift*( bscale*t( j, j ) )
779 temp2 = ascale*abs1( h( j+1, j ) )
780 tempr = max( temp, temp2 )
781 IF( tempr.LT.one .AND. tempr.NE.zero )
THEN
783 temp2 = temp2 / tempr
785 IF( abs1( h( j, j-1 ) )*temp2.LE.temp*atol )
790 ctemp = ascale*h( ifirst, ifirst ) -
791 $ shift*( bscale*t( ifirst, ifirst ) )
798 ctemp2 = ascale*h( istart+1, istart )
799 CALL clartg( ctemp, ctemp2, c, s, ctemp3 )
803 DO 150 j = istart, ilast - 1
804 IF( j.GT.istart )
THEN
806 CALL clartg( ctemp, h( j+1, j-1 ), c, s, h( j, j-1 ) )
807 h( j+1, j-1 ) = czero
810 DO 100 jc = j, ilastm
811 ctemp = c*h( j, jc ) + s*h( j+1, jc )
812 h( j+1, jc ) = -conjg( s )*h( j, jc ) + c*h( j+1, jc )
814 ctemp2 = c*t( j, jc ) + s*t( j+1, jc )
815 t( j+1, jc ) = -conjg( s )*t( j, jc ) + c*t( j+1, jc )
820 ctemp = c*q( jr, j ) + conjg( s )*q( jr, j+1 )
821 q( jr, j+1 ) = -s*q( jr, j ) + c*q( jr, j+1 )
826 ctemp = t( j+1, j+1 )
827 CALL clartg( ctemp, t( j+1, j ), c, s, t( j+1, j+1 ) )
830 DO 120 jr = ifrstm, min( j+2, ilast )
831 ctemp = c*h( jr, j+1 ) + s*h( jr, j )
832 h( jr, j ) = -conjg( s )*h( jr, j+1 ) + c*h( jr, j )
835 DO 130 jr = ifrstm, j
836 ctemp = c*t( jr, j+1 ) + s*t( jr, j )
837 t( jr, j ) = -conjg( s )*t( jr, j+1 ) + c*t( jr, j )
842 ctemp = c*z( jr, j+1 ) + s*z( jr, j )
843 z( jr, j ) = -conjg( s )*z( jr, j+1 ) + c*z( jr, j )
865 DO 200 j = 1, ilo - 1
866 absb = abs( t( j, j ) )
867 IF( absb.GT.safmin )
THEN
868 signbc = conjg( t( j, j ) / absb )
871 CALL cscal( j-1, signbc, t( 1, j ), 1 )
872 CALL cscal( j, signbc, h( 1, j ), 1 )
874 CALL cscal( 1, signbc, h( j, j ), 1 )
877 $
CALL cscal( n, signbc, z( 1, j ), 1 )
881 alpha( j ) = h( j, j )
882 beta( j ) = t( j, j )
892 work( 1 ) = cmplx( n )
subroutine clartg(f, g, c, s, r)
CLARTG generates a plane rotation with real cosine and complex sine.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine cscal(N, CA, CX, INCX)
CSCAL
subroutine chgeqz(JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT, ALPHA, BETA, Q, LDQ, Z, LDZ, WORK, LWORK, RWORK, INFO)
CHGEQZ
subroutine claset(UPLO, M, N, ALPHA, BETA, A, LDA)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine crot(N, CX, INCX, CY, INCY, C, S)
CROT applies a plane rotation with real cosine and complex sine to a pair of complex vectors.