3 * =========== DOCUMENTATION ===========
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
11 * SUBROUTINE CQRT01( M, N, A, AF, Q, R, LDA, TAU, WORK, LWORK,
14 * .. Scalar Arguments ..
15 * INTEGER LDA, LWORK, M, N
17 * .. Array Arguments ..
18 * REAL RESULT( * ), RWORK( * )
19 * COMPLEX A( LDA, * ), AF( LDA, * ), Q( LDA, * ),
20 * $ R( LDA, * ), TAU( * ), WORK( LWORK )
29 *> CQRT01 tests CGEQRF, which computes the QR factorization of an m-by-n
30 *> matrix A, and partially tests CUNGQR which forms the m-by-m
31 *> orthogonal matrix Q.
33 *> CQRT01 compares R with Q'*A, and checks that Q is orthogonal.
42 *> The number of rows of the matrix A. M >= 0.
48 *> The number of columns of the matrix A. N >= 0.
53 *> A is COMPLEX array, dimension (LDA,N)
54 *> The m-by-n matrix A.
59 *> AF is COMPLEX array, dimension (LDA,N)
60 *> Details of the QR factorization of A, as returned by CGEQRF.
61 *> See CGEQRF for further details.
66 *> Q is COMPLEX array, dimension (LDA,M)
67 *> The m-by-m orthogonal matrix Q.
72 *> R is COMPLEX array, dimension (LDA,max(M,N))
78 *> The leading dimension of the arrays A, AF, Q and R.
84 *> TAU is COMPLEX array, dimension (min(M,N))
85 *> The scalar factors of the elementary reflectors, as returned
91 *> WORK is COMPLEX array, dimension (LWORK)
97 *> The dimension of the array WORK.
102 *> RWORK is REAL array, dimension (M)
105 *> \param[out] RESULT
107 *> RESULT is REAL array, dimension (2)
109 *> RESULT(1) = norm( R - Q'*A ) / ( M * norm(A) * EPS )
110 *> RESULT(2) = norm( I - Q'*Q ) / ( M * EPS )
116 *> \author Univ. of Tennessee
117 *> \author Univ. of California Berkeley
118 *> \author Univ. of Colorado Denver
121 *> \date November 2011
123 *> \ingroup complex_lin
125 * =====================================================================
126 SUBROUTINE CQRT01( M, N, A, AF, Q, R, LDA, TAU, WORK, LWORK,
129 * -- LAPACK test routine (version 3.4.0) --
130 * -- LAPACK is a software package provided by Univ. of Tennessee, --
131 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
134 * .. Scalar Arguments ..
135 INTEGER LDA, LWORK, M, N
137 * .. Array Arguments ..
138 REAL RESULT( * ), RWORK( * )
139 COMPLEX A( LDA, * ), AF( LDA, * ), Q( LDA, * ),
140 $ R( LDA, * ), TAU( * ), WORK( LWORK )
143 * =====================================================================
147 PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0 )
149 PARAMETER ( ROGUE = ( -1.0E+10, -1.0E+10 ) )
151 * .. Local Scalars ..
153 REAL ANORM, EPS, RESID
155 * .. External Functions ..
156 REAL CLANGE, CLANSY, SLAMCH
157 EXTERNAL CLANGE, CLANSY, SLAMCH
159 * .. External Subroutines ..
160 EXTERNAL CGEMM, CGEQRF, CHERK, CLACPY, CLASET, CUNGQR
162 * .. Intrinsic Functions ..
163 INTRINSIC CMPLX, MAX, MIN, REAL
165 * .. Scalars in Common ..
168 * .. Common blocks ..
169 COMMON / SRNAMC / SRNAMT
171 * .. Executable Statements ..
174 EPS = SLAMCH( 'Epsilon' )
176 * Copy the matrix A to the array AF.
178 CALL CLACPY( 'Full', M, N, A, LDA, AF, LDA )
180 * Factorize the matrix A in the array AF.
183 CALL CGEQRF( M, N, AF, LDA, TAU, WORK, LWORK, INFO )
187 CALL CLASET( 'Full', M, M, ROGUE, ROGUE, Q, LDA )
188 CALL CLACPY( 'Lower', M-1, N, AF( 2, 1 ), LDA, Q( 2, 1 ), LDA )
190 * Generate the m-by-m matrix Q
193 CALL CUNGQR( M, M, MINMN, Q, LDA, TAU, WORK, LWORK, INFO )
197 CALL CLASET( 'Full', M, N, CMPLX( ZERO ), CMPLX( ZERO ), R, LDA )
198 CALL CLACPY( 'Upper', M, N, AF, LDA, R, LDA )
202 CALL CGEMM( 'Conjugate transpose', 'No transpose', M, N, M,
203 $ CMPLX( -ONE ), Q, LDA, A, LDA, CMPLX( ONE ), R, LDA )
205 * Compute norm( R - Q'*A ) / ( M * norm(A) * EPS ) .
207 ANORM = CLANGE( '1', M, N, A, LDA, RWORK )
208 RESID = CLANGE( '1', M, N, R, LDA, RWORK )
209 IF( ANORM.GT.ZERO ) THEN
210 RESULT( 1 ) = ( ( RESID / REAL( MAX( 1, M ) ) ) / ANORM ) / EPS
217 CALL CLASET( 'Full', M, M, CMPLX( ZERO ), CMPLX( ONE ), R, LDA )
218 CALL CHERK( 'Upper', 'Conjugate transpose', M, M, -ONE, Q, LDA,
221 * Compute norm( I - Q'*Q ) / ( M * EPS ) .
223 RESID = CLANSY( '1', 'Upper', M, R, LDA, RWORK )
225 RESULT( 2 ) = ( RESID / REAL( MAX( 1, M ) ) ) / EPS