120 DOUBLE PRECISION TWO, ONE,
121 parameter( two = 2.0d+0, one = 1.0d+0, zero = 0.0d+0 )
125 DOUBLE PRECISION , ALPHR, BETA, BIGNUM, SMLNUM, XNORM
129 DOUBLE PRECISION DLAMCH, , DLAPY2, DZNRM2
131 EXTERNAL dlamch,
dlapy3, dlapy2, dznrm2, zladiv
134 INTRINSIC abs, dble, dcmplx, dimag, sign
146 xnorm = dznrm2( n-1, x, incx )
147 alphr = dble( alpha )
148 alphi = dimag( alpha )
150 IF( xnorm.EQ.zero )
THEN
154 IF( alphi.EQ.zero )
THEN
155 IF( alphr.GE.zero )
THEN
165 x( 1 + (j-1)*incx ) = zero
171 xnorm = dlapy2( alphr, alphi )
172 tau = dcmplx( one - alphr / xnorm, -alphi / xnorm )
174 x( 1 + (j-1)*incx ) = zero
182 beta = sign(
dlapy3( alphr, alphi, xnorm ), alphr )
183 smlnum = dlamch
'S''E' )
184 bignum = one / smlnum
187 IF( abs( beta ).LT.smlnum )
THEN
193 CALL zdscal( n-1, bignum, x, incx )
197 IF( (abs( beta ).LT.smlnum) .AND. (knt .LT. 20) )
202 xnorm = dznrm2( n-1, x, incx )
203 alpha = dcmplx( alphr, alphi )
204 beta = sign(
dlapy3( alphr, alphi, xnorm ), alphr )
208 IF( beta.LT.zero )
THEN
212 alphr = alphi * (alphi/dble( alpha ))
213 alphr = alphr + xnorm * (xnorm/dble( alpha ))
214 tau = dcmplx( alphr/beta, -alphi/beta )
215 alpha = dcmplx( -alphr, alphi )
217 alpha = zladiv( dcmplx( one ), alpha )
219 IF ( abs(tau).LE.smlnum )
THEN
228 alphr = dble( savealpha )
229 alphi = dimag( savealpha )
230 IF( alphi.EQ.zero )
THEN
231 IF( alphr.GE.zero )
THEN
236 x( 1 + (j-1)*incx ) = zero
238 beta = dble( -savealpha )
241 xnorm = dlapy2( alphr, alphi )
242 tau = dcmplx( one - alphr / xnorm, -alphi / xnorm )
244 x( 1 + (j-1)*incx ) = zero
253 CALL zscal( n-1, alpha, x, incx )
subroutine zlarfgp(n, alpha, x, incx, tau)
ZLARFGP generates an elementary reflector (Householder matrix) with non-negative beta.