zlaqr5(l) - Linux man page
Name
Synopsis
- SUBROUTINE ZLAQR5(
WANTT, WANTZ, KACC22, N, KTOP, KBOT, NSHFTS, S, 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
COMPLEX*16
H( LDH, * ), S( * ), U( LDU, * ), V( LDV, * ), WH( LDWH, * ), WV( LDWV, * ), Z( LDZ, * )
COMPLEX*16
ZERO, ONE
PARAMETER
( ZERO = ( 0.0d0, 0.0d0 ), ONE = ( 1.0d0, 0.0d0 ) )
DOUBLE
PRECISION RZERO, RONE
PARAMETER
( RZERO = 0.0d0, RONE = 1.0d0 )
COMPLEX*16
ALPHA, BETA, CDUM, REFSUM
DOUBLE
PRECISION H11, H12, H21, H22, SAFMAX, SAFMIN, SCL, SMLNUM, TST1, TST2, ULP
INTEGER
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, DCONJG, DIMAG, MAX, MIN, MOD
COMPLEX*16
VT( 3 )
EXTERNAL
DLABAD, ZGEMM, ZLACPY, ZLAQR1, ZLARFG, ZLASET, ZTRMM
DOUBLE
PRECISION CABS1
CABS1(
CDUM ) = ABS( DBLE( CDUM ) ) + ABS( DIMAG( CDUM ) )
IF(
NSHFTS.LT.2 ) RETURN
IF(
KTOP.GE.KBOT ) RETURN
NS
= NSHFTS - MOD( NSHFTS, 2 )
SAFMIN
= DLAMCH( 'SAFE MINIMUM' )
SAFMAX
= RONE / 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
210 INCOL = 3*( 1-NBMPS ) + KTOP - 1, KBOT - 2, 3*NBMPS - 2
NDCOL
= INCOL + KDU
IF(
ACCUM ) CALL ZLASET( 'ALL', KDU, KDU, ZERO, ONE, U, LDU )
DO
140 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
10 M = MTOP, MBOT
K
= KRCOL + 3*( M-1 )
IF(
K.EQ.KTOP-1 ) THEN
CALL
ZLAQR1( 3, H( KTOP, KTOP ), LDH, S( 2*M-1 ), S( 2*M ), V( 1, M ) )
ALPHA
= V( 1, M )
CALL
ZLARFG( 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
ZLARFG( 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
ZLAQR1( 3, H( K+1, K+1 ), LDH, S( 2*M-1 ), S( 2*M ), VT )
ALPHA
= VT( 1 )
CALL
ZLARFG( 3, ALPHA, VT( 2 ), 1, VT( 1 ) )
REFSUM
= DCONJG( VT( 1 ) )* ( H( K+1, K )+DCONJG( VT( 2 ) )* H( K+2, K ) )
IF(
CABS1( H( K+2, K )-REFSUM*VT( 2 ) )+ CABS1( REFSUM*VT( 3 ) ).GT.ULP* ( CABS1( H( K, K ) )+CABS1( H( K+1, K+1 ) )+CABS1( 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
10
CONTINUE
K
= KRCOL + 3*( M22-1 )
IF(
BMP22 ) THEN
IF(
K.EQ.KTOP-1 ) THEN
CALL
ZLAQR1( 2, H( K+1, K+1 ), LDH, S( 2*M22-1 ), S( 2*M22 ), V( 1, M22 ) )
BETA
= V( 1, M22 )
CALL
ZLARFG( 2, BETA, V( 2, M22 ), 1, V( 1, M22 ) )
ELSE
BETA
= H( K+1, K )
V(
2, M22 ) = H( K+2, K )
CALL
ZLARFG( 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
30 J = MAX( KTOP, KRCOL ), JBOT
MEND
= MIN( MBOT, ( J-KRCOL+2 ) / 3 )
DO
20 M = MTOP, MEND
K
= KRCOL + 3*( M-1 )
REFSUM
= DCONJG( V( 1, M ) )* ( H( K+1, J )+DCONJG( V( 2, M ) )* H( K+2, J )+DCONJG( 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 )
20
CONTINUE
30
CONTINUE
IF(
BMP22 ) THEN
K
= KRCOL + 3*( M22-1 )
DO
40 J = MAX( K+1, KTOP ), JBOT
REFSUM
= DCONJG( V( 1, M22 ) )* ( H( K+1, J )+DCONJG( 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 )
40
CONTINUE
END
IF
IF(
ACCUM ) THEN
JTOP
= MAX( KTOP, INCOL )
ELSE
IF( WANTT ) THEN
JTOP
= 1
ELSE
JTOP
= KTOP
END
IF
DO
80 M = MTOP, MBOT
IF(
V( 1, M ).NE.ZERO ) THEN
K
= KRCOL + 3*( M-1 )
DO
50 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*DCONJG( V( 2, M ) )
H(
J, K+3 ) = H( J, K+3 ) - REFSUM*DCONJG( V( 3, M ) )
50
CONTINUE
IF(
ACCUM ) THEN
KMS
= K - INCOL
DO
60 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*DCONJG( V( 2, M ) )
U(
J, KMS+3 ) = U( J, KMS+3 ) - REFSUM*DCONJG( V( 3, M ) )
60
CONTINUE
ELSE
IF( WANTZ ) THEN
DO
70 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*DCONJG( V( 2, M ) )
Z(
J, K+3 ) = Z( J, K+3 ) - REFSUM*DCONJG( V( 3, M ) )
70
CONTINUE
END
IF
END
IF
80
CONTINUE
K
= KRCOL + 3*( M22-1 )
IF(
BMP22 .AND. ( V( 1, M22 ).NE.ZERO ) ) THEN
DO
90 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*DCONJG( V( 2, M22 ) )
90
CONTINUE
IF(
ACCUM ) THEN
KMS
= K - INCOL
DO
100 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*DCONJG( V( 2, M22 ) )
100
CONTINUE
ELSE
IF( WANTZ ) THEN
DO
110 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*DCONJG( V( 2, M22 ) )
110
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
120 M = MSTART, MEND
K
= MIN( KBOT-1, KRCOL+3*( M-1 ) )
IF(
H( K+1, K ).NE.ZERO ) THEN
TST1
= CABS1( H( K, K ) ) + CABS1( H( K+1, K+1 ) )
IF(
TST1.EQ.RZERO ) THEN
IF(
K.GE.KTOP+1 ) TST1 = TST1 + CABS1( H( K, K-1 ) )
IF(
K.GE.KTOP+2 ) TST1 = TST1 + CABS1( H( K, K-2 ) )
IF(
K.GE.KTOP+3 ) TST1 = TST1 + CABS1( H( K, K-3 ) )
IF(
K.LE.KBOT-2 ) TST1 = TST1 + CABS1( H( K+2, K+1 ) )
IF(
K.LE.KBOT-3 ) TST1 = TST1 + CABS1( H( K+3, K+1 ) )
IF(
K.LE.KBOT-4 ) TST1 = TST1 + CABS1( H( K+4, K+1 ) )
END
IF
IF(
CABS1( H( K+1, K ) ).LE.MAX( SMLNUM, ULP*TST1 ) ) THEN
H12
= MAX( CABS1( H( K+1, K ) ), CABS1( H( K, K+1 ) ) )
H21
= MIN( CABS1( H( K+1, K ) ), CABS1( H( K, K+1 ) ) )
H11
= MAX( CABS1( H( K+1, K+1 ) ), CABS1( H( K, K )-H( K+1, K+1 ) ) )
H22
= MIN( CABS1( H( K+1, K+1 ) ), CABS1( H( K, K )-H( K+1, K+1 ) ) )
SCL
= H11 + H12
TST2
= H22*( H11 / SCL )
IF(
TST2.EQ.RZERO .OR. H21*( H12 / SCL ).LE. MAX( SMLNUM, ULP*TST2 ) )H( K+1, K ) = ZERO
END
IF
END
IF
120
CONTINUE
MEND
= MIN( NBMPS, ( KBOT-KRCOL-1 ) / 3 )
DO
130 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*DCONJG( V( 2, M ) )
H(
K+4, K+3 ) = H( K+4, K+3 ) - REFSUM*DCONJG( V( 3, M ) )
130
CONTINUE
140
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
150 JCOL = MIN( NDCOL, KBOT ) + 1, JBOT, NH
JLEN
= MIN( NH, JBOT-JCOL+1 )
CALL
ZGEMM( 'C', 'N', NU, JLEN, NU, ONE, U( K1, K1 ), LDU, H( INCOL+K1, JCOL ), LDH, ZERO, WH, LDWH )
CALL
ZLACPY( 'ALL', NU, JLEN, WH, LDWH, H( INCOL+K1, JCOL ), LDH )
150
CONTINUE
DO
160 JROW = JTOP, MAX( KTOP, INCOL ) - 1, NV
JLEN
= MIN( NV, MAX( KTOP, INCOL )-JROW )
CALL
ZGEMM( 'N', 'N', JLEN, NU, NU, ONE, H( JROW, INCOL+K1 ), LDH, U( K1, K1 ), LDU, ZERO, WV, LDWV )
CALL
ZLACPY( 'ALL', JLEN, NU, WV, LDWV, H( JROW, INCOL+K1 ), LDH )
160
CONTINUE
IF(
WANTZ ) THEN
DO
170 JROW = ILOZ, IHIZ, NV
JLEN
= MIN( NV, IHIZ-JROW+1 )
CALL
ZGEMM( 'N', 'N', JLEN, NU, NU, ONE, Z( JROW, INCOL+K1 ), LDZ, U( K1, K1 ), LDU, ZERO, WV, LDWV )
CALL
ZLACPY( 'ALL', JLEN, NU, WV, LDWV, Z( JROW, INCOL+K1 ), LDZ )
170
CONTINUE
END
IF
ELSE
I2
= ( KDU+1 ) / 2
I4
= KDU
J2
= I4 - I2
J4
= KDU
KZS
= ( J4-J2 ) - ( NS+1 )
KNZ
= NS + 1
DO
180 JCOL = MIN( NDCOL, KBOT ) + 1, JBOT, NH
JLEN
= MIN( NH, JBOT-JCOL+1 )
CALL
ZLACPY( 'ALL', KNZ, JLEN, H( INCOL+1+J2, JCOL ), LDH, WH( KZS+1, 1 ), LDWH )
CALL
ZLASET( 'ALL', KZS, JLEN, ZERO, ZERO, WH, LDWH )
CALL
ZTRMM( 'L', 'U', 'C', 'N', KNZ, JLEN, ONE, U( J2+1, 1+KZS ), LDU, WH( KZS+1, 1 ), LDWH )
CALL
ZGEMM( 'C', 'N', I2, JLEN, J2, ONE, U, LDU, H( INCOL+1, JCOL ), LDH, ONE, WH, LDWH )
CALL
ZLACPY( 'ALL', J2, JLEN, H( INCOL+1, JCOL ), LDH, WH( I2+1, 1 ), LDWH )
CALL
ZTRMM( 'L', 'L', 'C', 'N', J2, JLEN, ONE, U( 1, I2+1 ), LDU, WH( I2+1, 1 ), LDWH )
CALL
ZGEMM( '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
ZLACPY( 'ALL', KDU, JLEN, WH, LDWH, H( INCOL+1, JCOL ), LDH )
180
CONTINUE
DO
190 JROW = JTOP, MAX( INCOL, KTOP ) - 1, NV
JLEN
= MIN( NV, MAX( INCOL, KTOP )-JROW )
CALL
ZLACPY( 'ALL', JLEN, KNZ, H( JROW, INCOL+1+J2 ), LDH, WV( 1, 1+KZS ), LDWV )
CALL
ZLASET( 'ALL', JLEN, KZS, ZERO, ZERO, WV, LDWV )
CALL
ZTRMM( 'R', 'U', 'N', 'N', JLEN, KNZ, ONE, U( J2+1, 1+KZS ), LDU, WV( 1, 1+KZS ), LDWV )
CALL
ZGEMM( 'N', 'N', JLEN, I2, J2, ONE, H( JROW, INCOL+1 ), LDH, U, LDU, ONE, WV, LDWV )
CALL
ZLACPY( 'ALL', JLEN, J2, H( JROW, INCOL+1 ), LDH, WV( 1, 1+I2 ), LDWV )
CALL
ZTRMM( 'R', 'L', 'N', 'N', JLEN, I4-I2, ONE, U( 1, I2+1 ), LDU, WV( 1, 1+I2 ), LDWV )
CALL
ZGEMM( '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
ZLACPY( 'ALL', JLEN, KDU, WV, LDWV, H( JROW, INCOL+1 ), LDH )
190
CONTINUE
IF(
WANTZ ) THEN
DO
200 JROW = ILOZ, IHIZ, NV
JLEN
= MIN( NV, IHIZ-JROW+1 )
CALL
ZLACPY( 'ALL', JLEN, KNZ, Z( JROW, INCOL+1+J2 ), LDZ, WV( 1, 1+KZS ), LDWV )
CALL
ZLASET( 'ALL', JLEN, KZS, ZERO, ZERO, WV, LDWV )
CALL
ZTRMM( 'R', 'U', 'N', 'N', JLEN, KNZ, ONE, U( J2+1, 1+KZS ), LDU, WV( 1, 1+KZS ), LDWV )
CALL
ZGEMM( 'N', 'N', JLEN, I2, J2, ONE, Z( JROW, INCOL+1 ), LDZ, U, LDU, ONE, WV, LDWV )
CALL
ZLACPY( 'ALL', JLEN, J2, Z( JROW, INCOL+1 ), LDZ, WV( 1, 1+I2 ), LDWV )
CALL
ZTRMM( 'R', 'L', 'N', 'N', JLEN, I4-I2, ONE, U( 1, I2+1 ), LDU, WV( 1, 1+I2 ), LDWV )
CALL
ZGEMM( '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
ZLACPY( 'ALL', JLEN, KDU, WV, LDWV, Z( JROW, INCOL+1 ), LDZ )
200
CONTINUE
END
IF
END
IF
END
IF
210
CONTINUE
END