00001 SUBROUTINE SLANV2( A, B, C, D, RT1R, RT1I, RT2R, RT2I, CS, SN )
00002
00003
00004
00005
00006
00007
00008
00009 REAL A, B, C, CS, D, RT1I, RT1R, RT2I, RT2R, SN
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 REAL ZERO, HALF, ONE
00060 PARAMETER ( ZERO = 0.0E+0, HALF = 0.5E+0, ONE = 1.0E+0 )
00061 REAL MULTPL
00062 PARAMETER ( MULTPL = 4.0E+0 )
00063
00064
00065 REAL AA, BB, BCMAX, BCMIS, CC, CS1, DD, EPS, P, SAB,
00066 $ SAC, SCALE, SIGMA, SN1, TAU, TEMP, Z
00067
00068
00069 REAL SLAMCH, SLAPY2
00070 EXTERNAL SLAMCH, SLAPY2
00071
00072
00073 INTRINSIC ABS, MAX, MIN, SIGN, SQRT
00074
00075
00076
00077 EPS = SLAMCH( 'P' )
00078 IF( C.EQ.ZERO ) THEN
00079 CS = ONE
00080 SN = ZERO
00081 GO TO 10
00082
00083 ELSE IF( B.EQ.ZERO ) THEN
00084
00085
00086
00087 CS = ZERO
00088 SN = ONE
00089 TEMP = D
00090 D = A
00091 A = TEMP
00092 B = -C
00093 C = ZERO
00094 GO TO 10
00095 ELSE IF( (A-D).EQ.ZERO .AND. SIGN( ONE, B ).NE.
00096 $ SIGN( ONE, C ) ) THEN
00097 CS = ONE
00098 SN = ZERO
00099 GO TO 10
00100 ELSE
00101
00102 TEMP = A - D
00103 P = HALF*TEMP
00104 BCMAX = MAX( ABS( B ), ABS( C ) )
00105 BCMIS = MIN( ABS( B ), ABS( C ) )*SIGN( ONE, B )*SIGN( ONE, C )
00106 SCALE = MAX( ABS( P ), BCMAX )
00107 Z = ( P / SCALE )*P + ( BCMAX / SCALE )*BCMIS
00108
00109
00110
00111
00112 IF( Z.GE.MULTPL*EPS ) THEN
00113
00114
00115
00116 Z = P + SIGN( SQRT( SCALE )*SQRT( Z ), P )
00117 A = D + Z
00118 D = D - ( BCMAX / Z )*BCMIS
00119
00120
00121
00122 TAU = SLAPY2( C, Z )
00123 CS = Z / TAU
00124 SN = C / TAU
00125 B = B - C
00126 C = ZERO
00127 ELSE
00128
00129
00130
00131
00132 SIGMA = B + C
00133 TAU = SLAPY2( SIGMA, TEMP )
00134 CS = SQRT( HALF*( ONE+ABS( SIGMA ) / TAU ) )
00135 SN = -( P / ( TAU*CS ) )*SIGN( ONE, SIGMA )
00136
00137
00138
00139
00140 AA = A*CS + B*SN
00141 BB = -A*SN + B*CS
00142 CC = C*CS + D*SN
00143 DD = -C*SN + D*CS
00144
00145
00146
00147
00148 A = AA*CS + CC*SN
00149 B = BB*CS + DD*SN
00150 C = -AA*SN + CC*CS
00151 D = -BB*SN + DD*CS
00152
00153 TEMP = HALF*( A+D )
00154 A = TEMP
00155 D = TEMP
00156
00157 IF( C.NE.ZERO ) THEN
00158 IF( B.NE.ZERO ) THEN
00159 IF( SIGN( ONE, B ).EQ.SIGN( ONE, C ) ) THEN
00160
00161
00162
00163 SAB = SQRT( ABS( B ) )
00164 SAC = SQRT( ABS( C ) )
00165 P = SIGN( SAB*SAC, C )
00166 TAU = ONE / SQRT( ABS( B+C ) )
00167 A = TEMP + P
00168 D = TEMP - P
00169 B = B - C
00170 C = ZERO
00171 CS1 = SAB*TAU
00172 SN1 = SAC*TAU
00173 TEMP = CS*CS1 - SN*SN1
00174 SN = CS*SN1 + SN*CS1
00175 CS = TEMP
00176 END IF
00177 ELSE
00178 B = -C
00179 C = ZERO
00180 TEMP = CS
00181 CS = -SN
00182 SN = TEMP
00183 END IF
00184 END IF
00185 END IF
00186
00187 END IF
00188
00189 10 CONTINUE
00190
00191
00192
00193 RT1R = A
00194 RT2R = D
00195 IF( C.EQ.ZERO ) THEN
00196 RT1I = ZERO
00197 RT2I = ZERO
00198 ELSE
00199 RT1I = SQRT( ABS( B ) )*SQRT( ABS( C ) )
00200 RT2I = -RT1I
00201 END IF
00202 RETURN
00203
00204
00205
00206 END