00001 SUBROUTINE ZUNGQR( M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
00002
00003
00004
00005
00006
00007
00008
00009 INTEGER INFO, K, LDA, LWORK, M, N
00010
00011
00012 COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * )
00013
00014
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 COMPLEX*16 ZERO
00074 PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ) )
00075
00076
00077 LOGICAL LQUERY
00078 INTEGER I, IB, IINFO, IWS, J, KI, KK, L, LDWORK,
00079 $ LWKOPT, NB, NBMIN, NX
00080
00081
00082 EXTERNAL XERBLA, ZLARFB, ZLARFT, ZUNG2R
00083
00084
00085 INTRINSIC MAX, MIN
00086
00087
00088 INTEGER ILAENV
00089 EXTERNAL ILAENV
00090
00091
00092
00093
00094
00095 INFO = 0
00096 NB = ILAENV( 1, 'ZUNGQR', ' ', M, N, K, -1 )
00097 LWKOPT = MAX( 1, N )*NB
00098 WORK( 1 ) = LWKOPT
00099 LQUERY = ( LWORK.EQ.-1 )
00100 IF( M.LT.0 ) THEN
00101 INFO = -1
00102 ELSE IF( N.LT.0 .OR. N.GT.M ) THEN
00103 INFO = -2
00104 ELSE IF( K.LT.0 .OR. K.GT.N ) THEN
00105 INFO = -3
00106 ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
00107 INFO = -5
00108 ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
00109 INFO = -8
00110 END IF
00111 IF( INFO.NE.0 ) THEN
00112 CALL XERBLA( 'ZUNGQR', -INFO )
00113 RETURN
00114 ELSE IF( LQUERY ) THEN
00115 RETURN
00116 END IF
00117
00118
00119
00120 IF( N.LE.0 ) THEN
00121 WORK( 1 ) = 1
00122 RETURN
00123 END IF
00124
00125 NBMIN = 2
00126 NX = 0
00127 IWS = N
00128 IF( NB.GT.1 .AND. NB.LT.K ) THEN
00129
00130
00131
00132 NX = MAX( 0, ILAENV( 3, 'ZUNGQR', ' ', M, N, K, -1 ) )
00133 IF( NX.LT.K ) THEN
00134
00135
00136
00137 LDWORK = N
00138 IWS = LDWORK*NB
00139 IF( LWORK.LT.IWS ) THEN
00140
00141
00142
00143
00144 NB = LWORK / LDWORK
00145 NBMIN = MAX( 2, ILAENV( 2, 'ZUNGQR', ' ', M, N, K, -1 ) )
00146 END IF
00147 END IF
00148 END IF
00149
00150 IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
00151
00152
00153
00154
00155 KI = ( ( K-NX-1 ) / NB )*NB
00156 KK = MIN( K, KI+NB )
00157
00158
00159
00160 DO 20 J = KK + 1, N
00161 DO 10 I = 1, KK
00162 A( I, J ) = ZERO
00163 10 CONTINUE
00164 20 CONTINUE
00165 ELSE
00166 KK = 0
00167 END IF
00168
00169
00170
00171 IF( KK.LT.N )
00172 $ CALL ZUNG2R( M-KK, N-KK, K-KK, A( KK+1, KK+1 ), LDA,
00173 $ TAU( KK+1 ), WORK, IINFO )
00174
00175 IF( KK.GT.0 ) THEN
00176
00177
00178
00179 DO 50 I = KI + 1, 1, -NB
00180 IB = MIN( NB, K-I+1 )
00181 IF( I+IB.LE.N ) THEN
00182
00183
00184
00185
00186 CALL ZLARFT( 'Forward', 'Columnwise', M-I+1, IB,
00187 $ A( I, I ), LDA, TAU( I ), WORK, LDWORK )
00188
00189
00190
00191 CALL ZLARFB( 'Left', 'No transpose', 'Forward',
00192 $ 'Columnwise', M-I+1, N-I-IB+1, IB,
00193 $ A( I, I ), LDA, WORK, LDWORK, A( I, I+IB ),
00194 $ LDA, WORK( IB+1 ), LDWORK )
00195 END IF
00196
00197
00198
00199 CALL ZUNG2R( M-I+1, IB, IB, A( I, I ), LDA, TAU( I ), WORK,
00200 $ IINFO )
00201
00202
00203
00204 DO 40 J = I, I + IB - 1
00205 DO 30 L = 1, I - 1
00206 A( L, J ) = ZERO
00207 30 CONTINUE
00208 40 CONTINUE
00209 50 CONTINUE
00210 END IF
00211
00212 WORK( 1 ) = IWS
00213 RETURN
00214
00215
00216
00217 END