diff --git a/SRC/chgeqz.f b/SRC/chgeqz.f index bcf5acd0bf..a158ee8398 100644 --- a/SRC/chgeqz.f +++ b/SRC/chgeqz.f @@ -518,13 +518,17 @@ SUBROUTINE CHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT, IF( ILAST.EQ.ILO ) THEN GO TO 60 ELSE - IF( ABS1( H( ILAST, ILAST-1 ) ).LE.ATOL ) THEN + IF( ABS1( H( ILAST, ILAST-1 ) ).LE.MAX( SAFMIN, ULP*( + $ ABS1( H( ILAST, ILAST ) ) + ABS1( H( ILAST-1, ILAST-1 ) + $ ) ) ) ) THEN H( ILAST, ILAST-1 ) = CZERO GO TO 60 END IF END IF * - IF( ABS( T( ILAST, ILAST ) ).LE.BTOL ) THEN + IF( ABS( T( ILAST, ILAST ) ).LE.MAX( SAFMIN, ULP*( + $ ABS( T( ILAST - 1, ILAST ) ) + ABS( T( ILAST-1, ILAST-1 ) + $ ) ) ) ) THEN T( ILAST, ILAST ) = CZERO GO TO 50 END IF @@ -538,7 +542,9 @@ SUBROUTINE CHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT, IF( J.EQ.ILO ) THEN ILAZRO = .TRUE. ELSE - IF( ABS1( H( J, J-1 ) ).LE.ATOL ) THEN + IF( ABS1( H( J, J-1 ) ).LE.MAX( SAFMIN, ULP*( + $ ABS1( H( J, J ) ) + ABS1( H( J-1, J-1 ) ) + $ ) ) ) THEN H( J, J-1 ) = CZERO ILAZRO = .TRUE. ELSE @@ -548,7 +554,10 @@ SUBROUTINE CHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT, * * Test 2: for T(j,j)=0 * - IF( ABS( T( J, J ) ).LT.BTOL ) THEN + TEMP = ABS ( T( J, J + 1 ) ) + IF ( J .GT. ILO ) + $ TEMP = TEMP + ABS ( T( J - 1, J ) ) + IF( ABS( T( J, J ) ).LT.MAX( SAFMIN,ULP*TEMP ) ) THEN T( J, J ) = CZERO * * Test 1a: Check for 2 consecutive small subdiagonals in A diff --git a/SRC/dhgeqz.f b/SRC/dhgeqz.f index 99557f20eb..655351386a 100644 --- a/SRC/dhgeqz.f +++ b/SRC/dhgeqz.f @@ -531,13 +531,17 @@ SUBROUTINE DHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT, * GO TO 80 ELSE - IF( ABS( H( ILAST, ILAST-1 ) ).LE.ATOL ) THEN + IF( ABS( H( ILAST, ILAST-1 ) ).LE.MAX( SAFMIN, ULP*( + $ ABS( H( ILAST, ILAST ) ) + ABS( H( ILAST-1, ILAST-1 ) ) + $ ) ) ) THEN H( ILAST, ILAST-1 ) = ZERO GO TO 80 END IF END IF * - IF( ABS( T( ILAST, ILAST ) ).LE.BTOL ) THEN + IF( ABS( T( ILAST, ILAST ) ).LE.MAX( SAFMIN, ULP*( + $ ABS( T( ILAST - 1, ILAST ) ) + ABS( T( ILAST-1, ILAST-1 ) + $ ) ) ) ) THEN T( ILAST, ILAST ) = ZERO GO TO 70 END IF @@ -551,7 +555,9 @@ SUBROUTINE DHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT, IF( J.EQ.ILO ) THEN ILAZRO = .TRUE. ELSE - IF( ABS( H( J, J-1 ) ).LE.ATOL ) THEN + IF( ABS( H( J, J-1 ) ).LE.MAX( SAFMIN, ULP*( + $ ABS( H( J, J ) ) + ABS( H( J-1, J-1 ) ) + $ ) ) ) THEN H( J, J-1 ) = ZERO ILAZRO = .TRUE. ELSE @@ -561,7 +567,10 @@ SUBROUTINE DHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT, * * Test 2: for T(j,j)=0 * - IF( ABS( T( J, J ) ).LT.BTOL ) THEN + TEMP = ABS ( T( J, J + 1 ) ) + IF ( J .GT. ILO ) + $ TEMP = TEMP + ABS ( T( J - 1, J ) ) + IF( ABS( T( J, J ) ).LT.MAX( SAFMIN,ULP*TEMP ) ) THEN T( J, J ) = ZERO * * Test 1a: Check for 2 consecutive small subdiagonals in A diff --git a/SRC/shgeqz.f b/SRC/shgeqz.f index 34f6a8ce0d..cfed49e5aa 100644 --- a/SRC/shgeqz.f +++ b/SRC/shgeqz.f @@ -531,13 +531,17 @@ SUBROUTINE SHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT, * GO TO 80 ELSE - IF( ABS( H( ILAST, ILAST-1 ) ).LE.ATOL ) THEN + IF( ABS( H( ILAST, ILAST-1 ) ).LE.MAX( SAFMIN, ULP*( + $ ABS( H( ILAST, ILAST ) ) + ABS( H( ILAST-1, ILAST-1 ) ) + $ ) ) ) THEN H( ILAST, ILAST-1 ) = ZERO GO TO 80 END IF END IF * - IF( ABS( T( ILAST, ILAST ) ).LE.BTOL ) THEN + IF( ABS( T( ILAST, ILAST ) ).LE.MAX( SAFMIN, ULP*( + $ ABS( T( ILAST - 1, ILAST ) ) + ABS( T( ILAST-1, ILAST-1 ) + $ ) ) ) ) THEN T( ILAST, ILAST ) = ZERO GO TO 70 END IF @@ -551,7 +555,9 @@ SUBROUTINE SHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT, IF( J.EQ.ILO ) THEN ILAZRO = .TRUE. ELSE - IF( ABS( H( J, J-1 ) ).LE.ATOL ) THEN + IF( ABS( H( J, J-1 ) ).LE.MAX( SAFMIN, ULP*( + $ ABS( H( J, J ) ) + ABS( H( J-1, J-1 ) ) + $ ) ) ) THEN H( J, J-1 ) = ZERO ILAZRO = .TRUE. ELSE @@ -561,7 +567,10 @@ SUBROUTINE SHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT, * * Test 2: for T(j,j)=0 * - IF( ABS( T( J, J ) ).LT.BTOL ) THEN + TEMP = ABS ( T( J, J + 1 ) ) + IF ( J .GT. ILO ) + $ TEMP = TEMP + ABS ( T( J - 1, J ) ) + IF( ABS( T( J, J ) ).LT.MAX( SAFMIN,ULP*TEMP ) ) THEN T( J, J ) = ZERO * * Test 1a: Check for 2 consecutive small subdiagonals in A diff --git a/SRC/zhgeqz.f b/SRC/zhgeqz.f index 9602447272..4b9c7a7611 100644 --- a/SRC/zhgeqz.f +++ b/SRC/zhgeqz.f @@ -519,13 +519,17 @@ SUBROUTINE ZHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT, IF( ILAST.EQ.ILO ) THEN GO TO 60 ELSE - IF( ABS1( H( ILAST, ILAST-1 ) ).LE.ATOL ) THEN + IF( ABS1( H( ILAST, ILAST-1 ) ).LE.MAX( SAFMIN, ULP*( + $ ABS1( H( ILAST, ILAST ) ) + ABS1( H( ILAST-1, ILAST-1 ) + $ ) ) ) ) THEN H( ILAST, ILAST-1 ) = CZERO GO TO 60 END IF END IF * - IF( ABS( T( ILAST, ILAST ) ).LE.BTOL ) THEN + IF( ABS( T( ILAST, ILAST ) ).LE.MAX( SAFMIN, ULP*( + $ ABS( T( ILAST - 1, ILAST ) ) + ABS( T( ILAST-1, ILAST-1 ) + $ ) ) ) ) THEN T( ILAST, ILAST ) = CZERO GO TO 50 END IF @@ -539,7 +543,9 @@ SUBROUTINE ZHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT, IF( J.EQ.ILO ) THEN ILAZRO = .TRUE. ELSE - IF( ABS1( H( J, J-1 ) ).LE.ATOL ) THEN + IF( ABS1( H( J, J-1 ) ).LE.MAX( SAFMIN, ULP*( + $ ABS1( H( J, J ) ) + ABS1( H( J-1, J-1 ) ) + $ ) ) ) THEN H( J, J-1 ) = CZERO ILAZRO = .TRUE. ELSE @@ -549,7 +555,10 @@ SUBROUTINE ZHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT, * * Test 2: for T(j,j)=0 * - IF( ABS( T( J, J ) ).LT.BTOL ) THEN + TEMP = ABS ( T( J, J + 1 ) ) + IF ( J .GT. ILO ) + $ TEMP = TEMP + ABS ( T( J - 1, J ) ) + IF( ABS( T( J, J ) ).LT.MAX( SAFMIN,ULP*TEMP ) ) THEN T( J, J ) = CZERO * * Test 1a: Check for 2 consecutive small subdiagonals in A