slaqr5(l) - Linux man page
Name
Synopsis
- SUBROUTINE SLAQR5(
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
REAL
H( LDH, * ), SI( * ), SR( * ), U( LDU, * ), V( LDV, * ), WH( LDWH, * ), WV( LDWV, * ), Z( LDZ, * )
REAL
ZERO, ONE
PARAMETER
( ZERO = 0.0e0, ONE = 1.0e0 )
REAL
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
REAL
SLAMCH
EXTERNAL
SLAMCH
INTRINSIC
ABS, MAX, MIN, MOD, REAL
REAL
VT( 3 )
EXTERNAL
SGEMM, SLABAD, SLACPY, SLAQR1, SLARFG, SLASET, STRMM
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
= SLAMCH( 'SAFE MINIMUM' )
SAFMAX
= ONE / SAFMIN
CALL
SLABAD( SAFMIN, SAFMAX )
ULP
= SLAMCH( 'PRECISION' )
SMLNUM
= SAFMIN*( REAL( 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 SLASET( '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
SLAQR1( 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
SLARFG( 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
SLARFG( 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
SLAQR1( 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
SLARFG( 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
SLAQR1( 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
SLARFG( 2, BETA, V( 2, M22 ), 1, V( 1, M22 ) )
ELSE
BETA
= H( K+1, K )
V(
2, M22 ) = H( K+2, K )
CALL
SLARFG( 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
SGEMM( 'C', 'N', NU, JLEN, NU, ONE, U( K1, K1 ), LDU, H( INCOL+K1, JCOL ), LDH, ZERO, WH, LDWH )
CALL
SLACPY( '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
SGEMM( 'N', 'N', JLEN, NU, NU, ONE, H( JROW, INCOL+K1 ), LDH, U( K1, K1 ), LDU, ZERO, WV, LDWV )
CALL
SLACPY( '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
SGEMM( 'N', 'N', JLEN, NU, NU, ONE, Z( JROW, INCOL+K1 ), LDZ, U( K1, K1 ), LDU, ZERO, WV, LDWV )
CALL
SLACPY( '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
SLACPY( 'ALL', KNZ, JLEN, H( INCOL+1+J2, JCOL ), LDH, WH( KZS+1, 1 ), LDWH )
CALL
SLASET( 'ALL', KZS, JLEN, ZERO, ZERO, WH, LDWH )
CALL
STRMM( 'L', 'U', 'C', 'N', KNZ, JLEN, ONE, U( J2+1, 1+KZS ), LDU, WH( KZS+1, 1 ), LDWH )
CALL
SGEMM( 'C', 'N', I2, JLEN, J2, ONE, U, LDU, H( INCOL+1, JCOL ), LDH, ONE, WH, LDWH )
CALL
SLACPY( 'ALL', J2, JLEN, H( INCOL+1, JCOL ), LDH, WH( I2+1, 1 ), LDWH )
CALL
STRMM( 'L', 'L', 'C', 'N', J2, JLEN, ONE, U( 1, I2+1 ), LDU, WH( I2+1, 1 ), LDWH )
CALL
SGEMM( '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
SLACPY( '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
SLACPY( 'ALL', JLEN, KNZ, H( JROW, INCOL+1+J2 ), LDH, WV( 1, 1+KZS ), LDWV )
CALL
SLASET( 'ALL', JLEN, KZS, ZERO, ZERO, WV, LDWV )
CALL
STRMM( 'R', 'U', 'N', 'N', JLEN, KNZ, ONE, U( J2+1, 1+KZS ), LDU, WV( 1, 1+KZS ), LDWV )
CALL
SGEMM( 'N', 'N', JLEN, I2, J2, ONE, H( JROW, INCOL+1 ), LDH, U, LDU, ONE, WV, LDWV )
CALL
SLACPY( 'ALL', JLEN, J2, H( JROW, INCOL+1 ), LDH, WV( 1, 1+I2 ), LDWV )
CALL
STRMM( 'R', 'L', 'N', 'N', JLEN, I4-I2, ONE, U( 1, I2+1 ), LDU, WV( 1, 1+I2 ), LDWV )
CALL
SGEMM( '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
SLACPY( '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
SLACPY( 'ALL', JLEN, KNZ, Z( JROW, INCOL+1+J2 ), LDZ, WV( 1, 1+KZS ), LDWV )
CALL
SLASET( 'ALL', JLEN, KZS, ZERO, ZERO, WV, LDWV )
CALL
STRMM( 'R', 'U', 'N', 'N', JLEN, KNZ, ONE, U( J2+1, 1+KZS ), LDU, WV( 1, 1+KZS ), LDWV )
CALL
SGEMM( 'N', 'N', JLEN, I2, J2, ONE, Z( JROW, INCOL+1 ), LDZ, U, LDU, ONE, WV, LDWV )
CALL
SLACPY( 'ALL', JLEN, J2, Z( JROW, INCOL+1 ), LDZ, WV( 1, 1+I2 ), LDWV )
CALL
STRMM( 'R', 'L', 'N', 'N', JLEN, I4-I2, ONE, U( 1, I2+1 ), LDU, WV( 1, 1+I2 ), LDWV )
CALL
SGEMM( '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
SLACPY( 'ALL', JLEN, KDU, WV, LDWV, Z( JROW, INCOL+1 ), LDZ )
210
CONTINUE
END
IF
END
IF
END
IF
220
CONTINUE
END