262 SUBROUTINE zlaqr3( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH,
264 $ IHIZ, Z, LDZ, NS, ND, SH, V, LDV, NH, T, LDT,
265 $ NV, WV, LDWV, WORK, LWORK )
272 INTEGER IHIZ, ILOZ, KBOT, KTOP, LDH, LDT, LDV, LDWV,
273 $ LDZ, LWORK, N, ND, NH, NS, NV, NW
277 COMPLEX*16 H( LDH, * ), SH( * ), T( LDT, * ), V( LDV, * ),
278 $ WORK( * ), WV( LDWV, * ), Z( LDZ, * )
285 PARAMETER ( ZERO = ( 0.0d0, 0.0d0 ),
286 $ one = ( 1.0d0, 0.0d0 ) )
287 DOUBLE PRECISION RZERO, RONE
288 parameter( rzero = 0.0d0, rone = 1.0d0 )
291 COMPLEX*16 CDUM, S, TAU
292 DOUBLE PRECISION FOO, SAFMAX, SAFMIN, SMLNUM, ULP
293 INTEGER I, IFST, ILST, INFO, INFQR, J, JW, KCOL, KLN,
294 $ knt, krow, kwtop, ltop, lwk1, lwk2, lwk3,
298 DOUBLE PRECISION DLAMCH
300 EXTERNAL DLAMCH, ILAENV
308 INTRINSIC abs, dble, dcmplx, dconjg, dimag, int, max, min
311 DOUBLE PRECISION CABS1
314 cabs1( cdum ) = abs( dble( cdum ) ) + abs( dimag( cdum ) )
320 jw = min( nw, kbot-ktop+1 )
327 CALL zgehrd( jw, 1, jw-1, t, ldt, work, work, -1, info )
328 lwk1 = int( work( 1 ) )
332 CALL zunmhr(
'R',
'N', jw, jw, 1, jw-1, t, ldt, work, v,
335 lwk2 = int( work( 1 ) )
339 CALL zlaqr4( .true., .true., jw, 1, jw, t, ldt, sh, 1, jw,
341 $ ldv, work, -1, infqr )
342 lwk3 = int( work( 1 ) )
346 lwkopt = max( jw+max( lwk1, lwk2 ), lwk3 )
351 IF( lwork.EQ.-1 )
THEN
352 work( 1 ) = dcmplx( lwkopt, 0 )
369 safmin = dlamch(
'SAFE MINIMUM' )
370 safmax = rone / safmin
371 ulp = dlamch(
'PRECISION' )
372 smlnum = safmin*( dble( n ) / ulp )
376 jw = min( nw, kbot-ktop+1 )
377 kwtop = kbot - jw + 1
378 IF( kwtop.EQ.ktop )
THEN
381 s = h( kwtop, kwtop-1 )
384 IF( kbot.EQ.kwtop )
THEN
388 sh( kwtop ) = h( kwtop, kwtop )
391 IF( cabs1( s ).LE.max( smlnum, ulp*cabs1( h( kwtop,
396 $ h( kwtop, kwtop-1 ) = zero
408 CALL zlacpy(
'U', jw, jw, h( kwtop, kwtop ), ldh, t, ldt )
409 CALL zcopy( jw-1, h( kwtop+1, kwtop ), ldh+1, t( 2, 1 ),
412 CALL zlaset(
'A', jw, jw, zero, one, v, ldv )
413 nmin = ilaenv( 12,
'ZLAQR3',
'SV', jw, 1, jw, lwork )
414 IF( jw.GT.nmin )
THEN
415 CALL zlaqr4( .true., .true., jw, 1, jw, t, ldt, sh( kwtop ),
417 $ jw, v, ldv, work, lwork, infqr )
419 CALL zlahqr( .true., .true., jw, 1, jw, t, ldt, sh( kwtop ),
421 $ jw, v, ldv, infqr )
428 DO 10 knt = infqr + 1, jw
432 foo = cabs1( t( ns, ns ) )
435 IF( cabs1( s )*cabs1( v( 1, ns ) ).LE.max( smlnum, ulp*foo ) )
447 CALL ztrexc(
'V', jw, t, ldt, v, ldv, ifst, ilst, info )
462 DO 30 i = infqr + 1, ns
465 IF( cabs1( t( j, j ) ).GT.cabs1( t( ifst, ifst ) ) )
470 $
CALL ztrexc(
'V', jw, t, ldt, v, ldv, ifst, ilst,
477 DO 40 i = infqr + 1, jw
478 sh( kwtop+i-1 ) = t( i, i )
482 IF( ns.LT.jw .OR. s.EQ.zero )
THEN
483 IF( ns.GT.1 .AND. s.NE.zero )
THEN
487 CALL zcopy( ns, v, ldv, work, 1 )
489 work( i ) = dconjg( work( i ) )
491 CALL zlarfg( ns, work( 1 ), work( 2 ), 1, tau )
493 CALL zlaset(
'L', jw-2, jw-2, zero, zero, t( 3, 1 ),
496 CALL zlarf1f(
'L', ns, jw, work, 1, conjg( tau ), t, ldt,
498 CALL zlarf1f(
'R', ns, ns, work, 1, tau, t, ldt,
500 CALL zlarf1f(
'R', jw, ns, work, 1, tau, v, ldv,
503 CALL zgehrd( jw, 1, ns, t, ldt, work, work( jw+1 ),
510 $ h( kwtop, kwtop-1 ) = s*dconjg( v( 1, 1 ) )
511 CALL zlacpy(
'U', jw, jw, t, ldt, h( kwtop, kwtop ), ldh )
512 CALL zcopy( jw-1, t( 2, 1 ), ldt+1, h( kwtop+1, kwtop ),
518 IF( ns.GT.1 .AND. s.NE.zero )
519 $
CALL zunmhr(
'R',
'N', jw, ns, 1, ns, t, ldt, work, v,
521 $ work( jw+1 ), lwork-jw, info )
530 DO 60 krow = ltop, kwtop - 1, nv
531 kln = min( nv, kwtop-krow )
532 CALL zgemm(
'N',
'N', kln, jw, jw, one, h( krow, kwtop ),
533 $ ldh, v, ldv, zero, wv, ldwv )
534 CALL zlacpy(
'A', kln, jw, wv, ldwv, h( krow, kwtop ),
541 DO 70 kcol = kbot + 1, n, nh
542 kln = min( nh, n-kcol+1 )
543 CALL zgemm(
'C',
'N', jw, kln, jw, one, v, ldv,
544 $ h( kwtop, kcol ), ldh, zero, t, ldt )
545 CALL zlacpy(
'A', jw, kln, t, ldt, h( kwtop, kcol ),
553 DO 80 krow = iloz, ihiz, nv
554 kln = min( nv, ihiz-krow+1 )
555 CALL zgemm(
'N',
'N', kln, jw, jw, one, z( krow,
557 $ ldz, v, ldv, zero, wv, ldwv )
558 CALL zlacpy(
'A', kln, jw, wv, ldwv, z( krow, kwtop ),
578 work( 1 ) = dcmplx( lwkopt, 0 )