229 SUBROUTINE cgghd3( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
230 $ LDQ, Z, LDZ, WORK, LWORK, INFO )
240 CHARACTER COMPQ, COMPZ
241 INTEGER IHI, ILO, INFO, LDA, LDB, , LDZ, N, LWORK
244 COMPLEX A( LDA, * ), B( LDB, * ), Q( LDQ, * ),
245 $ z( ldz, * ), work( * )
252 parameter( cone = ( 1.0e+0, 0.0e+0 ),
253 $ czero = ( 0.0e+0, 0.0e+0 ) )
256 LOGICAL BLK22, INITQ, INITZ, LQUERY, WANTQ, WANTZ
257 CHARACTER*1 COMPQ2, COMPZ2
258 INTEGER COLA, I, IERR, J, J0, JCOL, JJ, JROW, K,
259 $ kacc22, len, lwkopt, n2nb, nb, nblst, nbmin,
260 $ nh, nnb, nx, ppw, ppwo, pw, top, topq
262 COMPLEX C1, C2, CTEMP, S, S1, S2, TEMP, TEMP1, TEMP2,
268 EXTERNAL ilaenv, lsame
282 nb = ilaenv( 1,
'CGGHD3',
' ', n, ilo, ihi, -1 )
283 lwkopt =
max( 6*n*nb, 1 )
284 work( 1 ) =
cmplx( lwkopt )
285 initq = lsame( compq,
'I' )
286 wantq = initq .OR. lsame( compq,
'V' )
287 initz = lsame( compz,
'I' )
288 wantz = initz .OR. lsame( compz,
'V' )
289 lquery = ( lwork.EQ.-1 )
291 IF( .NOT.lsame( compq,
'N' ) .AND. .NOT.wantq )
THEN
293 ELSE IF( .NOT.lsame( compz,
'N' ) .AND. .NOT.wantz )
THEN
295 ELSE IF( n.LT.0 )
THEN
297 ELSE IF( ilo.LT.1 )
THEN
299 ELSE IF( ihi.GT.n .OR. ihi.LT.ilo-1 )
THEN
301 ELSE IF( lda.LT.
max( 1, n ) )
THEN
303 ELSE IF( ldb.LT.
max( 1, n ) )
THEN
305 ELSE IF( ( wantq .AND. ldq.LT.n ) .OR. ldq.LT.1 )
THEN
307 ELSE IF( ( wantz .AND. ldz.LT.n ) .OR. ldz.LT.1 )
THEN
309 ELSE IF( lwork.LT.1 .AND. .NOT.lquery )
THEN
313 CALL xerbla(
'CGGHD3', -info )
315 ELSE IF( lquery )
THEN
322 $
CALL claset(
'All', n, n, czero, cone, q, ldq )
324 $
CALL claset(
'All', n, n, czero, cone, z, ldz )
329 $
CALL claset(
'Lower', n-1, n-1, czero, czero, b(2, 1), ldb )
341 nbmin = ilaenv( 2,
'CGGHD3',
' ', n, ilo, ihi, -1 )
342 IF( nb.GT.1 .AND. nb.LT.nh )
THEN
346 nx =
max( nb, ilaenv( 3,
'CGGHD3',
' ', n, ilo, ihi, -1 ) )
351 IF( lwork.LT.lwkopt )
THEN
357 nbmin =
max( 2, ilaenv( 2,
'CGGHD3',
' ', n, ilo, ihi,
359 IF( lwork.GE.6*n*nbmin )
THEN
368 IF( nb.LT.nbmin .OR. nb.GE.nh )
THEN
378 kacc22 = ilaenv( 16,
'CGGHD3',
' ', n, ilo, ihi, -1 )
380 DO jcol = ilo, ihi-2, nb
381 nnb =
min( nb, ihi-jcol-1 )
389 n2nb = ( ihi-jcol-1 ) / nnb - 1
390 nblst = ihi - jcol - n2nb*nnb
391 CALL claset(
'All', nblst, nblst, czero, cone, work, nblst )
392 pw = nblst * nblst + 1
394 CALL claset(
'All', 2*nnb, 2*nnb, czero, cone,
395 $ work( pw ), 2*nnb )
401 DO j = jcol, jcol+nnb-1
408 CALL clartg( temp, a( i, j ), c, s, a( i-1, j ) )
409 a( i, j ) =
cmplx( c )
415 ppw = ( nblst + 1 )*( nblst - 2 ) - j + jcol + 1
417 jrow = j + n2nb*nnb + 2
421 DO jj = ppw, ppw+len-1
422 temp = work( jj + nblst )
423 work( jj + nblst ) = ctemp*temp - s*work( jj )
424 work( jj ) = conjg( s )*temp + ctemp*work(
427 ppw = ppw - nblst - 1
430 ppwo = nblst*nblst + ( nnb+j-jcol-1 )*2*nnb + nnb
432 DO jrow = j0, j+2, -nnb
435 DO i = jrow+nnb-1, jrow, -1
438 DO jj = ppw, ppw+len-1
439 temp = work( jj + 2*nnb )
440 work( jj + 2*nnb ) = ctemp*temp - s*work( jj )
441 work( jj ) = conjg( s )*temp + ctemp*work( jj )
444 ppw = ppw - 2*nnb - 1
446 ppwo = ppwo + 4*nnb*nnb
465 DO i =
min( jj+1, ihi ), j+2, -1
469 b( i, jj ) = ctemp*temp - conjg( s )*b( i-1, jj )
470 b( i-1, jj ) = s*temp + ctemp*b( i-1, jj )
476 temp = b( jj+1, jj+1 )
477 CALL clartg( temp, b( jj+1, jj ), c, s,
479 b( jj+1, jj ) = czero
480 CALL crot( jj-top, b( top+1, jj+1 ), 1,
481 $ b( top+1, jj ), 1, c, s )
482 a( jj+1, j ) =
cmplx( c )
483 b( jj+1, j ) = -conjg( s )
489 jj = mod( ihi-j-1, 3 )
490 DO i = ihi-j-3, jj+1, -3
491 ctemp = a( j+1+i, j )
500 temp1 = a( k, j+i+1 )
501 temp2 = a( k, j+i+2 )
502 temp3 = a( k, j+i+3 )
504 temp2 = -s2*temp3 + c2*temp2
505 a( k, j+i+2 ) = c1*temp2 + conjg( s1 )*temp1
506 temp1 = -s1*temp2 + c1*temp1
507 a( k, j+i+1 ) = ctemp*temp1 + conjg( s
508 a( k, j+i ) = -s*temp1 + ctemp*temp
514 c = dble( a( j+1+i, j ) )
515 CALL crot( ihi-top, a( top+1, j+i+1 ), 1,
516 $ a( top+1, j+i ), 1, c,
523 IF ( j .LT. jcol + nnb - 1 )
THEN
536 jrow = ihi - nblst + 1
537 CALL cgemv(
'Conjugate', nblst, len, cone, work,
538 $ nblst, a( jrow, j+1 ), 1, czero,
542 work( ppw ) = a( i, j+1 )
545 CALL ctrmv( 'lower
', 'conjugate
', 'non-unit
',
546 $ NBLST-LEN, WORK( LEN*NBLST + 1 ), NBLST,
547 $ WORK( PW+LEN ), 1 )
548 CALL CGEMV( 'conjugate
', LEN, NBLST-LEN, CONE,
549 $ WORK( (LEN+1)*NBLST - LEN + 1 ), NBLST,
550 $ A( JROW+NBLST-LEN, J+1 ), 1, CONE,
551 $ WORK( PW+LEN ), 1 )
553 DO I = JROW, JROW+NBLST-1
554 A( I, J+1 ) = WORK( PPW )
571 PPWO = 1 + NBLST*NBLST
573 DO JROW = J0, JCOL+1, -NNB
575 DO I = JROW, JROW+NNB-1
576 WORK( PPW ) = A( I, J+1 )
580 DO I = JROW+NNB, JROW+NNB+LEN-1
581 WORK( PPW ) = A( I, J+1 )
584 CALL CTRMV( 'upper
', 'conjugate
', 'non-unit
', LEN,
585 $ WORK( PPWO + NNB ), 2*NNB, WORK( PW ),
587 CALL CTRMV( 'lower
', 'conjugate
', 'non-unit
', NNB,
588 $ WORK( PPWO + 2*LEN*NNB ),
589 $ 2*NNB, WORK( PW + LEN ), 1 )
590 CALL CGEMV( 'conjugate
', NNB, LEN, CONE,
591 $ WORK( PPWO ), 2*NNB, A( JROW, J+1 ), 1,
592 $ CONE, WORK( PW ), 1 )
593 CALL CGEMV( 'conjugate
', LEN, NNB, CONE,
594 $ WORK( PPWO + 2*LEN*NNB + NNB ), 2*NNB,
595 $ A( JROW+NNB, J+1 ), 1, CONE,
596 $ WORK( PW+LEN ), 1 )
598 DO I = JROW, JROW+LEN+NNB-1
599 A( I, J+1 ) = WORK( PPW )
602 PPWO = PPWO + 4*NNB*NNB
609 COLA = N - JCOL - NNB + 1
611 CALL CGEMM( 'conjugate
', 'no transpose
', NBLST,
612 $ COLA, NBLST, CONE, WORK, NBLST,
613 $ A( J, JCOL+NNB ), LDA, CZERO, WORK( PW ),
615 CALL CLACPY( 'all
', NBLST, COLA, WORK( PW ), NBLST,
616 $ A( J, JCOL+NNB ), LDA )
617 PPWO = NBLST*NBLST + 1
619 DO J = J0, JCOL+1, -NNB
631 CALL CUNM22( 'left
', 'conjugate
', 2*NNB, COLA, NNB,
632 $ NNB, WORK( PPWO ), 2*NNB,
633 $ A( J, JCOL+NNB ), LDA, WORK( PW ),
639 CALL CGEMM( 'conjugate
', 'no transpose
', 2*NNB,
640 $ COLA, 2*NNB, CONE, WORK( PPWO ), 2*NNB,
641 $ A( J, JCOL+NNB ), LDA, CZERO, WORK( PW ),
643 CALL CLACPY( 'all
', 2*NNB, COLA, WORK( PW ), 2*NNB,
644 $ A( J, JCOL+NNB ), LDA )
646 PPWO = PPWO + 4*NNB*NNB
654 TOPQ = MAX( 2, J - JCOL + 1 )
660 CALL CGEMM( 'no transpose
', 'no transpose
', NH,
661 $ NBLST, NBLST, CONE, Q( TOPQ, J ), LDQ,
662 $ WORK, NBLST, CZERO, WORK( PW ), NH )
663 CALL CLACPY( 'all
', NH, NBLST, WORK( PW ), NH,
664 $ Q( TOPQ, J ), LDQ )
665 PPWO = NBLST*NBLST + 1
667 DO J = J0, JCOL+1, -NNB
669 TOPQ = MAX( 2, J - JCOL + 1 )
676 CALL CUNM22( 'right
', 'no transpose
', NH, 2*NNB,
677 $ NNB, NNB, WORK( PPWO ), 2*NNB,
678 $ Q( TOPQ, J ), LDQ, WORK( PW ),
684 CALL CGEMM( 'no transpose
', 'no transpose
', NH,
685 $ 2*NNB, 2*NNB, CONE, Q( TOPQ, J ), LDQ,
686 $ WORK( PPWO ), 2*NNB, CZERO, WORK( PW ),
688 CALL CLACPY( 'all
', NH, 2*NNB, WORK( PW ), NH,
689 $ Q( TOPQ, J ), LDQ )
691 PPWO = PPWO + 4*NNB*NNB
697.OR..GT.
IF ( WANTZ TOP0 ) THEN
702 CALL CLASET( 'all
', NBLST, NBLST, CZERO, CONE, WORK,
704 PW = NBLST * NBLST + 1
706 CALL CLASET( 'all
', 2*NNB, 2*NNB, CZERO, CONE,
707 $ WORK( PW ), 2*NNB )
713 DO J = JCOL, JCOL+NNB-1
714 PPW = ( NBLST + 1 )*( NBLST - 2 ) - J + JCOL + 1
716 JROW = J + N2NB*NNB + 2
722 DO JJ = PPW, PPW+LEN-1
723 TEMP = WORK( JJ + NBLST )
724 WORK( JJ + NBLST ) = CTEMP*TEMP -
725 $ CONJG( S )*WORK( JJ )
726 WORK( JJ ) = S*TEMP + CTEMP*WORK( JJ )
729 PPW = PPW - NBLST - 1
732 PPWO = NBLST*NBLST + ( NNB+J-JCOL-1 )*2*NNB + NNB
734 DO JROW = J0, J+2, -NNB
737 DO I = JROW+NNB-1, JROW, -1
742 DO JJ = PPW, PPW+LEN-1
743 TEMP = WORK( JJ + 2*NNB )
744 WORK( JJ + 2*NNB ) = CTEMP*TEMP -
745 $ CONJG( S )*WORK( JJ )
746 WORK( JJ ) = S*TEMP + CTEMP*WORK( JJ )
749 PPW = PPW - 2*NNB - 1
751 PPWO = PPWO + 4*NNB*NNB
756 CALL CLASET( 'lower
', IHI - JCOL - 1, NNB, CZERO, CZERO,
757 $ A( JCOL + 2, JCOL ), LDA )
758 CALL CLASET( 'lower
', IHI - JCOL - 1, NNB, CZERO, CZERO,
759 $ B( JCOL + 2, JCOL ), LDB )
766 CALL CGEMM( 'no transpose
', 'no transpose
', TOP,
767 $ NBLST, NBLST, CONE, A( 1, J ), LDA,
768 $ WORK, NBLST, CZERO, WORK( PW ), TOP )
769 CALL CLACPY( 'all
', TOP, NBLST, WORK( PW ), TOP,
771 PPWO = NBLST*NBLST + 1
773 DO J = J0, JCOL+1, -NNB
778 CALL CUNM22( 'right
', 'no transpose
', TOP, 2*NNB,
779 $ NNB, NNB, WORK( PPWO ), 2*NNB,
780 $ A( 1, J ), LDA, WORK( PW ),
786 CALL CGEMM( 'no transpose
', 'no transpose
', TOP,
787 $ 2*NNB, 2*NNB, CONE, A( 1, J ), LDA,
788 $ WORK( PPWO ), 2*NNB, CZERO,
790 CALL CLACPY( 'all
', TOP, 2*NNB, WORK( PW ), TOP,
793 PPWO = PPWO + 4*NNB*NNB
797 CALL CGEMM( 'no transpose
', 'no transpose
', TOP,
798 $ NBLST, NBLST, CONE, B( 1, J ), LDB,
799 $ WORK, NBLST, CZERO, WORK( PW ), TOP )
800 CALL CLACPY( 'all
', TOP, NBLST, WORK( PW ), TOP,
802 PPWO = NBLST*NBLST + 1
804 DO J = J0, JCOL+1, -NNB
809 CALL CUNM22( 'right
', 'no transpose
', TOP, 2*NNB,
810 $ NNB, NNB, WORK( PPWO ), 2*NNB,
811 $ B( 1, J ), LDB, WORK( PW ),
817 CALL CGEMM( 'no transpose
', 'no transpose
', TOP,
818 $ 2*NNB, 2*NNB, CONE, B( 1, J ), LDB,
819 $ WORK( PPWO ), 2*NNB, CZERO,
821 CALL CLACPY( 'all
', TOP, 2*NNB, WORK( PW ), TOP,
824 PPWO = PPWO + 4*NNB*NNB
833 TOPQ = MAX( 2, J - JCOL + 1 )
839 CALL CGEMM( 'no transpose
', 'no transpose
', NH,
840 $ NBLST, NBLST, CONE, Z( TOPQ, J ), LDZ,
841 $ WORK, NBLST, CZERO, WORK( PW ), NH )
842 CALL CLACPY( 'all
', NH, NBLST, WORK( PW ), NH,
843 $ Z( TOPQ, J ), LDZ )
844 PPWO = NBLST*NBLST + 1
846 DO J = J0, JCOL+1, -NNB
848 TOPQ = MAX( 2, J - JCOL + 1 )
855 CALL CUNM22( 'right
', 'no transpose
', NH, 2*NNB,
856 $ NNB, NNB, WORK( PPWO ), 2*NNB,
857 $ Z( TOPQ, J ), LDZ, WORK( PW ),
863 CALL CGEMM( 'no transpose
', 'no transpose
', NH,
864 $ 2*NNB, 2*NNB, CONE, Z( TOPQ, J ), LDZ,
865 $ WORK( PPWO ), 2*NNB, CZERO, WORK( PW ),
867 CALL CLACPY( 'all
', NH, 2*NNB, WORK( PW ), NH,
868 $ Z( TOPQ, J ), LDZ )
870 PPWO = PPWO + 4*NNB*NNB
881.NE.
IF ( JCOLILO ) THEN
889 $ CALL CGGHRD( COMPQ2, COMPZ2, N, JCOL, IHI, A, LDA, B, LDB, Q,
890 $ LDQ, Z, LDZ, IERR )
891 WORK( 1 ) = CMPLX( LWKOPT )