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,
239 INTRINSIC max, min, real
250 nb = max( 1, ilaenv( 1,
'CGEBRD',
' ', m, n, -1, -1 ) )
252 work( 1 ) =
REAL( lwkopt )
253 lquery = ( lwork.EQ.-1 )
256 ELSE IF( n.LT.0 )
THEN 258 ELSE IF( lda.LT.max( 1, m ) )
THEN 260 ELSE IF( lwork.LT.max( 1, m, n ) .AND. .NOT.lquery )
THEN 264 CALL xerbla(
'CGEBRD', -info )
266 ELSE IF( lquery )
THEN 273 IF( minmn.EQ.0 )
THEN 282 IF( nb.GT.1 .AND. nb.LT.minmn )
THEN 286 nx = max( nb, ilaenv( 3,
'CGEBRD',
' ', m, n, -1, -1 ) )
290 IF( nx.LT.minmn )
THEN 292 IF( lwork.LT.ws )
THEN 297 nbmin = ilaenv( 2,
'CGEBRD',
' ', m, n, -1, -1 )
298 IF( lwork.GE.( m+n )*nbmin )
THEN 310 DO 30 i = 1, minmn - nx, nb
316 CALL clabrd( m-i+1, n-i+1, nb, a( i, i ), lda, d( i ), e( i ),
317 $ tauq( i ), taup( i ), work, ldwrkx,
318 $ work( ldwrkx*nb+1 ), ldwrky )
323 CALL cgemm(
'No transpose',
'Conjugate transpose', m-i-nb+1,
324 $ n-i-nb+1, nb, -one, a( i+nb, i ), lda,
325 $ work( ldwrkx*nb+nb+1 ), ldwrky, one,
326 $ a( i+nb, i+nb ), lda )
327 CALL cgemm(
'No transpose',
'No transpose', m-i-nb+1, n-i-nb+1,
328 $ nb, -one, work( nb+1 ), ldwrkx, a( i, i+nb ), lda,
329 $ one, a( i+nb, i+nb ), lda )
334 DO 10 j = i, i + nb - 1
339 DO 20 j = i, i + nb - 1
348 CALL cgebd2( m-i+1, n-i+1, a( i, i ), lda, d( i ), e( i ),
349 $ tauq( i ), taup( i ), work, iinfo )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine cgebrd(M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK, INFO)
CGEBRD
subroutine clabrd(M, N, NB, A, LDA, D, E, TAUQ, TAUP, X, LDX, Y, LDY)
CLABRD reduces the first nb rows and columns of a general matrix to a bidiagonal form.
subroutine cgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
CGEMM
subroutine cgebd2(M, N, A, LDA, D, E, TAUQ, TAUP, WORK, INFO)
CGEBD2 reduces a general matrix to bidiagonal form using an unblocked algorithm.