225 SUBROUTINE zgghd3( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
226 $ LDQ, Z, LDZ, WORK, LWORK, INFO )
235 CHARACTER COMPQ, COMPZ
236 INTEGER IHI, ILO, INFO, LDA, LDB, LDQ, LDZ, N, LWORK
239 COMPLEX*16 A( LDA, * ), B( LDB, * ), Q( LDQ, * ),
240 $ z( ldz, * ), work( * )
247 parameter( cone = ( 1.0d+0, 0.0d+0 ),
248 $ czero = ( 0.0d+0, 0.0d+0 ) )
251 LOGICAL BLK22, INITQ, INITZ, LQUERY, WANTQ, WANTZ
252 CHARACTER*1 COMPQ2, COMPZ2
253 INTEGER COLA, I, IERR, J, J0, JCOL, JJ, JROW, K,
254 $ kacc22, len, lwkopt, n2nb, nb, nblst, nbmin,
255 $ nh, nnb, nx, ppw, ppwo, pw, top, topq
257 COMPLEX*16 C1, C2, CTEMP, S, S1, , TEMP, TEMP1, TEMP2,
263 EXTERNAL ilaenv, lsame
270 INTRINSIC dble, dcmplx, dconjg,
max
277 nb = ilaenv( 1,
'ZGGHD3',
' ', n, ilo, ihi, -1 )
278 lwkopt =
max( 6*n*nb, 1 )
279 work( 1 ) = dcmplx( lwkopt )
280 initq = lsame( compq,
'I' )
281 wantq = initq .OR. lsame( compq,
'V' )
282 initz = lsame( compz,
'I' )
283 wantz = initz .OR. lsame( compz,
'V' )
284 lquery = ( lwork.EQ.-1 )
286 IF( .NOT.lsame( compq,
'N' ) .AND. .NOT.wantq )
THEN
288 ELSE IF( .NOT.lsame( compz,
'N' ) .AND. .NOT.wantz )
THEN
290 ELSE IF( n.LT.0 )
THEN
292 ELSE IF( ilo.LT.1 )
THEN
294 ELSE IF( ihi.GT.n .OR. ihi.LT.ilo-1 )
THEN
296 ELSE IF( lda.LT.
max( 1, n ) )
THEN
298 ELSE IF( ldb.LT.
max(
THEN
300 ELSE IF( ( wantq .AND. ldq.LT.n ) .OR. ldq.LT.1 )
THEN
302 ELSE IF( ( wantz .AND. ldz.LT.n ) .OR. ldz.LT.1 )
THEN
304 ELSE IF( lwork.LT.1 .AND. .NOT.lquery )
THEN
308 CALL xerbla(
'ZGGHD3', -info )
310 ELSE IF( lquery )
THEN
317 $
CALL zlaset(
'All', n, n, czero, cone, q, ldq )
319 $
CALL zlaset(
'All', n, n, czero, cone, z, ldz )
324 $
CALL zlaset(
'Lower', n-1, n-1, czero, czero, b(2, 1), ldb )
336 nbmin = ilaenv( 2,
'ZGGHD3',
' ', n, ilo, ihi, -1 )
337 IF( nb.GT.1 .AND. nb.LT.nh )
THEN
341 nx =
max( nb, ilaenv( 3,
'ZGGHD3',
' ', n, ilo, ihi, -1 ) )
346 IF( lwork.LT.lwkopt )
THEN
352 nbmin =
max( 2, ilaenv( 2,
'ZGGHD3', '
', N, ILO, IHI,
354.GE.
IF( LWORK6*N*NBMIN ) THEN
363.LT..OR..GE.
IF( NBNBMIN NBNH ) THEN
373 KACC22 = ILAENV( 16, 'zgghd3', ' ', N, ILO, IHI, -1 )
375 DO JCOL = ILO, IHI-2, NB
376 NNB = MIN( NB, IHI-JCOL-1 )
384 N2NB = ( IHI-JCOL-1 ) / NNB - 1
385 NBLST = IHI - JCOL - N2NB*NNB
386 CALL ZLASET( 'all', nblst, nblst, czero, cone, work, nblst )
387 pw = nblst * nblst + 1
389 CALL zlaset(
'All', 2*nnb, 2*nnb, czero, cone,
390 $ work( pw ), 2*nnb )
403 CALL zlartg( temp, a( i, j ), c, s, a( i-1, j ) )
404 a( i, j ) = dcmplx( c )
410 ppw = ( nblst + 1 )*( nblst - 2 ) - j + jcol + 1
412 jrow = j + n2nb*nnb + 2
416 DO jj = ppw, ppw+len-1
417 temp = work( jj + nblst )
418 work( jj + nblst ) = ctemp*temp - s*work( jj )
419 work( jj ) = dconjg( s )*temp + ctemp*work( jj )
422 ppw = ppw - nblst - 1
425 ppwo = nblst*nblst + ( nnb+j-jcol-1 )*2*nnb + nnb
427 DO jrow = j0, j+2, -nnb
430 DO i = jrow+nnb-1, jrow, -1
433 DO jj = ppw, ppw+len-1
434 temp = work( jj + 2*nnb )
435 work( jj + 2*nnb ) = ctemp*temp - s*work( jj )
439 ppw = ppw - 2*nnb - 1
441 ppwo = ppwo + 4*nnb*nnb
460 DO i =
min( jj+1, ihi ), j+2, -1
464 b( i, jj ) = ctemp*temp - dconjg( s )*b( i-1, jj )
465 b( i-1, jj ) = s*temp + ctemp*b( i-1, jj )
471 temp = b( jj+1, jj+1 )
472 CALL zlartg( temp, b( jj+1, jj ), c, s,
474 b( jj+1, jj ) = czero
475 CALL zrot( jj-top, b( top+1, jj+1 ), 1,
476 $ b( top+1, jj ), 1, c, s )
477 a( jj+1, j ) = dcmplx( c )
478 b( jj+1, j ) = -dconjg( s )
484 jj = mod( ihi-j-1, 3 )
485 DO i = ihi-j-3, jj+1, -3
486 ctemp = a( j+1+i, j )
495 temp1 = a( k, j+i+1 )
496 temp2 = a( k, j+i+2 )
497 temp3 = a( k, j+i+3 )
498 a( k, j+i+3 ) = c2*temp3 + dconjg( s2 )*temp2
499 temp2 = -s2*temp3 + c2*temp2
500 a( k, j+i+2 ) = c1*temp2 + dconjg( s1 )*temp1
501 temp1 = -s1*temp2 + c1*temp1
502 a( k, j+i+1 ) = ctemp*temp1 + dconjg( s )*temp
503 a( k, j+i ) = -s*temp1 + ctemp*temp
509 c = dble( a( j+1+i, j ) )
510 CALL zrot( ihi-top, a( top+1, j+i+1 ), 1,
511 $ a( top+1, j+i ), 1, c,
512 $ -dconjg( b( j+1+i, j ) ) )
518 IF ( j .LT. jcol + nnb - 1 )
THEN
531 jrow = ihi - nblst + 1
532 CALL zgemv(
'Conjugate', nblst, len, cone, work,
533 $ nblst, a( jrow, j+1 ), 1, czero,
536 DO i = jrow, jrow+nblst-len-1
537 work( ppw ) = a( i, j+1 )
540 CALL ztrmv(
'Lower',
'Conjugate',
'Non-unit',
541 $ nblst-len, work( len*nblst + 1 ), nblst,
542 $ work( pw+len ), 1 )
543 CALL zgemv(
'Conjugate', len, nblst-len, cone,
544 $ work( (len+1)*nblst - len + 1 ), nblst,
545 $ a( jrow+nblst-len, j+1 ), 1, cone,
546 $ work( pw+len ), 1 )
548 DO i = jrow, jrow+nblst-1
549 a( i, j+1 ) = work( ppw )
566 ppwo = 1 + nblst*nblst
568 DO jrow = j0, jcol+1, -nnb
570 DO i = jrow, jrow+nnb-1
571 work( ppw ) = a( i, j+1 )
575 DO i = jrow+nnb, jrow+nnb+len-1
576 work( ppw ) = a( i, j+1 )
579 CALL ztrmv(
'Upper',
'Conjugate',
'Non-unit', len,
580 $ work( ppwo + nnb ), 2*nnb, work( pw ),
582 CALL ztrmv(
'Lower',
'Conjugate',
'Non-unit', nnb,
583 $ work( ppwo + 2*len*nnb ),
584 $ 2*nnb, work( pw + len ), 1 )
585 CALL zgemv(
'Conjugate', nnb, len, cone,
586 $ work( ppwo ), 2*nnb, a( jrow, j+1 ), 1,
587 $ cone, work( pw ), 1 )
588 CALL zgemv(
'Conjugate', len, nnb, cone,
589 $ work( ppwo + 2*len*nnb + nnb ), 2*nnb,
590 $ a( jrow+nnb, j+1 ), 1, cone,
591 $ work( pw+len ), 1 )
593 DO i = jrow, jrow+len+nnb-1
594 a( i, j+1 ) = work( ppw )
597 ppwo = ppwo + 4*nnb*nnb
604 cola = n - jcol - nnb + 1
606 CALL zgemm(
'Conjugate',
'No Transpose', nblst,
607 $ cola, nblst, cone, work, nblst,
608 $ a( j, jcol+nnb ), lda, czero, work( pw ),
610 CALL zlacpy(
'All', nblst, cola, work( pw ), nblst,
611 $ a( j, jcol+nnb ), lda )
612 ppwo = nblst*nblst + 1
614 DO j = j0, jcol+1, -nnb
626 CALL zunm22(
'Left',
'Conjugate', 2*nnb, cola, nnb,
627 $ nnb, work( ppwo ), 2*nnb,
628 $ a( j, jcol+nnb ), lda, work( pw ),
634 CALL zgemm(
'Conjugate', 'no transpose
', 2*NNB,
635 $ COLA, 2*NNB, CONE, WORK( PPWO ), 2*NNB,
636 $ A( J, JCOL+NNB ), LDA, CZERO, WORK( PW ),
638 CALL ZLACPY( 'all
', 2*NNB, COLA, WORK( PW ), 2*NNB,
639 $ A( J, JCOL+NNB ), LDA )
641 PPWO = PPWO + 4*NNB*NNB
649 TOPQ = MAX( 2, J - JCOL + 1 )
655 CALL ZGEMM( 'no transpose
', 'no transpose
', NH,
656 $ NBLST, NBLST, CONE, Q( TOPQ, J ), LDQ,
657 $ WORK, NBLST, CZERO, WORK( PW ), NH )
658 CALL ZLACPY( 'all
', NH, NBLST, WORK( PW ), NH,
659 $ Q( TOPQ, J ), LDQ )
660 PPWO = NBLST*NBLST + 1
662 DO J = J0, JCOL+1, -NNB
664 TOPQ = MAX( 2, J - JCOL + 1 )
671 CALL ZUNM22( 'right
', 'no transpose
', NH, 2*NNB,
672 $ NNB, NNB, WORK( PPWO ), 2*NNB,
673 $ Q( TOPQ, J ), LDQ, WORK( PW ),
679 CALL ZGEMM( 'no transpose
', 'no transpose
', NH,
680 $ 2*NNB, 2*NNB, CONE, Q( TOPQ, J ), LDQ,
681 $ WORK( PPWO ), 2*NNB, CZERO, WORK( PW ),
683 CALL ZLACPY( 'all
', NH, 2*NNB, WORK( PW ), NH,
684 $ Q( TOPQ, J ), LDQ )
686 PPWO = PPWO + 4*NNB*NNB
692.OR..GT.
IF ( WANTZ TOP0 ) THEN
697 CALL ZLASET( 'all
', NBLST, NBLST, CZERO, CONE, WORK,
699 PW = NBLST * NBLST + 1
701 CALL ZLASET( 'all
', 2*NNB, 2*NNB, CZERO, CONE,
702 $ WORK( PW ), 2*NNB )
708 DO J = JCOL, JCOL+NNB-1
709 PPW = ( NBLST + 1 )*( NBLST - 2 ) - J + JCOL + 1
711 JROW = J + N2NB*NNB + 2
717 DO JJ = PPW, PPW+LEN-1
718 TEMP = WORK( JJ + NBLST )
719 WORK( JJ + NBLST ) = CTEMP*TEMP -
720 $ DCONJG( S )*WORK( JJ )
721 WORK( JJ ) = S*TEMP + CTEMP*WORK( JJ )
724 PPW = PPW - NBLST - 1
727 PPWO = NBLST*NBLST + ( NNB+J-JCOL-1 )*2*NNB + NNB
729 DO JROW = J0, J+2, -NNB
732 DO I = JROW+NNB-1, JROW, -1
737 DO JJ = PPW, PPW+LEN-1
738 TEMP = WORK( JJ + 2*NNB )
739 WORK( JJ + 2*NNB ) = CTEMP*TEMP -
740 $ DCONJG( S )*WORK( JJ )
741 WORK( JJ ) = S*TEMP + CTEMP*WORK( JJ )
744 PPW = PPW - 2*NNB - 1
746 PPWO = PPWO + 4*NNB*NNB
751 CALL ZLASET( 'lower
', IHI - JCOL - 1, NNB, CZERO, CZERO,
752 $ A( JCOL + 2, JCOL ), LDA )
753 CALL ZLASET( 'lower
', IHI - JCOL - 1, NNB, CZERO, CZERO,
754 $ B( JCOL + 2, JCOL ), LDB )
761 CALL ZGEMM( 'no transpose
', 'no transpose
', TOP,
762 $ NBLST, NBLST, CONE, A( 1, J ), LDA,
763 $ WORK, NBLST, CZERO, WORK( PW ), TOP )
764 CALL ZLACPY( 'all
', TOP, NBLST, WORK( PW ), TOP,
766 PPWO = NBLST*NBLST + 1
768 DO J = J0, JCOL+1, -NNB
773 CALL ZUNM22( 'right
', 'no transpose
', TOP, 2*NNB,
774 $ NNB, NNB, WORK( PPWO ), 2*NNB,
775 $ A( 1, J ), LDA, WORK( PW ),
781 CALL ZGEMM( 'no transpose
', 'no transpose
', TOP,
782 $ 2*NNB, 2*NNB, CONE, A( 1, J ), LDA,
783 $ WORK( PPWO ), 2*NNB, CZERO,
785 CALL ZLACPY( 'all
', TOP, 2*NNB, WORK( PW ), TOP,
788 PPWO = PPWO + 4*NNB*NNB
792 CALL ZGEMM( 'no transpose
', 'no transpose
', TOP,
793 $ NBLST, NBLST, CONE, B( 1, J ), LDB,
794 $ WORK, NBLST, CZERO, WORK( PW ), TOP )
795 CALL ZLACPY( 'all
', TOP, NBLST, WORK( PW ), TOP,
797 PPWO = NBLST*NBLST + 1
799 DO J = J0, JCOL+1, -NNB
804 CALL ZUNM22( 'right
', 'no transpose
', TOP, 2*NNB,
805 $ NNB, NNB, WORK( PPWO ), 2*NNB,
806 $ B( 1, J ), LDB, WORK( PW ),
812 CALL ZGEMM( 'no transpose
', 'no transpose
', TOP,
813 $ 2*NNB, 2*NNB, CONE, B( 1, J ), LDB,
814 $ WORK( PPWO ), 2*NNB, CZERO,
816 CALL ZLACPY( 'all
', TOP, 2*NNB, WORK( PW ), TOP,
819 PPWO = PPWO + 4*NNB*NNB
828 TOPQ = MAX( 2, J - JCOL + 1 )
834 CALL ZGEMM( 'no transpose
', 'no transpose
', NH,
835 $ NBLST, NBLST, CONE, Z( TOPQ, J ), LDZ,
836 $ WORK, NBLST, CZERO, WORK( PW ), NH )
837 CALL ZLACPY( 'all
', NH, NBLST, WORK( PW ), NH,
838 $ Z( TOPQ, J ), LDZ )
839 PPWO = NBLST*NBLST + 1
841 DO J = J0, JCOL+1, -NNB
843 TOPQ = MAX( 2, J - JCOL + 1 )
850 CALL ZUNM22( 'right
', 'no transpose
', NH, 2*NNB,
851 $ NNB, NNB, WORK( PPWO ), 2*NNB,
852 $ Z( TOPQ, J ), LDZ, WORK( PW ),
858 CALL ZGEMM( 'no transpose',
'No Transpose', nh,
859 $ 2*nnb, 2*nnb, cone, z( topq, j ), ldz,
860 $ work( ppwo ), 2*nnb, czero, work( pw ),
862 CALL zlacpy(
'All', nh, 2*nnb, work( pw ), nh,
863 $ z( topq, j ), ldz )
865 ppwo = ppwo + 4*nnb*nnb
876 IF ( jcol.NE.ilo )
THEN
884 $
CALL zgghrd( compq2, compz2, n, jcol, ihi, a, lda, b, ldb, q,
885 $ ldq, z, ldz, ierr )
886 work( 1 ) = dcmplx( lwkopt )