dlaqr5(l) - Linux man page
Name
Synopsis
- SUBROUTINE DLAQR5(
WANTT, WANTZ, KACC22, N, KTOP, KBOT, NSHFTS, SR, SI, H, LDH, ILOZ, IHIZ, Z, LDZ, V, LDV, U, LDU, NV, WV, LDWV, NH, WH, LDWH )
INTEGER
IHIZ, ILOZ, KACC22, KBOT, KTOP, LDH, LDU, LDV, LDWH, LDWV, LDZ, N, NH, NSHFTS, NV
LOGICAL
WANTT, WANTZ
DOUBLE
PRECISION H( LDH, * ), SI( * ), SR( * ), U( LDU, * ), V( LDV, * ), WH( LDWH, * ), WV( LDWV, * ), Z( LDZ, * )
DOUBLE
PRECISION ZERO, ONE
PARAMETER
( ZERO = 0.0d0, ONE = 1.0d0 )
DOUBLE
PRECISION ALPHA, BETA, H11, H12, H21, H22, REFSUM, SAFMAX, SAFMIN, SCL, SMLNUM, SWAP, TST1, TST2, ULP
INTEGER
I, I2, I4, INCOL, J, J2, J4, JBOT, JCOL, JLEN, JROW, JTOP, K, K1, KDU, KMS, KNZ, KRCOL, KZS, M, M22, MBOT, MEND, MSTART, MTOP, NBMPS, NDCOL, NS, NU
LOGICAL
ACCUM, BLK22, BMP22
DOUBLE
PRECISION DLAMCH
EXTERNAL
DLAMCH
INTRINSIC
ABS, DBLE, MAX, MIN, MOD
DOUBLE
PRECISION VT( 3 )
EXTERNAL
DGEMM, DLABAD, DLACPY, DLAQR1, DLARFG, DLASET, DTRMM
IF(
NSHFTS.LT.2 ) RETURN
IF(
KTOP.GE.KBOT ) RETURN
DO
10 I = 1, NSHFTS - 2, 2
IF(
SI( I ).NE.-SI( I+1 ) ) THEN
SWAP
= SR( I )
SR(
I ) = SR( I+1 )
SR(
I+1 ) = SR( I+2 )
SR(
I+2 ) = SWAP
SWAP
= SI( I )
SI(
I ) = SI( I+1 )
SI(
I+1 ) = SI( I+2 )
SI(
I+2 ) = SWAP
END
IF
10
CONTINUE
NS
= NSHFTS - MOD( NSHFTS, 2 )
SAFMIN
= DLAMCH( 'SAFE MINIMUM' )
SAFMAX
= ONE / SAFMIN
CALL
DLABAD( SAFMIN, SAFMAX )
ULP
= DLAMCH( 'PRECISION' )
SMLNUM
= SAFMIN*( DBLE( N ) / ULP )
ACCUM
= ( KACC22.EQ.1 ) .OR. ( KACC22.EQ.2 )
BLK22
= ( NS.GT.2 ) .AND. ( KACC22.EQ.2 )
IF(
KTOP+2.LE.KBOT ) H( KTOP+2, KTOP ) = ZERO
NBMPS
= NS / 2
KDU
= 6*NBMPS - 3
DO
220 INCOL = 3*( 1-NBMPS ) + KTOP - 1, KBOT - 2, 3*NBMPS - 2
NDCOL
= INCOL + KDU
IF(
ACCUM ) CALL DLASET( 'ALL', KDU, KDU, ZERO, ONE, U, LDU )
DO
150 KRCOL = INCOL, MIN( INCOL+3*NBMPS-3, KBOT-2 )
MTOP
= MAX( 1, ( ( KTOP-1 )-KRCOL+2 ) / 3+1 )
MBOT
= MIN( NBMPS, ( KBOT-KRCOL ) / 3 )
M22
= MBOT + 1
BMP22
= ( MBOT.LT.NBMPS ) .AND. ( KRCOL+3*( M22-1 ) ).EQ. ( KBOT-2 )
DO
20 M = MTOP, MBOT
K
= KRCOL + 3*( M-1 )
IF(
K.EQ.KTOP-1 ) THEN
CALL
DLAQR1( 3, H( KTOP, KTOP ), LDH, SR( 2*M-1 ), SI( 2*M-1 ), SR( 2*M ), SI( 2*M ), V( 1, M ) )
ALPHA
= V( 1, M )
CALL
DLARFG( 3, ALPHA, V( 2, M ), 1, V( 1, M ) )
ELSE
BETA
= H( K+1, K )
V(
2, M ) = H( K+2, K )
V(
3, M ) = H( K+3, K )
CALL
DLARFG( 3, BETA, V( 2, M ), 1, V( 1, M ) )
IF(
H( K+3, K ).NE.ZERO .OR. H( K+3, K+1 ).NE. ZERO .OR. H( K+3, K+2 ).EQ.ZERO ) THEN
H(
K+1, K ) = BETA
H(
K+2, K ) = ZERO
H(
K+3, K ) = ZERO
ELSE
CALL
DLAQR1( 3, H( K+1, K+1 ), LDH, SR( 2*M-1 ), SI( 2*M-1 ), SR( 2*M ), SI( 2*M ), VT )
ALPHA
= VT( 1 )
CALL
DLARFG( 3, ALPHA, VT( 2 ), 1, VT( 1 ) )
REFSUM
= VT( 1 )*( H( K+1, K )+VT( 2 )* H( K+2, K ) )
IF(
ABS( H( K+2, K )-REFSUM*VT( 2 ) )+ ABS( REFSUM*VT( 3 ) ).GT.ULP* ( ABS( H( K, K ) )+ABS( H( K+1, K+1 ) )+ABS( H( K+2, K+2 ) ) ) ) THEN
H(
K+1, K ) = BETA
H(
K+2, K ) = ZERO
H(
K+3, K ) = ZERO
ELSE
H(
K+1, K ) = H( K+1, K ) - REFSUM
H(
K+2, K ) = ZERO
H(
K+3, K ) = ZERO
V(
1, M ) = VT( 1 )
V(
2, M ) = VT( 2 )
V(
3, M ) = VT( 3 )
END
IF
END
IF
END
IF
20
CONTINUE
K
= KRCOL + 3*( M22-1 )
IF(
BMP22 ) THEN
IF(
K.EQ.KTOP-1 ) THEN
CALL
DLAQR1( 2, H( K+1, K+1 ), LDH, SR( 2*M22-1 ), SI( 2*M22-1 ), SR( 2*M22 ), SI( 2*M22 ), V( 1, M22 ) )
BETA
= V( 1, M22 )
CALL
DLARFG( 2, BETA, V( 2, M22 ), 1, V( 1, M22 ) )
ELSE
BETA
= H( K+1, K )
V(
2, M22 ) = H( K+2, K )
CALL
DLARFG( 2, BETA, V( 2, M22 ), 1, V( 1, M22 ) )
H(
K+1, K ) = BETA
H(
K+2, K ) = ZERO
END
IF
END
IF
IF(
ACCUM ) THEN
JBOT
= MIN( NDCOL, KBOT )
ELSE
IF( WANTT ) THEN
JBOT
= N
ELSE
JBOT
= KBOT
END
IF
DO
40 J = MAX( KTOP, KRCOL ), JBOT
MEND
= MIN( MBOT, ( J-KRCOL+2 ) / 3 )
DO
30 M = MTOP, MEND
K
= KRCOL + 3*( M-1 )
REFSUM
= V( 1, M )*( H( K+1, J )+V( 2, M )* H( K+2, J )+V( 3, M )*H( K+3, J ) )
H(
K+1, J ) = H( K+1, J ) - REFSUM
H(
K+2, J ) = H( K+2, J ) - REFSUM*V( 2, M )
H(
K+3, J ) = H( K+3, J ) - REFSUM*V( 3, M )
30
CONTINUE
40
CONTINUE
IF(
BMP22 ) THEN
K
= KRCOL + 3*( M22-1 )
DO
50 J = MAX( K+1, KTOP ), JBOT
REFSUM
= V( 1, M22 )*( H( K+1, J )+V( 2, M22 )* H( K+2, J ) )
H(
K+1, J ) = H( K+1, J ) - REFSUM
H(
K+2, J ) = H( K+2, J ) - REFSUM*V( 2, M22 )
50
CONTINUE
END
IF
IF(
ACCUM ) THEN
JTOP
= MAX( KTOP, INCOL )
ELSE
IF( WANTT ) THEN
JTOP
= 1
ELSE
JTOP
= KTOP
END
IF
DO
90 M = MTOP, MBOT
IF(
V( 1, M ).NE.ZERO ) THEN
K
= KRCOL + 3*( M-1 )
DO
60 J = JTOP, MIN( KBOT, K+3 )
REFSUM
= V( 1, M )*( H( J, K+1 )+V( 2, M )* H( J, K+2 )+V( 3, M )*H( J, K+3 ) )
H(
J, K+1 ) = H( J, K+1 ) - REFSUM
H(
J, K+2 ) = H( J, K+2 ) - REFSUM*V( 2, M )
H(
J, K+3 ) = H( J, K+3 ) - REFSUM*V( 3, M )
60
CONTINUE
IF(
ACCUM ) THEN
KMS
= K - INCOL
DO
70 J = MAX( 1, KTOP-INCOL ), KDU
REFSUM
= V( 1, M )*( U( J, KMS+1 )+V( 2, M )* U( J, KMS+2 )+V( 3, M )*U( J, KMS+3 ) )
U(
J, KMS+1 ) = U( J, KMS+1 ) - REFSUM
U(
J, KMS+2 ) = U( J, KMS+2 ) - REFSUM*V( 2, M )
U(
J, KMS+3 ) = U( J, KMS+3 ) - REFSUM*V( 3, M )
70
CONTINUE
ELSE
IF( WANTZ ) THEN
DO
80 J = ILOZ, IHIZ
REFSUM
= V( 1, M )*( Z( J, K+1 )+V( 2, M )* Z( J, K+2 )+V( 3, M )*Z( J, K+3 ) )
Z(
J, K+1 ) = Z( J, K+1 ) - REFSUM
Z(
J, K+2 ) = Z( J, K+2 ) - REFSUM*V( 2, M )
Z(
J, K+3 ) = Z( J, K+3 ) - REFSUM*V( 3, M )
80
CONTINUE
END
IF
END
IF
90
CONTINUE
K
= KRCOL + 3*( M22-1 )
IF(
BMP22 .AND. ( V( 1, M22 ).NE.ZERO ) ) THEN
DO
100 J = JTOP, MIN( KBOT, K+3 )
REFSUM
= V( 1, M22 )*( H( J, K+1 )+V( 2, M22 )* H( J, K+2 ) )
H(
J, K+1 ) = H( J, K+1 ) - REFSUM
H(
J, K+2 ) = H( J, K+2 ) - REFSUM*V( 2, M22 )
100
CONTINUE
IF(
ACCUM ) THEN
KMS
= K - INCOL
DO
110 J = MAX( 1, KTOP-INCOL ), KDU
REFSUM
= V( 1, M22 )*( U( J, KMS+1 )+V( 2, M22 )* U( J, KMS+2 ) )
U(
J, KMS+1 ) = U( J, KMS+1 ) - REFSUM
U(
J, KMS+2 ) = U( J, KMS+2 ) - REFSUM*V( 2, M22 )
110
CONTINUE
ELSE
IF( WANTZ ) THEN
DO
120 J = ILOZ, IHIZ
REFSUM
= V( 1, M22 )*( Z( J, K+1 )+V( 2, M22 )* Z( J, K+2 ) )
Z(
J, K+1 ) = Z( J, K+1 ) - REFSUM
Z(
J, K+2 ) = Z( J, K+2 ) - REFSUM*V( 2, M22 )
120
CONTINUE
END
IF
END
IF
MSTART
= MTOP
IF(
KRCOL+3*( MSTART-1 ).LT.KTOP ) MSTART = MSTART + 1
MEND
= MBOT
IF(
BMP22 ) MEND = MEND + 1
IF(
KRCOL.EQ.KBOT-2 ) MEND = MEND + 1
DO
130 M = MSTART, MEND
K
= MIN( KBOT-1, KRCOL+3*( M-1 ) )
IF(
H( K+1, K ).NE.ZERO ) THEN
TST1
= ABS( H( K, K ) ) + ABS( H( K+1, K+1 ) )
IF(
TST1.EQ.ZERO ) THEN
IF(
K.GE.KTOP+1 ) TST1 = TST1 + ABS( H( K, K-1 ) )
IF(
K.GE.KTOP+2 ) TST1 = TST1 + ABS( H( K, K-2 ) )
IF(
K.GE.KTOP+3 ) TST1 = TST1 + ABS( H( K, K-3 ) )
IF(
K.LE.KBOT-2 ) TST1 = TST1 + ABS( H( K+2, K+1 ) )
IF(
K.LE.KBOT-3 ) TST1 = TST1 + ABS( H( K+3, K+1 ) )
IF(
K.LE.KBOT-4 ) TST1 = TST1 + ABS( H( K+4, K+1 ) )
END
IF
IF(
ABS( H( K+1, K ) ).LE.MAX( SMLNUM, ULP*TST1 ) ) THEN
H12
= MAX( ABS( H( K+1, K ) ), ABS( H( K, K+1 ) ) )
H21
= MIN( ABS( H( K+1, K ) ), ABS( H( K, K+1 ) ) )
H11
= MAX( ABS( H( K+1, K+1 ) ), ABS( H( K, K )-H( K+1, K+1 ) ) )
H22
= MIN( ABS( H( K+1, K+1 ) ), ABS( H( K, K )-H( K+1, K+1 ) ) )
SCL
= H11 + H12
TST2
= H22*( H11 / SCL )
IF(
TST2.EQ.ZERO .OR. H21*( H12 / SCL ).LE. MAX( SMLNUM, ULP*TST2 ) )H( K+1, K ) = ZERO
END
IF
END
IF
130
CONTINUE
MEND
= MIN( NBMPS, ( KBOT-KRCOL-1 ) / 3 )
DO
140 M = MTOP, MEND
K
= KRCOL + 3*( M-1 )
REFSUM
= V( 1, M )*V( 3, M )*H( K+4, K+3 )
H(
K+4, K+1 ) = -REFSUM
H(
K+4, K+2 ) = -REFSUM*V( 2, M )
H(
K+4, K+3 ) = H( K+4, K+3 ) - REFSUM*V( 3, M )
140
CONTINUE
150
CONTINUE
IF(
ACCUM ) THEN
IF(
WANTT ) THEN
JTOP
= 1
JBOT
= N
ELSE
JTOP
= KTOP
JBOT
= KBOT
END
IF
IF(
( .NOT.BLK22 ) .OR. ( INCOL.LT.KTOP ) .OR. ( NDCOL.GT.KBOT ) .OR. ( NS.LE.2 ) ) THEN
K1
= MAX( 1, KTOP-INCOL )
NU
= ( KDU-MAX( 0, NDCOL-KBOT ) ) - K1 + 1
DO
160 JCOL = MIN( NDCOL, KBOT ) + 1, JBOT, NH
JLEN
= MIN( NH, JBOT-JCOL+1 )
CALL
DGEMM( 'C', 'N', NU, JLEN, NU, ONE, U( K1, K1 ), LDU, H( INCOL+K1, JCOL ), LDH, ZERO, WH, LDWH )
CALL
DLACPY( 'ALL', NU, JLEN, WH, LDWH, H( INCOL+K1, JCOL ), LDH )
160
CONTINUE
DO
170 JROW = JTOP, MAX( KTOP, INCOL ) - 1, NV
JLEN
= MIN( NV, MAX( KTOP, INCOL )-JROW )
CALL
DGEMM( 'N', 'N', JLEN, NU, NU, ONE, H( JROW, INCOL+K1 ), LDH, U( K1, K1 ), LDU, ZERO, WV, LDWV )
CALL
DLACPY( 'ALL', JLEN, NU, WV, LDWV, H( JROW, INCOL+K1 ), LDH )
170
CONTINUE
IF(
WANTZ ) THEN
DO
180 JROW = ILOZ, IHIZ, NV
JLEN
= MIN( NV, IHIZ-JROW+1 )
CALL
DGEMM( 'N', 'N', JLEN, NU, NU, ONE, Z( JROW, INCOL+K1 ), LDZ, U( K1, K1 ), LDU, ZERO, WV, LDWV )
CALL
DLACPY( 'ALL', JLEN, NU, WV, LDWV, Z( JROW, INCOL+K1 ), LDZ )
180
CONTINUE
END
IF
ELSE
I2
= ( KDU+1 ) / 2
I4
= KDU
J2
= I4 - I2
J4
= KDU
KZS
= ( J4-J2 ) - ( NS+1 )
KNZ
= NS + 1
DO
190 JCOL = MIN( NDCOL, KBOT ) + 1, JBOT, NH
JLEN
= MIN( NH, JBOT-JCOL+1 )
CALL
DLACPY( 'ALL', KNZ, JLEN, H( INCOL+1+J2, JCOL ), LDH, WH( KZS+1, 1 ), LDWH )
CALL
DLASET( 'ALL', KZS, JLEN, ZERO, ZERO, WH, LDWH )
CALL
DTRMM( 'L', 'U', 'C', 'N', KNZ, JLEN, ONE, U( J2+1, 1+KZS ), LDU, WH( KZS+1, 1 ), LDWH )
CALL
DGEMM( 'C', 'N', I2, JLEN, J2, ONE, U, LDU, H( INCOL+1, JCOL ), LDH, ONE, WH, LDWH )
CALL
DLACPY( 'ALL', J2, JLEN, H( INCOL+1, JCOL ), LDH, WH( I2+1, 1 ), LDWH )
CALL
DTRMM( 'L', 'L', 'C', 'N', J2, JLEN, ONE, U( 1, I2+1 ), LDU, WH( I2+1, 1 ), LDWH )
CALL
DGEMM( 'C', 'N', I4-I2, JLEN, J4-J2, ONE, U( J2+1, I2+1 ), LDU, H( INCOL+1+J2, JCOL ), LDH, ONE, WH( I2+1, 1 ), LDWH )
CALL
DLACPY( 'ALL', KDU, JLEN, WH, LDWH, H( INCOL+1, JCOL ), LDH )
190
CONTINUE
DO
200 JROW = JTOP, MAX( INCOL, KTOP ) - 1, NV
JLEN
= MIN( NV, MAX( INCOL, KTOP )-JROW )
CALL
DLACPY( 'ALL', JLEN, KNZ, H( JROW, INCOL+1+J2 ), LDH, WV( 1, 1+KZS ), LDWV )
CALL
DLASET( 'ALL', JLEN, KZS, ZERO, ZERO, WV, LDWV )
CALL
DTRMM( 'R', 'U', 'N', 'N', JLEN, KNZ, ONE, U( J2+1, 1+KZS ), LDU, WV( 1, 1+KZS ), LDWV )
CALL
DGEMM( 'N', 'N', JLEN, I2, J2, ONE, H( JROW, INCOL+1 ), LDH, U, LDU, ONE, WV, LDWV )
CALL
DLACPY( 'ALL', JLEN, J2, H( JROW, INCOL+1 ), LDH, WV( 1, 1+I2 ), LDWV )
CALL
DTRMM( 'R', 'L', 'N', 'N', JLEN, I4-I2, ONE, U( 1, I2+1 ), LDU, WV( 1, 1+I2 ), LDWV )
CALL
DGEMM( 'N', 'N', JLEN, I4-I2, J4-J2, ONE, H( JROW, INCOL+1+J2 ), LDH, U( J2+1, I2+1 ), LDU, ONE, WV( 1, 1+I2 ), LDWV )
CALL
DLACPY( 'ALL', JLEN, KDU, WV, LDWV, H( JROW, INCOL+1 ), LDH )
200
CONTINUE
IF(
WANTZ ) THEN
DO
210 JROW = ILOZ, IHIZ, NV
JLEN
= MIN( NV, IHIZ-JROW+1 )
CALL
DLACPY( 'ALL', JLEN, KNZ, Z( JROW, INCOL+1+J2 ), LDZ, WV( 1, 1+KZS ), LDWV )
CALL
DLASET( 'ALL', JLEN, KZS, ZERO, ZERO, WV, LDWV )
CALL
DTRMM( 'R', 'U', 'N', 'N', JLEN, KNZ, ONE, U( J2+1, 1+KZS ), LDU, WV( 1, 1+KZS ), LDWV )
CALL
DGEMM( 'N', 'N', JLEN, I2, J2, ONE, Z( JROW, INCOL+1 ), LDZ, U, LDU, ONE, WV, LDWV )
CALL
DLACPY( 'ALL', JLEN, J2, Z( JROW, INCOL+1 ), LDZ, WV( 1, 1+I2 ), LDWV )
CALL
DTRMM( 'R', 'L', 'N', 'N', JLEN, I4-I2, ONE, U( 1, I2+1 ), LDU, WV( 1, 1+I2 ), LDWV )
CALL
DGEMM( 'N', 'N', JLEN, I4-I2, J4-J2, ONE, Z( JROW, INCOL+1+J2 ), LDZ, U( J2+1, I2+1 ), LDU, ONE, WV( 1, 1+I2 ), LDWV )
CALL
DLACPY( 'ALL', JLEN, KDU, WV, LDWV, Z( JROW, INCOL+1 ), LDZ )
210
CONTINUE
END
IF
END
IF
END
IF
220
CONTINUE
END