159 $ IPIV2, WORK, LWORK, INFO )
169 INTEGER N, LDA, LTB, LWORK, INFO
172 INTEGER IPIV( * ), IPIV2( * )
173 COMPLEX*16 A( LDA, * ), TB( * ), WORK( * )
179 parameter( zero = ( 0.0e+0, 0.0e+0 ),
180 $ one = ( 1.0e+0, 0.0e+0 ) )
183 LOGICAL UPPER, TQUERY,
184 INTEGER I, J, K, I1, I2, TD
185 INTEGER , NB, KB, JB, NT, IINFO
191 EXTERNAL lsame, ilaenv
199 INTRINSIC dconjg,
min,
max
206 upper = lsame( uplo,
'U' )
207 wquery = ( lwork.EQ.-1 )
208 tquery = ( ltb.EQ.-1 )
209 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
211 ELSE IF( n.LT.0 )
THEN
213 ELSE IF( lda.LT.
max( 1, n ) )
THEN
215 ELSE IF ( ltb .LT. 4*n .AND. .NOT.tquery )
THEN
217 ELSE IF ( lwork .LT. n .AND. .NOT.wquery )
THEN
222 CALL xerbla'ZHETRF_AA_2STAGE'
228 nb = ilaenv( 1,
'ZHETRF_AA_2STAGE', uplo, n, -1, -1, -1 )
237 IF( tquery .OR. wquery )
THEN
250 IF( ldtb .LT. 3*nb+1 )
THEN
253 IF( lwork .LT. nb*n )
THEN
287 IF( i .EQ. (j-1) )
THEN
292 CALL zgemm(
'NoTranspose',
'NoTranspose',
294 $ one, tb( td+1 + (i*nb)*ldtb ), ldtb-1,
295 $ a( (i-1)*nb+1, j*nb+1 ), lda,
296 $ zero, work( i*nb+1 ), n )
299 IF( i .EQ. (j-1) )
THEN
304 CALL zgemm(
'NoTranspose',
'NoTranspose',
306 $ one, tb( td+nb+1 + ((i-1)*nb)*ldtb ),
308 $ a( (i-2)*nb+1, j*nb+1 ), lda,
309 $ zero, work( i*nb+1 ), n )
315 CALL zlacpy(
'Upper', kb, kb, a( j*nb+1, j*nb+1 ), lda,
316 $ tb( td+1 + (j*nb)*ldtb ), ldtb-1 )
319 CALL zgemm(
'Conjugate transpose',
'NoTranspose',
321 $ -one, a( 1, j*nb+1 ), lda,
323 $ one, tb( td+1 + (j*nb)*ldtb ), ldtb-1 )
325 CALL zgemm(
'Conjugate transpose',
'NoTranspose',
327 $ one, a( (j-1)*nb+1, j*nb+1 ), lda,
328 $ tb( td+nb+1 + ((j-1)*nb)*ldtb ), ldtb-1,
329 $ zero, work( 1 ), n )
330 CALL zgemm(
'NoTranspose',
'NoTranspose',
332 $ -one, work( 1 ), n,
333 $ a( (j-2)*nb+1, j*nb+1 ), lda,
334 $ one, tb( td+1 + (j*nb)*ldtb ), ldtb-1 )
337 CALL zhegst( 1,
'Upper', kb,
338 $ tb( td+1 + (j*nb)*ldtb ), ldtb-1,
339 $ a( (j-1)*nb+1, j*nb+1 ), lda, iinfo )
346 $ = real( tb( td+1 + (j*nb+i-1)*ldtb ) )
348 tb( td+(k-i)+1 + (j*nb+i-1)*ldtb )
359 CALL zgemm(
'NoTranspose',
'NoTranspose',
361 $ one, tb( td+1 + (j*nb)*ldtb ), ldtb-1,
362 $ a( (j-1)*nb+1, j*nb+1 ), lda,
363 $ zero, work( j*nb+1 ), n )
365 CALL zgemm(
'NoTranspose',
'NoTranspose',
367 $ one, tb( td+nb+1 + ((j-1)*nb)*ldtb ),
369 $ a( (j-2)*nb+1, j*nb+1 ), lda,
370 $ zero, work( j*nb+1 ), n )
375 CALL zgemm(
'Conjugate transpose',
'NoTranspose',
376 $ nb, n-(j+1)*nb, j*nb,
377 $ -one, work( nb+1 ), n,
378 $ a( 1, (j+1)*nb+1 ), lda,
379 $ one, a( j*nb+1, (j+1)*nb+1 ), lda )
385 CALL zcopy( n-(j+1)*nb,
386 $ a( j*nb+k, (j+1)*nb+1 ), lda,
387 $ work( 1+(k-1)*n ), 1 )
392 CALL zgetrf( n-(j+1)*nb, nb,
394 $ ipiv( (j+1)*nb+1 ), iinfo )
405 CALL zcopy( n-k-(j+1)*nb,
406 $ work( k+1+(k-1)*n ), 1,
407 $ a( j*nb+k, (j+1)*nb+k+1 ), lda )
411 CALL zlacgv( k, work( 1+(k-1)*n ), 1 )
416 kb =
min(nb, n-(j+1)*nb)
417 CALL zlaset(
'Full', kb, nb, zero, zero,
418 $ tb( td+nb+1 + (j*nb)*ldtb) , ldtb-1 )
419 CALL zlacpy(
'Upper', kb, nb,
421 $ tb( td+nb+1 + (j*nb)*ldtb ), ldtb-1 )
423 CALL ztrsm(
'R',
'U',
'N',
'U', kb, nb, one,
424 $ a( (j-1)*nb+1, j*nb+1 ), lda,
425 $ tb( td+nb+1 + (j*nb)*ldtb ), ldtb-1 )
433 tb( td-nb+k-i+1 + (j*nb+nb+i-1)*ldtb )
434 $ = dconjg( tb( td+nb+i-k+1 + (j*nb+k-1)*ldtb ) )
437 CALL zlaset(
'Lower', kb, nb, zero, one,
438 $ a( j*nb+1, (j+1)*nb+1), lda )
444 ipiv( (j+1)*nb+k ) = ipiv( (j+1)*nb+k ) + (j+1)*nb
447 i2 = ipiv( (j+1)*nb+k )
450 CALL zswap( k-1, a( (j+1)*nb+1, i1 ), 1,
451 $ a( (j+1)*nb+1, i2 ), 1 )
453 IF( i2.GT.(i1+1) )
THEN
454 CALL zswap( i2-i1-1, a( i1, i1+1 ), lda,
456 CALL zlacgv( i2-i1-1, a( i1+1, i2 ), 1 )
458 CALL zlacgv( i2-i1, a( i1, i1+1 ), lda )
461 $
CALL zswap( n-i2, a( i1, i2+1 ), lda,
462 $ a( i2, i2+1 ), lda )
465 a( i1, i1 ) = a( i2, i2 )
469 CALL zswap( j*nb, a( 1, i1 ), 1,
490 IF( i .EQ. (j-1) )
THEN
495 CALL zgemm(
'NoTranspose',
'Conjugate transpose',
497 $ one, tb( td+1 + (i*nb)*ldtb ), ldtb-1,
498 $ a( j*nb+1, (i-1)*nb+1 ), lda,
499 $ zero, work( i*nb+1 ), n )
502 IF( i .EQ. (j-1) )
THEN
507 CALL zgemm(
'NoTranspose',
'Conjugate transpose',
509 $ one, tb( td+nb+1 + ((i-1)*nb)*ldtb ),
511 $ a( j*nb+1, (i-2)*nb+1 ), lda,
512 $ zero, work( i*nb+1 ), n )
518 CALL zlacpy(
'Lower', kb, kb, a( j*nb+1, j*nb+1 ), lda,
519 $ tb( td+1 + (j*nb)*ldtb ), ldtb-1 )
522 CALL zgemm(
'NoTranspose',
'NoTranspose',
524 $ -one, a( j*nb+1, 1 ), lda,
526 $ one, tb( td+1 + (j*nb)*ldtb ), ldtb-1 )
528 CALL zgemm(
'NoTranspose',
'NoTranspose',
530 $ one, a( j*nb+1, (j-1)*nb+1 ), lda,
531 $ tb( td+nb+1 + ((j-1)*nb)*ldtb ), ldtb-1,
532 $ zero, work( 1 ), n )
533 CALL zgemm(
'NoTranspose',
'Conjugate transpose',
535 $ -one, work( 1 ), n,
536 $ a( j*nb+1, (j-2)*nb+1 ), lda,
537 $ one, tb( td+1 + (j*nb)*ldtb ), ldtb-1 )
540 CALL zhegst( 1,
'Lower', kb,
541 $ tb( td+1 + (j*nb)*ldtb ), ldtb-1,
542 $ a( j*nb+1, (j-1)*nb+1 ), lda, iinfo )
548 tb( td+1 + (j*nb+i-1)*ldtb )
549 $ = real( tb( td+1 + (j*nb+i-1)*ldtb ) )
551 tb( td-(k-(i+1)) + (j*nb+k-1)*ldtb )
552 $ = dconjg( tb( td+(k-i)+1 + (j*nb+i-1)*ldtb ) )
562 CALL zgemm(
'NoTranspose',
'Conjugate transpose',
564 $ one, tb( td+1 + (j*nb)*ldtb ), ldtb-1,
565 $ a( j*nb+1, (j-1)*nb+1 ), lda,
568 CALL zgemm( 'notranspose
', 'conjugate transpose
',
570 $ ONE, TB( TD+NB+1 + ((J-1)*NB)*LDTB ),
572 $ A( J*NB+1, (J-2)*NB+1 ), LDA,
573 $ ZERO, WORK( J*NB+1 ), N )
578 CALL ZGEMM( 'notranspose
', 'notranspose
',
579 $ N-(J+1)*NB, NB, J*NB,
580 $ -ONE, A( (J+1)*NB+1, 1 ), LDA,
582 $ ONE, A( (J+1)*NB+1, J*NB+1 ), LDA )
587 CALL ZGETRF( N-(J+1)*NB, NB,
588 $ A( (J+1)*NB+1, J*NB+1 ), LDA,
589 $ IPIV( (J+1)*NB+1 ), IINFO )
596 KB = MIN(NB, N-(J+1)*NB)
597 CALL ZLASET( 'full
', KB, NB, ZERO, ZERO,
598 $ TB( TD+NB+1 + (J*NB)*LDTB) , LDTB-1 )
599 CALL ZLACPY( 'upper
', KB, NB,
600 $ A( (J+1)*NB+1, J*NB+1 ), LDA,
601 $ TB( TD+NB+1 + (J*NB)*LDTB ), LDTB-1 )
603 CALL ZTRSM( 'r
', 'l
', 'c
', 'u
', KB, NB, ONE,
604 $ A( J*NB+1, (J-1)*NB+1 ), LDA,
605 $ TB( TD+NB+1 + (J*NB)*LDTB ), LDTB-1 )
613 TB( TD-NB+K-I+1 + (J*NB+NB+I-1)*LDTB )
614 $ = DCONJG( TB( TD+NB+I-K+1 + (J*NB+K-1)*LDTB ) )
617 CALL ZLASET( 'upper
', KB, NB, ZERO, ONE,
618 $ A( (J+1)*NB+1, J*NB+1), LDA )
624 IPIV( (J+1)*NB+K ) = IPIV( (J+1)*NB+K ) + (J+1)*NB
627 I2 = IPIV( (J+1)*NB+K )
630 CALL ZSWAP( K-1, A( I1, (J+1)*NB+1 ), LDA,
631 $ A( I2, (J+1)*NB+1 ), LDA )
633.GT.
IF( I2(I1+1) ) THEN
634 CALL ZSWAP( I2-I1-1, A( I1+1, I1 ), 1,
635 $ A( I2, I1+1 ), LDA )
636 CALL ZLACGV( I2-I1-1, A( I2, I1+1 ), LDA )
638 CALL ZLACGV( I2-I1, A( I1+1, I1 ), 1 )
641 $ CALL ZSWAP( N-I2, A( I2+1, I1 ), 1,
645 A( I1, I1 ) = A( I2, I2 )
649 CALL ZSWAP( J*NB, A( I1, 1 ), LDA,
664 CALL ZGBTRF( N, N, NB, NB, TB, LDTB, IPIV2, INFO )