3 * =========== DOCUMENTATION ===========
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
11 * SUBROUTINE SLQT01( M, N, A, AF, Q, L, LDA, TAU, WORK, LWORK,
14 * .. Scalar Arguments ..
15 * INTEGER LDA, LWORK, M, N
17 * .. Array Arguments ..
18 * REAL A( LDA, * ), AF( LDA, * ), L( LDA, * ),
19 * $ Q( LDA, * ), RESULT( * ), RWORK( * ), TAU( * ),
29 *> SLQT01 tests SGELQF, which computes the LQ factorization of an m-by-n
30 *> matrix A, and partially tests SORGLQ which forms the n-by-n
31 *> orthogonal matrix Q.
33 *> SLQT01 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 REAL array, dimension (LDA,N)
54 *> The m-by-n matrix A.
59 *> AF is REAL array, dimension (LDA,N)
60 *> Details of the LQ factorization of A, as returned by SGELQF.
61 *> See SGELQF for further details.
66 *> Q is REAL array, dimension (LDA,N)
67 *> The n-by-n orthogonal matrix Q.
72 *> L is REAL array, dimension (LDA,max(M,N))
78 *> The leading dimension of the arrays A, AF, Q and L.
84 *> TAU is REAL array, dimension (min(M,N))
85 *> The scalar factors of the elementary reflectors, as returned
91 *> WORK is REAL array, dimension (LWORK)
97 *> The dimension of the array WORK.
102 *> RWORK is REAL array, dimension (max(M,N))
105 *> \param[out] RESULT
107 *> RESULT is REAL 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 single_lin
125 * =====================================================================
126 SUBROUTINE SLQT01( 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 REAL A( LDA, * ), AF( LDA, * ), L( LDA, * ),
139 $ Q( LDA, * ), RESULT( * ), RWORK( * ), TAU( * ),
143 * =====================================================================
147 PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0 )
149 PARAMETER ( ROGUE = -1.0E+10 )
151 * .. Local Scalars ..
153 REAL ANORM, EPS, RESID
155 * .. External Functions ..
156 REAL SLAMCH, SLANGE, SLANSY
157 EXTERNAL SLAMCH, SLANGE, SLANSY
159 * .. External Subroutines ..
160 EXTERNAL SGELQF, SGEMM, SLACPY, SLASET, SORGLQ, SSYRK
162 * .. Intrinsic Functions ..
163 INTRINSIC 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 SLACPY( 'Full', M, N, A, LDA, AF, LDA )
180 * Factorize the matrix A in the array AF.
183 CALL SGELQF( M, N, AF, LDA, TAU, WORK, LWORK, INFO )
187 CALL SLASET( 'Full', N, N, ROGUE, ROGUE, Q, LDA )
189 $ CALL SLACPY( 'Upper', M, N-1, AF( 1, 2 ), LDA, Q( 1, 2 ), LDA )
191 * Generate the n-by-n matrix Q
194 CALL SORGLQ( N, N, MINMN, Q, LDA, TAU, WORK, LWORK, INFO )
198 CALL SLASET( 'Full', M, N, ZERO, ZERO, L, LDA )
199 CALL SLACPY( 'Lower', M, N, AF, LDA, L, LDA )
203 CALL SGEMM( 'No transpose', 'Transpose', M, N, N, -ONE, A, LDA, Q,
206 * Compute norm( L - Q'*A ) / ( N * norm(A) * EPS ) .
208 ANORM = SLANGE( '1', M, N, A, LDA, RWORK )
209 RESID = SLANGE( '1', M, N, L, LDA, RWORK )
210 IF( ANORM.GT.ZERO ) THEN
211 RESULT( 1 ) = ( ( RESID / REAL( MAX( 1, N ) ) ) / ANORM ) / EPS
218 CALL SLASET( 'Full', N, N, ZERO, ONE, L, LDA )
219 CALL SSYRK( 'Upper', 'No transpose', N, N, -ONE, Q, LDA, ONE, L,
222 * Compute norm( I - Q*Q' ) / ( N * EPS ) .
224 RESID = SLANSY( '1', 'Upper', N, L, LDA, RWORK )
226 RESULT( 2 ) = ( RESID / REAL( MAX( 1, N ) ) ) / EPS