version 1.5, 2010/12/21 13:53:56
|
version 1.6, 2011/07/22 07:38:21
|
Line 1
|
Line 1
|
SUBROUTINE ZTFTRI( TRANSR, UPLO, DIAG, N, A, INFO ) |
SUBROUTINE ZTFTRI( TRANSR, UPLO, DIAG, N, A, INFO ) |
* |
* |
* -- LAPACK routine (version 3.3.0) -- |
* -- LAPACK routine (version 3.3.1) -- |
* |
* |
* -- Contributed by Fred Gustavson of the IBM Watson Research Center -- |
* -- Contributed by Fred Gustavson of the IBM Watson Research Center -- |
* November 2010 |
* -- April 2011 -- |
* |
* |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
Line 201
|
Line 201
|
ELSE IF( .NOT.LOWER .AND. .NOT.LSAME( UPLO, 'U' ) ) THEN |
ELSE IF( .NOT.LOWER .AND. .NOT.LSAME( UPLO, 'U' ) ) THEN |
INFO = -2 |
INFO = -2 |
ELSE IF( .NOT.LSAME( DIAG, 'N' ) .AND. .NOT.LSAME( DIAG, 'U' ) ) |
ELSE IF( .NOT.LSAME( DIAG, 'N' ) .AND. .NOT.LSAME( DIAG, 'U' ) ) |
+ THEN |
$ THEN |
INFO = -3 |
INFO = -3 |
ELSE IF( N.LT.0 ) THEN |
ELSE IF( N.LT.0 ) THEN |
INFO = -4 |
INFO = -4 |
Line 214
|
Line 214
|
* Quick return if possible |
* Quick return if possible |
* |
* |
IF( N.EQ.0 ) |
IF( N.EQ.0 ) |
+ RETURN |
$ RETURN |
* |
* |
* If N is odd, set NISODD = .TRUE. |
* If N is odd, set NISODD = .TRUE. |
* If N is even, set K = N/2 and NISODD = .FALSE. |
* If N is even, set K = N/2 and NISODD = .FALSE. |
Line 255
|
Line 255
|
* |
* |
CALL ZTRTRI( 'L', DIAG, N1, A( 0 ), N, INFO ) |
CALL ZTRTRI( 'L', DIAG, N1, A( 0 ), N, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL ZTRMM( 'R', 'L', 'N', DIAG, N2, N1, -CONE, A( 0 ), |
CALL ZTRMM( 'R', 'L', 'N', DIAG, N2, N1, -CONE, A( 0 ), |
+ N, A( N1 ), N ) |
$ N, A( N1 ), N ) |
CALL ZTRTRI( 'U', DIAG, N2, A( N ), N, INFO ) |
CALL ZTRTRI( 'U', DIAG, N2, A( N ), N, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ INFO = INFO + N1 |
$ INFO = INFO + N1 |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL ZTRMM( 'L', 'U', 'C', DIAG, N2, N1, CONE, A( N ), N, |
CALL ZTRMM( 'L', 'U', 'C', DIAG, N2, N1, CONE, A( N ), N, |
+ A( N1 ), N ) |
$ A( N1 ), N ) |
* |
* |
ELSE |
ELSE |
* |
* |
Line 274
|
Line 274
|
* |
* |
CALL ZTRTRI( 'L', DIAG, N1, A( N2 ), N, INFO ) |
CALL ZTRTRI( 'L', DIAG, N1, A( N2 ), N, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL ZTRMM( 'L', 'L', 'C', DIAG, N1, N2, -CONE, A( N2 ), |
CALL ZTRMM( 'L', 'L', 'C', DIAG, N1, N2, -CONE, A( N2 ), |
+ N, A( 0 ), N ) |
$ N, A( 0 ), N ) |
CALL ZTRTRI( 'U', DIAG, N2, A( N1 ), N, INFO ) |
CALL ZTRTRI( 'U', DIAG, N2, A( N1 ), N, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ INFO = INFO + N1 |
$ INFO = INFO + N1 |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL ZTRMM( 'R', 'U', 'N', DIAG, N1, N2, CONE, A( N1 ), |
CALL ZTRMM( 'R', 'U', 'N', DIAG, N1, N2, CONE, A( N1 ), |
+ N, A( 0 ), N ) |
$ N, A( 0 ), N ) |
* |
* |
END IF |
END IF |
* |
* |
Line 298
|
Line 298
|
* |
* |
CALL ZTRTRI( 'U', DIAG, N1, A( 0 ), N1, INFO ) |
CALL ZTRTRI( 'U', DIAG, N1, A( 0 ), N1, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL ZTRMM( 'L', 'U', 'N', DIAG, N1, N2, -CONE, A( 0 ), |
CALL ZTRMM( 'L', 'U', 'N', DIAG, N1, N2, -CONE, A( 0 ), |
+ N1, A( N1*N1 ), N1 ) |
$ N1, A( N1*N1 ), N1 ) |
CALL ZTRTRI( 'L', DIAG, N2, A( 1 ), N1, INFO ) |
CALL ZTRTRI( 'L', DIAG, N2, A( 1 ), N1, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ INFO = INFO + N1 |
$ INFO = INFO + N1 |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL ZTRMM( 'R', 'L', 'C', DIAG, N1, N2, CONE, A( 1 ), |
CALL ZTRMM( 'R', 'L', 'C', DIAG, N1, N2, CONE, A( 1 ), |
+ N1, A( N1*N1 ), N1 ) |
$ N1, A( N1*N1 ), N1 ) |
* |
* |
ELSE |
ELSE |
* |
* |
Line 316
|
Line 316
|
* |
* |
CALL ZTRTRI( 'U', DIAG, N1, A( N2*N2 ), N2, INFO ) |
CALL ZTRTRI( 'U', DIAG, N1, A( N2*N2 ), N2, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL ZTRMM( 'R', 'U', 'C', DIAG, N2, N1, -CONE, |
CALL ZTRMM( 'R', 'U', 'C', DIAG, N2, N1, -CONE, |
+ A( N2*N2 ), N2, A( 0 ), N2 ) |
$ A( N2*N2 ), N2, A( 0 ), N2 ) |
CALL ZTRTRI( 'L', DIAG, N2, A( N1*N2 ), N2, INFO ) |
CALL ZTRTRI( 'L', DIAG, N2, A( N1*N2 ), N2, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ INFO = INFO + N1 |
$ INFO = INFO + N1 |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL ZTRMM( 'L', 'L', 'N', DIAG, N2, N1, CONE, |
CALL ZTRMM( 'L', 'L', 'N', DIAG, N2, N1, CONE, |
+ A( N1*N2 ), N2, A( 0 ), N2 ) |
$ A( N1*N2 ), N2, A( 0 ), N2 ) |
END IF |
END IF |
* |
* |
END IF |
END IF |
Line 346
|
Line 346
|
* |
* |
CALL ZTRTRI( 'L', DIAG, K, A( 1 ), N+1, INFO ) |
CALL ZTRTRI( 'L', DIAG, K, A( 1 ), N+1, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL ZTRMM( 'R', 'L', 'N', DIAG, K, K, -CONE, A( 1 ), |
CALL ZTRMM( 'R', 'L', 'N', DIAG, K, K, -CONE, A( 1 ), |
+ N+1, A( K+1 ), N+1 ) |
$ N+1, A( K+1 ), N+1 ) |
CALL ZTRTRI( 'U', DIAG, K, A( 0 ), N+1, INFO ) |
CALL ZTRTRI( 'U', DIAG, K, A( 0 ), N+1, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ INFO = INFO + K |
$ INFO = INFO + K |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL ZTRMM( 'L', 'U', 'C', DIAG, K, K, CONE, A( 0 ), N+1, |
CALL ZTRMM( 'L', 'U', 'C', DIAG, K, K, CONE, A( 0 ), N+1, |
+ A( K+1 ), N+1 ) |
$ A( K+1 ), N+1 ) |
* |
* |
ELSE |
ELSE |
* |
* |
Line 365
|
Line 365
|
* |
* |
CALL ZTRTRI( 'L', DIAG, K, A( K+1 ), N+1, INFO ) |
CALL ZTRTRI( 'L', DIAG, K, A( K+1 ), N+1, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL ZTRMM( 'L', 'L', 'C', DIAG, K, K, -CONE, A( K+1 ), |
CALL ZTRMM( 'L', 'L', 'C', DIAG, K, K, -CONE, A( K+1 ), |
+ N+1, A( 0 ), N+1 ) |
$ N+1, A( 0 ), N+1 ) |
CALL ZTRTRI( 'U', DIAG, K, A( K ), N+1, INFO ) |
CALL ZTRTRI( 'U', DIAG, K, A( K ), N+1, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ INFO = INFO + K |
$ INFO = INFO + K |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL ZTRMM( 'R', 'U', 'N', DIAG, K, K, CONE, A( K ), N+1, |
CALL ZTRMM( 'R', 'U', 'N', DIAG, K, K, CONE, A( K ), N+1, |
+ A( 0 ), N+1 ) |
$ A( 0 ), N+1 ) |
END IF |
END IF |
ELSE |
ELSE |
* |
* |
Line 388
|
Line 388
|
* |
* |
CALL ZTRTRI( 'U', DIAG, K, A( K ), K, INFO ) |
CALL ZTRTRI( 'U', DIAG, K, A( K ), K, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL ZTRMM( 'L', 'U', 'N', DIAG, K, K, -CONE, A( K ), K, |
CALL ZTRMM( 'L', 'U', 'N', DIAG, K, K, -CONE, A( K ), K, |
+ A( K*( K+1 ) ), K ) |
$ A( K*( K+1 ) ), K ) |
CALL ZTRTRI( 'L', DIAG, K, A( 0 ), K, INFO ) |
CALL ZTRTRI( 'L', DIAG, K, A( 0 ), K, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ INFO = INFO + K |
$ INFO = INFO + K |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL ZTRMM( 'R', 'L', 'C', DIAG, K, K, CONE, A( 0 ), K, |
CALL ZTRMM( 'R', 'L', 'C', DIAG, K, K, CONE, A( 0 ), K, |
+ A( K*( K+1 ) ), K ) |
$ A( K*( K+1 ) ), K ) |
ELSE |
ELSE |
* |
* |
* SRPA for UPPER, TRANSPOSE and N is even (see paper) |
* SRPA for UPPER, TRANSPOSE and N is even (see paper) |
Line 406
|
Line 406
|
* |
* |
CALL ZTRTRI( 'U', DIAG, K, A( K*( K+1 ) ), K, INFO ) |
CALL ZTRTRI( 'U', DIAG, K, A( K*( K+1 ) ), K, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL ZTRMM( 'R', 'U', 'C', DIAG, K, K, -CONE, |
CALL ZTRMM( 'R', 'U', 'C', DIAG, K, K, -CONE, |
+ A( K*( K+1 ) ), K, A( 0 ), K ) |
$ A( K*( K+1 ) ), K, A( 0 ), K ) |
CALL ZTRTRI( 'L', DIAG, K, A( K*K ), K, INFO ) |
CALL ZTRTRI( 'L', DIAG, K, A( K*K ), K, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ INFO = INFO + K |
$ INFO = INFO + K |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL ZTRMM( 'L', 'L', 'N', DIAG, K, K, CONE, A( K*K ), K, |
CALL ZTRMM( 'L', 'L', 'N', DIAG, K, K, CONE, A( K*K ), K, |
+ A( 0 ), K ) |
$ A( 0 ), K ) |
END IF |
END IF |
END IF |
END IF |
END IF |
END IF |