00001 SUBROUTINE ZGEQPF( M, N, A, LDA, JPVT, TAU, WORK, RWORK, INFO )
00002
00003
00004
00005
00006
00007
00008
00009 INTEGER INFO, LDA, M, N
00010
00011
00012 INTEGER JPVT( * )
00013 DOUBLE PRECISION RWORK( * )
00014 COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * )
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090 DOUBLE PRECISION ZERO, ONE
00091 PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 )
00092
00093
00094 INTEGER I, ITEMP, J, MA, MN, PVT
00095 DOUBLE PRECISION TEMP, TEMP2, TOL3Z
00096 COMPLEX*16 AII
00097
00098
00099 EXTERNAL XERBLA, ZGEQR2, ZLARF, ZLARFG, ZSWAP, ZUNM2R
00100
00101
00102 INTRINSIC ABS, DCMPLX, DCONJG, MAX, MIN, SQRT
00103
00104
00105 INTEGER IDAMAX
00106 DOUBLE PRECISION DLAMCH, DZNRM2
00107 EXTERNAL IDAMAX, DLAMCH, DZNRM2
00108
00109
00110
00111
00112
00113 INFO = 0
00114 IF( M.LT.0 ) THEN
00115 INFO = -1
00116 ELSE IF( N.LT.0 ) THEN
00117 INFO = -2
00118 ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
00119 INFO = -4
00120 END IF
00121 IF( INFO.NE.0 ) THEN
00122 CALL XERBLA( 'ZGEQPF', -INFO )
00123 RETURN
00124 END IF
00125
00126 MN = MIN( M, N )
00127 TOL3Z = SQRT(DLAMCH('Epsilon'))
00128
00129
00130
00131 ITEMP = 1
00132 DO 10 I = 1, N
00133 IF( JPVT( I ).NE.0 ) THEN
00134 IF( I.NE.ITEMP ) THEN
00135 CALL ZSWAP( M, A( 1, I ), 1, A( 1, ITEMP ), 1 )
00136 JPVT( I ) = JPVT( ITEMP )
00137 JPVT( ITEMP ) = I
00138 ELSE
00139 JPVT( I ) = I
00140 END IF
00141 ITEMP = ITEMP + 1
00142 ELSE
00143 JPVT( I ) = I
00144 END IF
00145 10 CONTINUE
00146 ITEMP = ITEMP - 1
00147
00148
00149
00150 IF( ITEMP.GT.0 ) THEN
00151 MA = MIN( ITEMP, M )
00152 CALL ZGEQR2( M, MA, A, LDA, TAU, WORK, INFO )
00153 IF( MA.LT.N ) THEN
00154 CALL ZUNM2R( 'Left', 'Conjugate transpose', M, N-MA, MA, A,
00155 $ LDA, TAU, A( 1, MA+1 ), LDA, WORK, INFO )
00156 END IF
00157 END IF
00158
00159 IF( ITEMP.LT.MN ) THEN
00160
00161
00162
00163
00164 DO 20 I = ITEMP + 1, N
00165 RWORK( I ) = DZNRM2( M-ITEMP, A( ITEMP+1, I ), 1 )
00166 RWORK( N+I ) = RWORK( I )
00167 20 CONTINUE
00168
00169
00170
00171 DO 40 I = ITEMP + 1, MN
00172
00173
00174
00175 PVT = ( I-1 ) + IDAMAX( N-I+1, RWORK( I ), 1 )
00176
00177 IF( PVT.NE.I ) THEN
00178 CALL ZSWAP( M, A( 1, PVT ), 1, A( 1, I ), 1 )
00179 ITEMP = JPVT( PVT )
00180 JPVT( PVT ) = JPVT( I )
00181 JPVT( I ) = ITEMP
00182 RWORK( PVT ) = RWORK( I )
00183 RWORK( N+PVT ) = RWORK( N+I )
00184 END IF
00185
00186
00187
00188 AII = A( I, I )
00189 CALL ZLARFG( M-I+1, AII, A( MIN( I+1, M ), I ), 1,
00190 $ TAU( I ) )
00191 A( I, I ) = AII
00192
00193 IF( I.LT.N ) THEN
00194
00195
00196
00197 AII = A( I, I )
00198 A( I, I ) = DCMPLX( ONE )
00199 CALL ZLARF( 'Left', M-I+1, N-I, A( I, I ), 1,
00200 $ DCONJG( TAU( I ) ), A( I, I+1 ), LDA, WORK )
00201 A( I, I ) = AII
00202 END IF
00203
00204
00205
00206 DO 30 J = I + 1, N
00207 IF( RWORK( J ).NE.ZERO ) THEN
00208
00209
00210
00211
00212 TEMP = ABS( A( I, J ) ) / RWORK( J )
00213 TEMP = MAX( ZERO, ( ONE+TEMP )*( ONE-TEMP ) )
00214 TEMP2 = TEMP*( RWORK( J ) / RWORK( N+J ) )**2
00215 IF( TEMP2 .LE. TOL3Z ) THEN
00216 IF( M-I.GT.0 ) THEN
00217 RWORK( J ) = DZNRM2( M-I, A( I+1, J ), 1 )
00218 RWORK( N+J ) = RWORK( J )
00219 ELSE
00220 RWORK( J ) = ZERO
00221 RWORK( N+J ) = ZERO
00222 END IF
00223 ELSE
00224 RWORK( J ) = RWORK( J )*SQRT( TEMP )
00225 END IF
00226 END IF
00227 30 CONTINUE
00228
00229 40 CONTINUE
00230 END IF
00231 RETURN
00232
00233
00234
00235 END