119 SUBROUTINE dsytri2x( UPLO, N, A, LDA, IPIV, WORK, NB, INFO )
131 DOUBLE PRECISION A( LDA, * ), WORK( N+NB+1,* )
137 DOUBLE PRECISION ONE, ZERO
138 parameter( one = 1.0d+0, zero = 0.0d+0 )
142 INTEGER I, IINFO, IP, K, CUT, NNB
146 DOUBLE PRECISION AK, AKKP1, AKP1, D, T
147 DOUBLE PRECISION U01_I_J, U01_IP1_J
148 DOUBLE PRECISION U11_I_J, U11_IP1_J
166 upper = lsame( uplo,
'U' )
167 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
169 ELSE IF( n.LT.0 )
THEN
171 ELSE IF( lda.LT.
max( 1, n ) )
THEN
179 CALL xerbla'DSYTRI2X', -info )
188 CALL dsyconv( uplo,
'C', n, a, lda, ipiv, work, iinfo )
197 IF( ipiv( info ).GT.0 .AND. a( info, info ).EQ.zero )
205 IF( ipiv( info ).GT.0 .AND. a( info, info ).EQ.zero )
225 CALL dtrtri( uplo, 'u
', N, A, LDA, INFO )
231.GT.
IF( IPIV( K )0 ) THEN
233 WORK(K,INVD) = ONE / A( K, K )
240 AKP1 = A( K+1, K+1 ) / T
241 AKKP1 = WORK(K+1,1) / T
242 D = T*( AK*AKP1-ONE )
243 WORK(K,INVD) = AKP1 / D
244 WORK(K+1,INVD+1) = AK / D
245 WORK(K,INVD+1) = -AKKP1 / D
246 WORK(K+1,INVD) = -AKKP1 / D
258.LE.
IF (CUT NNB) THEN
264.LT.
IF (IPIV(I) 0) COUNT=COUNT+1
267.EQ.
IF (MOD(COUNT,2) 1) NNB=NNB+1
288 WORK(U11+I,J)=A(CUT+I,CUT+J)
296 IF (IPIV(I) > 0) THEN
298 WORK(I,J)=WORK(I,INVD)*WORK(I,J)
304 U01_IP1_J = WORK(I+1,J)
305 WORK(I,J)=WORK(I,INVD)*U01_I_J+
306 $ WORK(I,INVD+1)*U01_IP1_J
307 WORK(I+1,J)=WORK(I+1,INVD)*U01_I_J+
308 $ WORK(I+1,INVD+1)*U01_IP1_J
318 IF (IPIV(CUT+I) > 0) THEN
320 WORK(U11+I,J)=WORK(CUT+I,INVD)*WORK(U11+I,J)
325 U11_I_J = WORK(U11+I,J)
326 U11_IP1_J = WORK(U11+I+1,J)
327 WORK(U11+I,J)=WORK(CUT+I,INVD)*WORK(U11+I,J) +
328 $ WORK(CUT+I,INVD+1)*WORK(U11+I+1,J)
329 WORK(U11+I+1,J)=WORK(CUT+I+1,INVD)*U11_I_J+
330 $ WORK(CUT+I+1,INVD+1)*U11_IP1_J
338 CALL DTRMM('l
','u
','t
','u
',NNB, NNB,
339 $ ONE,A(CUT+1,CUT+1),LDA,WORK(U11+1,1),N+NB+1)
343 A(CUT+I,CUT+J)=WORK(U11+I,J)
349 CALL DGEMM('t
','n
',NNB,NNB,CUT,ONE,A(1,CUT+1),LDA,
350 $ 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 DTRMM('l
',UPLO,'t
','u
',CUT, NNB,
364 $ ONE,A,LDA,WORK,N+NB+1)
383.GT.
IF( IPIV(I) 0 ) THEN
385.LT.
IF (I IP) CALL DSYSWAPR( UPLO, N, A, LDA, I ,IP )
386.GT.
IF (I IP) CALL DSYSWAPR( UPLO, N, A, LDA, IP ,I )
391 $ CALL DSYSWAPR( UPLO, N, A, LDA, I-1 ,IP )
393 $ CALL DSYSWAPR( UPLO, N, A, LDA, IP ,I-1 )
403 CALL DTRTRI( UPLO, 'u
', N, A, LDA, INFO )
409.GT.
IF( IPIV( K )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
436.GT.
IF (CUT + NNB N) THEN
442.LT.
IF (IPIV(I) 0) COUNT=COUNT+1
445.EQ.
IF (MOD(COUNT,2) 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 DTRMM('l
',UPLO,'t
','u
',NNB, NNB,
511 $ ONE,A(CUT+1,CUT+1),LDA,WORK(U11+1,1),N+NB+1)
516 A(CUT+I,CUT+J)=WORK(U11+I,J)
520.LT.
IF ( (CUT+NNB) N ) THEN
524 CALL DGEMM('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 DTRMM('l
',UPLO,'t
','u
', N-NNB-CUT, NNB,
539 $ ONE,A(CUT+NNB+1,CUT+NNB+1),LDA,WORK,N+NB+1)
545 A(CUT+NNB+I,CUT+J)=WORK(I,J)
555 A(CUT+I,CUT+J)=WORK(U11+I,J)
569.GT.
IF( IPIV(I) 0 ) THEN
571.LT.
IF (I IP) CALL DSYSWAPR( UPLO, N, A, LDA, I ,IP )
572.GT.
IF (I IP) CALL DSYSWAPR( UPLO, N, A, LDA, IP ,I )
575.LT.
IF ( I IP) CALL DSYSWAPR( UPLO, N, A, LDA, I ,IP )
576.GT.
IF ( I IP) CALL DSYSWAPR( UPLO, N, A, LDA, IP, I )
subroutine xerbla(srname, info)
XERBLA
subroutine dtrtri(uplo, diag, n, a, lda, info)
DTRTRI
subroutine dsyswapr(uplo, n, a, lda, i1, i2)
DSYSWAPR applies an elementary permutation on the rows and columns of a symmetric matrix.
subroutine dsyconv(uplo, way, n, a, lda, ipiv, e, info)
DSYCONV
subroutine dsytri2x(uplo, n, a, lda, ipiv, work, nb, info)
DSYTRI2X
subroutine dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
DGEMM
subroutine dtrmm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
DTRMM