version 1.8, 2010/12/21 13:53:37
|
version 1.9, 2011/07/22 07:38:10
|
Line 1
|
Line 1
|
SUBROUTINE DSGESV( N, NRHS, A, LDA, IPIV, B, LDB, X, LDX, WORK, |
SUBROUTINE DSGESV( N, NRHS, A, LDA, IPIV, B, LDB, X, LDX, WORK, |
+ SWORK, ITER, INFO ) |
$ SWORK, ITER, INFO ) |
* |
* |
* -- LAPACK PROTOTYPE driver routine (version 3.2.2) -- |
* -- LAPACK PROTOTYPE driver routine (version 3.3.1) -- |
* -- 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..-- |
* February 2007 |
* -- April 2011 -- |
* |
* |
* .. |
* .. |
* .. Scalar Arguments .. |
* .. Scalar Arguments .. |
Line 14
|
Line 14
|
INTEGER IPIV( * ) |
INTEGER IPIV( * ) |
REAL SWORK( * ) |
REAL SWORK( * ) |
DOUBLE PRECISION A( LDA, * ), B( LDB, * ), WORK( N, * ), |
DOUBLE PRECISION A( LDA, * ), B( LDB, * ), WORK( N, * ), |
+ X( LDX, * ) |
$ X( LDX, * ) |
* .. |
* .. |
* |
* |
* Purpose |
* Purpose |
Line 122
|
Line 122
|
* but the factor U is exactly singular, so the solution |
* but the factor U is exactly singular, so the solution |
* could not be computed. |
* could not be computed. |
* |
* |
* ========= |
* ===================================================================== |
* |
* |
* .. Parameters .. |
* .. Parameters .. |
LOGICAL DOITREF |
LOGICAL DOITREF |
Line 143
|
Line 143
|
* |
* |
* .. External Subroutines .. |
* .. External Subroutines .. |
EXTERNAL DAXPY, DGEMM, DLACPY, DLAG2S, SLAG2D, SGETRF, |
EXTERNAL DAXPY, DGEMM, DLACPY, DLAG2S, SLAG2D, SGETRF, |
+ SGETRS, XERBLA |
$ SGETRS, XERBLA |
* .. |
* .. |
* .. External Functions .. |
* .. External Functions .. |
INTEGER IDAMAX |
INTEGER IDAMAX |
Line 179
|
Line 179
|
* Quick return if (N.EQ.0). |
* Quick return if (N.EQ.0). |
* |
* |
IF( N.EQ.0 ) |
IF( N.EQ.0 ) |
+ RETURN |
$ RETURN |
* |
* |
* Skip single precision iterative refinement if a priori slower |
* Skip single precision iterative refinement if a priori slower |
* than double precision factorization. |
* than double precision factorization. |
Line 232
|
Line 232
|
* Solve the system SA*SX = SB. |
* Solve the system SA*SX = SB. |
* |
* |
CALL SGETRS( 'No transpose', N, NRHS, SWORK( PTSA ), N, IPIV, |
CALL SGETRS( 'No transpose', N, NRHS, SWORK( PTSA ), N, IPIV, |
+ SWORK( PTSX ), N, INFO ) |
$ SWORK( PTSX ), N, INFO ) |
* |
* |
* Convert SX back to double precision |
* Convert SX back to double precision |
* |
* |
Line 243
|
Line 243
|
CALL DLACPY( 'All', N, NRHS, B, LDB, WORK, N ) |
CALL DLACPY( 'All', N, NRHS, B, LDB, WORK, N ) |
* |
* |
CALL DGEMM( 'No Transpose', 'No Transpose', N, NRHS, N, NEGONE, A, |
CALL DGEMM( 'No Transpose', 'No Transpose', N, NRHS, N, NEGONE, A, |
+ LDA, X, LDX, ONE, WORK, N ) |
$ LDA, X, LDX, ONE, WORK, N ) |
* |
* |
* Check whether the NRHS normwise backward errors satisfy the |
* Check whether the NRHS normwise backward errors satisfy the |
* stopping criterion. If yes, set ITER=0 and return. |
* stopping criterion. If yes, set ITER=0 and return. |
Line 252
|
Line 252
|
XNRM = ABS( X( IDAMAX( N, X( 1, I ), 1 ), I ) ) |
XNRM = ABS( X( IDAMAX( N, X( 1, I ), 1 ), I ) ) |
RNRM = ABS( WORK( IDAMAX( N, WORK( 1, I ), 1 ), I ) ) |
RNRM = ABS( WORK( IDAMAX( N, WORK( 1, I ), 1 ), I ) ) |
IF( RNRM.GT.XNRM*CTE ) |
IF( RNRM.GT.XNRM*CTE ) |
+ GO TO 10 |
$ GO TO 10 |
END DO |
END DO |
* |
* |
* If we are here, the NRHS normwise backward errors satisfy the |
* If we are here, the NRHS normwise backward errors satisfy the |
Line 278
|
Line 278
|
* Solve the system SA*SX = SR. |
* Solve the system SA*SX = SR. |
* |
* |
CALL SGETRS( 'No transpose', N, NRHS, SWORK( PTSA ), N, IPIV, |
CALL SGETRS( 'No transpose', N, NRHS, SWORK( PTSA ), N, IPIV, |
+ SWORK( PTSX ), N, INFO ) |
$ SWORK( PTSX ), N, INFO ) |
* |
* |
* Convert SX back to double precision and update the current |
* Convert SX back to double precision and update the current |
* iterate. |
* iterate. |
Line 294
|
Line 294
|
CALL DLACPY( 'All', N, NRHS, B, LDB, WORK, N ) |
CALL DLACPY( 'All', N, NRHS, B, LDB, WORK, N ) |
* |
* |
CALL DGEMM( 'No Transpose', 'No Transpose', N, NRHS, N, NEGONE, |
CALL DGEMM( 'No Transpose', 'No Transpose', N, NRHS, N, NEGONE, |
+ A, LDA, X, LDX, ONE, WORK, N ) |
$ A, LDA, X, LDX, ONE, WORK, N ) |
* |
* |
* Check whether the NRHS normwise backward errors satisfy the |
* Check whether the NRHS normwise backward errors satisfy the |
* stopping criterion. If yes, set ITER=IITER>0 and return. |
* stopping criterion. If yes, set ITER=IITER>0 and return. |
Line 303
|
Line 303
|
XNRM = ABS( X( IDAMAX( N, X( 1, I ), 1 ), I ) ) |
XNRM = ABS( X( IDAMAX( N, X( 1, I ), 1 ), I ) ) |
RNRM = ABS( WORK( IDAMAX( N, WORK( 1, I ), 1 ), I ) ) |
RNRM = ABS( WORK( IDAMAX( N, WORK( 1, I ), 1 ), I ) ) |
IF( RNRM.GT.XNRM*CTE ) |
IF( RNRM.GT.XNRM*CTE ) |
+ GO TO 20 |
$ GO TO 20 |
END DO |
END DO |
* |
* |
* If we are here, the NRHS normwise backward errors satisfy the |
* If we are here, the NRHS normwise backward errors satisfy the |
Line 332
|
Line 332
|
CALL DGETRF( N, N, A, LDA, IPIV, INFO ) |
CALL DGETRF( N, N, A, LDA, IPIV, INFO ) |
* |
* |
IF( INFO.NE.0 ) |
IF( INFO.NE.0 ) |
+ RETURN |
$ RETURN |
* |
* |
CALL DLACPY( 'All', N, NRHS, B, LDB, X, LDX ) |
CALL DLACPY( 'All', N, NRHS, B, LDB, X, LDX ) |
CALL DGETRS( 'No transpose', N, NRHS, A, LDA, IPIV, X, LDX, |
CALL DGETRS( 'No transpose', N, NRHS, A, LDA, IPIV, X, LDX, |
+ INFO ) |
$ INFO ) |
* |
* |
RETURN |
RETURN |
* |
* |