158 SUBROUTINE zsytri_3x( UPLO, N, A, LDA, E, IPIV, WORK, NB, INFO )
166 INTEGER INFO, LDA, N, NB
170 COMPLEX*16 A( LDA, * ), E( * ), WORK( N+NB+1, * )
176 COMPLEX*16 CONE, CZERO
177 parameter( cone = ( 1.0d+0, 0.0d+0 ),
178 $ czero = ( 0.0d+0, 0.0d+0 ) )
182 INTEGER CUT, I, ICOUNT, INVD, IP, K, NNB, J, U11
183 COMPLEX*16 AK, AKKP1, AKP1, D, T, U01_I_J, U01_IP1_J,
194 INTRINSIC abs,
max, mod
201 upper = lsame( uplo,
'U' )
202 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
204 ELSE IF( n.LT.0 )
THEN
206 ELSE IF( lda.LT.
max( 1, n ) )
THEN
213 CALL xerbla(
'ZSYTRI_3X', -info )
222 work( k, 1 ) = e( k )
232 IF( ipiv( info ).GT.0 .AND. a( info, info ).EQ.czero )
240 IF( ipiv( info ).GT.0 .AND. a( info, info ).EQ.czero )
266 CALL ztrtri( uplo,
'U', n, a, lda, info )
272 IF( ipiv( k ).GT.0 )
THEN
274 work( k, invd ) = cone / a( k, k )
275 work( k, invd+1 ) = czero
280 akp1 = a( k+1, k+1 ) / t
281 akkp1 = work( k+1, 1 ) / t
282 d = t*( ak*akp1-cone )
283 work( k, invd ) = akp1 / d
284 work( k+1, invd+1 ) = ak / d
285 work( k, invd+1 ) = -akkp1 / d
286 work( k+1, invd ) = work( k, invd+1 )
299 IF( cut.LE.nnb )
THEN
304 DO i = cut+1-nnb, cut
305 IF( ipiv( i ).LT.0 ) icount = icount + 1
308 IF( mod( icount, 2 ).EQ.1 ) nnb = nnb + 1
317 work( i, j ) = a( i, cut+j )
324 work( u11+i, i ) = cone
326 work( u11+i, j ) = czero
329 work( u11+i, j ) = a( cut+i, cut+j )
337 IF( ipiv( i ).GT.0 )
THEN
339 work( i, j ) = work( i, invd ) * work( i, j )
343 u01_i_j = work( i, j )
344 u01_ip1_j = work( i+1, j )
345 work( i, j ) = work( i, invd ) * u01_i_j
346 $ + work( i, invd+1 ) * u01_ip1_j
347 work( i+1, j ) = work( i+1, invd ) * u01_i_j
348 $ + work( i+1, invd+1 ) * u01_ip1_j
358 DO WHILE ( i.LE.nnb )
359 IF( ipiv( cut+i ).GT.0 )
THEN
361 work( u11+i, j ) = work(cut+i,invd) * work(u11+i,j)
365 u11_i_j = work(u11+i,j)
366 u11_ip1_j = work(u11+i+1,j)
367 work( u11+i, j ) = work(cut+i,invd) * work(u11+i,j)
368 $ + work(cut+i,invd+1) * work(u11+i+1,j)
369 work( u11+i+1, j ) = work(cut+i+1,invd) * u11_i_j
370 $ + work(cut+i+1,invd+1) * u11_ip1_j
379 CALL ztrmm(
'L',
'U',
'T', 'u
', NNB, NNB,
380 $ CONE, A( CUT+1, CUT+1 ), LDA, WORK( U11+1, 1 ),
385 A( CUT+I, CUT+J ) = WORK( U11+I, J )
391 CALL ZGEMM( 't
', 'n
', NNB, NNB, CUT, CONE, A( 1, CUT+1 ),
392 $ LDA, WORK, N+NB+1, CZERO, WORK(U11+1,1),
400 A( CUT+I, CUT+J ) = A( CUT+I, CUT+J ) + WORK(U11+I,J)
406 CALL ZTRMM( 'l
', UPLO, 't
', 'u
', CUT, NNB,
407 $ CONE, A, LDA, WORK, N+NB+1 )
414 A( I, CUT+J ) = WORK( I, J )
434 IP = ABS( IPIV( I ) )
436.LT.
IF (I IP) CALL ZSYSWAPR( UPLO, N, A, LDA, I ,IP )
437.GT.
IF (I IP) CALL ZSYSWAPR( UPLO, N, A, LDA, IP ,I )
447 CALL ZTRTRI( UPLO, 'u
', N, A, LDA, INFO )
453.GT.
IF( IPIV( K )0 ) THEN
455 WORK( K, INVD ) = CONE / A( K, K )
456 WORK( K, INVD+1 ) = CZERO
460 AK = A( K-1, K-1 ) / T
462 AKKP1 = WORK( K-1, 1 ) / T
463 D = T*( AK*AKP1-CONE )
464 WORK( K-1, INVD ) = AKP1 / D
465 WORK( K, INVD ) = AK / D
466 WORK( K, INVD+1 ) = -AKKP1 / D
467 WORK( K-1, INVD+1 ) = WORK( K, INVD+1 )
480.GT.
IF( (CUT + NNB)N ) THEN
485 DO I = CUT + 1, CUT+NNB
486.LT.
IF ( IPIV( I )0 ) ICOUNT = ICOUNT + 1
489.EQ.
IF( MOD( ICOUNT, 2 )1 ) NNB = NNB + 1
496 WORK( I, J ) = A( CUT+NNB+I, CUT+J )
503 WORK( U11+I, I) = CONE
505 WORK( U11+I, J ) = CZERO
508 WORK( U11+I, J ) = A( CUT+I, CUT+J )
516.GT.
IF( IPIV( CUT+NNB+I )0 ) THEN
518 WORK( I, J ) = WORK( CUT+NNB+I, INVD) * WORK( I, J)
523 U01_IP1_J = WORK(I-1,J)
524 WORK(I,J)=WORK(CUT+NNB+I,INVD)*U01_I_J+
525 $ WORK(CUT+NNB+I,INVD+1)*U01_IP1_J
526 WORK(I-1,J)=WORK(CUT+NNB+I-1,INVD+1)*U01_I_J+
527 $ WORK(CUT+NNB+I-1,INVD)*U01_IP1_J
538.GT.
IF( IPIV( CUT+I )0 ) THEN
540 WORK( U11+I, J ) = WORK( CUT+I, INVD)*WORK(U11+I,J)
545 U11_I_J = WORK( U11+I, J )
546 U11_IP1_J = WORK( U11+I-1, J )
547 WORK( U11+I, J ) = WORK(CUT+I,INVD) * WORK(U11+I,J)
548 $ + WORK(CUT+I,INVD+1) * U11_IP1_J
549 WORK( U11+I-1, J ) = WORK(CUT+I-1,INVD+1) * U11_I_J
550 $ + WORK(CUT+I-1,INVD) * U11_IP1_J
559 CALL ZTRMM( 'l
', UPLO, 't
', 'u
', NNB, NNB, CONE,
560 $ A( CUT+1, CUT+1 ), LDA, WORK( U11+1, 1 ),
566 A( CUT+I, CUT+J ) = WORK( U11+I, J )
570.LT.
IF( (CUT+NNB)N ) THEN
574 CALL ZGEMM( 't
', 'n
', NNB, NNB, N-NNB-CUT, CONE,
575 $ A( CUT+NNB+1, CUT+1 ), LDA, WORK, N+NB+1,
576 $ CZERO, WORK( U11+1, 1 ), N+NB+1 )
583 A( CUT+I, CUT+J ) = A( CUT+I, CUT+J )+WORK(U11+I,J)
589 CALL ZTRMM( 'l
', UPLO, 't
', 'u
', N-NNB-CUT, NNB, CONE,
590 $ A( CUT+NNB+1, CUT+NNB+1 ), LDA, WORK,
597 A( CUT+NNB+I, CUT+J ) = WORK( I, J )
607 A( CUT+I, CUT+J ) = WORK( U11+I, J )
630 IP = ABS( IPIV( I ) )
632.LT.
IF (I IP) CALL ZSYSWAPR( UPLO, N, A, LDA, I ,IP )
633.GT.
IF (I IP) CALL ZSYSWAPR( UPLO, N, A, LDA, IP ,I )
subroutine zgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
ZGEMM