Go to the documentation of this file.00001 SUBROUTINE DSTECT( N, A, B, SHIFT, NUM )
00002
00003
00004
00005
00006
00007
00008 INTEGER N, NUM
00009 DOUBLE PRECISION SHIFT
00010
00011
00012 DOUBLE PRECISION A( * ), B( * )
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 DOUBLE PRECISION ZERO, ONE, THREE
00049 PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0, THREE = 3.0D0 )
00050
00051
00052 INTEGER I
00053 DOUBLE PRECISION M1, M2, MX, OVFL, SOV, SSHIFT, SSUN, SUN, TMP,
00054 $ TOM, U, UNFL
00055
00056
00057 DOUBLE PRECISION DLAMCH
00058 EXTERNAL DLAMCH
00059
00060
00061 INTRINSIC ABS, MAX, SQRT
00062
00063
00064
00065
00066
00067 UNFL = DLAMCH( 'Safe minimum' )
00068 OVFL = DLAMCH( 'Overflow' )
00069
00070
00071
00072 MX = ABS( A( 1 ) )
00073 DO 10 I = 1, N - 1
00074 MX = MAX( MX, ABS( A( I+1 ) ), ABS( B( I ) ) )
00075 10 CONTINUE
00076
00077
00078
00079 IF( SHIFT.GE.THREE*MX ) THEN
00080 NUM = N
00081 RETURN
00082 END IF
00083 IF( SHIFT.LT.-THREE*MX ) THEN
00084 NUM = 0
00085 RETURN
00086 END IF
00087
00088
00089
00090
00091 SUN = SQRT( UNFL )
00092 SSUN = SQRT( SUN )
00093 SOV = SQRT( OVFL )
00094 TOM = SSUN*SOV
00095 IF( MX.LE.ONE ) THEN
00096 M1 = ONE / MX
00097 M2 = TOM
00098 ELSE
00099 M1 = ONE
00100 M2 = TOM / MX
00101 END IF
00102
00103
00104
00105 NUM = 0
00106 SSHIFT = ( SHIFT*M1 )*M2
00107 U = ( A( 1 )*M1 )*M2 - SSHIFT
00108 IF( U.LE.SUN ) THEN
00109 IF( U.LE.ZERO ) THEN
00110 NUM = NUM + 1
00111 IF( U.GT.-SUN )
00112 $ U = -SUN
00113 ELSE
00114 U = SUN
00115 END IF
00116 END IF
00117 DO 20 I = 2, N
00118 TMP = ( B( I-1 )*M1 )*M2
00119 U = ( ( A( I )*M1 )*M2-TMP*( TMP / U ) ) - SSHIFT
00120 IF( U.LE.SUN ) THEN
00121 IF( U.LE.ZERO ) THEN
00122 NUM = NUM + 1
00123 IF( U.GT.-SUN )
00124 $ U = -SUN
00125 ELSE
00126 U = SUN
00127 END IF
00128 END IF
00129 20 CONTINUE
00130 RETURN
00131
00132
00133
00134 END