119 SUBROUTINE zhetri2x( UPLO, N, A, LDA, IPIV, WORK, NB, INFO )
127 INTEGER INFO, LDA, N, NB
131 COMPLEX*16 A( LDA, * ), WORK( N+NB+1,* )
138 COMPLEX*16 CONE, ZERO
139 parameter( one = 1.0d+0,
140 $ cone = ( 1.0d+0, 0.0d+0 ),
141 $ zero = ( 0.0d+0, 0.0d+0 ) )
145 INTEGER I, IINFO, IP, K, CUT, NNB
149 COMPLEX*16 AK, AKKP1, AKP1, D, T
150 COMPLEX*16 U01_I_J, U01_IP1_J
151 COMPLEX*16 U11_I_J, U11_IP1_J
169 upper = lsame( uplo,
'U' )
170 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
172 ELSE IF( n.LT.0 )
THEN
174 ELSE IF( lda.LT.max( 1, n ) )
THEN
182 CALL xerbla(
'ZHETRI2X', -info )
191 CALL zsyconv( uplo,
'C', n, a, lda, ipiv, work, iinfo )
200 IF( ipiv( info ).GT.0 .AND. a( info, info ).EQ.zero )
208 IF( ipiv( info ).GT.0 .AND. a( info, info ).EQ.zero )
228 CALL ztrtri( uplo,
'U', n, a, lda, info )
233 DO WHILE ( k .LE. n )
234 IF( ipiv( k ).GT.0 )
THEN
236 work(k,invd) = one / real( a( k, k ) )
241 t = abs( work(k+1,1) )
242 ak = dble( a( k, k ) ) / t
243 akp1 = dble( a( k+1, k+1 ) ) / t
244 akkp1 = work(k+1,1) / t
245 d = t*( ak*akp1-one )
246 work(k,invd) = akp1 / d
247 work(k+1,invd+1) = ak / d
248 work(k,invd+1) = -akkp1 / d
249 work(k+1,invd) = dconjg(work(k,invd+1) )
259 DO WHILE (cut .GT. 0)
261 IF (cut .LE. nnb)
THEN
267 IF (ipiv(i) .LT. 0) count=count+1
270 IF (mod(count,2) .EQ. 1) nnb=nnb+1
291 work(u11+i,j)=a(cut+i,cut+j)
298 DO WHILE (i .LE. cut)
299 IF (ipiv(i) > 0)
THEN
301 work(i,j)=work(i,invd)*work(i,j)
307 u01_ip1_j = work(i+1,j)
308 work(i,j)=work(i,invd)*u01_i_j+
309 $ work(i,invd+1)*u01_ip1_j
310 work(i+1,j)=work(i+1,invd)*u01_i_j+
311 $ work(i+1,invd+1)*u01_ip1_j
320 DO WHILE (i .LE. nnb)
321 IF (ipiv(cut+i) > 0)
THEN
323 work(u11+i,j)=work(cut+i,invd)*work(u11+i,j)
328 u11_i_j = work(u11+i,j)
329 u11_ip1_j = work(u11+i+1,j)
330 work(u11+i,j)=work(cut+i,invd)*work(u11+i,j) +
331 $ work(cut+i,invd+1)*work(u11+i+1,j)
332 work(u11+i+1,j)=work(cut+i+1,invd)*u11_i_j+
333 $ work(cut+i+1,invd+1)*u11_ip1_j
341 CALL ztrmm(
'L',
'U',
'C',
'U',nnb, nnb,
342 $ cone,a(cut+1,cut+1),lda,work(u11+1,1),n+nb+1)
346 a(cut+i,cut+j)=work(u11+i,j)
352 CALL zgemm(
'C',
'N',nnb,nnb,cut,cone,a(1,cut+1),lda,
353 $ work,n+nb+1, zero, work(u11+1,1), n+nb+1)
359 a(cut+i,cut+j)=a(cut+i,cut+j)+work(u11+i,j)
365 CALL ztrmm(
'L',uplo,
'C',
'U',cut, nnb,
366 $ cone,a,lda,work,n+nb+1)
384 DO WHILE ( i .LE. n )
385 IF( ipiv(i) .GT. 0 )
THEN
387 IF (i .LT. ip)
CALL zheswapr( uplo, n, a, lda, i ,ip )
388 IF (i .GT. ip)
CALL zheswapr( uplo, n, a, lda, ip ,i )
393 $
CALL zheswapr( uplo, n, a, lda, i-1 ,ip )
395 $
CALL zheswapr( uplo, n, a, lda, ip ,i-1 )
405 CALL ztrtri( uplo,
'U', n, a, lda, info )
410 DO WHILE ( k .GE. 1 )
411 IF( ipiv( k ).GT.0 )
THEN
413 work(k,invd) = one / real( a( k, k ) )
418 t = abs( work(k-1,1) )
419 ak = dble( a( k-1, k-1 ) ) / t
420 akp1 = dble( a( k, k ) ) / t
421 akkp1 = work(k-1,1) / t
422 d = t*( ak*akp1-one )
423 work(k-1,invd) = akp1 / d
424 work(k,invd) = ak / d
425 work(k,invd+1) = -akkp1 / d
426 work(k-1,invd+1) = dconjg(work(k,invd+1) )
436 DO WHILE (cut .LT. n)
438 IF (cut + nnb .GE. n)
THEN
444 IF (ipiv(i) .LT. 0) count=count+1
447 IF (mod(count,2) .EQ. 1) nnb=nnb+1
452 work(i,j)=a(cut+nnb+i,cut+j)
462 work(u11+i,j)=a(cut+i,cut+j)
470 IF (ipiv(cut+nnb+i) > 0)
THEN
472 work(i,j)=work(cut+nnb+i,invd)*work(i,j)
478 u01_ip1_j = work(i-1,j)
479 work(i,j)=work(cut+nnb+i,invd)*u01_i_j+
480 $ work(cut+nnb+i,invd+1)*u01_ip1_j
481 work(i-1,j)=work(cut+nnb+i-1,invd+1)*u01_i_j+
482 $ work(cut+nnb+i-1,invd)*u01_ip1_j
492 IF (ipiv(cut+i) > 0)
THEN
494 work(u11+i,j)=work(cut+i,invd)*work(u11+i,j)
499 u11_i_j = work(u11+i,j)
500 u11_ip1_j = work(u11+i-1,j)
501 work(u11+i,j)=work(cut+i,invd)*work(u11+i,j) +
502 $ work(cut+i,invd+1)*u11_ip1_j
503 work(u11+i-1,j)=work(cut+i-1,invd+1)*u11_i_j+
504 $ work(cut+i-1,invd)*u11_ip1_j
512 CALL ztrmm(
'L',uplo,
'C',
'U',nnb, nnb,
513 $ cone,a(cut+1,cut+1),lda,work(u11+1,1),n+nb+1)
517 a(cut+i,cut+j)=work(u11+i,j)
521 IF ( (cut+nnb) .LT. n )
THEN
525 CALL zgemm(
'C',
'N',nnb,nnb,n-nnb-cut,cone,a(cut+nnb+1,cut+1)
526 $ ,lda,work,n+nb+1, zero, work(u11+1,1), n+nb+1)
533 a(cut+i,cut+j)=a(cut+i,cut+j)+work(u11+i,j)
539 CALL ztrmm(
'L',uplo,
'C',
'U', n-nnb-cut, nnb,
540 $ cone,a(cut+nnb+1,cut+nnb+1),lda,work,n+nb+1)
545 a(cut+nnb+i,cut+j)=work(i,j)
554 a(cut+i,cut+j)=work(u11+i,j)
567 DO WHILE ( i .GE. 1 )
568 IF( ipiv(i) .GT. 0 )
THEN
570 IF (i .LT. ip)
CALL zheswapr( uplo, n, a, lda, i ,ip )
571 IF (i .GT. ip)
CALL zheswapr( uplo, n, a, lda, ip ,i )
574 IF ( i .LT. ip)
CALL zheswapr( uplo, n, a, lda, i ,ip )
575 IF ( i .GT. ip)
CALL zheswapr( uplo, n, a, lda, ip ,i )
subroutine xerbla(srname, info)
subroutine zgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
ZGEMM
subroutine zheswapr(uplo, n, a, lda, i1, i2)
ZHESWAPR applies an elementary permutation on the rows and columns of a Hermitian matrix.
subroutine zhetri2x(uplo, n, a, lda, ipiv, work, nb, info)
ZHETRI2X
subroutine zsyconv(uplo, way, n, a, lda, ipiv, e, info)
ZSYCONV
subroutine ztrmm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
ZTRMM
subroutine ztrtri(uplo, diag, n, a, lda, info)
ZTRTRI