claqr5(l) - Linux man page

Name

Synopsis

SUBROUTINE CLAQR5(

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

H( LDH, * ), S( * ), U( LDU, * ), V( LDV, * ), WH( LDWH, * ), WV( LDWV, * ), Z( LDZ, * )

COMPLEX

ZERO, ONE

PARAMETER

( ZERO = ( 0.0e0, 0.0e0 ), ONE = ( 1.0e0, 0.0e0 ) )

REAL

RZERO, RONE

PARAMETER

( RZERO = 0.0e0, RONE = 1.0e0 )

COMPLEX

ALPHA, BETA, CDUM, REFSUM

REAL

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

REAL

SLAMCH

EXTERNAL

SLAMCH

INTRINSIC

ABS, AIMAG, CONJG, MAX, MIN, MOD, REAL

COMPLEX

VT( 3 )

EXTERNAL

CGEMM, CLACPY, CLAQR1, CLARFG, CLASET, CTRMM, SLABAD

REAL

CABS1

CABS1(

CDUM ) = ABS( REAL( CDUM ) ) + ABS( AIMAG( CDUM ) )

IF(

NSHFTS.LT.2 ) RETURN

IF(

KTOP.GE.KBOT ) RETURN

NS

= NSHFTS - MOD( NSHFTS, 2 )

SAFMIN

= SLAMCH( 'SAFE MINIMUM' )

SAFMAX

= RONE / 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

210 INCOL = 3*( 1-NBMPS ) + KTOP - 1, KBOT - 2, 3*NBMPS - 2

NDCOL

= INCOL + KDU

IF(

ACCUM ) CALL CLASET( '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

CLAQR1( 3, H( KTOP, KTOP ), LDH, S( 2*M-1 ), S( 2*M ), V( 1, M ) )

ALPHA

= V( 1, M )

CALL

CLARFG( 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

CLARFG( 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

CLAQR1( 3, H( K+1, K+1 ), LDH, S( 2*M-1 ), S( 2*M ), VT )

ALPHA

= VT( 1 )

CALL

CLARFG( 3, ALPHA, VT( 2 ), 1, VT( 1 ) )

REFSUM

= CONJG( VT( 1 ) )* ( H( K+1, K )+CONJG( 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

CLAQR1( 2, H( K+1, K+1 ), LDH, S( 2*M22-1 ), S( 2*M22 ), V( 1, M22 ) )

BETA

= V( 1, M22 )

CALL

CLARFG( 2, BETA, V( 2, M22 ), 1, V( 1, M22 ) )

ELSE

BETA

= H( K+1, K )

V(

2, M22 ) = H( K+2, K )

CALL

CLARFG( 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

= CONJG( V( 1, M ) )* ( H( K+1, J )+CONJG( V( 2, M ) )*H( K+2, J )+ CONJG( 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

= CONJG( V( 1, M22 ) )* ( H( K+1, J )+CONJG( 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*CONJG( V( 2, M ) )

H(

J, K+3 ) = H( J, K+3 ) - REFSUM*CONJG( 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*CONJG( V( 2, M ) )

U(

J, KMS+3 ) = U( J, KMS+3 ) - REFSUM*CONJG( 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*CONJG( V( 2, M ) )

Z(

J, K+3 ) = Z( J, K+3 ) - REFSUM*CONJG( 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*CONJG( 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*CONJG( 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*CONJG( 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*CONJG( V( 2, M ) )

H(

K+4, K+3 ) = H( K+4, K+3 ) - REFSUM*CONJG( 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

CGEMM( 'C', 'N', NU, JLEN, NU, ONE, U( K1, K1 ), LDU, H( INCOL+K1, JCOL ), LDH, ZERO, WH, LDWH )

CALL

CLACPY( '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

CGEMM( 'N', 'N', JLEN, NU, NU, ONE, H( JROW, INCOL+K1 ), LDH, U( K1, K1 ), LDU, ZERO, WV, LDWV )

CALL

CLACPY( '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

CGEMM( 'N', 'N', JLEN, NU, NU, ONE, Z( JROW, INCOL+K1 ), LDZ, U( K1, K1 ), LDU, ZERO, WV, LDWV )

CALL

CLACPY( '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

CLACPY( 'ALL', KNZ, JLEN, H( INCOL+1+J2, JCOL ), LDH, WH( KZS+1, 1 ), LDWH )

CALL

CLASET( 'ALL', KZS, JLEN, ZERO, ZERO, WH, LDWH )

CALL

CTRMM( 'L', 'U', 'C', 'N', KNZ, JLEN, ONE, U( J2+1, 1+KZS ), LDU, WH( KZS+1, 1 ), LDWH )

CALL

CGEMM( 'C', 'N', I2, JLEN, J2, ONE, U, LDU, H( INCOL+1, JCOL ), LDH, ONE, WH, LDWH )

CALL

CLACPY( 'ALL', J2, JLEN, H( INCOL+1, JCOL ), LDH, WH( I2+1, 1 ), LDWH )

CALL

CTRMM( 'L', 'L', 'C', 'N', J2, JLEN, ONE, U( 1, I2+1 ), LDU, WH( I2+1, 1 ), LDWH )

CALL

CGEMM( '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

CLACPY( '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

CLACPY( 'ALL', JLEN, KNZ, H( JROW, INCOL+1+J2 ), LDH, WV( 1, 1+KZS ), LDWV )

CALL

CLASET( 'ALL', JLEN, KZS, ZERO, ZERO, WV, LDWV )

CALL

CTRMM( 'R', 'U', 'N', 'N', JLEN, KNZ, ONE, U( J2+1, 1+KZS ), LDU, WV( 1, 1+KZS ), LDWV )

CALL

CGEMM( 'N', 'N', JLEN, I2, J2, ONE, H( JROW, INCOL+1 ), LDH, U, LDU, ONE, WV, LDWV )

CALL

CLACPY( 'ALL', JLEN, J2, H( JROW, INCOL+1 ), LDH, WV( 1, 1+I2 ), LDWV )

CALL

CTRMM( 'R', 'L', 'N', 'N', JLEN, I4-I2, ONE, U( 1, I2+1 ), LDU, WV( 1, 1+I2 ), LDWV )

CALL

CGEMM( '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

CLACPY( '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

CLACPY( 'ALL', JLEN, KNZ, Z( JROW, INCOL+1+J2 ), LDZ, WV( 1, 1+KZS ), LDWV )

CALL

CLASET( 'ALL', JLEN, KZS, ZERO, ZERO, WV, LDWV )

CALL

CTRMM( 'R', 'U', 'N', 'N', JLEN, KNZ, ONE, U( J2+1, 1+KZS ), LDU, WV( 1, 1+KZS ), LDWV )

CALL

CGEMM( 'N', 'N', JLEN, I2, J2, ONE, Z( JROW, INCOL+1 ), LDZ, U, LDU, ONE, WV, LDWV )

CALL

CLACPY( 'ALL', JLEN, J2, Z( JROW, INCOL+1 ), LDZ, WV( 1, 1+I2 ), LDWV )

CALL

CTRMM( 'R', 'L', 'N', 'N', JLEN, I4-I2, ONE, U( 1, I2+1 ), LDU, WV( 1, 1+I2 ), LDWV )

CALL

CGEMM( '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

CLACPY( 'ALL', JLEN, KDU, WV, LDWV, Z( JROW, INCOL+1 ), LDZ )

200

CONTINUE

END

IF

END

IF

END

IF

210

CONTINUE

END

Purpose