version 1.5, 2010/12/21 13:53:40
|
version 1.6, 2011/07/22 07:38:12
|
Line 1
|
Line 1
|
SUBROUTINE DTFTRI( TRANSR, UPLO, DIAG, N, A, INFO ) |
SUBROUTINE DTFTRI( 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 181
|
Line 181
|
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 194
|
Line 194
|
* 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 235
|
Line 235
|
* |
* |
CALL DTRTRI( 'L', DIAG, N1, A( 0 ), N, INFO ) |
CALL DTRTRI( 'L', DIAG, N1, A( 0 ), N, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL DTRMM( 'R', 'L', 'N', DIAG, N2, N1, -ONE, A( 0 ), |
CALL DTRMM( 'R', 'L', 'N', DIAG, N2, N1, -ONE, A( 0 ), |
+ N, A( N1 ), N ) |
$ N, A( N1 ), N ) |
CALL DTRTRI( 'U', DIAG, N2, A( N ), N, INFO ) |
CALL DTRTRI( '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 DTRMM( 'L', 'U', 'T', DIAG, N2, N1, ONE, A( N ), N, |
CALL DTRMM( 'L', 'U', 'T', DIAG, N2, N1, ONE, A( N ), N, |
+ A( N1 ), N ) |
$ A( N1 ), N ) |
* |
* |
ELSE |
ELSE |
* |
* |
Line 254
|
Line 254
|
* |
* |
CALL DTRTRI( 'L', DIAG, N1, A( N2 ), N, INFO ) |
CALL DTRTRI( 'L', DIAG, N1, A( N2 ), N, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL DTRMM( 'L', 'L', 'T', DIAG, N1, N2, -ONE, A( N2 ), |
CALL DTRMM( 'L', 'L', 'T', DIAG, N1, N2, -ONE, A( N2 ), |
+ N, A( 0 ), N ) |
$ N, A( 0 ), N ) |
CALL DTRTRI( 'U', DIAG, N2, A( N1 ), N, INFO ) |
CALL DTRTRI( '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 DTRMM( 'R', 'U', 'N', DIAG, N1, N2, ONE, A( N1 ), |
CALL DTRMM( 'R', 'U', 'N', DIAG, N1, N2, ONE, A( N1 ), |
+ N, A( 0 ), N ) |
$ N, A( 0 ), N ) |
* |
* |
END IF |
END IF |
* |
* |
Line 278
|
Line 278
|
* |
* |
CALL DTRTRI( 'U', DIAG, N1, A( 0 ), N1, INFO ) |
CALL DTRTRI( 'U', DIAG, N1, A( 0 ), N1, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL DTRMM( 'L', 'U', 'N', DIAG, N1, N2, -ONE, A( 0 ), |
CALL DTRMM( 'L', 'U', 'N', DIAG, N1, N2, -ONE, A( 0 ), |
+ N1, A( N1*N1 ), N1 ) |
$ N1, A( N1*N1 ), N1 ) |
CALL DTRTRI( 'L', DIAG, N2, A( 1 ), N1, INFO ) |
CALL DTRTRI( '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 DTRMM( 'R', 'L', 'T', DIAG, N1, N2, ONE, A( 1 ), |
CALL DTRMM( 'R', 'L', 'T', DIAG, N1, N2, ONE, A( 1 ), |
+ N1, A( N1*N1 ), N1 ) |
$ N1, A( N1*N1 ), N1 ) |
* |
* |
ELSE |
ELSE |
* |
* |
Line 296
|
Line 296
|
* |
* |
CALL DTRTRI( 'U', DIAG, N1, A( N2*N2 ), N2, INFO ) |
CALL DTRTRI( 'U', DIAG, N1, A( N2*N2 ), N2, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL DTRMM( 'R', 'U', 'T', DIAG, N2, N1, -ONE, |
CALL DTRMM( 'R', 'U', 'T', DIAG, N2, N1, -ONE, |
+ A( N2*N2 ), N2, A( 0 ), N2 ) |
$ A( N2*N2 ), N2, A( 0 ), N2 ) |
CALL DTRTRI( 'L', DIAG, N2, A( N1*N2 ), N2, INFO ) |
CALL DTRTRI( '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 DTRMM( 'L', 'L', 'N', DIAG, N2, N1, ONE, |
CALL DTRMM( 'L', 'L', 'N', DIAG, N2, N1, ONE, |
+ A( N1*N2 ), N2, A( 0 ), N2 ) |
$ A( N1*N2 ), N2, A( 0 ), N2 ) |
END IF |
END IF |
* |
* |
END IF |
END IF |
Line 326
|
Line 326
|
* |
* |
CALL DTRTRI( 'L', DIAG, K, A( 1 ), N+1, INFO ) |
CALL DTRTRI( 'L', DIAG, K, A( 1 ), N+1, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL DTRMM( 'R', 'L', 'N', DIAG, K, K, -ONE, A( 1 ), |
CALL DTRMM( 'R', 'L', 'N', DIAG, K, K, -ONE, A( 1 ), |
+ N+1, A( K+1 ), N+1 ) |
$ N+1, A( K+1 ), N+1 ) |
CALL DTRTRI( 'U', DIAG, K, A( 0 ), N+1, INFO ) |
CALL DTRTRI( '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 DTRMM( 'L', 'U', 'T', DIAG, K, K, ONE, A( 0 ), N+1, |
CALL DTRMM( 'L', 'U', 'T', DIAG, K, K, ONE, A( 0 ), N+1, |
+ A( K+1 ), N+1 ) |
$ A( K+1 ), N+1 ) |
* |
* |
ELSE |
ELSE |
* |
* |
Line 345
|
Line 345
|
* |
* |
CALL DTRTRI( 'L', DIAG, K, A( K+1 ), N+1, INFO ) |
CALL DTRTRI( 'L', DIAG, K, A( K+1 ), N+1, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL DTRMM( 'L', 'L', 'T', DIAG, K, K, -ONE, A( K+1 ), |
CALL DTRMM( 'L', 'L', 'T', DIAG, K, K, -ONE, A( K+1 ), |
+ N+1, A( 0 ), N+1 ) |
$ N+1, A( 0 ), N+1 ) |
CALL DTRTRI( 'U', DIAG, K, A( K ), N+1, INFO ) |
CALL DTRTRI( '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 DTRMM( 'R', 'U', 'N', DIAG, K, K, ONE, A( K ), N+1, |
CALL DTRMM( 'R', 'U', 'N', DIAG, K, K, ONE, A( K ), N+1, |
+ A( 0 ), N+1 ) |
$ A( 0 ), N+1 ) |
END IF |
END IF |
ELSE |
ELSE |
* |
* |
Line 368
|
Line 368
|
* |
* |
CALL DTRTRI( 'U', DIAG, K, A( K ), K, INFO ) |
CALL DTRTRI( 'U', DIAG, K, A( K ), K, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL DTRMM( 'L', 'U', 'N', DIAG, K, K, -ONE, A( K ), K, |
CALL DTRMM( 'L', 'U', 'N', DIAG, K, K, -ONE, A( K ), K, |
+ A( K*( K+1 ) ), K ) |
$ A( K*( K+1 ) ), K ) |
CALL DTRTRI( 'L', DIAG, K, A( 0 ), K, INFO ) |
CALL DTRTRI( '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 DTRMM( 'R', 'L', 'T', DIAG, K, K, ONE, A( 0 ), K, |
CALL DTRMM( 'R', 'L', 'T', DIAG, K, K, ONE, 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 386
|
Line 386
|
* |
* |
CALL DTRTRI( 'U', DIAG, K, A( K*( K+1 ) ), K, INFO ) |
CALL DTRTRI( 'U', DIAG, K, A( K*( K+1 ) ), K, INFO ) |
IF( INFO.GT.0 ) |
IF( INFO.GT.0 ) |
+ RETURN |
$ RETURN |
CALL DTRMM( 'R', 'U', 'T', DIAG, K, K, -ONE, |
CALL DTRMM( 'R', 'U', 'T', DIAG, K, K, -ONE, |
+ A( K*( K+1 ) ), K, A( 0 ), K ) |
$ A( K*( K+1 ) ), K, A( 0 ), K ) |
CALL DTRTRI( 'L', DIAG, K, A( K*K ), K, INFO ) |
CALL DTRTRI( '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 DTRMM( 'L', 'L', 'N', DIAG, K, K, ONE, A( K*K ), K, |
CALL DTRMM( 'L', 'L', 'N', DIAG, K, K, ONE, A( K*K ), K, |
+ A( 0 ), K ) |
$ A( 0 ), K ) |
END IF |
END IF |
END IF |
END IF |
END IF |
END IF |