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, WQUERY
184 INTEGER I, J, K, I1, I2, TD
185 INTEGER LDTB, 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', -info )
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 )
345 tb( td+1 + (j*nb+i-1)*ldtb )
346 $ = real( tb( td+1 + (j*nb+i-1)*ldtb ) )
348 tb( td+(k-i)+1 + (j*nb+i-1)*ldtb )
349 $ = dconjg( tb( td-(k-(i+1)) + (j*nb+k-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,
566 $ zero, work( j*nb+1 ), n )
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 IF( i2.GT.(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 )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zswap(N, ZX, INCX, ZY, INCY)
ZSWAP
subroutine zcopy(N, ZX, INCX, ZY, INCY)
ZCOPY
subroutine zgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
ZGEMM
subroutine ztrsm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
ZTRSM
subroutine zgbtrf(M, N, KL, KU, AB, LDAB, IPIV, INFO)
ZGBTRF
subroutine zhegst(ITYPE, UPLO, N, A, LDA, B, LDB, INFO)
ZHEGST
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine zlacgv(N, X, INCX)
ZLACGV conjugates a complex vector.
subroutine zhetrf_aa_2stage(UPLO, N, A, LDA, TB, LTB, IPIV, IPIV2, WORK, LWORK, INFO)
ZHETRF_AA_2STAGE
subroutine zgetrf(M, N, A, LDA, IPIV, INFO)
ZGETRF VARIANT: Crout Level 3 BLAS version of the algorithm.