00001 SUBROUTINE SLASV2( F, G, H, SSMIN, SSMAX, SNR, CSR, SNL, CSL )
00002
00003
00004
00005
00006
00007
00008
00009 REAL CSL, CSR, F, G, H, SNL, SNR, SSMAX, SSMIN
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
00073
00074
00075
00076
00077
00078 REAL ZERO
00079 PARAMETER ( ZERO = 0.0E0 )
00080 REAL HALF
00081 PARAMETER ( HALF = 0.5E0 )
00082 REAL ONE
00083 PARAMETER ( ONE = 1.0E0 )
00084 REAL TWO
00085 PARAMETER ( TWO = 2.0E0 )
00086 REAL FOUR
00087 PARAMETER ( FOUR = 4.0E0 )
00088
00089
00090 LOGICAL GASMAL, SWAP
00091 INTEGER PMAX
00092 REAL A, CLT, CRT, D, FA, FT, GA, GT, HA, HT, L, M,
00093 $ MM, R, S, SLT, SRT, T, TEMP, TSIGN, TT
00094
00095
00096 INTRINSIC ABS, SIGN, SQRT
00097
00098
00099 REAL SLAMCH
00100 EXTERNAL SLAMCH
00101
00102
00103
00104 FT = F
00105 FA = ABS( FT )
00106 HT = H
00107 HA = ABS( H )
00108
00109
00110
00111
00112
00113
00114 PMAX = 1
00115 SWAP = ( HA.GT.FA )
00116 IF( SWAP ) THEN
00117 PMAX = 3
00118 TEMP = FT
00119 FT = HT
00120 HT = TEMP
00121 TEMP = FA
00122 FA = HA
00123 HA = TEMP
00124
00125
00126
00127 END IF
00128 GT = G
00129 GA = ABS( GT )
00130 IF( GA.EQ.ZERO ) THEN
00131
00132
00133
00134 SSMIN = HA
00135 SSMAX = FA
00136 CLT = ONE
00137 CRT = ONE
00138 SLT = ZERO
00139 SRT = ZERO
00140 ELSE
00141 GASMAL = .TRUE.
00142 IF( GA.GT.FA ) THEN
00143 PMAX = 2
00144 IF( ( FA / GA ).LT.SLAMCH( 'EPS' ) ) THEN
00145
00146
00147
00148 GASMAL = .FALSE.
00149 SSMAX = GA
00150 IF( HA.GT.ONE ) THEN
00151 SSMIN = FA / ( GA / HA )
00152 ELSE
00153 SSMIN = ( FA / GA )*HA
00154 END IF
00155 CLT = ONE
00156 SLT = HT / GT
00157 SRT = ONE
00158 CRT = FT / GT
00159 END IF
00160 END IF
00161 IF( GASMAL ) THEN
00162
00163
00164
00165 D = FA - HA
00166 IF( D.EQ.FA ) THEN
00167
00168
00169
00170 L = ONE
00171 ELSE
00172 L = D / FA
00173 END IF
00174
00175
00176
00177 M = GT / FT
00178
00179
00180
00181 T = TWO - L
00182
00183
00184
00185 MM = M*M
00186 TT = T*T
00187 S = SQRT( TT+MM )
00188
00189
00190
00191 IF( L.EQ.ZERO ) THEN
00192 R = ABS( M )
00193 ELSE
00194 R = SQRT( L*L+MM )
00195 END IF
00196
00197
00198
00199 A = HALF*( S+R )
00200
00201
00202
00203 SSMIN = HA / A
00204 SSMAX = FA*A
00205 IF( MM.EQ.ZERO ) THEN
00206
00207
00208
00209 IF( L.EQ.ZERO ) THEN
00210 T = SIGN( TWO, FT )*SIGN( ONE, GT )
00211 ELSE
00212 T = GT / SIGN( D, FT ) + M / T
00213 END IF
00214 ELSE
00215 T = ( M / ( S+T )+M / ( R+L ) )*( ONE+A )
00216 END IF
00217 L = SQRT( T*T+FOUR )
00218 CRT = TWO / L
00219 SRT = T / L
00220 CLT = ( CRT+SRT*M ) / A
00221 SLT = ( HT / FT )*SRT / A
00222 END IF
00223 END IF
00224 IF( SWAP ) THEN
00225 CSL = SRT
00226 SNL = CRT
00227 CSR = SLT
00228 SNR = CLT
00229 ELSE
00230 CSL = CLT
00231 SNL = SLT
00232 CSR = CRT
00233 SNR = SRT
00234 END IF
00235
00236
00237
00238 IF( PMAX.EQ.1 )
00239 $ TSIGN = SIGN( ONE, CSR )*SIGN( ONE, CSL )*SIGN( ONE, F )
00240 IF( PMAX.EQ.2 )
00241 $ TSIGN = SIGN( ONE, SNR )*SIGN( ONE, CSL )*SIGN( ONE, G )
00242 IF( PMAX.EQ.3 )
00243 $ TSIGN = SIGN( ONE, SNR )*SIGN( ONE, SNL )*SIGN( ONE, H )
00244 SSMAX = SIGN( SSMAX, TSIGN )
00245 SSMIN = SIGN( SSMIN, TSIGN*SIGN( ONE, F )*SIGN( ONE, H ) )
00246 RETURN
00247
00248
00249
00250 END