3 * =========== DOCUMENTATION ===========
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
11 * REAL FUNCTION CQRT17( TRANS, IRESID, M, N, NRHS, A,
12 * LDA, X, LDX, B, LDB, C, WORK, LWORK )
14 * .. Scalar Arguments ..
16 * INTEGER IRESID, LDA, LDB, LDX, LWORK, M, N, NRHS
18 * .. Array Arguments ..
19 * COMPLEX A( LDA, * ), B( LDB, * ), C( LDB, * ),
20 * $ WORK( LWORK ), X( LDX, * )
29 *> CQRT17 computes the ratio
31 *> || R'*op(A) ||/(||A||*alpha*max(M,N,NRHS)*eps)
33 *> where R = op(A)*X - B, op(A) is A or A', and
35 *> alpha = ||B|| if IRESID = 1 (zero-residual problem)
36 *> alpha = ||R|| if IRESID = 2 (otherwise).
44 *> TRANS is CHARACTER*1
45 *> Specifies whether or not the transpose of A is used.
46 *> = 'N': No transpose, op(A) = A.
47 *> = 'C': Conjugate transpose, op(A) = A'.
53 *> IRESID = 1 indicates zero-residual problem.
54 *> IRESID = 2 indicates non-zero residual.
60 *> The number of rows of the matrix A.
61 *> If TRANS = 'N', the number of rows of the matrix B.
62 *> If TRANS = 'C', the number of rows of the matrix X.
68 *> The number of columns of the matrix A.
69 *> If TRANS = 'N', the number of rows of the matrix X.
70 *> If TRANS = 'C', the number of rows of the matrix B.
76 *> The number of columns of the matrices X and B.
81 *> A is COMPLEX array, dimension (LDA,N)
82 *> The m-by-n matrix A.
88 *> The leading dimension of the array A. LDA >= M.
93 *> X is COMPLEX array, dimension (LDX,NRHS)
94 *> If TRANS = 'N', the n-by-nrhs matrix X.
95 *> If TRANS = 'C', the m-by-nrhs matrix X.
101 *> The leading dimension of the array X.
102 *> If TRANS = 'N', LDX >= N.
103 *> If TRANS = 'C', LDX >= M.
108 *> B is COMPLEX array, dimension (LDB,NRHS)
109 *> If TRANS = 'N', the m-by-nrhs matrix B.
110 *> If TRANS = 'C', the n-by-nrhs matrix B.
116 *> The leading dimension of the array B.
117 *> If TRANS = 'N', LDB >= M.
118 *> If TRANS = 'C', LDB >= N.
123 *> C is COMPLEX array, dimension (LDB,NRHS)
128 *> WORK is COMPLEX array, dimension (LWORK)
134 *> The length of the array WORK. LWORK >= NRHS*(M+N).
140 *> \author Univ. of Tennessee
141 *> \author Univ. of California Berkeley
142 *> \author Univ. of Colorado Denver
145 *> \date November 2015
147 *> \ingroup complex_lin
149 * =====================================================================
150 REAL FUNCTION CQRT17( TRANS, IRESID, M, N, NRHS, A,
151 $ LDA, X, LDX, B, LDB, C, WORK, LWORK )
153 * -- LAPACK test routine (version 3.6.0) --
154 * -- LAPACK is a software package provided by Univ. of Tennessee, --
155 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
158 * .. Scalar Arguments ..
160 INTEGER IRESID, LDA, LDB, LDX, LWORK, M, N, NRHS
162 * .. Array Arguments ..
163 COMPLEX A( LDA, * ), B( LDB, * ), C( LDB, * ),
164 $ WORK( LWORK ), X( LDX, * )
167 * =====================================================================
171 PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0 )
173 * .. Local Scalars ..
174 INTEGER INFO, ISCL, NCOLS, NROWS
175 REAL BIGNUM, ERR, NORMA, NORMB, NORMRS, NORMX,
181 * .. External Functions ..
184 EXTERNAL LSAME, CLANGE, SLAMCH
186 * .. External Subroutines ..
187 EXTERNAL CGEMM, CLACPY, CLASCL, XERBLA
189 * .. Intrinsic Functions ..
190 INTRINSIC CMPLX, MAX, REAL
192 * .. Executable Statements ..
196 IF( LSAME( TRANS, 'N' ) ) THEN
199 ELSE IF( LSAME( TRANS, 'C' ) ) THEN
203 CALL XERBLA( 'CQRT17', 1 )
207 IF( LWORK.LT.NCOLS*NRHS ) THEN
208 CALL XERBLA( 'CQRT17', 13 )
212 IF( M.LE.0 .OR. N.LE.0 .OR. NRHS.LE.0 )
215 NORMA = CLANGE( 'One-norm', M, N, A, LDA, RWORK )
216 SMLNUM = SLAMCH( 'Safe minimum' ) / SLAMCH( 'Precision' )
217 BIGNUM = ONE / SMLNUM
220 * compute residual and scale it
222 CALL CLACPY( 'All', NROWS, NRHS, B, LDB, C, LDB )
223 CALL CGEMM( TRANS, 'No transpose', NROWS, NRHS, NCOLS,
224 $ CMPLX( -ONE ), A, LDA, X, LDX, CMPLX( ONE ), C, LDB )
225 NORMRS = CLANGE( 'Max', NROWS, NRHS, C, LDB, RWORK )
226 IF( NORMRS.GT.SMLNUM ) THEN
228 CALL CLASCL( 'General', 0, 0, NORMRS, ONE, NROWS, NRHS, C, LDB,
234 CALL CGEMM( 'Conjugate transpose', TRANS, NRHS, NCOLS, NROWS,
235 $ CMPLX( ONE ), C, LDB, A, LDA, CMPLX( ZERO ), WORK,
238 * compute and properly scale error
240 ERR = CLANGE( 'One-norm', NRHS, NCOLS, WORK, NRHS, RWORK )
247 IF( IRESID.EQ.1 ) THEN
248 NORMB = CLANGE( 'One-norm', NROWS, NRHS, B, LDB, RWORK )
256 CQRT17 = ERR / ( SLAMCH( 'Epsilon' )*REAL( MAX( M, N, NRHS ) ) )