205 SUBROUTINE sgebrd( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
214 INTEGER INFO, LDA, LWORK, M, N
217 REAL A( LDA, * ), D( * ), E( * ), TAUP( * ),
218 $ tauq( * ), work( * )
225 parameter( one = 1.0e+0 )
229 INTEGER I, IINFO, J, LDWRKX, LDWRKY, LWKOPT, MINMN, NB,
236 INTRINSIC max, min, real
247 nb = max( 1, ilaenv( 1,
'SGEBRD',
' ', m, n, -1, -1 ) )
249 work( 1 ) = real( lwkopt )
250 lquery = ( lwork.EQ.-1 )
253 ELSE IF( n.LT.0 )
THEN
255 ELSE IF( lda.LT.max( 1, m ) )
THEN
257 ELSE IF( lwork.LT.max( 1, m, n ) .AND. .NOT.lquery )
THEN
261 CALL xerbla(
'SGEBRD', -info )
263 ELSE IF( lquery )
THEN
270 IF( minmn.EQ.0 )
THEN
279 IF( nb.GT.1 .AND. nb.LT.minmn )
THEN
283 nx = max( nb, ilaenv( 3,
'SGEBRD',
' ', m, n, -1, -1 ) )
287 IF( nx.LT.minmn )
THEN
289 IF( lwork.LT.ws )
THEN
294 nbmin = ilaenv( 2,
'SGEBRD',
' ', m, n, -1, -1 )
295 IF( lwork.GE.( m+n )*nbmin )
THEN
307 DO 30 i = 1, minmn - nx, nb
313 CALL slabrd( m-i+1, n-i+1, nb, a( i, i ), lda, d( i ), e( i ),
314 $ tauq( i ), taup( i ), work, ldwrkx,
315 $ work( ldwrkx*nb+1 ), ldwrky )
320 CALL sgemm(
'No transpose',
'Transpose', m-i-nb+1, n-i-nb+1,
321 $ nb, -one, a( i+nb, i ), lda,
322 $ work( ldwrkx*nb+nb+1 ), ldwrky, one,
323 $ a( i+nb, i+nb ), lda )
324 CALL sgemm(
'No transpose',
'No transpose', m-i-nb+1, n-i-nb+1,
325 $ nb, -one, work( nb+1 ), ldwrkx, a( i, i+nb ), lda,
326 $ one, a( i+nb, i+nb ), lda )
331 DO 10 j = i, i + nb - 1
336 DO 20 j = i, i + nb - 1
345 CALL sgebd2( m-i+1, n-i+1, a( i, i ), lda, d( i ), e( i ),
346 $ tauq( i ), taup( i ), work, iinfo )