170 RECURSIVE SUBROUTINE dgehrd( N, ILO, IHI, A, LDA, TAU, WORK,
179 INTEGER ihi, ilo, info, lda, lwork, n
182 DOUBLE PRECISION a( lda, * ), tau( * ), work( * )
189 parameter( nbmax = 64, ldt = nbmax+1 )
190 DOUBLE PRECISION zero, one
191 parameter( zero = 0.0d+0,
196 INTEGER i, ib, iinfo, iws, j, ldwork, lwkopt, nb,
201 DOUBLE PRECISION t( ldt, nbmax )
219 nb = min( nbmax,
ilaenv( 1,
'DGEHRD',
' ', n, ilo, ihi, -1 ) )
222 lquery = ( lwork.EQ.-1 )
225 ELSE IF( ilo.LT.1 .OR. ilo.GT.max( 1, n ) )
THEN
227 ELSE IF( ihi.LT.min( ilo, n ) .OR. ihi.GT.n )
THEN
229 ELSE IF( lda.LT.max( 1, n ) )
THEN
231 ELSE IF( lwork.LT.max( 1, n ) .AND. .NOT.lquery )
THEN
235 CALL
xerbla(
'DGEHRD', -info )
237 ELSE IF( lquery )
THEN
246 DO 20 i = max( 1, ihi ), n - 1
260 nb = min( nbmax,
ilaenv( 1,
'DGEHRD',
' ', n, ilo, ihi, -1 ) )
263 IF( nb.GT.1 .AND. nb.LT.nh )
THEN
268 nx = max( nb,
ilaenv( 3,
'DGEHRD',
' ', n, ilo, ihi, -1 ) )
274 IF( lwork.LT.iws )
THEN
280 nbmin = max( 2,
ilaenv( 2,
'DGEHRD',
' ', n, ilo, ihi,
282 IF( lwork.GE.n*nbmin )
THEN
292 IF( nb.LT.nbmin .OR. nb.GE.nh )
THEN
302 DO 40 i = ilo, ihi - 1 - nx, nb
303 ib = min( nb, ihi-i )
309 CALL
dlahr2( ihi, i, ib, a( 1, i ), lda, tau( i ), t, ldt,
316 ei = a( i+ib, i+ib-1 )
317 a( i+ib, i+ib-1 ) = one
318 CALL
dgemm(
'No transpose',
'Transpose',
320 $ ib, -one, work, ldwork, a( i+ib, i ), lda, one,
321 $ a( 1, i+ib ), lda )
322 a( i+ib, i+ib-1 ) = ei
327 CALL
dtrmm(
'Right',
'Lower',
'Transpose',
329 $ one, a( i+1, i ), lda, work, ldwork )
331 CALL
daxpy( i, -one, work( ldwork*j+1 ), 1,
338 CALL
dlarfb(
'Left',
'Transpose',
'Forward',
340 $ ihi-i, n-i-ib+1, ib, a( i+1, i ), lda, t, ldt,
341 $ a( i+1, i+ib ), lda, work, ldwork )
347 CALL
dgehd2( n, i, ihi, a, lda, tau, work, iinfo )