121 SUBROUTINE dsytri2x( UPLO, N, A, LDA, IPIV, WORK, NB, INFO )
130 INTEGER INFO, LDA, N, NB
134 DOUBLE PRECISION A( lda, * ), WORK( n+nb+1,* )
140 DOUBLE PRECISION ONE, ZERO
141 parameter ( one = 1.0d+0, zero = 0.0d+0 )
145 INTEGER I, IINFO, IP, K, CUT, NNB
149 DOUBLE PRECISION AK, AKKP1, AKP1, D, T
150 DOUBLE PRECISION U01_I_J, U01_IP1_J
151 DOUBLE PRECISION 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(
'DSYTRI2X', -info )
191 CALL dsyconv( 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 dtrtri( uplo,
'U', n, a, lda, info )
233 DO WHILE ( k .LE. n )
234 IF( ipiv( k ).GT.0 )
THEN
236 work(k,invd) = one / a( k, k )
243 akp1 = 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) = -akkp1 / d
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 dtrmm(
'L',
'U',
'T',
'U',nnb, nnb,
342 $ one,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 dgemm(
'T',
'N',nnb,nnb,cut,one,a(1,cut+1),lda,
353 $ 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 dtrmm(
'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 dsyswapr( uplo, n, a, lda, i ,ip )
389 IF (i .GT. ip)
CALL dsyswapr( uplo, n, a, lda, ip ,i )
394 $
CALL dsyswapr( uplo, n, a, lda, i-1 ,ip )
396 $
CALL dsyswapr( uplo, n, a, lda, ip ,i-1 )
406 CALL dtrtri( 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 .GT. 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 dtrmm(
'L',uplo,
'T',
'U',nnb, nnb,
514 $ one,a(cut+1,cut+1),lda,work(u11+1,1),n+nb+1)
519 a(cut+i,cut+j)=work(u11+i,j)
523 IF ( (cut+nnb) .LT. n )
THEN
527 CALL dgemm(
'T',
'N',nnb,nnb,n-nnb-cut,one,a(cut+nnb+1,cut+1)
528 $ ,lda,work,n+nb+1, zero, work(u11+1,1), n+nb+1)
535 a(cut+i,cut+j)=a(cut+i,cut+j)+work(u11+i,j)
541 CALL dtrmm(
'L',uplo,
'T',
'U', n-nnb-cut, nnb,
542 $ one,a(cut+nnb+1,cut+nnb+1),lda,work,n+nb+1)
548 a(cut+nnb+i,cut+j)=work(i,j)
558 a(cut+i,cut+j)=work(u11+i,j)
571 DO WHILE ( i .GE. 1 )
572 IF( ipiv(i) .GT. 0 )
THEN
574 IF (i .LT. ip)
CALL dsyswapr( uplo, n, a, lda, i ,ip )
575 IF (i .GT. ip)
CALL dsyswapr( uplo, n, a, lda, ip ,i )
578 IF ( i .LT. ip)
CALL dsyswapr( uplo, n, a, lda, i ,ip )
579 IF ( i .GT. ip)
CALL dsyswapr( uplo, n, a, lda, ip, i )
subroutine dtrmm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
DTRMM
subroutine dgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
DGEMM
subroutine dsyswapr(UPLO, N, A, LDA, I1, I2)
DSYSWAPR applies an elementary permutation on the rows and columns of a symmetric matrix...
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dsyconv(UPLO, WAY, N, A, LDA, IPIV, E, INFO)
DSYCONV
subroutine dtrtri(UPLO, DIAG, N, A, LDA, INFO)
DTRTRI
subroutine dsytri2x(UPLO, N, A, LDA, IPIV, WORK, NB, INFO)
DSYTRI2X