3 * =========== DOCUMENTATION ===========
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
11 * SUBROUTINE ZLQT01( M, N, A, AF, Q, L, LDA, TAU, WORK, LWORK,
14 * .. Scalar Arguments ..
15 * INTEGER LDA, LWORK, M, N
17 * .. Array Arguments ..
18 * DOUBLE PRECISION RESULT( * ), RWORK( * )
19 * COMPLEX*16 A( LDA, * ), AF( LDA, * ), L( LDA, * ),
20 * $ Q( LDA, * ), TAU( * ), WORK( LWORK )
29 *> ZLQT01 tests ZGELQF, which computes the LQ factorization of an m-by-n
30 *> matrix A, and partially tests ZUNGLQ which forms the n-by-n
31 *> orthogonal matrix Q.
33 *> ZLQT01 compares L with A*Q', 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*16 array, dimension (LDA,N)
54 *> The m-by-n matrix A.
59 *> AF is COMPLEX*16 array, dimension (LDA,N)
60 *> Details of the LQ factorization of A, as returned by ZGELQF.
61 *> See ZGELQF for further details.
66 *> Q is COMPLEX*16 array, dimension (LDA,N)
67 *> The n-by-n orthogonal matrix Q.
72 *> L is COMPLEX*16 array, dimension (LDA,max(M,N))
78 *> The leading dimension of the arrays A, AF, Q and L.
84 *> TAU is COMPLEX*16 array, dimension (min(M,N))
85 *> The scalar factors of the elementary reflectors, as returned
91 *> WORK is COMPLEX*16 array, dimension (LWORK)
97 *> The dimension of the array WORK.
102 *> RWORK is DOUBLE PRECISION array, dimension (max(M,N))
105 *> \param[out] RESULT
107 *> RESULT is DOUBLE PRECISION array, dimension (2)
109 *> RESULT(1) = norm( L - A*Q' ) / ( N * norm(A) * EPS )
110 *> RESULT(2) = norm( I - Q*Q' ) / ( N * EPS )
116 *> \author Univ. of Tennessee
117 *> \author Univ. of California Berkeley
118 *> \author Univ. of Colorado Denver
121 *> \date November 2011
123 *> \ingroup complex16_lin
125 * =====================================================================
126 SUBROUTINE ZLQT01( M, N, A, AF, Q, L, 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 DOUBLE PRECISION RESULT( * ), RWORK( * )
139 COMPLEX*16 A( LDA, * ), AF( LDA, * ), L( LDA, * ),
140 $ Q( LDA, * ), TAU( * ), WORK( LWORK )
143 * =====================================================================
146 DOUBLE PRECISION ZERO, ONE
147 PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 )
149 PARAMETER ( ROGUE = ( -1.0D+10, -1.0D+10 ) )
151 * .. Local Scalars ..
153 DOUBLE PRECISION ANORM, EPS, RESID
155 * .. External Functions ..
156 DOUBLE PRECISION DLAMCH, ZLANGE, ZLANSY
157 EXTERNAL DLAMCH, ZLANGE, ZLANSY
159 * .. External Subroutines ..
160 EXTERNAL ZGELQF, ZGEMM, ZHERK, ZLACPY, ZLASET, ZUNGLQ
162 * .. Intrinsic Functions ..
163 INTRINSIC DBLE, DCMPLX, MAX, MIN
165 * .. Scalars in Common ..
168 * .. Common blocks ..
169 COMMON / SRNAMC / SRNAMT
171 * .. Executable Statements ..
174 EPS = DLAMCH( 'Epsilon' )
176 * Copy the matrix A to the array AF.
178 CALL ZLACPY( 'Full', M, N, A, LDA, AF, LDA )
180 * Factorize the matrix A in the array AF.
183 CALL ZGELQF( M, N, AF, LDA, TAU, WORK, LWORK, INFO )
187 CALL ZLASET( 'Full', N, N, ROGUE, ROGUE, Q, LDA )
189 $ CALL ZLACPY( 'Upper', M, N-1, AF( 1, 2 ), LDA, Q( 1, 2 ), LDA )
191 * Generate the n-by-n matrix Q
194 CALL ZUNGLQ( N, N, MINMN, Q, LDA, TAU, WORK, LWORK, INFO )
198 CALL ZLASET( 'Full', M, N, DCMPLX( ZERO ), DCMPLX( ZERO ), L,
200 CALL ZLACPY( 'Lower', M, N, AF, LDA, L, LDA )
204 CALL ZGEMM( 'No transpose', 'Conjugate transpose', M, N, N,
205 $ DCMPLX( -ONE ), A, LDA, Q, LDA, DCMPLX( ONE ), L,
208 * Compute norm( L - Q'*A ) / ( N * norm(A) * EPS ) .
210 ANORM = ZLANGE( '1', M, N, A, LDA, RWORK )
211 RESID = ZLANGE( '1', M, N, L, LDA, RWORK )
212 IF( ANORM.GT.ZERO ) THEN
213 RESULT( 1 ) = ( ( RESID / DBLE( MAX( 1, N ) ) ) / ANORM ) / EPS
220 CALL ZLASET( 'Full', N, N, DCMPLX( ZERO ), DCMPLX( ONE ), L, LDA )
221 CALL ZHERK( 'Upper', 'No transpose', N, N, -ONE, Q, LDA, ONE, L,
224 * Compute norm( I - Q*Q' ) / ( N * EPS ) .
226 RESID = ZLANSY( '1', 'Upper', N, L, LDA, RWORK )
228 RESULT( 2 ) = ( RESID / DBLE( MAX( 1, N ) ) ) / EPS