1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
SUBROUTINE DGET03( N, A, LDA, AINV, LDAINV, WORK, LDWORK, RWORK,
$ RCOND, RESID )
*
* -- LAPACK test routine (version 3.0) --
* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
* Courant Institute, Argonne National Lab, and Rice University
* June 30, 1999
*
* .. Scalar Arguments ..
INTEGER LDA, LDAINV, LDWORK, N
DOUBLE PRECISION RCOND, RESID
* ..
* .. Array Arguments ..
DOUBLE PRECISION A( LDA, * ), AINV( LDAINV, * ), RWORK( * ),
$ WORK( LDWORK, * )
* ..
*
* Purpose
* =======
*
* DGET03 computes the residual for a general matrix times its inverse:
* norm( I - AINV*A ) / ( N * norm(A) * norm(AINV) * EPS ),
* where EPS is the machine epsilon.
*
* Arguments
* ==========
*
* N (input) INTEGER
* The number of rows and columns of the matrix A. N >= 0.
*
* A (input) DOUBLE PRECISION array, dimension (LDA,N)
* The original N x N matrix A.
*
* LDA (input) INTEGER
* The leading dimension of the array A. LDA >= max(1,N).
*
* AINV (input) DOUBLE PRECISION array, dimension (LDAINV,N)
* The inverse of the matrix A.
*
* LDAINV (input) INTEGER
* The leading dimension of the array AINV. LDAINV >= max(1,N).
*
* WORK (workspace) DOUBLE PRECISION array, dimension (LDWORK,N)
*
* LDWORK (input) INTEGER
* The leading dimension of the array WORK. LDWORK >= max(1,N).
*
* RWORK (workspace) DOUBLE PRECISION array, dimension (N)
*
* RCOND (output) DOUBLE PRECISION
* The reciprocal of the condition number of A, computed as
* ( 1/norm(A) ) / norm(AINV).
*
* RESID (output) DOUBLE PRECISION
* norm(I - AINV*A) / ( N * norm(A) * norm(AINV) * EPS )
*
* =====================================================================
*
* .. Parameters ..
DOUBLE PRECISION ZERO, ONE
PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 )
* ..
* .. Local Scalars ..
INTEGER I
DOUBLE PRECISION AINVNM, ANORM, EPS
* ..
* .. External Functions ..
DOUBLE PRECISION DLAMCH, DLANGE
EXTERNAL DLAMCH, DLANGE
* ..
* .. External Subroutines ..
EXTERNAL DGEMM
* ..
* .. Intrinsic Functions ..
INTRINSIC DBLE
* ..
* .. Executable Statements ..
*
* Quick exit if N = 0.
*
IF( N.LE.0 ) THEN
RCOND = ONE
RESID = ZERO
RETURN
END IF
*
* Exit with RESID = 1/EPS if ANORM = 0 or AINVNM = 0.
*
EPS = DLAMCH( 'Epsilon' )
ANORM = DLANGE( '1', N, N, A, LDA, RWORK )
AINVNM = DLANGE( '1', N, N, AINV, LDAINV, RWORK )
IF( ANORM.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN
RCOND = ZERO
RESID = ONE / EPS
RETURN
END IF
RCOND = ( ONE / ANORM ) / AINVNM
*
* Compute I - A * AINV
*
CALL DGEMM( 'No transpose', 'No transpose', N, N, N, -ONE, AINV,
$ LDAINV, A, LDA, ZERO, WORK, LDWORK )
DO 10 I = 1, N
WORK( I, I ) = ONE + WORK( I, I )
10 CONTINUE
*
* Compute norm(I - AINV*A) / (N * norm(A) * norm(AINV) * EPS)
*
RESID = DLANGE( '1', N, N, WORK, LDWORK, RWORK )
*
RESID = ( ( RESID*RCOND ) / EPS ) / DBLE( N )
*
RETURN
*
* End of DGET03
*
END
|