00001 SUBROUTINE DGET39( RMAX, LMAX, NINFO, KNT )
00002
00003
00004
00005
00006
00007
00008 INTEGER KNT, LMAX, NINFO
00009 DOUBLE PRECISION RMAX
00010
00011
00012
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
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 INTEGER LDT, LDT2
00073 PARAMETER ( LDT = 10, LDT2 = 2*LDT )
00074 DOUBLE PRECISION ZERO, ONE
00075 PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 )
00076
00077
00078 INTEGER I, INFO, IVM1, IVM2, IVM3, IVM4, IVM5, J, K, N,
00079 $ NDIM
00080 DOUBLE PRECISION BIGNUM, DOMIN, DUMM, EPS, NORM, NORMTB, RESID,
00081 $ SCALE, SMLNUM, W, XNORM
00082
00083
00084 INTEGER IDAMAX
00085 DOUBLE PRECISION DASUM, DDOT, DLAMCH, DLANGE
00086 EXTERNAL IDAMAX, DASUM, DDOT, DLAMCH, DLANGE
00087
00088
00089 EXTERNAL DCOPY, DGEMV, DLABAD, DLAQTR
00090
00091
00092 INTRINSIC ABS, COS, DBLE, MAX, SIN, SQRT
00093
00094
00095 INTEGER IDIM( 6 ), IVAL( 5, 5, 6 )
00096 DOUBLE PRECISION B( LDT ), D( LDT2 ), DUM( 1 ), T( LDT, LDT ),
00097 $ VM1( 5 ), VM2( 5 ), VM3( 5 ), VM4( 5 ),
00098 $ VM5( 3 ), WORK( LDT ), X( LDT2 ), Y( LDT2 )
00099
00100
00101 DATA IDIM / 4, 5*5 /
00102 DATA IVAL / 3, 4*0, 1, 1, -1, 0, 0, 3, 2, 1, 0, 0,
00103 $ 4, 3, 2, 2, 0, 5*0, 1, 4*0, 2, 2, 3*0, 3, 3, 4,
00104 $ 0, 0, 4, 2, 2, 3, 0, 4*1, 5, 1, 4*0, 2, 4, -2,
00105 $ 0, 0, 3, 3, 4, 0, 0, 4, 2, 2, 3, 0, 5*1, 1,
00106 $ 4*0, 2, 1, -1, 0, 0, 9, 8, 1, 0, 0, 4, 9, 1, 2,
00107 $ -1, 5*2, 9, 4*0, 6, 4, 0, 0, 0, 3, 2, 1, 1, 0,
00108 $ 5, 1, -1, 1, 0, 5*2, 4, 4*0, 2, 2, 0, 0, 0, 1,
00109 $ 4, 4, 0, 0, 2, 4, 2, 2, -1, 5*2 /
00110
00111
00112
00113
00114
00115 EPS = DLAMCH( 'P' )
00116 SMLNUM = DLAMCH( 'S' )
00117 BIGNUM = ONE / SMLNUM
00118 CALL DLABAD( SMLNUM, BIGNUM )
00119
00120
00121
00122 VM1( 1 ) = ONE
00123 VM1( 2 ) = SQRT( SMLNUM )
00124 VM1( 3 ) = SQRT( VM1( 2 ) )
00125 VM1( 4 ) = SQRT( BIGNUM )
00126 VM1( 5 ) = SQRT( VM1( 4 ) )
00127
00128 VM2( 1 ) = ONE
00129 VM2( 2 ) = SQRT( SMLNUM )
00130 VM2( 3 ) = SQRT( VM2( 2 ) )
00131 VM2( 4 ) = SQRT( BIGNUM )
00132 VM2( 5 ) = SQRT( VM2( 4 ) )
00133
00134 VM3( 1 ) = ONE
00135 VM3( 2 ) = SQRT( SMLNUM )
00136 VM3( 3 ) = SQRT( VM3( 2 ) )
00137 VM3( 4 ) = SQRT( BIGNUM )
00138 VM3( 5 ) = SQRT( VM3( 4 ) )
00139
00140 VM4( 1 ) = ONE
00141 VM4( 2 ) = SQRT( SMLNUM )
00142 VM4( 3 ) = SQRT( VM4( 2 ) )
00143 VM4( 4 ) = SQRT( BIGNUM )
00144 VM4( 5 ) = SQRT( VM4( 4 ) )
00145
00146 VM5( 1 ) = ONE
00147 VM5( 2 ) = EPS
00148 VM5( 3 ) = SQRT( SMLNUM )
00149
00150
00151
00152 KNT = 0
00153 RMAX = ZERO
00154 NINFO = 0
00155 SMLNUM = SMLNUM / EPS
00156
00157
00158
00159 DO 140 IVM5 = 1, 3
00160 DO 130 IVM4 = 1, 5
00161 DO 120 IVM3 = 1, 5
00162 DO 110 IVM2 = 1, 5
00163 DO 100 IVM1 = 1, 5
00164 DO 90 NDIM = 1, 6
00165
00166 N = IDIM( NDIM )
00167 DO 20 I = 1, N
00168 DO 10 J = 1, N
00169 T( I, J ) = DBLE( IVAL( I, J, NDIM ) )*
00170 $ VM1( IVM1 )
00171 IF( I.GE.J )
00172 $ T( I, J ) = T( I, J )*VM5( IVM5 )
00173 10 CONTINUE
00174 20 CONTINUE
00175
00176 W = ONE*VM2( IVM2 )
00177
00178 DO 30 I = 1, N
00179 B( I ) = COS( DBLE( I ) )*VM3( IVM3 )
00180 30 CONTINUE
00181
00182 DO 40 I = 1, 2*N
00183 D( I ) = SIN( DBLE( I ) )*VM4( IVM4 )
00184 40 CONTINUE
00185
00186 NORM = DLANGE( '1', N, N, T, LDT, WORK )
00187 K = IDAMAX( N, B, 1 )
00188 NORMTB = NORM + ABS( B( K ) ) + ABS( W )
00189
00190 CALL DCOPY( N, D, 1, X, 1 )
00191 KNT = KNT + 1
00192 CALL DLAQTR( .FALSE., .TRUE., N, T, LDT, DUM,
00193 $ DUMM, SCALE, X, WORK, INFO )
00194 IF( INFO.NE.0 )
00195 $ NINFO = NINFO + 1
00196
00197
00198
00199
00200 CALL DCOPY( N, D, 1, Y, 1 )
00201 CALL DGEMV( 'No transpose', N, N, ONE, T, LDT,
00202 $ X, 1, -SCALE, Y, 1 )
00203 XNORM = DASUM( N, X, 1 )
00204 RESID = DASUM( N, Y, 1 )
00205 DOMIN = MAX( SMLNUM, ( SMLNUM / EPS )*NORM,
00206 $ ( NORM*EPS )*XNORM )
00207 RESID = RESID / DOMIN
00208 IF( RESID.GT.RMAX ) THEN
00209 RMAX = RESID
00210 LMAX = KNT
00211 END IF
00212
00213 CALL DCOPY( N, D, 1, X, 1 )
00214 KNT = KNT + 1
00215 CALL DLAQTR( .TRUE., .TRUE., N, T, LDT, DUM,
00216 $ DUMM, SCALE, X, WORK, INFO )
00217 IF( INFO.NE.0 )
00218 $ NINFO = NINFO + 1
00219
00220
00221
00222
00223 CALL DCOPY( N, D, 1, Y, 1 )
00224 CALL DGEMV( 'Transpose', N, N, ONE, T, LDT, X,
00225 $ 1, -SCALE, Y, 1 )
00226 XNORM = DASUM( N, X, 1 )
00227 RESID = DASUM( N, Y, 1 )
00228 DOMIN = MAX( SMLNUM, ( SMLNUM / EPS )*NORM,
00229 $ ( NORM*EPS )*XNORM )
00230 RESID = RESID / DOMIN
00231 IF( RESID.GT.RMAX ) THEN
00232 RMAX = RESID
00233 LMAX = KNT
00234 END IF
00235
00236 CALL DCOPY( 2*N, D, 1, X, 1 )
00237 KNT = KNT + 1
00238 CALL DLAQTR( .FALSE., .FALSE., N, T, LDT, B, W,
00239 $ SCALE, X, WORK, INFO )
00240 IF( INFO.NE.0 )
00241 $ NINFO = NINFO + 1
00242
00243
00244
00245
00246
00247
00248 CALL DCOPY( 2*N, D, 1, Y, 1 )
00249 Y( 1 ) = DDOT( N, B, 1, X( 1+N ), 1 ) +
00250 $ SCALE*Y( 1 )
00251 DO 50 I = 2, N
00252 Y( I ) = W*X( I+N ) + SCALE*Y( I )
00253 50 CONTINUE
00254 CALL DGEMV( 'No transpose', N, N, ONE, T, LDT,
00255 $ X, 1, -ONE, Y, 1 )
00256
00257 Y( 1+N ) = DDOT( N, B, 1, X, 1 ) -
00258 $ SCALE*Y( 1+N )
00259 DO 60 I = 2, N
00260 Y( I+N ) = W*X( I ) - SCALE*Y( I+N )
00261 60 CONTINUE
00262 CALL DGEMV( 'No transpose', N, N, ONE, T, LDT,
00263 $ X( 1+N ), 1, ONE, Y( 1+N ), 1 )
00264
00265 RESID = DASUM( 2*N, Y, 1 )
00266 DOMIN = MAX( SMLNUM, ( SMLNUM / EPS )*NORMTB,
00267 $ EPS*( NORMTB*DASUM( 2*N, X, 1 ) ) )
00268 RESID = RESID / DOMIN
00269 IF( RESID.GT.RMAX ) THEN
00270 RMAX = RESID
00271 LMAX = KNT
00272 END IF
00273
00274 CALL DCOPY( 2*N, D, 1, X, 1 )
00275 KNT = KNT + 1
00276 CALL DLAQTR( .TRUE., .FALSE., N, T, LDT, B, W,
00277 $ SCALE, X, WORK, INFO )
00278 IF( INFO.NE.0 )
00279 $ NINFO = NINFO + 1
00280
00281
00282
00283
00284
00285 CALL DCOPY( 2*N, D, 1, Y, 1 )
00286 Y( 1 ) = B( 1 )*X( 1+N ) - SCALE*Y( 1 )
00287 DO 70 I = 2, N
00288 Y( I ) = B( I )*X( 1+N ) + W*X( I+N ) -
00289 $ SCALE*Y( I )
00290 70 CONTINUE
00291 CALL DGEMV( 'Transpose', N, N, ONE, T, LDT, X,
00292 $ 1, ONE, Y, 1 )
00293
00294 Y( 1+N ) = B( 1 )*X( 1 ) + SCALE*Y( 1+N )
00295 DO 80 I = 2, N
00296 Y( I+N ) = B( I )*X( 1 ) + W*X( I ) +
00297 $ SCALE*Y( I+N )
00298 80 CONTINUE
00299 CALL DGEMV( 'Transpose', N, N, ONE, T, LDT,
00300 $ X( 1+N ), 1, -ONE, Y( 1+N ), 1 )
00301
00302 RESID = DASUM( 2*N, Y, 1 )
00303 DOMIN = MAX( SMLNUM, ( SMLNUM / EPS )*NORMTB,
00304 $ EPS*( NORMTB*DASUM( 2*N, X, 1 ) ) )
00305 RESID = RESID / DOMIN
00306 IF( RESID.GT.RMAX ) THEN
00307 RMAX = RESID
00308 LMAX = KNT
00309 END IF
00310
00311 90 CONTINUE
00312 100 CONTINUE
00313 110 CONTINUE
00314 120 CONTINUE
00315 130 CONTINUE
00316 140 CONTINUE
00317
00318 RETURN
00319
00320
00321
00322 END