242 $ WORK, LWORK, INFO )
252 INTEGER , LDA, LDAB, LWORK, N, KD
255 COMPLEX A( LDA, * ), AB( LDAB, * ),
256 $ tau( * ), work( * )
263 COMPLEX ZERO, ONE, HALF
264 parameter( rone = 1.0e+0,
265 $ zero = ( 0.0e+0, 0.0e+0 ),
266 $ one = ( 1.0e+0, 0.0e+0 ),
267 $ half = ( 0.5e+0, 0.0e+0 ) )
271 INTEGER I, J, IINFO, LWMIN, PN, PK, LK,
272 $ ldt, ldw, lds2, lds1,
274 $ tpos, wpos, s2pos, s1pos
286 EXTERNAL lsame, ilaenv2stage
294 upper = lsame( uplo,
'U' )
295 lquery = ( lwork.EQ.-1 )
296 lwmin = ilaenv2stage( 4,
'CHETRD_HE2HB',
'', n, kd, -1, -1 )
298 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
300 ELSE IF( n.LT.0 )
THEN
302 ELSE IF( kd.LT.0 )
THEN
304 ELSE IF( lda.LT.
max( 1, n ) )
THEN
306 ELSE IF( ldab.LT.
max( 1, kd
THEN
308 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
313 CALL xerbla(
'CHETRD_HE2HB', -info )
315 ELSE IF( lquery )
THEN
327 CALL ccopy( lk, a( i-lk+1, i ), 1,
328 $ ab( kd+1-lk+1, i ), 1 )
332 lk =
min( kd+1, n-i+1 )
333 CALL ccopy( lk, a( i, i ), 1, ab( 1, i ), 1 )
347 ls2 = lwmin - lt - lw - ls1
365 CALL claset(
"A", ldt, kd, zero, zero, work( tpos ), ldt )
368 DO 10 i = 1, n - kd, kd
370 pk =
min( n-i-kd+1, kd )
374 CALL cgelqf( kd, pn, a( i, i+kd ), lda,
375 $ tau( i ), work( s2pos ), ls2, iinfo )
380 lk =
min( kd, n-j ) + 1
381 CALL ccopy( lk, a( j, j ), lda, ab( kd+1, j ), ldab-1 )
384 CALL claset(
'Lower', pk, pk, zero, one,
385 $ a( i, i+kd ), lda )
389 CALL clarft(
'Forward',
'Rowwise', pn, pk,
390 $ a( i, i+kd ), lda, tau( i ),
391 $ work( tpos ), ldt )
395 CALL cgemm(
'Conjugate',
'No transpose', pk, pn, pk,
396 $ one, work( tpos ), ldt,
398 $ zero, work( s2pos ), lds2 )
400 CALL chemm(
'Right', uplo, pk, pn,
401 $ one, a( i+kd, i+kd ), lda,
402 $ work( s2pos ), lds2,
403 $ zero, work( wpos ), ldw )
405 CALL cgemm(
'No transpose',
'Conjugate', pk, pk, pn,
406 $ one, work( wpos ), ldw,
407 $ work( s2pos ), lds2,
408 $ zero, work( s1pos ), lds1 )
410 CALL cgemm(
'No transpose',
'No transpose', pk, pn, pk,
411 $ -half, work( s1pos ), lds1,
413 $ one, work( wpos ), ldw )
419 CALL cher2k( uplo,
'Conjugate', pn, pk,
420 $ -one, a( i, i+kd ), lda,
422 $ rone, a( i+kd, i+kd ), lda )
429 CALL ccopy( lk, a( j, j ), lda, ab( kd+1, j ), ldab-1 )
436 DO 40 i = 1, n - kd, kd
438 pk =
min( n-i-kd+1, kd )
442 CALL cgeqrf( pn, kd, a( i+kd, i ), lda,
443 $ tau( i ), work( s2pos ), ls2, iinfo )
448 lk =
min( kd, n-j ) + 1
449 CALL ccopy( lk, a( j, j ), 1, ab( 1, j ), 1 )
452 CALL claset( 'upper
', PK, PK, ZERO, ONE,
453 $ A( I+KD, I ), LDA )
457 CALL CLARFT( 'forward
', 'columnwise
', PN, PK,
458 $ A( I+KD, I ), LDA, TAU( I ),
459 $ WORK( TPOS ), LDT )
463 CALL CGEMM( 'no transpose
', 'no transpose
', PN, PK, PK,
464 $ ONE, A( I+KD, I ), LDA,
466 $ ZERO, WORK( S2POS ), LDS2 )
468 CALL CHEMM( 'left
', UPLO, PN, PK,
469 $ ONE, A( I+KD, I+KD ), LDA,
470 $ WORK( S2POS ), LDS2,
471 $ ZERO, WORK( WPOS ), LDW )
473 CALL CGEMM( 'conjugate
', 'no transpose
', PK, PK, PN,
474 $ ONE, WORK( S2POS ), LDS2,
476 $ ZERO, WORK( S1POS ), LDS1 )
478 CALL CGEMM( 'no transpose
', 'no transpose
', PN, PK, PK,
479 $ -HALF, A( I+KD, I ), LDA,
480 $ WORK( S1POS ), LDS1,
481 $ ONE, WORK( WPOS ), LDW )
487 CALL CHER2K( UPLO, 'no transpose
', PN, PK,
488 $ -ONE, A( I+KD, I ), LDA,
490 $ RONE, A( I+KD, I+KD ), LDA )
503 LK = MIN(KD, N-J) + 1
504 CALL CCOPY( LK, A( J, J ), 1, AB( 1, J ), 1 )