193 SUBROUTINE zlahqr( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILOZ,
194 $ IHIZ, Z, LDZ, INFO )
202 INTEGER IHI, IHIZ, ILO, , INFO, LDH, LDZ, N
206 COMPLEX*16 H( LDH, * ), W( * ), Z( LDZ, * )
213 parameter( zero = ( 0.0d0, 0.0d0 ),
214 $ one = ( 1.0d0, 0.0d0 ) )
215 DOUBLE PRECISION RZERO, , HALF
216 parameter( rzero = 0.0d0, rone = 1.0d0, half = 0.5d0 )
217 DOUBLE PRECISION DAT1
218 PARAMETER ( dat1 = 3.0d0 / 4.0d0 )
220 parameter( kexsh = 10 )
223 COMPLEX*16 CDUM, H11, H11S, H22, SC, SUM, T, T1, TEMP, U,
225 DOUBLE PRECISION AA, AB, BA, BB, H10, H21, RTEMP, S, SAFMAX,
226 $ safmin, smlnum, sx, t2, tst, ulp
227 INTEGER I, I1, I2, ITS, ITMAX, J, JHI, JLO, K, L, M,
235 DOUBLE PRECISION DLAMCH
236 EXTERNAL zladiv, dlamch
242 DOUBLE PRECISION CABS1
245 INTRINSIC abs, dble, dconjg, dimag,
max,
min, sqrt
248 cabs1( cdum ) = abs( dble( cdum ) ) + abs( dimag( cdum ) )
258 IF( ilo.EQ.ihi )
THEN
259 w( ilo ) = h( ilo, ilo )
264 DO 10 j = ilo, ihi - 3
269 $ h( ihi, ihi-2 ) = zero
278 DO 20 i = ilo + 1, ihi
279 IF( dimag( h( i, i-1 ) ).NE.rzero )
THEN
283 sc = h( i, i-1 ) / cabs1( h( i, i-1 ) )
284 sc = dconjg( sc ) / abs( sc )
285 h( i, i-1 ) = abs( h( i, i-1 ) )
286 CALL zscal( jhi-i+1, sc, h( i, i ), ldh )
287 CALL zscal(
min( jhi, i+1 )-jlo+1, dconjg( sc ),
290 $
CALL zscal( ihiz-iloz+1, dconjg( sc ), z( iloz, i ), 1 )
299 safmin = dlamch(
'SAFE MINIMUM' )
300 safmax = rone / safmin
301 CALL dlabad( safmin, safmax )
302 ulp = dlamch(
'PRECISION' )
303 smlnum = safmin*( dble( nh ) / ulp )
316 itmax = 30 *
max( 10, nh )
338 DO 130 its = 0, itmax
342 DO 40 k = i, l + 1, -1
343 IF( cabs1( h( k, k-1 ) ).LE.smlnum )
345 tst = cabs1( h( k-1, k-1 ) ) + cabs1( h( k, k ) )
346 IF( tst.EQ.zero )
THEN
348 $ tst = tst + abs( dble( h( k-1, k-2 ) ) )
350 $ tst = tst + abs( dble( h( k+1, k ) ) )
356 IF( abs( dble( h( k, k-1 ) ) ).LE.ulp*tst )
THEN
357 ab =
max( cabs1( h( k, k-1 ) ), cabs1( h( k-1, k ) ) )
358 ba =
min( cabs1( h( k, k-1 ) ), cabs1( h( k-1, k ) ) )
359 aa =
max( cabs1( h( k, k ) ),
360 $ cabs1( h( k-1, k-1 )-h( k, k ) ) )
361 bb =
min( cabs1( h( k, k ) ),
362 $ cabs1( h( k-1, k-1 )-h( k, k ) ) )
364 IF( ba*( ab / s ).LE.
max( smlnum,
365 $ ulp*( bb*( aa / s ) ) ) )
GO TO 50
387 IF( .NOT.wantt )
THEN
392 IF( mod(kdefl,2*kexsh).EQ.0 )
THEN
396 s = dat1*abs( dble( h( i, i-1 ) ) )
398 ELSE IF( mod(kdefl,kexsh).EQ.0 )
THEN
402 s = dat1*abs( dble( h( l+1, l ) ) )
409 u = sqrt( h( i-1, i ) )*sqrt( h( i, i-1 ) )
411 IF( s.NE.rzero )
THEN
412 x = half*( h( i-1, i-1 )-t )
414 s =
max( s, cabs1( x ) )
415 y = s*sqrt( ( x / s )**2+( u / s )**2 )
416 IF( sx.GT.rzero )
THEN
417 IF( dble( x / sx )*dble( y )+dimag( x / sx )*
418 $ dimag( y ).LT.rzero )y = -y
420 t = t - u*zladiv( u, ( x+y ) )
426 DO 60 m = i - 1, l + 1, -1
435 h21 = dble( h( m+1, m ) )
436 s = cabs1( h11s ) + abs( h21 )
441 h10 = dble( h( m, m-1 ) )
442 IF( abs( h10 )*abs( h21 ).LE.ulp*
443 $ ( cabs1( h11s )*( cabs1( h11 )+cabs1( h22 ) ) ) )
449 h21 = dble( h( l+1, l ) )
450 s = cabs1( h11s ) + abs( h21 )
474 $
CALL zcopy( 2, h( k, k-1 ), 1, v, 1 )
475 CALL zlarfg( 2, v( 1 ), v( 2 ), 1, t1 )
487 sum = dconjg( t1 )*h( k, j ) + t2*h( k+1, j )
488 h( k, j ) = h( k, j ) - sum
489 h( k+1, j ) = h( k+1, j ) - sum*v2
495 DO 90 j = i1,
min( k+2, i )
496 sum = t1*h( j, k ) + t2*h( j, k+1 )
497 h( j, k ) = h( j, k ) - sum
498 h( j, k+1 ) = h( j, k+1 ) - sum*dconjg( v2 )
505 DO 100 j = iloz, ihiz
506 sum = t1*z( j, k ) + t2*z( j, k+1 )
507 z( j, k ) = z( j, k ) - sum
508 z( j, k+1 ) = z( j, k+1 ) - sum*dconjg( v2 )
512 IF( k.EQ.m .AND. m.GT.l )
THEN
520 temp = temp / abs( temp )
521 h( m+1, m ) = h( m+1, m )*dconjg( temp )
523 $ h( m+2, m+1 ) = h( m+2, m+1 )*temp
527 $
CALL zscal( i2-j, temp, h( j, j+1 ), ldh )
528 CALL zscal( j-i1, dconjg( temp
530 CALL zscal( nz, dconjg( temp ), z( iloz, j ),
541 IF( dimag( temp ).NE.rzero )
THEN
546 $
CALL zscal( i2-i, dconjg( temp ), h( i, i+1 ), ldh )
547 CALL zscal( i-i1, temp, h( i1, i ), 1 )
549 CALL zscal( nz, temp, z( iloz, i ), 1 )