119 SUBROUTINE csytri2x( UPLO, N, A, LDA, IPIV, WORK, NB, INFO )
127 INTEGER INFO, LDA, N, NB
131 COMPLEX A( LDA, * ), WORK( N+NB+1,* )
138 parameter( one = ( 1.0e+0, 0.0e+0 ),
139 $ zero = ( 0.0e+0, 0.0e+0 ) )
143 INTEGER I, IINFO, IP, K, CUT, NNB
147 COMPLEX AK, AKKP1, AKP1, D, T
148 COMPLEX U01_I_J, U01_IP1_J
149 COMPLEX U11_I_J, U11_IP1_J
167 upper = lsame( uplo, 'u
' )
168.NOT..AND..NOT.
IF( UPPER LSAME( UPLO, 'l
' ) ) THEN
170.LT.
ELSE IF( N0 ) THEN
172.LT.
ELSE IF( LDAMAX( 1, N ) ) THEN
189 CALL CSYCONV( UPLO, 'c
', N, A, LDA, IPIV, WORK, IINFO )
198.GT..AND..EQ.
IF( IPIV( INFO )0 A( INFO, INFO )ZERO )
206.GT..AND..EQ.
IF( IPIV( INFO )0 A( INFO, INFO )ZERO )
226 CALL CTRTRI( UPLO, 'u
', N, A, LDA, INFO )
232.GT.
IF( IPIV( K )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
259.LE.
IF (CUT NNB) THEN
265.LT.
IF (IPIV(I) 0) COUNT=COUNT+1
268.EQ.
IF (MOD(COUNT,2) 1) NNB=NNB+1
289 WORK(U11+I,J)=A(CUT+I,CUT+J)
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
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 CTRMM('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 CGEMM('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 CTRMM('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 CSYSWAPR( UPLO, N, A, LDA, I ,IP )
386.GT.
IF (I IP) CALL CSYSWAPR( UPLO, N, A, LDA, IP ,I )
391 $ CALL CSYSWAPR( UPLO, N, A, LDA, I-1 ,IP )
393 $ CALL CSYSWAPR( UPLO, N, A, LDA, IP ,I-1 )
403 CALL CTRTRI( 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.GE.
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 CTRMM('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)
519.LT.
IF ( (CUT+NNB) N ) THEN
523 CALL CGEMM('t
','n
',NNB,NNB,N-NNB-CUT,ONE,A(CUT+NNB+1,CUT+1)
524 $ ,LDA,WORK,N+NB+1, ZERO, WORK(U11+1,1), N+NB+1)
531 A(CUT+I,CUT+J)=A(CUT+I,CUT+J)+WORK(U11+I,J)
537 CALL CTRMM('l
',UPLO,'t
','u', n-nnb-cut, nnb,
538 $ one,a(cut+nnb+1,cut+nnb+1),lda,work,n+nb+1)
543 a(cut+nnb+i,cut+j)=work(i,j)
552 a(cut+i,cut+j)=work(u11+i,j)
565 DO WHILE ( i .GE. 1 )
566 IF( ipiv(i) .GT. 0 )
THEN
568 IF (i .LT. ip)
CALL csyswapr( uplo, n, a, lda, i ,ip )
569 IF (i .GT. ip)
CALL csyswapr( uplo, n, a, lda, ip ,i )
572 IF ( i .LT. ip)
CALL csyswapr( uplo, n, a, lda, i ,ip )
573 IF ( i .GT. ip)
CALL csyswapr( uplo, n, a, lda, ip ,i )
subroutine csyconv(uplo, way, n, a, lda, ipiv, e, info)
CSYCONV
subroutine csytri2x(uplo, n, a, lda, ipiv, work, nb, info)
CSYTRI2X
subroutine ctrmm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
CTRMM
subroutine cgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
CGEMM