299 SUBROUTINE shgeqz( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T,
301 $ ALPHAR, ALPHAI, BETA, Q, LDQ, Z, LDZ, WORK,
309 CHARACTER COMPQ, COMPZ, JOB
310 INTEGER IHI, ILO, INFO, LDH, LDQ, LDT, LDZ, LWORK, N
313 REAL ALPHAI( * ), ALPHAR( * ), BETA( * ),
314 $ H( LDH, * ), Q( LDQ, * ), T( LDT, * ),
315 $ WORK( * ), Z( LDZ, * )
322 REAL HALF, ZERO, ONE, SAFETY
323 PARAMETER ( HALF = 0.5e+0, zero = 0.0e+0, one = 1.0e+0,
327 LOGICAL ILAZR2, ILAZRO, ILPIVT, ILQ, ILSCHR, ILZ,
329 INTEGER ICOMPQ, ICOMPZ, IFIRST, IFRSTM, IITER, ILAST,
330 $ ilastm, in, ischur, istart, j, jc, jch, jiter,
332 REAL A11, A12, A1I, A1R, A21, A22, A2I, A2R, AD11,
333 $ AD11L, AD12, AD12L, AD21, AD21L, AD22, AD22L,
334 $ AD32L, AN, ANORM, ASCALE, ATOL, B11, B1A, B1I,
335 $ b1r, b22, b2a, b2i, b2r, bn, bnorm, bscale,
336 $ btol, c, c11i, c11r, c12, c21, c22i, c22r, cl,
337 $ cq, cr, cz, eshift, s, s1, s1inv, s2, safmax,
338 $ safmin, scale, sl, sqi, sqr, sr, szi, szr, t1,
339 $ t2, t3, tau, temp, temp2, tempi, tempr, u1,
340 $ u12, u12l, u2, ulp, vs, w11, w12, w21, w22,
348 REAL SLAMCH, SLANHS, SLAPY2,
349 $ SLAPY3, SROUNDUP_LWORK
350 EXTERNAL lsame, slamch, slanhs,
351 $ slapy2, slapy3, sroundup_lwork
359 INTRINSIC abs, max, min, real, sqrt
365 IF( lsame( job,
'E' ) )
THEN
368 ELSE IF( lsame( job,
'S' ) )
THEN
375 IF( lsame( compq,
'N' ) )
THEN
378 ELSE IF( lsame( compq,
'V' ) )
THEN
381 ELSE IF( lsame( compq,
'I' ) )
THEN
388 IF( lsame( compz,
'N' ) )
THEN
391 ELSE IF( lsame( compz,
'V' ) )
THEN
394 ELSE IF( lsame( compz,
'I' ) )
THEN
404 work( 1 ) = real( max( 1, n ) )
405 lquery = ( lwork.EQ.-1 )
406 IF( ischur.EQ.0 )
THEN
408 ELSE IF( icompq.EQ.0 )
THEN
410 ELSE IF( icompz.EQ.0 )
THEN
412 ELSE IF( n.LT.0 )
THEN
414 ELSE IF( ilo.LT.1 )
THEN
416 ELSE IF( ihi.GT.n .OR. ihi.LT.ilo-1 )
THEN
418 ELSE IF( ldh.LT.n )
THEN
420 ELSE IF( ldt.LT.n )
THEN
422 ELSE IF( ldq.LT.1 .OR. ( ilq .AND. ldq.LT.n ) )
THEN
424 ELSE IF( ldz.LT.1 .OR. ( ilz .AND. ldz.LT.n ) )
THEN
426 ELSE IF( lwork.LT.max( 1, n ) .AND. .NOT.lquery )
THEN
430 CALL xerbla(
'SHGEQZ', -info )
432 ELSE IF( lquery )
THEN
439 work( 1 ) = real( 1 )
446 $
CALL slaset(
'Full', n, n, zero, one, q, ldq )
448 $
CALL slaset(
'Full', n, n, zero, one, z, ldz )
453 safmin = slamch(
'S' )
454 safmax = one / safmin
455 ulp = slamch(
'E' )*slamch(
'B' )
456 anorm = slanhs(
'F', in, h( ilo, ilo ), ldh, work )
457 bnorm = slanhs(
'F', in, t( ilo, ilo ), ldt, work )
458 atol = max( safmin, ulp*anorm )
459 btol = max( safmin, ulp*bnorm )
460 ascale = one / max( safmin, anorm )
461 bscale = one / max( safmin, bnorm )
466 IF( t( j, j ).LT.zero )
THEN
469 h( jr, j ) = -h( jr, j )
470 t( jr, j ) = -t( jr, j )
473 h( j, j ) = -h( j, j )
474 t( j, j ) = -t( j, j )
478 z( jr, j ) = -z( jr, j )
482 alphar( j ) = h( j, j )
484 beta( j ) = t( j, j )
517 maxit = 30*( ihi-ilo+1 )
519 DO 360 jiter = 1, maxit
527 IF( ilast.EQ.ilo )
THEN
533 IF( abs( h( ilast, ilast-1 ) ).LE.max( safmin, ulp*(
534 $ abs( h( ilast, ilast ) ) + abs( h( ilast-1, ilast-1 ) )
536 h( ilast, ilast-1 ) = zero
541 IF( abs( t( ilast, ilast ) ).LE.btol )
THEN
542 t( ilast, ilast ) = zero
548 DO 60 j = ilast - 1, ilo, -1
555 IF( abs( h( j, j-1 ) ).LE.max( safmin, ulp*(
556 $ abs( h( j, j ) ) + abs( h( j-1, j-1 ) )
567 IF( abs( t( j, j ) ).LT.btol )
THEN
573 IF( .NOT.ilazro )
THEN
574 temp = abs( h( j, j-1 ) )
575 temp2 = abs( h( j, j ) )
576 tempr = max( temp, temp2 )
577 IF( tempr.LT.one .AND. tempr.NE.zero )
THEN
579 temp2 = temp2 / tempr
581 IF( temp*( ascale*abs( h( j+1, j ) ) ).LE.temp2*
582 $ ( ascale*atol ) )ilazr2 = .true.
591 IF( ilazro .OR. ilazr2 )
THEN
592 DO 40 jch = j, ilast - 1
594 CALL slartg( temp, h( jch+1, jch ), c, s,
596 h( jch+1, jch ) = zero
597 CALL srot( ilastm-jch, h( jch, jch+1 ), ldh,
598 $ h( jch+1, jch+1 ), ldh, c, s )
599 CALL srot( ilastm-jch, t( jch, jch+1 ), ldt,
600 $ t( jch+1, jch+1 ), ldt, c, s )
602 $
CALL srot( n, q( 1, jch ), 1, q( 1, jch+1 ),
606 $ h( jch, jch-1 ) = h( jch, jch-1 )*c
608 IF( abs( t( jch+1, jch+1 ) ).GE.btol )
THEN
609 IF( jch+1.GE.ilast )
THEN
616 t( jch+1, jch+1 ) = zero
624 DO 50 jch = j, ilast - 1
625 temp = t( jch, jch+1 )
626 CALL slartg( temp, t( jch+1, jch+1 ), c, s,
628 t( jch+1, jch+1 ) = zero
629 IF( jch.LT.ilastm-1 )
630 $
CALL srot( ilastm-jch-1, t( jch, jch+2 ),
632 $ t( jch+1, jch+2 ), ldt, c, s )
633 CALL srot( ilastm-jch+2, h( jch, jch-1 ), ldh,
634 $ h( jch+1, jch-1 ), ldh, c, s )
636 $
CALL srot( n, q( 1, jch ), 1, q( 1, jch+1 ),
639 temp = h( jch+1, jch )
640 CALL slartg( temp, h( jch+1, jch-1 ), c, s,
642 h( jch+1, jch-1 ) = zero
643 CALL srot( jch+1-ifrstm, h( ifrstm, jch ), 1,
644 $ h( ifrstm, jch-1 ), 1, c, s )
645 CALL srot( jch-ifrstm, t( ifrstm, jch ), 1,
646 $ t( ifrstm, jch-1 ), 1, c, s )
648 $
CALL srot( n, z( 1, jch ), 1, z( 1, jch-1 ),
654 ELSE IF( ilazro )
THEN
675 temp = h( ilast, ilast )
676 CALL slartg( temp, h( ilast, ilast-1 ), c, s,
677 $ h( ilast, ilast ) )
678 h( ilast, ilast-1 ) = zero
679 CALL srot( ilast-ifrstm, h( ifrstm, ilast ), 1,
680 $ h( ifrstm, ilast-1 ), 1, c, s )
681 CALL srot( ilast-ifrstm, t( ifrstm, ilast ), 1,
682 $ t( ifrstm, ilast-1 ), 1, c, s )
684 $
CALL srot( n, z( 1, ilast ), 1, z( 1, ilast-1 ), 1, c,
691 IF( t( ilast, ilast ).LT.zero )
THEN
693 DO 90 j = ifrstm, ilast
694 h( j, ilast ) = -h( j, ilast )
695 t( j, ilast ) = -t( j, ilast )
698 h( ilast, ilast ) = -h( ilast, ilast )
699 t( ilast, ilast ) = -t( ilast, ilast )
703 z( j, ilast ) = -z( j, ilast )
707 alphar( ilast ) = h( ilast, ilast )
708 alphai( ilast ) = zero
709 beta( ilast ) = t( ilast, ilast )
721 IF( .NOT.ilschr )
THEN
723 IF( ifrstm.GT.ilast )
735 IF( .NOT.ilschr )
THEN
745 IF( ( iiter / 10 )*10.EQ.iiter )
THEN
750 IF( ( real( maxit )*safmin )*abs( h( ilast, ilast-1 ) ).LT.
751 $ abs( t( ilast-1, ilast-1 ) ) )
THEN
752 eshift = h( ilast, ilast-1 ) /
753 $ t( ilast-1, ilast-1 )
755 eshift = eshift + one / ( safmin*real( maxit ) )
766 CALL slag2( h( ilast-1, ilast-1 ), ldh,
767 $ t( ilast-1, ilast-1 ), ldt, safmin*safety, s1,
770 IF ( abs( (wr/s1)*t( ilast, ilast ) - h( ilast, ilast ) )
771 $ .GT. abs( (wr2/s2)*t( ilast, ilast )
772 $ - h( ilast, ilast ) ) )
THEN
780 temp = max( s1, safmin*max( one, abs( wr ), abs( wi ) ) )
787 temp = min( ascale, one )*( half*safmax )
788 IF( s1.GT.temp )
THEN
794 temp = min( bscale, one )*( half*safmax )
795 IF( abs( wr ).GT.temp )
796 $ scale = min( scale, temp / abs( wr ) )
802 DO 120 j = ilast - 1, ifirst + 1, -1
804 temp = abs( s1*h( j, j-1 ) )
805 temp2 = abs( s1*h( j, j )-wr*t( j, j ) )
806 tempr = max( temp, temp2 )
807 IF( tempr.LT.one .AND. tempr.NE.zero )
THEN
809 temp2 = temp2 / tempr
811 IF( abs( ( ascale*h( j+1, j ) )*temp ).LE.( ascale*atol )*
822 temp = s1*h( istart, istart ) - wr*t( istart, istart )
823 temp2 = s1*h( istart+1, istart )
824 CALL slartg( temp, temp2, c, s, tempr )
828 DO 190 j = istart, ilast - 1
829 IF( j.GT.istart )
THEN
831 CALL slartg( temp, h( j+1, j-1 ), c, s, h( j, j-1 ) )
835 DO 140 jc = j, ilastm
836 temp = c*h( j, jc ) + s*h( j+1, jc )
837 h( j+1, jc ) = -s*h( j, jc ) + c*h( j+1, jc )
839 temp2 = c*t( j, jc ) + s*t( j+1, jc )
840 t( j+1, jc ) = -s*t( j, jc ) + c*t( j+1, jc )
845 temp = c*q( jr, j ) + s*q( jr, j+1 )
846 q( jr, j+1 ) = -s*q( jr, j ) + c*q( jr, j+1 )
852 CALL slartg( temp, t( j+1, j ), c, s, t( j+1, j+1 ) )
855 DO 160 jr = ifrstm, min( j+2, ilast )
856 temp = c*h( jr, j+1 ) + s*h( jr, j )
857 h( jr, j ) = -s*h( jr, j+1 ) + c*h( jr, j )
860 DO 170 jr = ifrstm, j
861 temp = c*t( jr, j+1 ) + s*t( jr, j )
862 t( jr, j ) = -s*t( jr, j+1 ) + c*t( jr, j )
867 temp = c*z( jr, j+1 ) + s*z( jr, j )
868 z( jr, j ) = -s*z( jr, j+1 ) + c*z( jr, j )
884 IF( ifirst+1.EQ.ilast )
THEN
894 CALL slasv2( t( ilast-1, ilast-1 ), t( ilast-1, ilast ),
895 $ t( ilast, ilast ), b22, b11, sr, cr, sl, cl )
897 IF( b11.LT.zero )
THEN
904 CALL srot( ilastm+1-ifirst, h( ilast-1, ilast-1 ), ldh,
905 $ h( ilast, ilast-1 ), ldh, cl, sl )
906 CALL srot( ilast+1-ifrstm, h( ifrstm, ilast-1 ), 1,
907 $ h( ifrstm, ilast ), 1, cr, sr )
909 IF( ilast.LT.ilastm )
910 $
CALL srot( ilastm-ilast, t( ilast-1, ilast+1 ), ldt,
911 $ t( ilast, ilast+1 ), ldt, cl, sl )
912 IF( ifrstm.LT.ilast-1 )
913 $
CALL srot( ifirst-ifrstm, t( ifrstm, ilast-1 ), 1,
914 $ t( ifrstm, ilast ), 1, cr, sr )
917 $
CALL srot( n, q( 1, ilast-1 ), 1, q( 1, ilast ), 1,
921 $
CALL srot( n, z( 1, ilast-1 ), 1, z( 1, ilast ), 1,
925 t( ilast-1, ilast-1 ) = b11
926 t( ilast-1, ilast ) = zero
927 t( ilast, ilast-1 ) = zero
928 t( ilast, ilast ) = b22
932 IF( b22.LT.zero )
THEN
933 DO 210 j = ifrstm, ilast
934 h( j, ilast ) = -h( j, ilast )
935 t( j, ilast ) = -t( j, ilast )
940 z( j, ilast ) = -z( j, ilast )
950 CALL slag2( h( ilast-1, ilast-1 ), ldh,
951 $ t( ilast-1, ilast-1 ), ldt, safmin*safety, s1,
952 $ temp, wr, temp2, wi )
963 a11 = h( ilast-1, ilast-1 )
964 a21 = h( ilast, ilast-1 )
965 a12 = h( ilast-1, ilast )
966 a22 = h( ilast, ilast )
974 c11r = s1*a11 - wr*b11
978 c22r = s1*a22 - wr*b22
981 IF( abs( c11r )+abs( c11i )+abs( c12 ).GT.abs( c21 )+
982 $ abs( c22r )+abs( c22i ) )
THEN
983 t1 = slapy3( c12, c11r, c11i )
988 cz = slapy2( c22r, c22i )
989 IF( cz.LE.safmin )
THEN
996 t1 = slapy2( cz, c21 )
998 szr = -c21*tempr / t1
1009 an = abs( a11 ) + abs( a12 ) + abs( a21 ) + abs( a22 )
1010 bn = abs( b11 ) + abs( b22 )
1011 wabs = abs( wr ) + abs( wi )
1012 IF( s1*an.GT.wabs*bn )
THEN
1017 a1r = cz*a11 + szr*a12
1019 a2r = cz*a21 + szr*a22
1021 cq = slapy2( a1r, a1i )
1022 IF( cq.LE.safmin )
THEN
1029 sqr = tempr*a2r + tempi*a2i
1030 sqi = tempi*a2r - tempr*a2i
1033 t1 = slapy3( cq, sqr, sqi )
1040 tempr = sqr*szr - sqi*szi
1041 tempi = sqr*szi + sqi*szr
1042 b1r = cq*cz*b11 + tempr*b22
1044 b1a = slapy2( b1r, b1i )
1045 b2r = cq*cz*b22 + tempr*b11
1047 b2a = slapy2( b2r, b2i )
1051 beta( ilast-1 ) = b1a
1053 alphar( ilast-1 ) = ( wr*b1a )*s1inv
1054 alphai( ilast-1 ) = ( wi*b1a )*s1inv
1055 alphar( ilast ) = ( wr*b2a )*s1inv
1056 alphai( ilast ) = -( wi*b2a )*s1inv
1068 IF( .NOT.ilschr )
THEN
1070 IF( ifrstm.GT.ilast )
1088 ad11 = ( ascale*h( ilast-1, ilast-1 ) ) /
1089 $ ( bscale*t( ilast-1, ilast-1 ) )
1090 ad21 = ( ascale*h( ilast, ilast-1 ) ) /
1091 $ ( bscale*t( ilast-1, ilast-1 ) )
1092 ad12 = ( ascale*h( ilast-1, ilast ) ) /
1093 $ ( bscale*t( ilast, ilast ) )
1094 ad22 = ( ascale*h( ilast, ilast ) ) /
1095 $ ( bscale*t( ilast, ilast ) )
1096 u12 = t( ilast-1, ilast ) / t( ilast, ilast )
1097 ad11l = ( ascale*h( ifirst, ifirst ) ) /
1098 $ ( bscale*t( ifirst, ifirst ) )
1099 ad21l = ( ascale*h( ifirst+1, ifirst ) ) /
1100 $ ( bscale*t( ifirst, ifirst ) )
1101 ad12l = ( ascale*h( ifirst, ifirst+1 ) ) /
1102 $ ( bscale*t( ifirst+1, ifirst+1 ) )
1103 ad22l = ( ascale*h( ifirst+1, ifirst+1 ) ) /
1104 $ ( bscale*t( ifirst+1, ifirst+1 ) )
1105 ad32l = ( ascale*h( ifirst+2, ifirst+1 ) ) /
1106 $ ( bscale*t( ifirst+1, ifirst+1 ) )
1107 u12l = t( ifirst, ifirst+1 ) / t( ifirst+1, ifirst+1 )
1109 v( 1 ) = ( ad11-ad11l )*( ad22-ad11l ) - ad12*ad21 +
1110 $ ad21*u12*ad11l + ( ad12l-ad11l*u12l )*ad21l
1111 v( 2 ) = ( ( ad22l-ad11l )-ad21l*u12l-( ad11-ad11l )-
1112 $ ( ad22-ad11l )+ad21*u12 )*ad21l
1113 v( 3 ) = ad32l*ad21l
1117 CALL slarfg( 3, v( 1 ), v( 2 ), 1, tau )
1122 DO 290 j = istart, ilast - 2
1128 IF( j.GT.istart )
THEN
1129 v( 1 ) = h( j, j-1 )
1130 v( 2 ) = h( j+1, j-1 )
1131 v( 3 ) = h( j+2, j-1 )
1133 CALL slarfg( 3, h( j, j-1 ), v( 2 ), 1, tau )
1135 h( j+1, j-1 ) = zero
1136 h( j+2, j-1 ) = zero
1141 DO 230 jc = j, ilastm
1142 temp = h( j, jc )+v( 2 )*h( j+1, jc )+v( 3 )*
1144 h( j, jc ) = h( j, jc ) - temp*tau
1145 h( j+1, jc ) = h( j+1, jc ) - temp*t2
1146 h( j+2, jc ) = h( j+2, jc ) - temp*t3
1147 temp2 = t( j, jc )+v( 2 )*t( j+1, jc )+v( 3 )*
1149 t( j, jc ) = t( j, jc ) - temp2*tau
1150 t( j+1, jc ) = t( j+1, jc ) - temp2*t2
1151 t( j+2, jc ) = t( j+2, jc ) - temp2*t3
1155 temp = q( jr, j )+v( 2 )*q( jr, j+1 )+v( 3 )*
1157 q( jr, j ) = q( jr, j ) - temp*tau
1158 q( jr, j+1 ) = q( jr, j+1 ) - temp*t2
1159 q( jr, j+2 ) = q( jr, j+2 ) - temp*t3
1168 temp = max( abs( t( j+1, j+1 ) ), abs( t( j+1, j+2 ) ) )
1169 temp2 = max( abs( t( j+2, j+1 ) ), abs( t( j+2, j+2 ) ) )
1170 IF( max( temp, temp2 ).LT.safmin )
THEN
1175 ELSE IF( temp.GE.temp2 )
THEN
1193 IF( abs( w12 ).GT.abs( w11 ) )
THEN
1207 w22 = w22 - temp*w12
1213 IF( abs( w22 ).LT.safmin )
THEN
1219 IF( abs( w22 ).LT.abs( u2 ) )
1220 $ scale = abs( w22 / u2 )
1221 IF( abs( w11 ).LT.abs( u1 ) )
1222 $ scale = min( scale, abs( w11 / u1 ) )
1226 u2 = ( scale*u2 ) / w22
1227 u1 = ( scale*u1-w12*u2 ) / w11
1238 t1 = sqrt( scale**2+u1**2+u2**2 )
1239 tau = one + scale / t1
1240 vs = -one / ( scale+t1 )
1249 DO 260 jr = ifrstm, min( j+3, ilast )
1250 temp = h( jr, j )+v( 2 )*h( jr, j+1 )+v( 3 )*
1252 h( jr, j ) = h( jr, j ) - temp*tau
1253 h( jr, j+1 ) = h( jr, j+1 ) - temp*t2
1254 h( jr, j+2 ) = h( jr, j+2 ) - temp*t3
1256 DO 270 jr = ifrstm, j + 2
1257 temp = t( jr, j )+v( 2 )*t( jr, j+1 )+v( 3 )*
1259 t( jr, j ) = t( jr, j ) - temp*tau
1260 t( jr, j+1 ) = t( jr, j+1 ) - temp*t2
1261 t( jr, j+2 ) = t( jr, j+2 ) - temp*t3
1265 temp = z( jr, j )+v( 2 )*z( jr, j+1 )+v( 3 )*
1267 z( jr, j ) = z( jr, j ) - temp*tau
1268 z( jr, j+1 ) = z( jr, j+1 ) - temp*t2
1269 z( jr, j+2 ) = z( jr, j+2 ) - temp*t3
1282 CALL slartg( temp, h( j+1, j-1 ), c, s, h( j, j-1 ) )
1283 h( j+1, j-1 ) = zero
1285 DO 300 jc = j, ilastm
1286 temp = c*h( j, jc ) + s*h( j+1, jc )
1287 h( j+1, jc ) = -s*h( j, jc ) + c*h( j+1, jc )
1289 temp2 = c*t( j, jc ) + s*t( j+1, jc )
1290 t( j+1, jc ) = -s*t( j, jc ) + c*t( j+1, jc )
1295 temp = c*q( jr, j ) + s*q( jr, j+1 )
1296 q( jr, j+1 ) = -s*q( jr, j ) + c*q( jr, j+1 )
1303 temp = t( j+1, j+1 )
1304 CALL slartg( temp, t( j+1, j ), c, s, t( j+1, j+1 ) )
1307 DO 320 jr = ifrstm, ilast
1308 temp = c*h( jr, j+1 ) + s*h( jr, j )
1309 h( jr, j ) = -s*h( jr, j+1 ) + c*h( jr, j )
1312 DO 330 jr = ifrstm, ilast - 1
1313 temp = c*t( jr, j+1 ) + s*t( jr, j )
1314 t( jr, j ) = -s*t( jr, j+1 ) + c*t( jr, j )
1319 temp = c*z( jr, j+1 ) + s*z( jr, j )
1320 z( jr, j ) = -s*z( jr, j+1 ) + c*z( jr, j )
1347 DO 410 j = 1, ilo - 1
1348 IF( t( j, j ).LT.zero )
THEN
1351 h( jr, j ) = -h( jr, j )
1352 t( jr, j ) = -t( jr, j )
1355 h( j, j ) = -h( j, j )
1356 t( j, j ) = -t( j, j )
1360 z( jr, j ) = -z( jr, j )
1364 alphar( j ) = h( j, j )
1366 beta( j ) = t( j, j )
1376 work( 1 ) = sroundup_lwork( n )