121 SUBROUTINE csytri2x( UPLO, N, A, LDA, IPIV, WORK, NB, INFO )
130 INTEGER info, lda, n, nb
134 COMPLEX a( lda, * ), work( n+nb+1,* )
141 parameter( one = ( 1.0e+0, 0.0e+0 ),
142 $ zero = ( 0.0e+0, 0.0e+0 ) )
146 INTEGER i, iinfo, ip, k, cut, nnb
150 COMPLEX ak, akkp1, akp1, d, t
151 COMPLEX u01_i_j, u01_ip1_j
152 COMPLEX u11_i_j, u11_ip1_j
170 upper =
lsame( uplo,
'U' )
171 IF( .NOT.upper .AND. .NOT.
lsame( uplo,
'L' ) )
THEN
173 ELSE IF( n.LT.0 )
THEN
175 ELSE IF( lda.LT.max( 1, n ) )
THEN
183 CALL
xerbla(
'CSYTRI2X', -info )
192 CALL
csyconv( uplo,
'C', n, a, lda, ipiv, work, iinfo )
201 IF( ipiv( info ).GT.0 .AND. a( info, info ).EQ.zero )
209 IF( ipiv( info ).GT.0 .AND. a( info, info ).EQ.zero )
229 CALL
ctrtri( uplo,
'U', n, a, lda, info )
234 DO WHILE ( k .LE. n )
235 IF( ipiv( k ).GT.0 )
THEN
237 work(k,invd) = one / a( k, k )
244 akp1 = a( k+1, k+1 ) / t
245 akkp1 = work(k+1,1) / t
246 d = t*( ak*akp1-one )
247 work(k,invd) = akp1 / d
248 work(k+1,invd+1) = ak / d
249 work(k,invd+1) = -akkp1 / d
250 work(k+1,invd) = -akkp1 / d
260 DO WHILE (cut .GT. 0)
262 IF (cut .LE. nnb)
THEN
268 IF (ipiv(i) .LT. 0) count=count+1
271 IF (mod(count,2) .EQ. 1) nnb=nnb+1
292 work(u11+i,j)=a(cut+i,cut+j)
299 DO WHILE (i .LE. cut)
300 IF (ipiv(i) > 0)
THEN
302 work(i,j)=work(i,invd)*work(i,j)
308 u01_ip1_j = work(i+1,j)
309 work(i,j)=work(i,invd)*u01_i_j+
310 $ work(i,invd+1)*u01_ip1_j
311 work(i+1,j)=work(i+1,invd)*u01_i_j+
312 $ work(i+1,invd+1)*u01_ip1_j
321 DO WHILE (i .LE. nnb)
322 IF (ipiv(cut+i) > 0)
THEN
324 work(u11+i,j)=work(cut+i,invd)*work(u11+i,j)
329 u11_i_j = work(u11+i,j)
330 u11_ip1_j = work(u11+i+1,j)
331 work(u11+i,j)=work(cut+i,invd)*work(u11+i,j) +
332 $ work(cut+i,invd+1)*work(u11+i+1,j)
333 work(u11+i+1,j)=work(cut+i+1,invd)*u11_i_j+
334 $ work(cut+i+1,invd+1)*u11_ip1_j
342 CALL
ctrmm(
'L',
'U',
'T',
'U',nnb, nnb,
343 $ one,a(cut+1,cut+1),lda,work(u11+1,1),n+nb+1)
347 a(cut+i,cut+j)=work(u11+i,j)
353 CALL
cgemm(
'T',
'N',nnb,nnb,cut,one,a(1,cut+1),lda,
354 $ work,n+nb+1, zero, work(u11+1,1), n+nb+1)
360 a(cut+i,cut+j)=a(cut+i,cut+j)+work(u11+i,j)
366 CALL
ctrmm(
'L',uplo,
'T',
'U',cut, nnb,
367 $ one,a,lda,work,n+nb+1)
385 DO WHILE ( i .LE. n )
386 IF( ipiv(i) .GT. 0 )
THEN
388 IF (i .LT. ip) CALL
csyswapr( uplo, n, a, lda, i ,ip )
389 IF (i .GT. ip) CALL
csyswapr( uplo, n, a, lda, ip ,i )
394 $ CALL
csyswapr( uplo, n, a, lda, i-1 ,ip )
396 $ CALL
csyswapr( uplo, n, a, lda, ip ,i-1 )
406 CALL
ctrtri( uplo,
'U', n, a, lda, info )
411 DO WHILE ( k .GE. 1 )
412 IF( ipiv( k ).GT.0 )
THEN
414 work(k,invd) = one / a( k, k )
420 ak = a( k-1, k-1 ) / t
422 akkp1 = work(k-1,1) / t
423 d = t*( ak*akp1-one )
424 work(k-1,invd) = akp1 / d
425 work(k,invd) = ak / d
426 work(k,invd+1) = -akkp1 / d
427 work(k-1,invd+1) = -akkp1 / d
437 DO WHILE (cut .LT. n)
439 IF (cut + nnb .GE. n)
THEN
445 IF (ipiv(i) .LT. 0) count=count+1
448 IF (mod(count,2) .EQ. 1) nnb=nnb+1
453 work(i,j)=a(cut+nnb+i,cut+j)
463 work(u11+i,j)=a(cut+i,cut+j)
471 IF (ipiv(cut+nnb+i) > 0)
THEN
473 work(i,j)=work(cut+nnb+i,invd)*work(i,j)
479 u01_ip1_j = work(i-1,j)
480 work(i,j)=work(cut+nnb+i,invd)*u01_i_j+
481 $ work(cut+nnb+i,invd+1)*u01_ip1_j
482 work(i-1,j)=work(cut+nnb+i-1,invd+1)*u01_i_j+
483 $ work(cut+nnb+i-1,invd)*u01_ip1_j
493 IF (ipiv(cut+i) > 0)
THEN
495 work(u11+i,j)=work(cut+i,invd)*work(u11+i,j)
500 u11_i_j = work(u11+i,j)
501 u11_ip1_j = work(u11+i-1,j)
502 work(u11+i,j)=work(cut+i,invd)*work(u11+i,j) +
503 $ work(cut+i,invd+1)*u11_ip1_j
504 work(u11+i-1,j)=work(cut+i-1,invd+1)*u11_i_j+
505 $ work(cut+i-1,invd)*u11_ip1_j
513 CALL
ctrmm(
'L',uplo,
'T',
'U',nnb, nnb,
514 $ one,a(cut+1,cut+1),lda,work(u11+1,1),n+nb+1)
518 a(cut+i,cut+j)=work(u11+i,j)
522 IF ( (cut+nnb) .LT. n )
THEN
526 CALL
cgemm(
'T',
'N',nnb,nnb,n-nnb-cut,one,a(cut+nnb+1,cut+1)
527 $ ,lda,work,n+nb+1, zero, work(u11+1,1), n+nb+1)
534 a(cut+i,cut+j)=a(cut+i,cut+j)+work(u11+i,j)
540 CALL
ctrmm(
'L',uplo,
'T',
'U', n-nnb-cut, nnb,
541 $ one,a(cut+nnb+1,cut+nnb+1),lda,work,n+nb+1)
546 a(cut+nnb+i,cut+j)=work(i,j)
555 a(cut+i,cut+j)=work(u11+i,j)
568 DO WHILE ( i .GE. 1 )
569 IF( ipiv(i) .GT. 0 )
THEN
571 IF (i .LT. ip) CALL
csyswapr( uplo, n, a, lda, i ,ip )
572 IF (i .GT. ip) CALL
csyswapr( uplo, n, a, lda, ip ,i )
575 IF ( i .LT. ip) CALL
csyswapr( uplo, n, a, lda, i ,ip )
576 IF ( i .GT. ip) CALL
csyswapr( uplo, n, a, lda, ip ,i )