228 SUBROUTINE dgghd3( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
229 $ LDQ, Z, LDZ, WORK, LWORK, INFO )
238 CHARACTER COMPQ, COMPZ
239 INTEGER IHI, ILO, INFO, LDA, LDB, LDQ, LDZ, N, LWORK
242 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), Q( LDQ, * ),
243 $ z( ldz, * ), work( * )
249 DOUBLE PRECISION ZERO, ONE
253 LOGICAL BLK22, INITQ, INITZ, LQUERY, WANTQ, WANTZ
254 CHARACTER*1 COMPQ2, COMPZ2
255 INTEGER COLA, I, IERR, J, J0, JCOL, JJ, JROW, K,
256 $ kacc22, len, lwkopt, n2nb, nb, nblst, nbmin,
257 $ nh, nnb, nx, ppw, ppwo, pw, top, topq
258 DOUBLE PRECISION C, C1, C2, S, S1, S2, TEMP, TEMP1, TEMP2, TEMP3
263 EXTERNAL ilaenv,
lsame
277 nb = ilaenv( 1,
'DGGHD3',
' ', n, ilo, ihi, -1 )
278 lwkopt =
max( 6*n*nb, 1 )
279 work( 1 ) = dble( 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( 1, n ) )
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(
'DGGHD3', -info )
310 ELSE IF( lquery )
THEN
317 $
CALL dlaset(
'All', n, n, zero, one, q, ldq )
319 $
CALL dlaset(
'All', n, n, zero, one, z, ldz )
324 $
CALL dlaset(
'Lower', n-1, n-1, zero, zero, b(2, 1), ldb )
336 nbmin = ilaenv( 2,
'DGGHD3',
' ', n, ilo, ihi, -1 )
337 IF( nb.GT.1 .AND. nb.LT.nh )
THEN
341 nx =
max( nb, ilaenv( 3,
'DGGHD3',
' ', n, ilo
346 IF( lwork.LT.lwkopt )
THEN
352 nbmin =
max( 2, ilaenv( 2, '
dgghd3', ' ', N, ILO, IHI,
354.GE.
IF( LWORK6*N*NBMIN ) THEN
363.LT..OR..GE.
IF( NBNBMIN NBNH ) THEN
373 KACC22 = ILAENV( 16, 'dgghd3', ' ', 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 DLASET( 'all
', NBLST, NBLST, ZERO, ONE, WORK, NBLST )
387 PW = NBLST * NBLST + 1
389 CALL DLASET( 'all
', 2*NNB, 2*NNB, ZERO, ONE,
390 $ WORK( PW ), 2*NNB )
396 DO J = JCOL, JCOL+NNB-1
403 CALL DLARTG( TEMP, A( I, J ), C, S, A( I-1, J ) )
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 ) = C*TEMP - S*WORK( JJ )
419 WORK( JJ ) = S*TEMP + C*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 ) = C*TEMP - S*WORK( JJ )
436 WORK( JJ ) = S*TEMP + C*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 ) = C*TEMP - S*B( I-1, JJ )
465 B( I-1, JJ ) = S*TEMP + C*B( I-1, JJ )
471 TEMP = B( JJ+1, JJ+1 )
472 CALL DLARTG( TEMP, B( JJ+1, JJ ), C, S,
475 CALL DROT( JJ-TOP, B( TOP+1, JJ+1 ), 1,
476 $ B( TOP+1, JJ ), 1, C, S )
489 JJ = MOD( IHI-J-1, 3 )
490 DO I = IHI-J-3, JJ+1, -3
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 + S2*TEMP2
504 TEMP2 = -S2*TEMP3 + C2*TEMP2
505 A( K, J+I+2 ) = C1*TEMP2 + S1*TEMP1
506 TEMP1 = -S1*TEMP2 + C1*TEMP1
507 A( K, J+I+1 ) = C*TEMP1 + S*TEMP
508 A( K, J+I ) = -S*TEMP1 + C*TEMP
514 CALL DROT( IHI-TOP, A( TOP+1, J+I+1 ), 1,
515 $ A( TOP+1, J+I ), 1, A( J+1+I, J ),
522.LT.
IF ( J JCOL + NNB - 1 ) THEN
535 JROW = IHI - NBLST + 1
536 CALL DGEMV( 'transpose
', NBLST, LEN, ONE, WORK,
537 $ NBLST, A( JROW, J+1 ), 1, ZERO,
540 DO I = JROW, JROW+NBLST-LEN-1
541 WORK( PPW ) = A( I, J+1 )
544 CALL DTRMV( 'lower
', 'transpose
', 'non-unit
',
545 $ NBLST-LEN, WORK( LEN*NBLST + 1 ), NBLST,
546 $ WORK( PW+LEN ), 1 )
547 CALL DGEMV( 'transpose
', LEN, NBLST-LEN, ONE,
548 $ WORK( (LEN+1)*NBLST - LEN + 1 ), NBLST,
549 $ A( JROW+NBLST-LEN, J+1 ), 1, ONE,
550 $ WORK( PW+LEN ), 1 )
552 DO I = JROW, JROW+NBLST-1
553 A( I, J+1 ) = WORK( PPW )
570 PPWO = 1 + NBLST*NBLST
572 DO JROW = J0, JCOL+1, -NNB
574 DO I = JROW, JROW+NNB-1
575 WORK( PPW ) = A( I, J+1 )
579 DO I = JROW+NNB, JROW+NNB+LEN-1
580 WORK( PPW ) = A( I, J+1 )
583 CALL DTRMV( 'upper
', 'transpose
', 'non-unit
', LEN,
584 $ WORK( PPWO + NNB ), 2*NNB, WORK( PW ),
586 CALL DTRMV( 'lower
', 'transpose
', 'non-unit
', NNB,
587 $ WORK( PPWO + 2*LEN*NNB ),
588 $ 2*NNB, WORK( PW + LEN ), 1 )
589 CALL DGEMV( 'transpose
', NNB, LEN, ONE,
590 $ WORK( PPWO ), 2*NNB, A( JROW, J+1 ), 1,
591 $ ONE, WORK( PW ), 1 )
592 CALL DGEMV( 'transpose
', LEN, NNB, ONE,
593 $ WORK( PPWO + 2*LEN*NNB + NNB ), 2*NNB,
594 $ A( JROW+NNB, J+1 ), 1, ONE,
595 $ WORK( PW+LEN ), 1 )
597 DO I = JROW, JROW+LEN+NNB-1
598 A( I, J+1 ) = WORK( PPW )
601 PPWO = PPWO + 4*NNB*NNB
608 COLA = N - JCOL - NNB + 1
610 CALL DGEMM( 'transpose
', 'no
', NBLST,
611 $ COLA, NBLST, ONE, WORK, NBLST,
612 $ A( J, JCOL+NNB ), LDA, ZERO, WORK( PW ),
614 CALL DLACPY( 'all
', NBLST, COLA, WORK( PW ), NBLST,
615 $ A( J, JCOL+NNB ), LDA )
616 PPWO = NBLST*NBLST + 1
618 DO J = J0, JCOL+1, -NNB
630 CALL DORM22( 'left
', 'transpose
', 2*NNB, COLA, NNB,
631 $ NNB, WORK( PPWO ), 2*NNB,
632 $ A( J, JCOL+NNB ), LDA, WORK( PW ),
638 CALL DGEMM( 'transpose
', 'no transpose
', 2*NNB,
639 $ COLA, 2*NNB, ONE, WORK( PPWO ), 2*NNB,
640 $ A( J, JCOL+NNB ), LDA, ZERO, WORK( PW ),
642 CALL DLACPY( 'all
', 2*NNB, COLA, WORK( PW ), 2*NNB,
643 $ A( J, JCOL+NNB ), LDA )
645 PPWO = PPWO + 4*NNB*NNB
653 TOPQ = MAX( 2, J - JCOL + 1 )
659 CALL DGEMM( 'no transpose
', 'no transpose
', NH,
660 $ NBLST, NBLST, ONE, Q( TOPQ, J ), LDQ,
661 $ WORK, NBLST, ZERO, WORK( PW ), NH )
662 CALL DLACPY( 'all
', NH, NBLST, WORK( PW ), NH,
663 $ Q( TOPQ, J ), LDQ )
664 PPWO = NBLST*NBLST + 1
666 DO J = J0, JCOL+1, -NNB
668 TOPQ = MAX( 2, J - JCOL + 1 )
675 CALL DORM22( 'right
', 'no transpose
', NH, 2*NNB,
676 $ NNB, NNB, WORK( PPWO ), 2*NNB,
677 $ Q( TOPQ, J ), LDQ, WORK( PW ),
683 CALL DGEMM( 'no transpose
', 'no transpose
', NH,
684 $ 2*NNB, 2*NNB, ONE, Q( TOPQ, J ), LDQ,
685 $ WORK( PPWO ), 2*NNB, ZERO, WORK( PW ),
687 CALL DLACPY( 'all
', NH, 2*NNB, WORK( PW ), NH,
688 $ Q( TOPQ, J ), LDQ )
690 PPWO = PPWO + 4*NNB*NNB
696.OR..GT.
IF ( WANTZ TOP0 ) THEN
701 CALL DLASET( 'all
', NBLST, NBLST, ZERO, ONE, WORK,
703 PW = NBLST * NBLST + 1
705 CALL DLASET( 'all
', 2*NNB, 2*NNB, ZERO, ONE,
706 $ WORK( PW ), 2*NNB )
712 DO J = JCOL, JCOL+NNB-1
713 PPW = ( NBLST + 1 )*( NBLST - 2 ) - J + JCOL + 1
715 JROW = J + N2NB*NNB + 2
721 DO JJ = PPW, PPW+LEN-1
722 TEMP = WORK( JJ + NBLST )
723 WORK( JJ + NBLST ) = C*TEMP - S*WORK( JJ )
724 WORK( JJ ) = S*TEMP + C*WORK( JJ )
727 PPW = PPW - NBLST - 1
730 PPWO = NBLST*NBLST + ( NNB+J-JCOL-1 )*2*NNB + NNB
732 DO JROW = J0, J+2, -NNB
735 DO I = JROW+NNB-1, JROW, -1
740 DO JJ = PPW, PPW+LEN-1
741 TEMP = WORK( JJ + 2*NNB )
742 WORK( JJ + 2*NNB ) = C*TEMP - S*WORK( JJ )
743 WORK( JJ ) = S*TEMP + C*WORK( JJ )
746 PPW = PPW - 2*NNB - 1
748 PPWO = PPWO + 4*NNB*NNB
753 CALL DLASET( 'lower
', IHI - JCOL - 1, NNB, ZERO, ZERO,
754 $ A( JCOL + 2, JCOL ), LDA )
755 CALL DLASET( 'lower
', IHI - JCOL - 1, NNB, ZERO, ZERO,
756 $ B( JCOL + 2, JCOL ), LDB )
763 CALL DGEMM( 'no transpose
', 'no transpose
', TOP,
764 $ NBLST, NBLST, ONE, A( 1, J ), LDA,
765 $ WORK, NBLST, ZERO, WORK( PW ), TOP )
766 CALL DLACPY( 'all
', TOP, NBLST, WORK( PW ), TOP,
768 PPWO = NBLST*NBLST + 1
770 DO J = J0, JCOL+1, -NNB
775 CALL DORM22( 'right
', 'no transpose
', TOP, 2*NNB,
776 $ NNB, NNB, WORK( PPWO ), 2*NNB,
777 $ A( 1, J ), LDA, WORK( PW ),
783 CALL DGEMM( 'no transpose',
'No Transpose', top,
784 $ 2*nnb, 2*nnb, one, a( 1, j ), lda,
785 $ work( ppwo ), 2*nnb, zero,
787 CALL dlacpy(
'All', top, 2*nnb, work( pw ), top,
790 ppwo = ppwo + 4*nnb*nnb
794 CALL dgemm(
'No Transpose',
'No Transpose', top,
795 $ nblst, nblst, one, b( 1, j ), ldb,
796 $ work, nblst, zero, work( pw ), top )
797 CALL dlacpy(
'All', top, nblst, work( pw ), top,
799 ppwo = nblst*nblst + 1
801 DO j = j0, jcol+1, -nnb
806 CALL dorm22(
'Right',
'No Transpose', top, 2*nnb,
807 $ nnb, nnb, work( ppwo ), 2*nnb,
808 $ b( 1, j ), ldb, work( pw ),
814 CALL dgemm(
'No Transpose', 'no transpose
', TOP,
815 $ 2*NNB, 2*NNB, ONE, B( 1, J ), LDB,
816 $ WORK( PPWO ), 2*NNB, ZERO,
818 CALL DLACPY( 'all
', TOP, 2*NNB, WORK( PW ), TOP,
821 PPWO = PPWO + 4*NNB*NNB
830 TOPQ = MAX( 2, J - JCOL + 1 )
836 CALL DGEMM( 'no transpose
', 'no transpose
', NH,
837 $ NBLST, NBLST, ONE, Z( TOPQ, J ), LDZ,
838 $ WORK, NBLST, ZERO, WORK( PW ), NH )
839 CALL DLACPY( 'all
', NH, NBLST, WORK( PW ), NH,
840 $ Z( TOPQ, J ), LDZ )
841 PPWO = NBLST*NBLST + 1
843 DO J = J0, JCOL+1, -NNB
845 TOPQ = MAX( 2, J - JCOL + 1 )
852 CALL DORM22( 'right
', 'no transpose
', NH, 2*NNB,
853 $ NNB, NNB, WORK( PPWO ), 2*NNB,
854 $ Z( TOPQ, J ), LDZ, WORK( PW ),
860 CALL DGEMM( 'no transpose
', 'no transpose
', NH,
861 $ 2*NNB, 2*NNB, ONE, Z( TOPQ, J ), LDZ,
862 $ WORK( PPWO ), 2*NNB, ZERO, WORK( PW ),
864 CALL DLACPY( 'all
', NH, 2*NNB, WORK( PW ), NH,
865 $ Z( TOPQ, J ), LDZ )
867 PPWO = PPWO + 4*NNB*NNB
878.NE.
IF ( JCOLILO ) THEN
886 $ CALL DGGHRD( COMPQ2, COMPZ2, N, JCOL, IHI, A, LDA, B, LDB, Q,
887 $ LDQ, Z, LDZ, IERR )
888 WORK( 1 ) = DBLE( LWKOPT )
subroutine dorm22(side, trans, m, n, n1, n2, q, ldq, c, ldc, work, lwork, info)
DORM22 multiplies a general matrix by a banded orthogonal matrix.
subroutine dgghd3(compq, compz, n, ilo, ihi, a, lda, b, ldb, q, ldq, z, ldz, work, lwork, info)
DGGHD3