193 SUBROUTINE clahqr( 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 H( LDH, * ), W( * ), Z( LDZ, * )
213 parameter( zero = ( 0.0e0, 0.0e0 ),
214 $ one = ( 1.0e0, 0.0e0 ) )
215 REAL RZERO, RONE, HALF
216 parameter( rzero = 0.0e0, rone = 1.0e0, half = 0.5e0 )
220 parameter( kexsh = 10 )
223 COMPLEX CDUM, H11, H11S, H22, SC, SUM, T, T1, TEMP, U,
225 REAL 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,
236 EXTERNAL cladiv, slamch
245 INTRINSIC abs, aimag, conjg,
max,
min, real, sqrt
248 cabs1( cdum ) = abs( real( cdum ) ) + abs( aimag( 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( aimag( h( i, i-1 ) ).NE.rzero )
THEN
283 sc = h( i, i-1 ) / cabs1( h( i, i-1 ) )
284 sc = conjg( sc ) / abs( sc )
285 h( i, i-1 ) = abs( h( i, i-1 ) )
286 CALL cscal( jhi-i+1, sc, h( i, i ), ldh )
287 CALL cscal(
min( jhi, i+1 )-jlo+1, conjg( sc ), h( jlo, i ),
290 $
CALL cscal( ihiz-iloz+1, conjg( sc ), z( iloz, i ), 1 )
299 safmin = slamch(
'SAFE MINIMUM' )
300 safmax = rone / safmin
301 CALL slabad( safmin, safmax )
302 ulp = slamch(
'PRECISION' )
303 smlnum = safmin*( real( 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( real( h( k-1, k-2 ) ) )
350 $ tst = tst + abs( real( h( k+1, k ) ) )
356 IF( abs( real( 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( real( h( i, i-1 ) ) )
398 ELSE IF( mod(kdefl,kexsh).EQ.0 )
THEN
402 s = dat1*abs( real( 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( real( x / sx )*real( y )+aimag( x / sx )*
418 $ aimag( y ).LT.rzero )y = -y
420 t = t - u*cladiv( u, ( x+y ) )
426 DO 60 m = i - 1, l + 1, -1
435 h21 = real( h( m+1, m ) )
436 s = cabs1( h11s ) + abs( h21 )
441 h10 = real( h( m, m-1 ) )
442 IF( abs( h10 )*abs( h21 ).LE.ulp*
443 $ ( cabs1( h11s )*( cabs1( h11 )+cabs1( h22 ) ) ) )
449 h21 = real( h( l+1, l ) )
450 s = cabs1( h11s ) + abs( h21 )
474 $
CALL ccopy( 2, h( k, k-1 ), 1, v, 1 )
475 CALL clarfg( 2, v( 1 ), v( 2 ), 1, t1 )
487 sum = conjg( 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*conjg( 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*conjg( v2 )
512 IF( k.EQ.m .AND. m.GT.l )
THEN
521 h( m+1, m ) = h( m+1, m )*conjg( temp )
523 $ h( m+2, m+1 ) = h( m+2, m+1 )*temp
527 $
CALL cscal( i2-j, temp, h( j, j+1 ), ldh
528 CALL cscal( j-i1, conjg( temp ), h( i1, j ), 1 )
530 CALL cscal( nz, conjg( temp ), z( iloz, j ), 1 )
540 IF( aimag( temp ).NE.rzero )
THEN
545 $
CALL cscal( i2-i, conjg( temp ), h( i, i+1 ), ldh )
546 CALL cscal( i-i1, temp, h( i1, i ), 1 )
548 CALL cscal( nz, temp, z( iloz, i ), 1 )