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, , ASCALE, ATOL, BNORM, BSCALE, BTOL
318COMPLEX ABI22, AD11, AD12, AD21, AD22, CTEMP, ,
319 $ CTEMP3, ESHIFT, S, , 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 )
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.GT.
IF( ABSBSAFMIN ) 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.EQ.
IF( ILASTILO ) THEN
518.LE.
IF( ABS1( H( ILAST, ILAST-1 ) )MAX( SAFMIN, ULP*(
519 $ ABS1( H( ILAST, ILAST ) ) + ABS1( H( ILAST-1, ILAST-1 )
521 H( ILAST, ILAST-1 ) = CZERO
526.LE.
IF( ABS( T( ILAST, ILAST ) )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.LE.
IF( ABS1( H( J, J-1 ) )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.LT.
IF( ABS( T( J, J ) )MAX( SAFMIN,ULP*TEMP ) ) THEN
563.NOT.
IF( ILAZRO ) THEN
564 IF( ABS1( H( J, J-1 ) )*( ASCALE*ABS1( H( J+1,
565.LE.
$ J ) ) )ABS1( H( J, J ) )*( ASCALE*ATOL ) )
575.OR.
IF( ILAZRO 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.GE.
IF( ABS1( T( JCH+1, JCH+1 ) )BTOL ) THEN
592.GE.
IF( JCH+1ILAST ) 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.LT.
IF( JCHILASTM-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.GT.
IF( ABSBSAFMIN ) 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.NOT.
IF( ILSCHR ) THEN
700.GT.
IF( IFRSTMILAST )
712.NOT.
IF( ILSCHR ) THEN
722.NE.
IF( ( IITER / 10 )*10IITER ) 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.NE.
IF( CTEMPZERO ) THEN
748 X = HALF*( AD11-SHIFT )
750 TEMP = MAX( TEMP, ABS1( X ) )
751 Y = TEMP*SQRT( ( X / TEMP )**2+( CTEMP / TEMP )**2 )
752.GT.
IF( TEMP2ZERO ) THEN
753 IF( REAL( X / TEMP2 )*REAL( Y )+
754.LT.
$ AIMAG( X / TEMP2 )*AIMAG( Y )ZERO )Y = -Y
756 SHIFT = SHIFT - CTEMP*CLADIV( CTEMP, ( X+Y ) )
762.EQ..AND.
IF( ( IITER / 20 )*20IITER
763.GT.
$ BSCALE*ABS1(T( ILAST, ILAST ))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.LT..AND..NE.
IF( TEMPRONE TEMPRZERO ) THEN
783 TEMP2 = TEMP2 / TEMPR
785.LE.
IF( ABS1( H( J, J-1 ) )*TEMP2TEMP*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.GT.
IF( JISTART ) 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.GT.
IF( ABSBSAFMIN ) 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 chgeqz(job, compq, compz, n, ilo, ihi, h, ldh, t, ldt, alpha, beta, q, ldq, z, ldz, work, lwork, rwork, info)
CHGEQZ
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.
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.