00001 SUBROUTINE SGET31( RMAX, LMAX, NINFO, KNT )
00002
00003
00004
00005
00006
00007
00008 INTEGER KNT, LMAX
00009 REAL RMAX
00010
00011
00012 INTEGER NINFO( 2 )
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 REAL ZERO, HALF, ONE
00061 PARAMETER ( ZERO = 0.0E0, HALF = 0.5E0, ONE = 1.0E0 )
00062 REAL TWO, THREE, FOUR
00063 PARAMETER ( TWO = 2.0E0, THREE = 3.0E0, FOUR = 4.0E0 )
00064 REAL SEVEN, TEN
00065 PARAMETER ( SEVEN = 7.0E0, TEN = 10.0E0 )
00066 REAL TWNONE
00067 PARAMETER ( TWNONE = 21.0E0 )
00068
00069
00070 INTEGER IA, IB, ICA, ID1, ID2, INFO, ISMIN, ITRANS,
00071 $ IWI, IWR, NA, NW
00072 REAL BIGNUM, CA, D1, D2, DEN, EPS, RES, SCALE, SMIN,
00073 $ SMLNUM, TMP, UNFL, WI, WR, XNORM
00074
00075
00076 LOGICAL LTRANS( 0: 1 )
00077 REAL A( 2, 2 ), B( 2, 2 ), VAB( 3 ), VCA( 5 ),
00078 $ VDD( 4 ), VSMIN( 4 ), VWI( 4 ), VWR( 4 ),
00079 $ X( 2, 2 )
00080
00081
00082 REAL SLAMCH
00083 EXTERNAL SLAMCH
00084
00085
00086 EXTERNAL SLABAD, SLALN2
00087
00088
00089 INTRINSIC ABS, MAX, SQRT
00090
00091
00092 DATA LTRANS / .FALSE., .TRUE. /
00093
00094
00095
00096
00097
00098 EPS = SLAMCH( 'P' )
00099 UNFL = SLAMCH( 'U' )
00100 SMLNUM = SLAMCH( 'S' ) / EPS
00101 BIGNUM = ONE / SMLNUM
00102 CALL SLABAD( SMLNUM, BIGNUM )
00103
00104
00105
00106 VSMIN( 1 ) = SMLNUM
00107 VSMIN( 2 ) = EPS
00108 VSMIN( 3 ) = ONE / ( TEN*TEN )
00109 VSMIN( 4 ) = ONE / EPS
00110 VAB( 1 ) = SQRT( SMLNUM )
00111 VAB( 2 ) = ONE
00112 VAB( 3 ) = SQRT( BIGNUM )
00113 VWR( 1 ) = ZERO
00114 VWR( 2 ) = HALF
00115 VWR( 3 ) = TWO
00116 VWR( 4 ) = ONE
00117 VWI( 1 ) = SMLNUM
00118 VWI( 2 ) = EPS
00119 VWI( 3 ) = ONE
00120 VWI( 4 ) = TWO
00121 VDD( 1 ) = SQRT( SMLNUM )
00122 VDD( 2 ) = ONE
00123 VDD( 3 ) = TWO
00124 VDD( 4 ) = SQRT( BIGNUM )
00125 VCA( 1 ) = ZERO
00126 VCA( 2 ) = SQRT( SMLNUM )
00127 VCA( 3 ) = EPS
00128 VCA( 4 ) = HALF
00129 VCA( 5 ) = ONE
00130
00131 KNT = 0
00132 NINFO( 1 ) = 0
00133 NINFO( 2 ) = 0
00134 LMAX = 0
00135 RMAX = ZERO
00136
00137
00138
00139 DO 190 ID1 = 1, 4
00140 D1 = VDD( ID1 )
00141 DO 180 ID2 = 1, 4
00142 D2 = VDD( ID2 )
00143 DO 170 ICA = 1, 5
00144 CA = VCA( ICA )
00145 DO 160 ITRANS = 0, 1
00146 DO 150 ISMIN = 1, 4
00147 SMIN = VSMIN( ISMIN )
00148
00149 NA = 1
00150 NW = 1
00151 DO 30 IA = 1, 3
00152 A( 1, 1 ) = VAB( IA )
00153 DO 20 IB = 1, 3
00154 B( 1, 1 ) = VAB( IB )
00155 DO 10 IWR = 1, 4
00156 IF( D1.EQ.ONE .AND. D2.EQ.ONE .AND. CA.EQ.
00157 $ ONE ) THEN
00158 WR = VWR( IWR )*A( 1, 1 )
00159 ELSE
00160 WR = VWR( IWR )
00161 END IF
00162 WI = ZERO
00163 CALL SLALN2( LTRANS( ITRANS ), NA, NW,
00164 $ SMIN, CA, A, 2, D1, D2, B, 2,
00165 $ WR, WI, X, 2, SCALE, XNORM,
00166 $ INFO )
00167 IF( INFO.LT.0 )
00168 $ NINFO( 1 ) = NINFO( 1 ) + 1
00169 IF( INFO.GT.0 )
00170 $ NINFO( 2 ) = NINFO( 2 ) + 1
00171 RES = ABS( ( CA*A( 1, 1 )-WR*D1 )*
00172 $ X( 1, 1 )-SCALE*B( 1, 1 ) )
00173 IF( INFO.EQ.0 ) THEN
00174 DEN = MAX( EPS*( ABS( ( CA*A( 1,
00175 $ 1 )-WR*D1 )*X( 1, 1 ) ) ),
00176 $ SMLNUM )
00177 ELSE
00178 DEN = MAX( SMIN*ABS( X( 1, 1 ) ),
00179 $ SMLNUM )
00180 END IF
00181 RES = RES / DEN
00182 IF( ABS( X( 1, 1 ) ).LT.UNFL .AND.
00183 $ ABS( B( 1, 1 ) ).LE.SMLNUM*
00184 $ ABS( CA*A( 1, 1 )-WR*D1 ) )RES = ZERO
00185 IF( SCALE.GT.ONE )
00186 $ RES = RES + ONE / EPS
00187 RES = RES + ABS( XNORM-ABS( X( 1, 1 ) ) )
00188 $ / MAX( SMLNUM, XNORM ) / EPS
00189 IF( INFO.NE.0 .AND. INFO.NE.1 )
00190 $ RES = RES + ONE / EPS
00191 KNT = KNT + 1
00192 IF( RES.GT.RMAX ) THEN
00193 LMAX = KNT
00194 RMAX = RES
00195 END IF
00196 10 CONTINUE
00197 20 CONTINUE
00198 30 CONTINUE
00199
00200 NA = 1
00201 NW = 2
00202 DO 70 IA = 1, 3
00203 A( 1, 1 ) = VAB( IA )
00204 DO 60 IB = 1, 3
00205 B( 1, 1 ) = VAB( IB )
00206 B( 1, 2 ) = -HALF*VAB( IB )
00207 DO 50 IWR = 1, 4
00208 IF( D1.EQ.ONE .AND. D2.EQ.ONE .AND. CA.EQ.
00209 $ ONE ) THEN
00210 WR = VWR( IWR )*A( 1, 1 )
00211 ELSE
00212 WR = VWR( IWR )
00213 END IF
00214 DO 40 IWI = 1, 4
00215 IF( D1.EQ.ONE .AND. D2.EQ.ONE .AND.
00216 $ CA.EQ.ONE ) THEN
00217 WI = VWI( IWI )*A( 1, 1 )
00218 ELSE
00219 WI = VWI( IWI )
00220 END IF
00221 CALL SLALN2( LTRANS( ITRANS ), NA, NW,
00222 $ SMIN, CA, A, 2, D1, D2, B,
00223 $ 2, WR, WI, X, 2, SCALE,
00224 $ XNORM, INFO )
00225 IF( INFO.LT.0 )
00226 $ NINFO( 1 ) = NINFO( 1 ) + 1
00227 IF( INFO.GT.0 )
00228 $ NINFO( 2 ) = NINFO( 2 ) + 1
00229 RES = ABS( ( CA*A( 1, 1 )-WR*D1 )*
00230 $ X( 1, 1 )+( WI*D1 )*X( 1, 2 )-
00231 $ SCALE*B( 1, 1 ) )
00232 RES = RES + ABS( ( -WI*D1 )*X( 1, 1 )+
00233 $ ( CA*A( 1, 1 )-WR*D1 )*X( 1, 2 )-
00234 $ SCALE*B( 1, 2 ) )
00235 IF( INFO.EQ.0 ) THEN
00236 DEN = MAX( EPS*( MAX( ABS( CA*A( 1,
00237 $ 1 )-WR*D1 ), ABS( D1*WI ) )*
00238 $ ( ABS( X( 1, 1 ) )+ABS( X( 1,
00239 $ 2 ) ) ) ), SMLNUM )
00240 ELSE
00241 DEN = MAX( SMIN*( ABS( X( 1,
00242 $ 1 ) )+ABS( X( 1, 2 ) ) ),
00243 $ SMLNUM )
00244 END IF
00245 RES = RES / DEN
00246 IF( ABS( X( 1, 1 ) ).LT.UNFL .AND.
00247 $ ABS( X( 1, 2 ) ).LT.UNFL .AND.
00248 $ ABS( B( 1, 1 ) ).LE.SMLNUM*
00249 $ ABS( CA*A( 1, 1 )-WR*D1 ) )
00250 $ RES = ZERO
00251 IF( SCALE.GT.ONE )
00252 $ RES = RES + ONE / EPS
00253 RES = RES + ABS( XNORM-
00254 $ ABS( X( 1, 1 ) )-
00255 $ ABS( X( 1, 2 ) ) ) /
00256 $ MAX( SMLNUM, XNORM ) / EPS
00257 IF( INFO.NE.0 .AND. INFO.NE.1 )
00258 $ RES = RES + ONE / EPS
00259 KNT = KNT + 1
00260 IF( RES.GT.RMAX ) THEN
00261 LMAX = KNT
00262 RMAX = RES
00263 END IF
00264 40 CONTINUE
00265 50 CONTINUE
00266 60 CONTINUE
00267 70 CONTINUE
00268
00269 NA = 2
00270 NW = 1
00271 DO 100 IA = 1, 3
00272 A( 1, 1 ) = VAB( IA )
00273 A( 1, 2 ) = -THREE*VAB( IA )
00274 A( 2, 1 ) = -SEVEN*VAB( IA )
00275 A( 2, 2 ) = TWNONE*VAB( IA )
00276 DO 90 IB = 1, 3
00277 B( 1, 1 ) = VAB( IB )
00278 B( 2, 1 ) = -TWO*VAB( IB )
00279 DO 80 IWR = 1, 4
00280 IF( D1.EQ.ONE .AND. D2.EQ.ONE .AND. CA.EQ.
00281 $ ONE ) THEN
00282 WR = VWR( IWR )*A( 1, 1 )
00283 ELSE
00284 WR = VWR( IWR )
00285 END IF
00286 WI = ZERO
00287 CALL SLALN2( LTRANS( ITRANS ), NA, NW,
00288 $ SMIN, CA, A, 2, D1, D2, B, 2,
00289 $ WR, WI, X, 2, SCALE, XNORM,
00290 $ INFO )
00291 IF( INFO.LT.0 )
00292 $ NINFO( 1 ) = NINFO( 1 ) + 1
00293 IF( INFO.GT.0 )
00294 $ NINFO( 2 ) = NINFO( 2 ) + 1
00295 IF( ITRANS.EQ.1 ) THEN
00296 TMP = A( 1, 2 )
00297 A( 1, 2 ) = A( 2, 1 )
00298 A( 2, 1 ) = TMP
00299 END IF
00300 RES = ABS( ( CA*A( 1, 1 )-WR*D1 )*
00301 $ X( 1, 1 )+( CA*A( 1, 2 ) )*
00302 $ X( 2, 1 )-SCALE*B( 1, 1 ) )
00303 RES = RES + ABS( ( CA*A( 2, 1 ) )*
00304 $ X( 1, 1 )+( CA*A( 2, 2 )-WR*D2 )*
00305 $ X( 2, 1 )-SCALE*B( 2, 1 ) )
00306 IF( INFO.EQ.0 ) THEN
00307 DEN = MAX( EPS*( MAX( ABS( CA*A( 1,
00308 $ 1 )-WR*D1 )+ABS( CA*A( 1, 2 ) ),
00309 $ ABS( CA*A( 2, 1 ) )+ABS( CA*A( 2,
00310 $ 2 )-WR*D2 ) )*MAX( ABS( X( 1,
00311 $ 1 ) ), ABS( X( 2, 1 ) ) ) ),
00312 $ SMLNUM )
00313 ELSE
00314 DEN = MAX( EPS*( MAX( SMIN / EPS,
00315 $ MAX( ABS( CA*A( 1,
00316 $ 1 )-WR*D1 )+ABS( CA*A( 1, 2 ) ),
00317 $ ABS( CA*A( 2, 1 ) )+ABS( CA*A( 2,
00318 $ 2 )-WR*D2 ) ) )*MAX( ABS( X( 1,
00319 $ 1 ) ), ABS( X( 2, 1 ) ) ) ),
00320 $ SMLNUM )
00321 END IF
00322 RES = RES / DEN
00323 IF( ABS( X( 1, 1 ) ).LT.UNFL .AND.
00324 $ ABS( X( 2, 1 ) ).LT.UNFL .AND.
00325 $ ABS( B( 1, 1 ) )+ABS( B( 2, 1 ) ).LE.
00326 $ SMLNUM*( ABS( CA*A( 1,
00327 $ 1 )-WR*D1 )+ABS( CA*A( 1,
00328 $ 2 ) )+ABS( CA*A( 2,
00329 $ 1 ) )+ABS( CA*A( 2, 2 )-WR*D2 ) ) )
00330 $ RES = ZERO
00331 IF( SCALE.GT.ONE )
00332 $ RES = RES + ONE / EPS
00333 RES = RES + ABS( XNORM-
00334 $ MAX( ABS( X( 1, 1 ) ), ABS( X( 2,
00335 $ 1 ) ) ) ) / MAX( SMLNUM, XNORM ) /
00336 $ EPS
00337 IF( INFO.NE.0 .AND. INFO.NE.1 )
00338 $ RES = RES + ONE / EPS
00339 KNT = KNT + 1
00340 IF( RES.GT.RMAX ) THEN
00341 LMAX = KNT
00342 RMAX = RES
00343 END IF
00344 80 CONTINUE
00345 90 CONTINUE
00346 100 CONTINUE
00347
00348 NA = 2
00349 NW = 2
00350 DO 140 IA = 1, 3
00351 A( 1, 1 ) = VAB( IA )*TWO
00352 A( 1, 2 ) = -THREE*VAB( IA )
00353 A( 2, 1 ) = -SEVEN*VAB( IA )
00354 A( 2, 2 ) = TWNONE*VAB( IA )
00355 DO 130 IB = 1, 3
00356 B( 1, 1 ) = VAB( IB )
00357 B( 2, 1 ) = -TWO*VAB( IB )
00358 B( 1, 2 ) = FOUR*VAB( IB )
00359 B( 2, 2 ) = -SEVEN*VAB( IB )
00360 DO 120 IWR = 1, 4
00361 IF( D1.EQ.ONE .AND. D2.EQ.ONE .AND. CA.EQ.
00362 $ ONE ) THEN
00363 WR = VWR( IWR )*A( 1, 1 )
00364 ELSE
00365 WR = VWR( IWR )
00366 END IF
00367 DO 110 IWI = 1, 4
00368 IF( D1.EQ.ONE .AND. D2.EQ.ONE .AND.
00369 $ CA.EQ.ONE ) THEN
00370 WI = VWI( IWI )*A( 1, 1 )
00371 ELSE
00372 WI = VWI( IWI )
00373 END IF
00374 CALL SLALN2( LTRANS( ITRANS ), NA, NW,
00375 $ SMIN, CA, A, 2, D1, D2, B,
00376 $ 2, WR, WI, X, 2, SCALE,
00377 $ XNORM, INFO )
00378 IF( INFO.LT.0 )
00379 $ NINFO( 1 ) = NINFO( 1 ) + 1
00380 IF( INFO.GT.0 )
00381 $ NINFO( 2 ) = NINFO( 2 ) + 1
00382 IF( ITRANS.EQ.1 ) THEN
00383 TMP = A( 1, 2 )
00384 A( 1, 2 ) = A( 2, 1 )
00385 A( 2, 1 ) = TMP
00386 END IF
00387 RES = ABS( ( CA*A( 1, 1 )-WR*D1 )*
00388 $ X( 1, 1 )+( CA*A( 1, 2 ) )*
00389 $ X( 2, 1 )+( WI*D1 )*X( 1, 2 )-
00390 $ SCALE*B( 1, 1 ) )
00391 RES = RES + ABS( ( CA*A( 1,
00392 $ 1 )-WR*D1 )*X( 1, 2 )+
00393 $ ( CA*A( 1, 2 ) )*X( 2, 2 )-
00394 $ ( WI*D1 )*X( 1, 1 )-SCALE*
00395 $ B( 1, 2 ) )
00396 RES = RES + ABS( ( CA*A( 2, 1 ) )*
00397 $ X( 1, 1 )+( CA*A( 2, 2 )-WR*D2 )*
00398 $ X( 2, 1 )+( WI*D2 )*X( 2, 2 )-
00399 $ SCALE*B( 2, 1 ) )
00400 RES = RES + ABS( ( CA*A( 2, 1 ) )*
00401 $ X( 1, 2 )+( CA*A( 2, 2 )-WR*D2 )*
00402 $ X( 2, 2 )-( WI*D2 )*X( 2, 1 )-
00403 $ SCALE*B( 2, 2 ) )
00404 IF( INFO.EQ.0 ) THEN
00405 DEN = MAX( EPS*( MAX( ABS( CA*A( 1,
00406 $ 1 )-WR*D1 )+ABS( CA*A( 1,
00407 $ 2 ) )+ABS( WI*D1 ),
00408 $ ABS( CA*A( 2,
00409 $ 1 ) )+ABS( CA*A( 2,
00410 $ 2 )-WR*D2 )+ABS( WI*D2 ) )*
00411 $ MAX( ABS( X( 1,
00412 $ 1 ) )+ABS( X( 2, 1 ) ),
00413 $ ABS( X( 1, 2 ) )+ABS( X( 2,
00414 $ 2 ) ) ) ), SMLNUM )
00415 ELSE
00416 DEN = MAX( EPS*( MAX( SMIN / EPS,
00417 $ MAX( ABS( CA*A( 1,
00418 $ 1 )-WR*D1 )+ABS( CA*A( 1,
00419 $ 2 ) )+ABS( WI*D1 ),
00420 $ ABS( CA*A( 2,
00421 $ 1 ) )+ABS( CA*A( 2,
00422 $ 2 )-WR*D2 )+ABS( WI*D2 ) ) )*
00423 $ MAX( ABS( X( 1,
00424 $ 1 ) )+ABS( X( 2, 1 ) ),
00425 $ ABS( X( 1, 2 ) )+ABS( X( 2,
00426 $ 2 ) ) ) ), SMLNUM )
00427 END IF
00428 RES = RES / DEN
00429 IF( ABS( X( 1, 1 ) ).LT.UNFL .AND.
00430 $ ABS( X( 2, 1 ) ).LT.UNFL .AND.
00431 $ ABS( X( 1, 2 ) ).LT.UNFL .AND.
00432 $ ABS( X( 2, 2 ) ).LT.UNFL .AND.
00433 $ ABS( B( 1, 1 ) )+
00434 $ ABS( B( 2, 1 ) ).LE.SMLNUM*
00435 $ ( ABS( CA*A( 1, 1 )-WR*D1 )+
00436 $ ABS( CA*A( 1, 2 ) )+ABS( CA*A( 2,
00437 $ 1 ) )+ABS( CA*A( 2,
00438 $ 2 )-WR*D2 )+ABS( WI*D2 )+ABS( WI*
00439 $ D1 ) ) )RES = ZERO
00440 IF( SCALE.GT.ONE )
00441 $ RES = RES + ONE / EPS
00442 RES = RES + ABS( XNORM-
00443 $ MAX( ABS( X( 1, 1 ) )+ABS( X( 1,
00444 $ 2 ) ), ABS( X( 2,
00445 $ 1 ) )+ABS( X( 2, 2 ) ) ) ) /
00446 $ MAX( SMLNUM, XNORM ) / EPS
00447 IF( INFO.NE.0 .AND. INFO.NE.1 )
00448 $ RES = RES + ONE / EPS
00449 KNT = KNT + 1
00450 IF( RES.GT.RMAX ) THEN
00451 LMAX = KNT
00452 RMAX = RES
00453 END IF
00454 110 CONTINUE
00455 120 CONTINUE
00456 130 CONTINUE
00457 140 CONTINUE
00458 150 CONTINUE
00459 160 CONTINUE
00460 170 CONTINUE
00461 180 CONTINUE
00462 190 CONTINUE
00463
00464 RETURN
00465
00466
00467
00468 END