206 SUBROUTINE cgebrd( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
215 INTEGER INFO, LDA, LWORK, M, N
219 COMPLEX A( LDA, * ), TAUP( * ), TAUQ( * ),
227 parameter( one = ( 1.0e+0, 0.0e+0 ) )
231 INTEGER I, IINFO, J, LDWRKX, LDWRKY, LWKOPT, MINMN, NB,
238 INTRINSIC max, min, real
249 nb = max( 1, ilaenv( 1,
'CGEBRD',
' ', m, n, -1, -1 ) )
251 work( 1 ) = real( lwkopt )
252 lquery = ( lwork.EQ.-1 )
255 ELSE IF( n.LT.0 )
THEN
257 ELSE IF( lda.LT.max( 1, m ) )
THEN
259 ELSE IF( lwork.LT.max( 1, m, n ) .AND. .NOT.lquery )
THEN
263 CALL xerbla(
'CGEBRD', -info )
265 ELSE IF( lquery )
THEN
272 IF( minmn.EQ.0 )
THEN
281 IF( nb.GT.1 .AND. nb.LT.minmn )
THEN
285 nx = max( nb, ilaenv( 3,
'CGEBRD',
' ', m, n, -1, -1 ) )
289 IF( nx.LT.minmn )
THEN
291 IF( lwork.LT.ws )
THEN
296 nbmin = ilaenv( 2,
'CGEBRD',
' ', m, n, -1, -1 )
297 IF( lwork.GE.( m+n )*nbmin )
THEN
309 DO 30 i = 1, minmn - nx, nb
315 CALL clabrd( m-i+1, n-i+1, nb, a( i, i ), lda, d( i ), e( i ),
316 $ tauq( i ), taup( i ), work, ldwrkx,
317 $ work( ldwrkx*nb+1 ), ldwrky )
322 CALL cgemm(
'No transpose',
'Conjugate transpose', m-i-nb+1,
323 $ n-i-nb+1, nb, -one, a( i+nb, i ), lda,
324 $ work( ldwrkx*nb+nb+1 ), ldwrky, one,
325 $ a( i+nb, i+nb ), lda )
326 CALL cgemm(
'No transpose',
'No transpose', m-i-nb+1, n-i-nb+1,
327 $ nb, -one, work( nb+1 ), ldwrkx, a( i, i+nb ), lda,
328 $ one, a( i+nb, i+nb ), lda )
333 DO 10 j = i, i + nb - 1
338 DO 20 j = i, i + nb - 1
347 CALL cgebd2( m-i+1, n-i+1, a( i, i ), lda, d( i ), e( i ),
348 $ tauq( i ), taup( i ), work, iinfo )