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