Go to the documentation of this file.00001 SUBROUTINE DSVDCT( N, S, E, SHIFT, NUM )
00002
00003
00004
00005
00006
00007
00008 INTEGER N, NUM
00009 DOUBLE PRECISION SHIFT
00010
00011
00012 DOUBLE PRECISION E( * ), S( * )
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
00049
00050
00051
00052
00053 DOUBLE PRECISION ONE
00054 PARAMETER ( ONE = 1.0D0 )
00055 DOUBLE PRECISION ZERO
00056 PARAMETER ( ZERO = 0.0D0 )
00057
00058
00059 INTEGER I
00060 DOUBLE PRECISION M1, M2, MX, OVFL, SOV, SSHIFT, SSUN, SUN, TMP,
00061 $ TOM, U, UNFL
00062
00063
00064 DOUBLE PRECISION DLAMCH
00065 EXTERNAL DLAMCH
00066
00067
00068 INTRINSIC ABS, MAX, SQRT
00069
00070
00071
00072
00073
00074 UNFL = 2*DLAMCH( 'Safe minimum' )
00075 OVFL = ONE / UNFL
00076
00077
00078
00079 MX = ABS( S( 1 ) )
00080 DO 10 I = 1, N - 1
00081 MX = MAX( MX, ABS( S( I+1 ) ), ABS( E( I ) ) )
00082 10 CONTINUE
00083
00084 IF( MX.EQ.ZERO ) THEN
00085 IF( SHIFT.LT.ZERO ) THEN
00086 NUM = 0
00087 ELSE
00088 NUM = 2*N
00089 END IF
00090 RETURN
00091 END IF
00092
00093
00094
00095 SUN = SQRT( UNFL )
00096 SSUN = SQRT( SUN )
00097 SOV = SQRT( OVFL )
00098 TOM = SSUN*SOV
00099 IF( MX.LE.ONE ) THEN
00100 M1 = ONE / MX
00101 M2 = TOM
00102 ELSE
00103 M1 = ONE
00104 M2 = TOM / MX
00105 END IF
00106
00107
00108
00109 U = ONE
00110 NUM = 0
00111 SSHIFT = ( SHIFT*M1 )*M2
00112 U = -SSHIFT
00113 IF( U.LE.SUN ) THEN
00114 IF( U.LE.ZERO ) THEN
00115 NUM = NUM + 1
00116 IF( U.GT.-SUN )
00117 $ U = -SUN
00118 ELSE
00119 U = SUN
00120 END IF
00121 END IF
00122 TMP = ( S( 1 )*M1 )*M2
00123 U = -TMP*( TMP / U ) - SSHIFT
00124 IF( U.LE.SUN ) THEN
00125 IF( U.LE.ZERO ) THEN
00126 NUM = NUM + 1
00127 IF( U.GT.-SUN )
00128 $ U = -SUN
00129 ELSE
00130 U = SUN
00131 END IF
00132 END IF
00133 DO 20 I = 1, N - 1
00134 TMP = ( E( I )*M1 )*M2
00135 U = -TMP*( TMP / U ) - SSHIFT
00136 IF( U.LE.SUN ) THEN
00137 IF( U.LE.ZERO ) THEN
00138 NUM = NUM + 1
00139 IF( U.GT.-SUN )
00140 $ U = -SUN
00141 ELSE
00142 U = SUN
00143 END IF
00144 END IF
00145 TMP = ( S( I+1 )*M1 )*M2
00146 U = -TMP*( TMP / U ) - SSHIFT
00147 IF( U.LE.SUN ) THEN
00148 IF( U.LE.ZERO ) THEN
00149 NUM = NUM + 1
00150 IF( U.GT.-SUN )
00151 $ U = -SUN
00152 ELSE
00153 U = SUN
00154 END IF
00155 END IF
00156 20 CONTINUE
00157 RETURN
00158
00159
00160
00161 END