1 SUBROUTINE dlaqr6( JOB, WANTT, WANTZ, KACC22, N, KTOP, KBOT,
2 $ NSHFTS, SR, SI, H, LDH, ILOZ, IHIZ, Z, LDZ,
3 $ V, LDV, U, LDU, NV, WV, LDWV, NH, WH, LDWH )
16 INTEGER IHIZ, ILOZ, KACC22, KBOT, KTOP, LDH, LDU, LDV,
17 $ ldwh, ldwv, ldz, n, nh, nshfts, nv
21 DOUBLE PRECISION H( , * ), SI( * ), SR( * ), U( LDU, * ),
22 $ V( LDV, * ), WH( LDWH, * ), WV( LDWV, * ),
169 DOUBLE PRECISION ZERO,
170 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
173 DOUBLE PRECISION ALPHA, BETA, H11, H12, H21
174, SCL, SMLNUM, SWAP, TST1, ,
176 INTEGER I, , I4, INCOL, J, J2, J4, JBOT, JCOL, JLEN,
177 $ JROW, JTOP, K, K1, KDU, KMS, KNZ, KRCOL, KZS,
178 $ m, m22, mbot, mend, mstart, mtop, nbmps, ndcol,
179 $ ns, nu, sincol, eincol, uincol, iphv, chunk,
180 $ threads, jlen2, jcol2, gchunk, jrow2, maxchunk
181 LOGICAL ACCUM, BLK22, BMP22, INTRO, CHASE, OFF, ALL
186 DOUBLE PRECISION DLAMCH
187 EXTERNAL lsame, dlamch, pilaenvx
191 INTRINSIC abs, dble,
max,
min, mod
194 DOUBLE PRECISION VT( 3 )
219 DO 10 i = 1, nshfts - 2, 2
220 IF( si( i ).NE.-si( i+1 ) )
THEN
224 sr( i+1 ) = sr( i+2 )
229 si( i+1 ) = si( i+2 )
239 ns = nshfts - mod( nshfts, 2 )
243 safmin = dlamch(
'SAFE MINIMUM' )
244 safmax = one / safmin
245 CALL dlabad( safmin, safmax )
246 ulp = dlamch(
'PRECISION' )
247 smlnum = safmin*( dble( n ) / ulp )
253 accum = ( kacc22.EQ.1 ) .OR. ( kacc22.EQ.2 )
254 accum = accum .AND. nh.GE.1 .AND. nv.GE.1
258 blk22 = ( ns.GT.2 ) .AND. ( kacc22.EQ.2 )
262 all = lsame( job,
'A' )
264 $ intro = lsame( job,
'I' )
265 IF( .NOT. all .AND. .NOT. intro )
266 $ chase = lsame( job, 'c
' )
267.NOT..AND..NOT..AND..NOT.
IF( ALL INTRO CHASE ) THEN
268 OFF = LSAME( JOB, 'o
' )
275.OR..AND..LE.
IF( INTROALL KTOP+2KBOT )
276 $ H( KTOP+2, KTOP ) = ZERO
289 SINCOL = 3*( 1-NBMPS ) + KTOP - 1
293 SINCOL = 3*( 1-NBMPS ) + KTOP - 1
294 EINCOL = KBOT - 3*NBMPS - 1
298 EINCOL = KBOT - 3*NBMPS - 1
309 DO 220 INCOL = SINCOL, EINCOL, UINCOL
310 NDCOL = MIN( INCOL + KDU, EINCOL )
312 $ CALL DLASET( 'all
', KDU, KDU, ZERO, ONE, U, LDU )
326 DO 150 KRCOL = INCOL, MIN( EINCOL, INCOL+3*NBMPS-3, KBOT-2 )
335 MTOP = MAX( 1, ( ( KTOP-1 )-KRCOL+2 ) / 3+1 )
336 MBOT = MIN( NBMPS, ( KBOT-KRCOL ) / 3 )
338.LT..AND..EQ.
BMP22 = ( MBOTNBMPS ) ( KRCOL+3*( M22-1 ) )
345 K = KRCOL + 3*( M-1 )
346.EQ.
IF( KKTOP-1 ) THEN
347 CALL DLAQR1( 3, H( KTOP, KTOP ), LDH, SR( 2*M-1 ),
348 $ SI( 2*M-1 ), SR( 2*M ), SI( 2*M ),
351 CALL DLARFG( 3, ALPHA, V( 2, M ), 1, V( 1, M ) )
354 V( 2, M ) = H( K+2, K )
355 V( 3, M ) = H( K+3, K )
356 CALL DLARFG( 3, BETA, V( 2, M ), 1, V( 1, M ) )
363.NE..OR..NE.
IF( H( K+3, K )ZERO H( K+3, K+1 )
364.OR..EQ.
$ ZERO H( K+3, K+2 )ZERO ) THEN
379 CALL DLAQR1( 3, H( K+1, K+1 ), LDH, SR( 2*M-1 ),
380 $ SI( 2*M-1 ), SR( 2*M ), SI( 2*M ),
383 CALL DLARFG( 3, ALPHA, VT( 2 ), 1, VT( 1 ) )
384 REFSUM = VT( 1 )*( H( K+1, K )+VT( 2 )*
387 IF( ABS( H( K+2, K )-REFSUM*VT( 2 ) )+
388.GT.
$ ABS( REFSUM*VT( 3 ) )ULP*
389 $ ( ABS( H( K, K ) )+ABS( H( K+1,
390 $ K+1 ) )+ABS( H( K+2, K+2 ) ) ) ) THEN
406 H( K+1, K ) = H( K+1, K ) - REFSUM
419 K = KRCOL + 3*( M22-1 )
421.EQ.
IF( KKTOP-1 ) THEN
422 CALL DLAQR1( 2, H( K+1, K+1 ), LDH, SR( 2*M22-1 ),
423 $ SI( 2*M22-1 ), SR( 2*M22 ), SI( 2*M22 ),
426 CALL DLARFG( 2, BETA, V( 2, M22 ), 1, V( 1, M22 ) )
429 V( 2, M22 ) = H( K+2, K )
430 CALL DLARFG( 2, BETA, V( 2, M22 ), 1, V( 1, M22 ) )
445 JBOT = MIN( MAX(INCOL+KDU,NDCOL), KBOT )
446 ELSE IF( WANTT ) THEN
451 DO 40 J = MAX( KTOP, KRCOL ), JBOT
452 MEND = MIN( MBOT, ( J-KRCOL+2 ) / 3 )
454 K = KRCOL + 3*( M-1 )
455 REFSUM = V( 1, M )*( H( K+1, J )+V( 2, M )*
456 $ H( K+2, J )+V( 3, M )*H( K+3, J ) )
457 H( K+1, J ) = H( K+1, J ) - REFSUM
458 H( K+2, J ) = H( K+2, J ) - REFSUM*V( 2, M )
459 H( K+3, J ) = H( K+3, J ) - REFSUM*V( 3, M )
463 K = KRCOL + 3*( M22-1 )
464 DO 50 J = MAX( K+1, KTOP ), JBOT
465 REFSUM = V( 1, M22 )*( H( K+1, J )+V( 2, M22 )*
467 H( K+1, J ) = H( K+1, J ) - REFSUM
468 H( K+2, J ) = H( K+2, J ) - REFSUM*V( 2, M22 )
477 JTOP = MAX( KTOP, INCOL )
478 ELSE IF( WANTT ) THEN
484.NE.
IF( V( 1, M )ZERO ) THEN
485 K = KRCOL + 3*( M-1 )
486 DO 60 J = JTOP, MIN( KBOT, K+3 )
487 REFSUM = V( 1, M )*( H( J, K+1 )+V( 2, M )*
488 $ H( J, K+2 )+V( 3, M )*H( J, K+3 ) )
489 H( J, K+1 ) = H( J, K+1 ) - REFSUM
490 H( J, K+2 ) = H( J, K+2 ) - REFSUM*V( 2, M )
491 H( J, K+3 ) = H( J, K+3 ) - REFSUM*V( 3, M )
501 DO 70 J = MAX( 1, KTOP-INCOL ), KDU
502 REFSUM = V( 1, M )*( U( J, KMS+1 )+V( 2, M )*
503 $ U( J, KMS+2 )+V( 3, M )*U( J, KMS+3 ) )
504 U( J, KMS+1 ) = U( J, KMS+1 ) - REFSUM
505 U( J, KMS+2 ) = U( J, KMS+2 ) - REFSUM*V( 2, M )
506 U( J, KMS+3 ) = U( J, KMS+3 ) - REFSUM*V( 3, M )
508 ELSE IF( WANTZ ) THEN
515 REFSUM = V( 1, M )*( Z( J, K+1 )+V( 2, M )*
516 $ Z( J, K+2 )+V( 3, M )*Z( J, K+3 ) )
517 Z( J, K+1 ) = Z( J, K+1 ) - REFSUM
518 Z( J, K+2 ) = Z( J, K+2 ) - REFSUM*V( 2, M )
519 Z( J, K+3 ) = Z( J, K+3 ) - REFSUM*V( 3, M )
527 K = KRCOL + 3*( M22-1 )
529.NE.
IF( V( 1, M22 )ZERO ) THEN
530 DO 100 J = JTOP, MIN( KBOT, K+3 )
531 REFSUM = V( 1, M22 )*( H( J, K+1 )+V( 2, M22 )*
533 H( J, K+1 ) = H( J, K+1 ) - REFSUM
534 H( J, K+2 ) = H( J, K+2 ) - REFSUM*V( 2, M22 )
539 DO 110 J = MAX( 1, KTOP-INCOL ), KDU
540 REFSUM = V( 1, M22 )*( U( J, KMS+1 ) +
541 $ V( 2, M22 )*U( J, KMS+2 ) )
542 U( J, KMS+1 ) = U( J, KMS+1 ) - REFSUM
543 U( J, KMS+2 ) = U( J, KMS+2 ) -
546 ELSE IF( WANTZ ) THEN
547 DO 120 J = ILOZ, IHIZ
548 REFSUM = V( 1, M22 )*( Z( J, K+1 )+V( 2, M22 )*
550 Z( J, K+1 ) = Z( J, K+1 ) - REFSUM
551 Z( J, K+2 ) = Z( J, K+2 ) - REFSUM*V( 2, M22 )
560.LT.
IF( KRCOL+3*( MSTART-1 )KTOP )
561 $ MSTART = MSTART + 1
565.EQ.
IF( KRCOLKBOT-2 )
567 DO 130 M = MSTART, MEND
568 K = MIN( KBOT-1, KRCOL+3*( M-1 ) )
579.NE.
IF( H( K+1, K )ZERO ) THEN
580 TST1 = ABS( H( K, K ) ) + ABS( H( K+1, K+1 ) )
581.EQ.
IF( TST1ZERO ) THEN
583 $ TST1 = TST1 + ABS( H( K, K-1 ) )
585 $ TST1 = TST1 + ABS( H( K, K-2 ) )
587 $ TST1 = TST1 + ABS( H( K, K-3 ) )
589 $ TST1 = TST1 + ABS( H( K+2, K+1 ) )
591 $ TST1 = TST1 + ABS( H( K+3, K+1 ) )
593 $ TST1 = TST1 + ABS( H( K+4, K+1 ) )
595.LE.
IF( ABS( H( K+1, K ) )MAX( SMLNUM, ULP*TST1 ) )
597 H12 = MAX( ABS( H( K+1, K ) ), ABS( H( K, K+1 ) ) )
598 H21 = MIN( ABS( H( K+1, K ) ), ABS( H( K, K+1 ) ) )
599 H11 = MAX( ABS( H( K+1, K+1 ) ),
600 $ ABS( H( K, K )-H( K+1, K+1 ) ) )
601 H22 = MIN( ABS( H( K+1, K+1 ) ),
602 $ ABS( H( K, K )-H( K+1, K+1 ) ) )
604 TST2 = H22*( H11 / SCL )
606.EQ..OR..LE.
IF( TST2ZERO H21*( H12 / SCL )
607 $ MAX( SMLNUM, ULP*TST2 ) )H( K+1, K ) = ZERO
614 MEND = MIN( NBMPS, ( KBOT-KRCOL-1 ) / 3 )
615 DO 140 M = MTOP, MEND
616 K = KRCOL + 3*( M-1 )
617 REFSUM = V( 1, M )*V( 3, M )*H( K+4, K+3 )
618 H( K+4, K+1 ) = -REFSUM
619 H( K+4, K+2 ) = -REFSUM*V( 2, M )
620 H( K+4, K+3 ) = H( K+4, K+3 ) - REFSUM*V( 3, M )
639 K1 = MAX( 1, KTOP-INCOL )
640 NU = ( KDU-MAX( 0, MAX(INCOL+KDU,NDCOL)-KBOT ) ) - K1 + 1
641.NOT..OR..LT..OR.
IF( ( BLK22 ) ( INCOLKTOP )
642.GT..OR..LE..OR.
$ ( NDCOLKBOT ) ( NS2 )
656 DO 160 JCOL = MIN(MAX(INCOL+KDU,NDCOL),KBOT)+ 1, JBOT, NH
657 JLEN = MIN( NH, JBOT-JCOL+1 )
658 CALL DGEMM( 'c
', 'n
', NU, JLEN, NU, ONE, U( K1, K1 ),
659 $ LDU, H( INCOL+K1, JCOL ), LDH, ZERO, WH,
661 CALL DLAMOV( 'all
', NU, JLEN, WH, LDWH,
662 $ H( INCOL+K1, JCOL ), LDH )
667 DO 170 JROW = JTOP, MAX( KTOP, INCOL ) - 1, NV
668 JLEN = MIN( NV, MAX( KTOP, INCOL )-JROW )
669 CALL DGEMM( 'n
', 'n
', JLEN, NU, NU, ONE,
670 $ H( JROW, INCOL+K1 ), LDH, U( K1, K1 ),
671 $ LDU, ZERO, WV, LDWV )
672 CALL DLAMOV( 'all
', JLEN, NU, WV, LDWV,
673 $ H( JROW, INCOL+K1 ), LDH )
679 DO 180 JROW = ILOZ, IHIZ, NV
680 JLEN = MIN( NV, IHIZ-JROW+1 )
681 CALL DGEMM( 'n
', 'n
', JLEN, NU, NU, ONE,
682 $ Z( JROW, INCOL+K1 ), LDZ, U( K1, K1 ),
683 $ LDU, ZERO, WV, LDWV )
684 CALL DLAMOV( 'all
', JLEN, NU, WV, LDWV,
685 $ Z( JROW, INCOL+K1 ), LDZ )
703 KZS = ( J4-J2 ) - ( NS+1 )
708 DO 190 JCOL = MIN(MAX(INCOL+KDU,NDCOL),KBOT)+ 1, JBOT, NH
709 JLEN = MIN( NH, JBOT-JCOL+1 )
714 CALL DLAMOV( 'all
', KNZ, JLEN, H( INCOL+1+J2, JCOL ),
715 $ LDH, WH( KZS+1, 1 ), LDWH )
716 CALL DLASET( 'all
', KZS, JLEN, ZERO, ZERO, WH, LDWH )
720 CALL DTRMM( 'l
', 'u
', 'c
', 'n
', KNZ, JLEN, ONE,
721 $ U( J2+1, 1+KZS ), LDU, WH( KZS+1, 1 ),
726 CALL DGEMM( 'c
', 'n
', I2, JLEN, J2, ONE, U, LDU,
727 $ H( INCOL+1, JCOL ), LDH, ONE, WH, LDWH )
731 CALL DLAMOV( 'all
', J2, JLEN, H( INCOL+1, JCOL ), LDH,
732 $ WH( I2+1, 1 ), LDWH )
736 CALL DTRMM( 'l
', 'l
', 'c
', 'n
', J2, JLEN, ONE,
737 $ U( 1, I2+1 ), LDU, WH( I2+1, 1 ), LDWH )
741 CALL DGEMM( 'c
', 'n', i4-i2, jlen, j4-j2, one,
742 $ u( j2+1, i2+1 ), ldu,
744 $ wh( i2+1, 1 ), ldwh )
748 CALL dlamov(
'ALL', kdu, jlen, wh, ldwh,
749 $ h( incol+1, jcol ), ldh )
754 DO 200 jrow = jtop,
max( incol, ktop ) - 1, nv
755 jlen =
min( nv,
max( incol, ktop )-jrow )
760 CALL dlamov(
'ALL', jlen, knz, h( jrow, incol+1+j2 ),
762 CALL dlaset(
'ALL', jlen, kzs, zero, zero, wv, ldwv )
766 CALL dtrmm(
'R',
'U',
'N',
'N', jlen, knz, one,
767 $ u( j2+1, 1+kzs ), ldu, wv( 1, 1+kzs ),
772 CALL dgemm(
'N',
'N', jlen, i2, j2, one,
773 $ h( jrow, incol+1 ), ldh, u, ldu, one, wv,
778 CALL dlamov(
'ALL', jlen
779 $ wv( 1, 1+i2 ), ldwv )
783 CALL dtrmm(
'R',
'L',
'N',
'N', jlen
784 $ u( 1, i2+1 ), ldu, wv( 1, 1+i2 ), ldwv )
788 CALL dgemm(
'N',
'N', jlen, i4-i2, j4-j2, one,
789 $ h( jrow, incol+1+j2 ), ldh,
790 $ u( j2+1, i2+1 ), ldu, one, wv( 1, 1+i2 ),
795 CALL dlamov(
'ALL', jlen, kdu, wv, ldwv,
796 $ h( jrow, incol+1 ), ldh )
802 DO 210 jrow = iloz, ihiz, nv
803 jlen =
min( nv, ihiz-jrow+1 )
808 CALL dlamov(
'ALL', jlen, knz,
809 $ z( jrow, incol+1+j2 ), ldz,
810 $ wv( 1, 1+kzs ), ldwv )
814 CALL dlaset(
'ALL', jlen, kzs, zero, zero, wv,
816 CALL dtrmm(
'R',
'U',
'N',
'N', jlen, knz, one,
817 $ u( j2+1, 1+kzs ), ldu, wv( 1, 1+kzs ),
822 CALL dgemm(
'N',
'N', jlen, i2, j2, one,
823 $ z( jrow, incol+1 ), ldz, u, ldu, one,
828 CALL dlamov(
'ALL', jlen, j2, z( jrow, incol+1 ),
829 $ ldz, wv( 1, 1+i2 ), ldwv )
833 CALL dtrmm(
'R',
'L',
'N',
'N', jlen, i4-i2, one,
834 $ u( 1, i2+1 ), ldu, wv( 1, 1+i2 ),
839 CALL dgemm(
'N',
'N', jlen, i4-i2, j4-j2, one,
840 $ z( jrow, incol+1+j2 ), ldz,
841 $ u( j2+1, i2+1 ), ldu, one,
842 $ wv( 1, 1+i2 ), ldwv )
846 CALL dlamov(
'ALL', jlen, kdu, wv, ldwv,
847 $ z( jrow, incol+1 ), ldz )
857 $
CALL dlaset(
'Lower', n-4, n-4, zero, zero, h(5,1), ldh )