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, LDQ, LDZ, N, LWORK
244 COMPLEX A( LDA, * ), B( LDB, * ), Q( LDQ, * ),
245 $ z( ldz, * ), work( * )
252 parameter( cone = ( 1.0e+0, 0.0e+0 ),
256 LOGICAL , INITQ, INITZ, LQUERY, , WANTZ
257 CHARACTER*1 COMPQ2, COMPZ2
258 INTEGER COLA, , IERR, J, J0, JCOL, , 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.OR.
WANTQ = INITQ LSAME( COMPQ, 'v
' )
287 INITZ = LSAME( COMPZ, 'i
' )
288.OR.
WANTZ = INITZ LSAME( COMPZ, 'v
' )
289.EQ.
LQUERY = ( LWORK-1 )
291.NOT.
IF( LSAME( COMPQ, 'n.AND..NOT.
' ) WANTQ ) THEN
293.NOT.
ELSE IF( LSAME( COMPZ, 'n.AND..NOT.
' ) WANTZ ) THEN
295.LT.
ELSE IF( N0 ) THEN
297.LT.
ELSE IF( ILO1 ) THEN
299.GT..OR..LT.
ELSE IF( IHIN IHIILO-1 ) THEN
301.LT.
ELSE IF( LDAMAX( 1, N ) ) THEN
303.LT.
ELSE IF( LDBMAX( 1, N ) ) THEN
305.AND..LT..OR..LT.
ELSE IF( ( WANTQ LDQN ) LDQ1 ) THEN
307.AND..LT..OR..LT.
ELSE IF( ( WANTZ LDZN ) LDZ1 ) THEN
309.LT..AND..NOT.
ELSE IF( LWORK1 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.GT..AND..LT.
IF( NB1 NBNH ) THEN
346 NX = MAX( NB, ILAENV( 3, 'cgghd3', ' ', N, ILO, IHI, -1 ) )
351.LT.
IF( LWORKLWKOPT ) THEN
357 NBMIN = MAX( 2, ILAENV( 2, 'cgghd3', ' ', N, ILO, IHI,
359.GE.
IF( LWORK6*N*NBMIN ) THEN
368.LT..OR..GE.
IF( NBNBMIN NBNH ) 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( JJ )
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 )
503 A( K, J+I+3 ) = C2*TEMP3 + CONJG( S2 )*TEMP2
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 )*TEMP
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,
517 $ -CONJG( B( J+1+I, J ) ) )
523.LT.
IF ( J 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,
541 DO I = JROW, JROW+NBLST-LEN-1
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'
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 IF ( jcol.NE.ilo )
THEN
889 $
CALL cgghrd( compq2, compz2, n, jcol, ihi, a, lda, b, ldb, q,
890 $ ldq, z, ldz, ierr )
891 work( 1 ) =
cmplx( lwkopt )