LAPACK 3.3.0
|
00001 SUBROUTINE ZLQT02( M, N, K, A, AF, Q, L, LDA, TAU, WORK, LWORK, 00002 $ RWORK, RESULT ) 00003 * 00004 * -- LAPACK test routine (version 3.1) -- 00005 * Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. 00006 * November 2006 00007 * 00008 * .. Scalar Arguments .. 00009 INTEGER K, LDA, LWORK, M, N 00010 * .. 00011 * .. Array Arguments .. 00012 DOUBLE PRECISION RESULT( * ), RWORK( * ) 00013 COMPLEX*16 A( LDA, * ), AF( LDA, * ), L( LDA, * ), 00014 $ Q( LDA, * ), TAU( * ), WORK( LWORK ) 00015 * .. 00016 * 00017 * Purpose 00018 * ======= 00019 * 00020 * ZLQT02 tests ZUNGLQ, which generates an m-by-n matrix Q with 00021 * orthonornmal rows that is defined as the product of k elementary 00022 * reflectors. 00023 * 00024 * Given the LQ factorization of an m-by-n matrix A, ZLQT02 generates 00025 * the orthogonal matrix Q defined by the factorization of the first k 00026 * rows of A; it compares L(1:k,1:m) with A(1:k,1:n)*Q(1:m,1:n)', and 00027 * checks that the rows of Q are orthonormal. 00028 * 00029 * Arguments 00030 * ========= 00031 * 00032 * M (input) INTEGER 00033 * The number of rows of the matrix Q to be generated. M >= 0. 00034 * 00035 * N (input) INTEGER 00036 * The number of columns of the matrix Q to be generated. 00037 * N >= M >= 0. 00038 * 00039 * K (input) INTEGER 00040 * The number of elementary reflectors whose product defines the 00041 * matrix Q. M >= K >= 0. 00042 * 00043 * A (input) COMPLEX*16 array, dimension (LDA,N) 00044 * The m-by-n matrix A which was factorized by ZLQT01. 00045 * 00046 * AF (input) COMPLEX*16 array, dimension (LDA,N) 00047 * Details of the LQ factorization of A, as returned by ZGELQF. 00048 * See ZGELQF for further details. 00049 * 00050 * Q (workspace) COMPLEX*16 array, dimension (LDA,N) 00051 * 00052 * L (workspace) COMPLEX*16 array, dimension (LDA,M) 00053 * 00054 * LDA (input) INTEGER 00055 * The leading dimension of the arrays A, AF, Q and L. LDA >= N. 00056 * 00057 * TAU (input) COMPLEX*16 array, dimension (M) 00058 * The scalar factors of the elementary reflectors corresponding 00059 * to the LQ factorization in AF. 00060 * 00061 * WORK (workspace) COMPLEX*16 array, dimension (LWORK) 00062 * 00063 * LWORK (input) INTEGER 00064 * The dimension of the array WORK. 00065 * 00066 * RWORK (workspace) DOUBLE PRECISION array, dimension (M) 00067 * 00068 * RESULT (output) DOUBLE PRECISION array, dimension (2) 00069 * The test ratios: 00070 * RESULT(1) = norm( L - A*Q' ) / ( N * norm(A) * EPS ) 00071 * RESULT(2) = norm( I - Q*Q' ) / ( N * EPS ) 00072 * 00073 * ===================================================================== 00074 * 00075 * .. Parameters .. 00076 DOUBLE PRECISION ZERO, ONE 00077 PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 ) 00078 COMPLEX*16 ROGUE 00079 PARAMETER ( ROGUE = ( -1.0D+10, -1.0D+10 ) ) 00080 * .. 00081 * .. Local Scalars .. 00082 INTEGER INFO 00083 DOUBLE PRECISION ANORM, EPS, RESID 00084 * .. 00085 * .. External Functions .. 00086 DOUBLE PRECISION DLAMCH, ZLANGE, ZLANSY 00087 EXTERNAL DLAMCH, ZLANGE, ZLANSY 00088 * .. 00089 * .. External Subroutines .. 00090 EXTERNAL ZGEMM, ZHERK, ZLACPY, ZLASET, ZUNGLQ 00091 * .. 00092 * .. Intrinsic Functions .. 00093 INTRINSIC DBLE, DCMPLX, MAX 00094 * .. 00095 * .. Scalars in Common .. 00096 CHARACTER*32 SRNAMT 00097 * .. 00098 * .. Common blocks .. 00099 COMMON / SRNAMC / SRNAMT 00100 * .. 00101 * .. Executable Statements .. 00102 * 00103 EPS = DLAMCH( 'Epsilon' ) 00104 * 00105 * Copy the first k rows of the factorization to the array Q 00106 * 00107 CALL ZLASET( 'Full', M, N, ROGUE, ROGUE, Q, LDA ) 00108 CALL ZLACPY( 'Upper', K, N-1, AF( 1, 2 ), LDA, Q( 1, 2 ), LDA ) 00109 * 00110 * Generate the first n columns of the matrix Q 00111 * 00112 SRNAMT = 'ZUNGLQ' 00113 CALL ZUNGLQ( M, N, K, Q, LDA, TAU, WORK, LWORK, INFO ) 00114 * 00115 * Copy L(1:k,1:m) 00116 * 00117 CALL ZLASET( 'Full', K, M, DCMPLX( ZERO ), DCMPLX( ZERO ), L, 00118 $ LDA ) 00119 CALL ZLACPY( 'Lower', K, M, AF, LDA, L, LDA ) 00120 * 00121 * Compute L(1:k,1:m) - A(1:k,1:n) * Q(1:m,1:n)' 00122 * 00123 CALL ZGEMM( 'No transpose', 'Conjugate transpose', K, M, N, 00124 $ DCMPLX( -ONE ), A, LDA, Q, LDA, DCMPLX( ONE ), L, 00125 $ LDA ) 00126 * 00127 * Compute norm( L - A*Q' ) / ( N * norm(A) * EPS ) . 00128 * 00129 ANORM = ZLANGE( '1', K, N, A, LDA, RWORK ) 00130 RESID = ZLANGE( '1', K, M, L, LDA, RWORK ) 00131 IF( ANORM.GT.ZERO ) THEN 00132 RESULT( 1 ) = ( ( RESID / DBLE( MAX( 1, N ) ) ) / ANORM ) / EPS 00133 ELSE 00134 RESULT( 1 ) = ZERO 00135 END IF 00136 * 00137 * Compute I - Q*Q' 00138 * 00139 CALL ZLASET( 'Full', M, M, DCMPLX( ZERO ), DCMPLX( ONE ), L, LDA ) 00140 CALL ZHERK( 'Upper', 'No transpose', M, N, -ONE, Q, LDA, ONE, L, 00141 $ LDA ) 00142 * 00143 * Compute norm( I - Q*Q' ) / ( N * EPS ) . 00144 * 00145 RESID = ZLANSY( '1', 'Upper', M, L, LDA, RWORK ) 00146 * 00147 RESULT( 2 ) = ( RESID / DBLE( MAX( 1, N ) ) ) / EPS 00148 * 00149 RETURN 00150 * 00151 * End of ZLQT02 00152 * 00153 END