Go to the documentation of this file.00001 SUBROUTINE DLAGTS( JOB, N, A, B, C, D, IN, Y, TOL, INFO )
00002
00003
00004
00005
00006
00007
00008
00009 INTEGER INFO, JOB, N
00010 DOUBLE PRECISION TOL
00011
00012
00013 INTEGER IN( * )
00014 DOUBLE PRECISION A( * ), B( * ), C( * ), D( * ), Y( * )
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
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 DOUBLE PRECISION ONE, ZERO
00104 PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 )
00105
00106
00107 INTEGER K
00108 DOUBLE PRECISION ABSAK, AK, BIGNUM, EPS, PERT, SFMIN, TEMP
00109
00110
00111 INTRINSIC ABS, MAX, SIGN
00112
00113
00114 DOUBLE PRECISION DLAMCH
00115 EXTERNAL DLAMCH
00116
00117
00118 EXTERNAL XERBLA
00119
00120
00121
00122 INFO = 0
00123 IF( ( ABS( JOB ).GT.2 ) .OR. ( JOB.EQ.0 ) ) THEN
00124 INFO = -1
00125 ELSE IF( N.LT.0 ) THEN
00126 INFO = -2
00127 END IF
00128 IF( INFO.NE.0 ) THEN
00129 CALL XERBLA( 'DLAGTS', -INFO )
00130 RETURN
00131 END IF
00132
00133 IF( N.EQ.0 )
00134 $ RETURN
00135
00136 EPS = DLAMCH( 'Epsilon' )
00137 SFMIN = DLAMCH( 'Safe minimum' )
00138 BIGNUM = ONE / SFMIN
00139
00140 IF( JOB.LT.0 ) THEN
00141 IF( TOL.LE.ZERO ) THEN
00142 TOL = ABS( A( 1 ) )
00143 IF( N.GT.1 )
00144 $ TOL = MAX( TOL, ABS( A( 2 ) ), ABS( B( 1 ) ) )
00145 DO 10 K = 3, N
00146 TOL = MAX( TOL, ABS( A( K ) ), ABS( B( K-1 ) ),
00147 $ ABS( D( K-2 ) ) )
00148 10 CONTINUE
00149 TOL = TOL*EPS
00150 IF( TOL.EQ.ZERO )
00151 $ TOL = EPS
00152 END IF
00153 END IF
00154
00155 IF( ABS( JOB ).EQ.1 ) THEN
00156 DO 20 K = 2, N
00157 IF( IN( K-1 ).EQ.0 ) THEN
00158 Y( K ) = Y( K ) - C( K-1 )*Y( K-1 )
00159 ELSE
00160 TEMP = Y( K-1 )
00161 Y( K-1 ) = Y( K )
00162 Y( K ) = TEMP - C( K-1 )*Y( K )
00163 END IF
00164 20 CONTINUE
00165 IF( JOB.EQ.1 ) THEN
00166 DO 30 K = N, 1, -1
00167 IF( K.LE.N-2 ) THEN
00168 TEMP = Y( K ) - B( K )*Y( K+1 ) - D( K )*Y( K+2 )
00169 ELSE IF( K.EQ.N-1 ) THEN
00170 TEMP = Y( K ) - B( K )*Y( K+1 )
00171 ELSE
00172 TEMP = Y( K )
00173 END IF
00174 AK = A( K )
00175 ABSAK = ABS( AK )
00176 IF( ABSAK.LT.ONE ) THEN
00177 IF( ABSAK.LT.SFMIN ) THEN
00178 IF( ABSAK.EQ.ZERO .OR. ABS( TEMP )*SFMIN.GT.ABSAK )
00179 $ THEN
00180 INFO = K
00181 RETURN
00182 ELSE
00183 TEMP = TEMP*BIGNUM
00184 AK = AK*BIGNUM
00185 END IF
00186 ELSE IF( ABS( TEMP ).GT.ABSAK*BIGNUM ) THEN
00187 INFO = K
00188 RETURN
00189 END IF
00190 END IF
00191 Y( K ) = TEMP / AK
00192 30 CONTINUE
00193 ELSE
00194 DO 50 K = N, 1, -1
00195 IF( K.LE.N-2 ) THEN
00196 TEMP = Y( K ) - B( K )*Y( K+1 ) - D( K )*Y( K+2 )
00197 ELSE IF( K.EQ.N-1 ) THEN
00198 TEMP = Y( K ) - B( K )*Y( K+1 )
00199 ELSE
00200 TEMP = Y( K )
00201 END IF
00202 AK = A( K )
00203 PERT = SIGN( TOL, AK )
00204 40 CONTINUE
00205 ABSAK = ABS( AK )
00206 IF( ABSAK.LT.ONE ) THEN
00207 IF( ABSAK.LT.SFMIN ) THEN
00208 IF( ABSAK.EQ.ZERO .OR. ABS( TEMP )*SFMIN.GT.ABSAK )
00209 $ THEN
00210 AK = AK + PERT
00211 PERT = 2*PERT
00212 GO TO 40
00213 ELSE
00214 TEMP = TEMP*BIGNUM
00215 AK = AK*BIGNUM
00216 END IF
00217 ELSE IF( ABS( TEMP ).GT.ABSAK*BIGNUM ) THEN
00218 AK = AK + PERT
00219 PERT = 2*PERT
00220 GO TO 40
00221 END IF
00222 END IF
00223 Y( K ) = TEMP / AK
00224 50 CONTINUE
00225 END IF
00226 ELSE
00227
00228
00229
00230 IF( JOB.EQ.2 ) THEN
00231 DO 60 K = 1, N
00232 IF( K.GE.3 ) THEN
00233 TEMP = Y( K ) - B( K-1 )*Y( K-1 ) - D( K-2 )*Y( K-2 )
00234 ELSE IF( K.EQ.2 ) THEN
00235 TEMP = Y( K ) - B( K-1 )*Y( K-1 )
00236 ELSE
00237 TEMP = Y( K )
00238 END IF
00239 AK = A( K )
00240 ABSAK = ABS( AK )
00241 IF( ABSAK.LT.ONE ) THEN
00242 IF( ABSAK.LT.SFMIN ) THEN
00243 IF( ABSAK.EQ.ZERO .OR. ABS( TEMP )*SFMIN.GT.ABSAK )
00244 $ THEN
00245 INFO = K
00246 RETURN
00247 ELSE
00248 TEMP = TEMP*BIGNUM
00249 AK = AK*BIGNUM
00250 END IF
00251 ELSE IF( ABS( TEMP ).GT.ABSAK*BIGNUM ) THEN
00252 INFO = K
00253 RETURN
00254 END IF
00255 END IF
00256 Y( K ) = TEMP / AK
00257 60 CONTINUE
00258 ELSE
00259 DO 80 K = 1, N
00260 IF( K.GE.3 ) THEN
00261 TEMP = Y( K ) - B( K-1 )*Y( K-1 ) - D( K-2 )*Y( K-2 )
00262 ELSE IF( K.EQ.2 ) THEN
00263 TEMP = Y( K ) - B( K-1 )*Y( K-1 )
00264 ELSE
00265 TEMP = Y( K )
00266 END IF
00267 AK = A( K )
00268 PERT = SIGN( TOL, AK )
00269 70 CONTINUE
00270 ABSAK = ABS( AK )
00271 IF( ABSAK.LT.ONE ) THEN
00272 IF( ABSAK.LT.SFMIN ) THEN
00273 IF( ABSAK.EQ.ZERO .OR. ABS( TEMP )*SFMIN.GT.ABSAK )
00274 $ THEN
00275 AK = AK + PERT
00276 PERT = 2*PERT
00277 GO TO 70
00278 ELSE
00279 TEMP = TEMP*BIGNUM
00280 AK = AK*BIGNUM
00281 END IF
00282 ELSE IF( ABS( TEMP ).GT.ABSAK*BIGNUM ) THEN
00283 AK = AK + PERT
00284 PERT = 2*PERT
00285 GO TO 70
00286 END IF
00287 END IF
00288 Y( K ) = TEMP / AK
00289 80 CONTINUE
00290 END IF
00291
00292 DO 90 K = N, 2, -1
00293 IF( IN( K-1 ).EQ.0 ) THEN
00294 Y( K-1 ) = Y( K-1 ) - C( K-1 )*Y( K )
00295 ELSE
00296 TEMP = Y( K-1 )
00297 Y( K-1 ) = Y( K )
00298 Y( K ) = TEMP - C( K-1 )*Y( K )
00299 END IF
00300 90 CONTINUE
00301 END IF
00302
00303
00304
00305 END