119 SUBROUTINE zsytri2x( UPLO, N, A, LDA, IPIV, WORK, NB, INFO )
127 INTEGER INFO, LDA, N, NB
131 COMPLEX*16 A( lda, * ), WORK( n+nb+1,* )
138 parameter( one = ( 1.0d+0, 0.0d+0 ),
139 $ zero = ( 0.0d+0, 0.0d+0 ) )
143 INTEGER I, IINFO, IP, K, CUT, NNB
147 COMPLEX*16 AK, AKKP1, AKP1, D, T
148 COMPLEX*16 U01_I_J, U01_IP1_J
149 COMPLEX*16 U11_I_J, U11_IP1_J
167 upper = lsame( uplo,
'U' )
168 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN 170 ELSE IF( n.LT.0 )
THEN 172 ELSE IF( lda.LT.max( 1, n ) )
THEN 180 CALL xerbla(
'ZSYTRI2X', -info )
189 CALL zsyconv( uplo,
'C', n, a, lda, ipiv, work, iinfo )
198 IF( ipiv( info ).GT.0 .AND. a( info, info ).EQ.zero )
206 IF( ipiv( info ).GT.0 .AND. a( info, info ).EQ.zero )
226 CALL ztrtri( uplo,
'U', n, a, lda, info )
231 DO WHILE ( k .LE. n )
232 IF( ipiv( k ).GT.0 )
THEN 234 work(k,invd) = one / a( k, k )
241 akp1 = a( k+1, k+1 ) / t
242 akkp1 = work(k+1,1) / t
243 d = t*( ak*akp1-one )
244 work(k,invd) = akp1 / d
245 work(k+1,invd+1) = ak / d
246 work(k,invd+1) = -akkp1 / d
247 work(k+1,invd) = -akkp1 / d
257 DO WHILE (cut .GT. 0)
259 IF (cut .LE. nnb)
THEN 265 IF (ipiv(i) .LT. 0) count=count+1
268 IF (mod(count,2) .EQ. 1) nnb=nnb+1
289 work(u11+i,j)=a(cut+i,cut+j)
296 DO WHILE (i .LE. cut)
297 IF (ipiv(i) > 0)
THEN 299 work(i,j)=work(i,invd)*work(i,j)
305 u01_ip1_j = work(i+1,j)
306 work(i,j)=work(i,invd)*u01_i_j+
307 $ work(i,invd+1)*u01_ip1_j
308 work(i+1,j)=work(i+1,invd)*u01_i_j+
309 $ work(i+1,invd+1)*u01_ip1_j
318 DO WHILE (i .LE. nnb)
319 IF (ipiv(cut+i) > 0)
THEN 321 work(u11+i,j)=work(cut+i,invd)*work(u11+i,j)
326 u11_i_j = work(u11+i,j)
327 u11_ip1_j = work(u11+i+1,j)
328 work(u11+i,j)=work(cut+i,invd)*work(u11+i,j) +
329 $ work(cut+i,invd+1)*work(u11+i+1,j)
330 work(u11+i+1,j)=work(cut+i+1,invd)*u11_i_j+
331 $ work(cut+i+1,invd+1)*u11_ip1_j
339 CALL ztrmm(
'L',
'U',
'T',
'U',nnb, nnb,
340 $ one,a(cut+1,cut+1),lda,work(u11+1,1),n+nb+1)
344 a(cut+i,cut+j)=work(u11+i,j)
350 CALL zgemm(
'T',
'N',nnb,nnb,cut,one,a(1,cut+1),lda,
351 $ work,n+nb+1, zero, work(u11+1,1), n+nb+1)
357 a(cut+i,cut+j)=a(cut+i,cut+j)+work(u11+i,j)
363 CALL ztrmm(
'L',uplo,
'T',
'U',cut, nnb,
364 $ one,a,lda,work,n+nb+1)
382 DO WHILE ( i .LE. n )
383 IF( ipiv(i) .GT. 0 )
THEN 385 IF (i .LT. ip)
CALL zsyswapr( uplo, n, a, lda, i ,ip )
386 IF (i .GT. ip)
CALL zsyswapr( uplo, n, a, lda, ip ,i )
391 $
CALL zsyswapr( uplo, n, a, lda, i-1 ,ip )
393 $
CALL zsyswapr( uplo, n, a, lda, ip ,i-1 )
403 CALL ztrtri( uplo,
'U', n, a, lda, info )
408 DO WHILE ( k .GE. 1 )
409 IF( ipiv( k ).GT.0 )
THEN 411 work(k,invd) = one / a( k, k )
417 ak = a( k-1, k-1 ) / t
419 akkp1 = work(k-1,1) / t
420 d = t*( ak*akp1-one )
421 work(k-1,invd) = akp1 / d
422 work(k,invd) = ak / d
423 work(k,invd+1) = -akkp1 / d
424 work(k-1,invd+1) = -akkp1 / d
434 DO WHILE (cut .LT. n)
436 IF (cut + nnb .GE. n)
THEN 442 IF (ipiv(i) .LT. 0) count=count+1
445 IF (mod(count,2) .EQ. 1) nnb=nnb+1
450 work(i,j)=a(cut+nnb+i,cut+j)
460 work(u11+i,j)=a(cut+i,cut+j)
468 IF (ipiv(cut+nnb+i) > 0)
THEN 470 work(i,j)=work(cut+nnb+i,invd)*work(i,j)
476 u01_ip1_j = work(i-1,j)
477 work(i,j)=work(cut+nnb+i,invd)*u01_i_j+
478 $ work(cut+nnb+i,invd+1)*u01_ip1_j
479 work(i-1,j)=work(cut+nnb+i-1,invd+1)*u01_i_j+
480 $ work(cut+nnb+i-1,invd)*u01_ip1_j
490 IF (ipiv(cut+i) > 0)
THEN 492 work(u11+i,j)=work(cut+i,invd)*work(u11+i,j)
497 u11_i_j = work(u11+i,j)
498 u11_ip1_j = work(u11+i-1,j)
499 work(u11+i,j)=work(cut+i,invd)*work(u11+i,j) +
500 $ work(cut+i,invd+1)*u11_ip1_j
501 work(u11+i-1,j)=work(cut+i-1,invd+1)*u11_i_j+
502 $ work(cut+i-1,invd)*u11_ip1_j
510 CALL ztrmm(
'L',uplo,
'T',
'U',nnb, nnb,
511 $ one,a(cut+1,cut+1),lda,work(u11+1,1),n+nb+1)
515 a(cut+i,cut+j)=work(u11+i,j)
520 IF ( (cut+nnb) .LT. n )
THEN 524 CALL zgemm(
'T',
'N',nnb,nnb,n-nnb-cut,one,a(cut+nnb+1,cut+1)
525 $ ,lda,work,n+nb+1, zero, work(u11+1,1), n+nb+1)
532 a(cut+i,cut+j)=a(cut+i,cut+j)+work(u11+i,j)
538 CALL ztrmm(
'L',uplo,
'T',
'U', n-nnb-cut, nnb,
539 $ one,a(cut+nnb+1,cut+nnb+1),lda,work,n+nb+1)
544 a(cut+nnb+i,cut+j)=work(i,j)
553 a(cut+i,cut+j)=work(u11+i,j)
566 DO WHILE ( i .GE. 1 )
567 IF( ipiv(i) .GT. 0 )
THEN 569 IF (i .LT. ip)
CALL zsyswapr( uplo, n, a, lda, i ,ip )
570 IF (i .GT. ip)
CALL zsyswapr( uplo, n, a, lda, ip ,i )
573 IF ( i .LT. ip)
CALL zsyswapr( uplo, n, a, lda, i ,ip )
574 IF ( i .GT. ip)
CALL zsyswapr( uplo, n, a, lda, ip ,i )
subroutine ztrmm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
ZTRMM
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zsyconv(UPLO, WAY, N, A, LDA, IPIV, E, INFO)
ZSYCONV
subroutine zgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
ZGEMM
subroutine ztrtri(UPLO, DIAG, N, A, LDA, INFO)
ZTRTRI
subroutine zsytri2x(UPLO, N, A, LDA, IPIV, WORK, NB, INFO)
ZSYTRI2X
subroutine zsyswapr(UPLO, N, A, LDA, I1, I2)
ZSYSWAPR