00001 SUBROUTINE ZLARFGP( N, ALPHA, X, INCX, TAU )
00002
00003
00004
00005
00006
00007
00008
00009 INTEGER INCX, N
00010 COMPLEX*16 ALPHA, TAU
00011
00012
00013 COMPLEX*16 X( * )
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 DOUBLE PRECISION TWO, ONE, ZERO
00062 PARAMETER ( TWO = 2.0D+0, ONE = 1.0D+0, ZERO = 0.0D+0 )
00063
00064
00065 INTEGER J, KNT
00066 DOUBLE PRECISION ALPHI, ALPHR, BETA, BIGNUM, SMLNUM, XNORM
00067 COMPLEX*16 SAVEALPHA
00068
00069
00070 DOUBLE PRECISION DLAMCH, DLAPY3, DLAPY2, DZNRM2
00071 COMPLEX*16 ZLADIV
00072 EXTERNAL DLAMCH, DLAPY3, DLAPY2, DZNRM2, ZLADIV
00073
00074
00075 INTRINSIC ABS, DBLE, DCMPLX, DIMAG, SIGN
00076
00077
00078 EXTERNAL ZDSCAL, ZSCAL
00079
00080
00081
00082 IF( N.LE.0 ) THEN
00083 TAU = ZERO
00084 RETURN
00085 END IF
00086
00087 XNORM = DZNRM2( N-1, X, INCX )
00088 ALPHR = DBLE( ALPHA )
00089 ALPHI = DIMAG( ALPHA )
00090
00091 IF( XNORM.EQ.ZERO ) THEN
00092
00093
00094
00095 IF( ALPHI.EQ.ZERO ) THEN
00096 IF( ALPHR.GE.ZERO ) THEN
00097
00098
00099
00100 TAU = ZERO
00101 ELSE
00102
00103
00104 TAU = TWO
00105 DO J = 1, N-1
00106 X( 1 + (J-1)*INCX ) = ZERO
00107 END DO
00108 ALPHA = -ALPHA
00109 END IF
00110 ELSE
00111
00112 XNORM = DLAPY2( ALPHR, ALPHI )
00113 TAU = DCMPLX( ONE - ALPHR / XNORM, -ALPHI / XNORM )
00114 DO J = 1, N-1
00115 X( 1 + (J-1)*INCX ) = ZERO
00116 END DO
00117 ALPHA = XNORM
00118 END IF
00119 ELSE
00120
00121
00122
00123 BETA = SIGN( DLAPY3( ALPHR, ALPHI, XNORM ), ALPHR )
00124 SMLNUM = DLAMCH( 'S' ) / DLAMCH( 'E' )
00125 BIGNUM = ONE / SMLNUM
00126
00127 KNT = 0
00128 IF( ABS( BETA ).LT.SMLNUM ) THEN
00129
00130
00131
00132 10 CONTINUE
00133 KNT = KNT + 1
00134 CALL ZDSCAL( N-1, BIGNUM, X, INCX )
00135 BETA = BETA*BIGNUM
00136 ALPHI = ALPHI*BIGNUM
00137 ALPHR = ALPHR*BIGNUM
00138 IF( ABS( BETA ).LT.SMLNUM )
00139 $ GO TO 10
00140
00141
00142
00143 XNORM = DZNRM2( N-1, X, INCX )
00144 ALPHA = DCMPLX( ALPHR, ALPHI )
00145 BETA = SIGN( DLAPY3( ALPHR, ALPHI, XNORM ), ALPHR )
00146 END IF
00147 SAVEALPHA = ALPHA
00148 ALPHA = ALPHA + BETA
00149 IF( BETA.LT.ZERO ) THEN
00150 BETA = -BETA
00151 TAU = -ALPHA / BETA
00152 ELSE
00153 ALPHR = ALPHI * (ALPHI/DBLE( ALPHA ))
00154 ALPHR = ALPHR + XNORM * (XNORM/DBLE( ALPHA ))
00155 TAU = DCMPLX( ALPHR/BETA, -ALPHI/BETA )
00156 ALPHA = DCMPLX( -ALPHR, ALPHI )
00157 END IF
00158 ALPHA = ZLADIV( DCMPLX( ONE ), ALPHA )
00159
00160 IF ( ABS(TAU).LE.SMLNUM ) THEN
00161
00162
00163
00164
00165
00166
00167
00168
00169 ALPHR = DBLE( SAVEALPHA )
00170 ALPHI = DIMAG( SAVEALPHA )
00171 IF( ALPHI.EQ.ZERO ) THEN
00172 IF( ALPHR.GE.ZERO ) THEN
00173 TAU = ZERO
00174 ELSE
00175 TAU = TWO
00176 DO J = 1, N-1
00177 X( 1 + (J-1)*INCX ) = ZERO
00178 END DO
00179 BETA = -SAVEALPHA
00180 END IF
00181 ELSE
00182 XNORM = DLAPY2( ALPHR, ALPHI )
00183 TAU = DCMPLX( ONE - ALPHR / XNORM, -ALPHI / XNORM )
00184 DO J = 1, N-1
00185 X( 1 + (J-1)*INCX ) = ZERO
00186 END DO
00187 BETA = XNORM
00188 END IF
00189
00190 ELSE
00191
00192
00193
00194 CALL ZSCAL( N-1, ALPHA, X, INCX )
00195
00196 END IF
00197
00198
00199
00200 DO 20 J = 1, KNT
00201 BETA = BETA*SMLNUM
00202 20 CONTINUE
00203 ALPHA = BETA
00204 END IF
00205
00206 RETURN
00207
00208
00209
00210 END