159 $ IPIV2, WORK, LWORK, INFO )
169 INTEGER N, LDA, LTB, LWORK, INFO
172 INTEGER IPIV( * ), IPIV2( * )
173 COMPLEX 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
207 upper = lsame( uplo,
'U' )
208 wquery = ( lwork.EQ.-1 )
209 tquery = ( ltb.EQ.-1 )
210 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
212 ELSE IF( n.LT.0 )
THEN
214 ELSE IF( lda.LT.
max( 1, n ) )
THEN
218 ELSE IF ( lwork .LT. n .AND. .NOT.wquery )
THEN
223 CALL xerbla(
'CHETRF_AA_2STAGE', -info )
229 nb = ilaenv( 1,
'CHETRF_AA_2STAGE', uplo, n, -1, -1, -1 )
238 IF( tquery .OR. wquery )
THEN
251 IF( ldtb .LT. 3*nb+1 )
THEN
254 IF( lwork .LT. nb*n )
THEN
288 IF( i .EQ. (j-1) )
THEN
293 CALL cgemm(
'NoTranspose',
'NoTranspose',
296 $ a( (i-1)*nb+1, j*nb+1 ), lda,
297 $ zero, work( i*nb+1 ), n )
300 IF( i .EQ. (j-1) )
THEN
305 CALL cgemm(
'NoTranspose',
'NoTranspose',
307 $ one, tb( td+nb+1 + ((i-1)*nb)*ldtb ),
309 $ a( (i-2)*nb+1, j*nb+1 )
310 $ zero, work( i*nb+1 ), n
316 CALL clacpy(
'Upper', kb, kb, a( j*nb+1, j*nb+1 ), lda,
317 $ tb( td+1 + (j*nb)*ldtb ), ldtb-1 )
320 CALL cgemm(
'Conjugate transpose',
'NoTranspose'
322 $ -one, a( 1, j*nb+1 ), lda,
324 $ one, tb( td+1 + (j*nb)*ldtb ), ldtb-1 )
326 CALL cgemm(
'Conjugate transpose',
'NoTranspose',
328 $ one, a( (j-1)*nb+1, j*nb+1 ), lda,
329 $ tb( td+nb+1 + ((j-1)*nb)*ldtb ), ldtb-1,
330 $ zero, work( 1 ), n )
331 CALL cgemm( 'notranspose
', 'notranspose
',
333 $ -ONE, WORK( 1 ), N,
334 $ A( (J-2)*NB+1, J*NB+1 ), LDA,
335 $ ONE, TB( TD+1 + (J*NB)*LDTB ), LDTB-1 )
338 CALL CHEGST( 1, 'upper
', KB,
339 $ TB( TD+1 + (J*NB)*LDTB ), LDTB-1,
340 $ A( (J-1)*NB+1, J*NB+1 ), LDA, IINFO )
346 TB( TD+1 + (J*NB+I-1)*LDTB )
347 $ = REAL( TB( TD+1 + (J*NB+I-1)*LDTB ) )
349 TB( TD+(K-I)+1 + (J*NB+I-1)*LDTB )
350 $ = CONJG( TB( TD-(K-(I+1)) + (J*NB+K-1)*LDTB ) )
360 CALL CGEMM( 'notranspose
', 'notranspose
',
362 $ ONE, TB( TD+1 + (J*NB)*LDTB ), LDTB-1,
363 $ A( (J-1)*NB+1, J*NB+1 ), LDA,
364 $ ZERO, WORK( J*NB+1 ), N )
366 CALL CGEMM( 'notranspose
', 'notranspose
',
368 $ ONE, TB( TD+NB+1 + ((J-1)*NB)*LDTB ),
370 $ A( (J-2)*NB+1, J*NB+1 ), LDA,
371 $ ZERO, WORK( J*NB+1 ), N )
376 CALL CGEMM( 'conjugate transpose
', 'notranspose
',
377 $ NB, N-(J+1)*NB, J*NB,
378 $ -ONE, WORK( NB+1 ), N,
379 $ A( 1, (J+1)*NB+1 ), LDA,
380 $ ONE, A( J*NB+1, (J+1)*NB+1 ), LDA )
386 CALL CCOPY( N-(J+1)*NB,
387 $ A( J*NB+K, (J+1)*NB+1 ), LDA,
388 $ WORK( 1+(K-1)*N ), 1 )
393 CALL CGETRF( N-(J+1)*NB, NB,
395 $ IPIV( (J+1)*NB+1 ), IINFO )
406 CALL CCOPY( N-K-(J+1)*NB,
407 $ WORK( K+1+(K-1)*N ), 1,
408 $ A( J*NB+K, (J+1)*NB+K+1 ), LDA )
412 CALL CLACGV( K, WORK( 1+(K-1)*N ), 1 )
417 KB = MIN(NB, N-(J+1)*NB)
418 CALL CLASET( 'full
', KB, NB, ZERO, ZERO,
419 $ TB( TD+NB+1 + (J*NB)*LDTB), LDTB-1 )
420 CALL CLACPY( 'upper
', KB, NB,
422 $ TB( TD+NB+1 + (J*NB)*LDTB ), LDTB-1 )
424 CALL CTRSM( 'r
', 'u
', 'n
', 'u
', KB, NB, ONE,
425 $ A( (J-1)*NB+1, J*NB+1 ), LDA,
426 $ TB( TD+NB+1 + (J*NB)*LDTB ), LDTB-1 )
434 TB( TD-NB+K-I+1 + (J*NB+NB+I-1)*LDTB )
435 $ = CONJG( TB( TD+NB+I-K+1 + (J*NB+K-1)*LDTB ) )
438 CALL CLASET( 'lower
', KB, NB, ZERO, ONE,
439 $ A( J*NB+1, (J+1)*NB+1), LDA )
445 IPIV( (J+1)*NB+K ) = IPIV( (J+1)*NB+K ) + (J+1)*NB
448 I2 = IPIV( (J+1)*NB+K )
451 CALL CSWAP( K-1, A( (J+1)*NB+1, I1 ), 1,
452 $ A( (J+1)*NB+1, I2 ), 1 )
454.GT.
IF( I2(I1+1) ) THEN
455 CALL CSWAP( I2-I1-1, A( I1, I1+1 ), LDA,
457 CALL CLACGV( I2-I1-1, A( I1+1, I2 ), 1 )
459 CALL CLACGV( I2-I1, A( I1, I1+1 ), LDA )
462 $ CALL CSWAP( N-I2, A( I1, I2+1 ), LDA,
463 $ A( I2, I2+1 ), LDA )
466 A( I1, I1 ) = A( I2, I2 )
470 CALL CSWAP( J*NB, A( 1, I1 ), 1,
491.EQ.
IF( I (J-1) ) THEN
496 CALL CGEMM( 'notranspose
', 'conjugate transpose
',
498 $ ONE, TB( TD+1 + (I*NB)*LDTB ), LDTB-1,
499 $ A( J*NB+1, (I-1)*NB+1 ), LDA,
500 $ ZERO, WORK( I*NB+1 ), N )
503.EQ.
IF( I (J-1) ) THEN
508 CALL CGEMM( 'notranspose
', 'conjugate transpose
',
510 $ ONE, TB( TD+NB+1 + ((I-1)*NB)*LDTB ),
512 $ A( J*NB+1, (I-2)*NB+1 ), LDA,
513 $ ZERO, WORK( I*NB+1 ), N )
519 CALL CLACPY( 'lower
', KB, KB, A( J*NB+1, J*NB+1 ), LDA,
520 $ TB( TD+1 + (J*NB)*LDTB ), LDTB-1 )
523 CALL CGEMM( 'notranspose
', 'notranspose
',
525 $ -ONE, A( J*NB+1, 1 ), LDA,
527 $ ONE, TB( TD+1 + (J*NB)*LDTB ), LDTB-1 )
529 CALL CGEMM( 'notranspose
', 'notranspose
',
531 $ ONE, A( J*NB+1, (J-1)*NB+1 ), LDA,
532 $ TB( TD+NB+1 + ((J-1)*NB)*LDTB ), LDTB-1,
533 $ ZERO, WORK( 1 ), N )
534 CALL CGEMM( 'notranspose
', 'conjugate transpose
',
536 $ -ONE, WORK( 1 ), N,
537 $ A( J*NB+1, (J-2)*NB+1 ), LDA,
538 $ ONE, TB( TD+1 + (J*NB)*LDTB ), LDTB-1 )
541 CALL CHEGST( 1, 'lower
', KB,
542 $ TB( TD+1 + (J*NB)*LDTB ), LDTB-1,
543 $ A( J*NB+1, (J-1)*NB+1 ), LDA, IINFO )
549 TB( TD+1 + (J*NB+I-1)*LDTB )
550 $ = REAL( TB( TD+1 + (J*NB+I-1)*LDTB ) )
552 TB( TD-(K-(I+1)) + (J*NB+K-1)*LDTB )
553 $ = CONJG( TB( TD+(K-I)+1 + (J*NB+I-1)*LDTB ) )
563 CALL CGEMM( 'notranspose',
'Conjugate transpose',
565 $ one, tb( td+1 + (j*nb)*ldtb ), ldtb-1,
566 $ a( j*nb+1, (j-1)*nb+1 ), lda,
567 $ zero, work( j*nb+1 ), n )
569 CALL cgemm(
'NoTranspose',
'Conjugate transpose',
571 $ one, tb( td+nb+1 + ((j-1)*nb)*ldtb ),
573 $ a( j*nb+1, (j-2)*nb+1 ), lda,
579 CALL cgemm(
'NoTranspose',
'NoTranspose',
580 $ n-(j+1)*nb, nb, j*nb,
581 $ -one, a( (j+1)*nb+1, 1 ), lda,
583 $ one, a( (j+1)*nb+1, j*nb+1 ), lda )
588 CALL cgetrf( n-(j+1)*nb, nb,
589 $ a( (j+1)*nb+1, j*nb+1 ), lda,
590 $ ipiv( (j+1)*nb+1 ), iinfo )
597 kb =
min(nb, n-(j+1)*nb)
598 CALL claset(
'Full', kb, nb, zero, zero,
599 $ tb( td+nb+1 + (j*nb)*ldtb), ldtb-1 )
600 CALL clacpy(
'Upper', kb, nb,
601 $ a( (j+1)*nb+1, j*nb+1 ), lda,
602 $ tb( td+nb+1 + (j*nb)*ldtb ), ldtb-1 )
604 CALL ctrsm(
'R',
'L',
'C',
'U', kb, nb, one,
605 $ a( j*nb+1, (j-1)*nb+1 ), lda,
606 $ tb( td+nb+1 + (j*nb)*ldtb ), ldtb-1 )
614 tb( td-nb+k-i+1 + (j*nb+nb+i-1)*ldtb )
615 $ = conjg( tb( td+nb+i-k+1 + (j*nb+k-1)*ldtb ) )
618 CALL claset(
'Upper', kb, nb, zero, one,
619 $ a( (j+1)*nb+1, j*nb+1), lda )
625 ipiv( (j+1)*nb+k ) = ipiv( (j+1)*nb+k ) + (j+1)*nb
628 i2 = ipiv( (j+1)*nb+k )
631 CALL cswap( k-1, a( i1, (j+1)*nb+1 ), lda,
632 $ a( i2, (j+1)*nb+1 ), lda )
634 IF( i2.GT.(i1+1) )
THEN
635 CALL cswap( i2-i1-1, a( i1+1, i1 ), 1,
636 $ a( i2, i1+1 ), lda )
637 CALL clacgv( i2-i1-1, a( i2, i1+1 ), lda )
639 CALL clacgv( i2-i1, a( i1+1, i1 ), 1 )
642 $
CALL cswap( n-i2, a( i2+1, i1 ), 1,
646 a( i1, i1 ) = a( i2, i2 )
650 CALL cswap( j*nb, a( i1, 1 ), lda,
665 CALL cgbtrf( n, n, nb, nb, tb, ldtb, ipiv2, info )