193 SUBROUTINE zlahqr( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILOZ,
194 $ IHIZ, Z, LDZ, INFO )
202 INTEGER IHI, IHIZ, ILO, ILOZ, 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, RONE, 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 ), h( i1, j ), 1 )
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 )
subroutine zlarfg(N, ALPHA, X, INCX, TAU)
ZLARFG generates an elementary reflector (Householder matrix).
subroutine zcopy(N, ZX, INCX, ZY, INCY)
ZCOPY
subroutine zlahqr(WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILOZ, IHIZ, Z, LDZ, INFO)
ZLAHQR computes the eigenvalues and Schur factorization of an upper Hessenberg matrix, using the double-shift/single-shift QR algorithm.
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine zscal(N, ZA, ZX, INCX)
ZSCAL