1 SUBROUTINE DCKGQR( NM, MVAL, NP, PVAL, NN, NVAL, NMATS, ISEED,
2 $ THRESH, NMAX, A, AF, AQ, AR, TAUA, B, BF, BZ,
3 $ BT, BWK, TAUB, WORK, RWORK, NIN, NOUT, INFO )
4 *
5 * -- LAPACK test routine (version 3.1) --
6 * Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
7 * November 2006
8 *
9 * .. Scalar Arguments ..
10 INTEGER INFO, NIN, NM, NMATS, NMAX, NN, NOUT, NP
11 DOUBLE PRECISION THRESH
12 * ..
13 * .. Array Arguments ..
14 INTEGER ISEED( 4 ), MVAL( * ), NVAL( * ), PVAL( * )
15 DOUBLE PRECISION A( * ), AF( * ), AQ( * ), AR( * ), B( * ),
16 $ BF( * ), BT( * ), BWK( * ), BZ( * ),
17 $ RWORK( * ), TAUA( * ), TAUB( * ), WORK( * )
18 * ..
19 *
20 * Purpose
21 * =======
22 *
23 * DCKGQR tests
24 * DGGQRF: GQR factorization for N-by-M matrix A and N-by-P matrix B,
25 * DGGRQF: GRQ factorization for M-by-N matrix A and P-by-N matrix B.
26 *
27 * Arguments
28 * =========
29 *
30 * NM (input) INTEGER
31 * The number of values of M contained in the vector MVAL.
32 *
33 * MVAL (input) INTEGER array, dimension (NM)
34 * The values of the matrix row(column) dimension M.
35 *
36 * NP (input) INTEGER
37 * The number of values of P contained in the vector PVAL.
38 *
39 * PVAL (input) INTEGER array, dimension (NP)
40 * The values of the matrix row(column) dimension P.
41 *
42 * NN (input) INTEGER
43 * The number of values of N contained in the vector NVAL.
44 *
45 * NVAL (input) INTEGER array, dimension (NN)
46 * The values of the matrix column(row) dimension N.
47 *
48 * NMATS (input) INTEGER
49 * The number of matrix types to be tested for each combination
50 * of matrix dimensions. If NMATS >= NTYPES (the maximum
51 * number of matrix types), then all the different types are
52 * generated for testing. If NMATS < NTYPES, another input line
53 * is read to get the numbers of the matrix types to be used.
54 *
55 * ISEED (input/output) INTEGER array, dimension (4)
56 * On entry, the seed of the random number generator. The array
57 * elements should be between 0 and 4095, otherwise they will be
58 * reduced mod 4096, and ISEED(4) must be odd.
59 * On exit, the next seed in the random number sequence after
60 * all the test matrices have been generated.
61 *
62 * THRESH (input) DOUBLE PRECISION
63 * The threshold value for the test ratios. A result is
64 * included in the output file if RESULT >= THRESH. To have
65 * every test ratio printed, use THRESH = 0.
66 *
67 * NMAX (input) INTEGER
68 * The maximum value permitted for M or N, used in dimensioning
69 * the work arrays.
70 *
71 * A (workspace) DOUBLE PRECISION array, dimension (NMAX*NMAX)
72 *
73 * AF (workspace) DOUBLE PRECISION array, dimension (NMAX*NMAX)
74 *
75 * AQ (workspace) DOUBLE PRECISION array, dimension (NMAX*NMAX)
76 *
77 * AR (workspace) DOUBLE PRECISION array, dimension (NMAX*NMAX)
78 *
79 * TAUA (workspace) DOUBLE PRECISION array, dimension (NMAX)
80 *
81 * B (workspace) DOUBLE PRECISION array, dimension (NMAX*NMAX)
82 *
83 * BF (workspace) DOUBLE PRECISION array, dimension (NMAX*NMAX)
84 *
85 * BZ (workspace) DOUBLE PRECISION array, dimension (NMAX*NMAX)
86 *
87 * BT (workspace) DOUBLE PRECISION array, dimension (NMAX*NMAX)
88 *
89 * BWK (workspace) DOUBLE PRECISION array, dimension (NMAX*NMAX)
90 *
91 * TAUB (workspace) DOUBLE PRECISION array, dimension (NMAX)
92 *
93 * WORK (workspace) DOUBLE PRECISION array, dimension (NMAX*NMAX)
94 *
95 * RWORK (workspace) DOUBLE PRECISION array, dimension (NMAX)
96 *
97 * NIN (input) INTEGER
98 * The unit number for input.
99 *
100 * NOUT (input) INTEGER
101 * The unit number for output.
102 *
103 * INFO (output) INTEGER
104 * = 0 : successful exit
105 * > 0 : If DLATMS returns an error code, the absolute value
106 * of it is returned.
107 *
108 * =====================================================================
109 *
110 * .. Parameters ..
111 INTEGER NTESTS
112 PARAMETER ( NTESTS = 7 )
113 INTEGER NTYPES
114 PARAMETER ( NTYPES = 8 )
115 * ..
116 * .. Local Scalars ..
117 LOGICAL FIRSTT
118 CHARACTER DISTA, DISTB, TYPE
119 CHARACTER*3 PATH
120 INTEGER I, IINFO, IM, IMAT, IN, IP, KLA, KLB, KUA, KUB,
121 $ LDA, LDB, LWORK, M, MODEA, MODEB, N, NFAIL,
122 $ NRUN, NT, P
123 DOUBLE PRECISION ANORM, BNORM, CNDNMA, CNDNMB
124 * ..
125 * .. Local Arrays ..
126 LOGICAL DOTYPE( NTYPES )
127 DOUBLE PRECISION RESULT( NTESTS )
128 * ..
129 * .. External Subroutines ..
130 EXTERNAL ALAHDG, ALAREQ, ALASUM, DGQRTS, DGRQTS, DLATB9,
131 $ DLATMS
132 * ..
133 * .. Intrinsic Functions ..
134 INTRINSIC ABS
135 * ..
136 * .. Executable Statements ..
137 *
138 * Initialize constants.
139 *
140 PATH( 1: 3 ) = 'GQR'
141 INFO = 0
142 NRUN = 0
143 NFAIL = 0
144 FIRSTT = .TRUE.
145 CALL ALAREQ( PATH, NMATS, DOTYPE, NTYPES, NIN, NOUT )
146 LDA = NMAX
147 LDB = NMAX
148 LWORK = NMAX*NMAX
149 *
150 * Do for each value of M in MVAL.
151 *
152 DO 60 IM = 1, NM
153 M = MVAL( IM )
154 *
155 * Do for each value of P in PVAL.
156 *
157 DO 50 IP = 1, NP
158 P = PVAL( IP )
159 *
160 * Do for each value of N in NVAL.
161 *
162 DO 40 IN = 1, NN
163 N = NVAL( IN )
164 *
165 DO 30 IMAT = 1, NTYPES
166 *
167 * Do the tests only if DOTYPE( IMAT ) is true.
168 *
169 IF( .NOT.DOTYPE( IMAT ) )
170 $ GO TO 30
171 *
172 * Test DGGRQF
173 *
174 * Set up parameters with DLATB9 and generate test
175 * matrices A and B with DLATMS.
176 *
177 CALL DLATB9( 'GRQ', IMAT, M, P, N, TYPE, KLA, KUA,
178 $ KLB, KUB, ANORM, BNORM, MODEA, MODEB,
179 $ CNDNMA, CNDNMB, DISTA, DISTB )
180 *
181 * Generate M by N matrix A
182 *
183 CALL DLATMS( M, N, DISTA, ISEED, TYPE, RWORK, MODEA,
184 $ CNDNMA, ANORM, KLA, KUA, 'No packing', A,
185 $ LDA, WORK, IINFO )
186 IF( IINFO.NE.0 ) THEN
187 WRITE( NOUT, FMT = 9999 )IINFO
188 INFO = ABS( IINFO )
189 GO TO 30
190 END IF
191 *
192 * Generate P by N matrix B
193 *
194 CALL DLATMS( P, N, DISTB, ISEED, TYPE, RWORK, MODEB,
195 $ CNDNMB, BNORM, KLB, KUB, 'No packing', B,
196 $ LDB, WORK, IINFO )
197 IF( IINFO.NE.0 ) THEN
198 WRITE( NOUT, FMT = 9999 )IINFO
199 INFO = ABS( IINFO )
200 GO TO 30
201 END IF
202 *
203 NT = 4
204 *
205 CALL DGRQTS( M, P, N, A, AF, AQ, AR, LDA, TAUA, B, BF,
206 $ BZ, BT, BWK, LDB, TAUB, WORK, LWORK,
207 $ RWORK, RESULT )
208 *
209 * Print information about the tests that did not
210 * pass the threshold.
211 *
212 DO 10 I = 1, NT
213 IF( RESULT( I ).GE.THRESH ) THEN
214 IF( NFAIL.EQ.0 .AND. FIRSTT ) THEN
215 FIRSTT = .FALSE.
216 CALL ALAHDG( NOUT, 'GRQ' )
217 END IF
218 WRITE( NOUT, FMT = 9998 )M, P, N, IMAT, I,
219 $ RESULT( I )
220 NFAIL = NFAIL + 1
221 END IF
222 10 CONTINUE
223 NRUN = NRUN + NT
224 *
225 * Test DGGQRF
226 *
227 * Set up parameters with DLATB9 and generate test
228 * matrices A and B with DLATMS.
229 *
230 CALL DLATB9( 'GQR', IMAT, M, P, N, TYPE, KLA, KUA,
231 $ KLB, KUB, ANORM, BNORM, MODEA, MODEB,
232 $ CNDNMA, CNDNMB, DISTA, DISTB )
233 *
234 * Generate N-by-M matrix A
235 *
236 CALL DLATMS( N, M, DISTA, ISEED, TYPE, RWORK, MODEA,
237 $ CNDNMA, ANORM, KLA, KUA, 'No packing', A,
238 $ LDA, WORK, IINFO )
239 IF( IINFO.NE.0 ) THEN
240 WRITE( NOUT, FMT = 9999 )IINFO
241 INFO = ABS( IINFO )
242 GO TO 30
243 END IF
244 *
245 * Generate N-by-P matrix B
246 *
247 CALL DLATMS( N, P, DISTB, ISEED, TYPE, RWORK, MODEA,
248 $ CNDNMA, BNORM, KLB, KUB, 'No packing', B,
249 $ LDB, WORK, IINFO )
250 IF( IINFO.NE.0 ) THEN
251 WRITE( NOUT, FMT = 9999 )IINFO
252 INFO = ABS( IINFO )
253 GO TO 30
254 END IF
255 *
256 NT = 4
257 *
258 CALL DGQRTS( N, M, P, A, AF, AQ, AR, LDA, TAUA, B, BF,
259 $ BZ, BT, BWK, LDB, TAUB, WORK, LWORK,
260 $ RWORK, RESULT )
261 *
262 * Print information about the tests that did not
263 * pass the threshold.
264 *
265 DO 20 I = 1, NT
266 IF( RESULT( I ).GE.THRESH ) THEN
267 IF( NFAIL.EQ.0 .AND. FIRSTT ) THEN
268 FIRSTT = .FALSE.
269 CALL ALAHDG( NOUT, PATH )
270 END IF
271 WRITE( NOUT, FMT = 9997 )N, M, P, IMAT, I,
272 $ RESULT( I )
273 NFAIL = NFAIL + 1
274 END IF
275 20 CONTINUE
276 NRUN = NRUN + NT
277 *
278 30 CONTINUE
279 40 CONTINUE
280 50 CONTINUE
281 60 CONTINUE
282 *
283 * Print a summary of the results.
284 *
285 CALL ALASUM( PATH, NOUT, NFAIL, NRUN, 0 )
286 *
287 9999 FORMAT( ' DLATMS in DCKGQR: INFO = ', I5 )
288 9998 FORMAT( ' M=', I4, ' P=', I4, ', N=', I4, ', type ', I2,
289 $ ', test ', I2, ', ratio=', G13.6 )
290 9997 FORMAT( ' N=', I4, ' M=', I4, ', P=', I4, ', type ', I2,
291 $ ', test ', I2, ', ratio=', G13.6 )
292 RETURN
293 *
294 * End of DCKGQR
295 *
296 END
2 $ THRESH, NMAX, A, AF, AQ, AR, TAUA, B, BF, BZ,
3 $ BT, BWK, TAUB, WORK, RWORK, NIN, NOUT, INFO )
4 *
5 * -- LAPACK test routine (version 3.1) --
6 * Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
7 * November 2006
8 *
9 * .. Scalar Arguments ..
10 INTEGER INFO, NIN, NM, NMATS, NMAX, NN, NOUT, NP
11 DOUBLE PRECISION THRESH
12 * ..
13 * .. Array Arguments ..
14 INTEGER ISEED( 4 ), MVAL( * ), NVAL( * ), PVAL( * )
15 DOUBLE PRECISION A( * ), AF( * ), AQ( * ), AR( * ), B( * ),
16 $ BF( * ), BT( * ), BWK( * ), BZ( * ),
17 $ RWORK( * ), TAUA( * ), TAUB( * ), WORK( * )
18 * ..
19 *
20 * Purpose
21 * =======
22 *
23 * DCKGQR tests
24 * DGGQRF: GQR factorization for N-by-M matrix A and N-by-P matrix B,
25 * DGGRQF: GRQ factorization for M-by-N matrix A and P-by-N matrix B.
26 *
27 * Arguments
28 * =========
29 *
30 * NM (input) INTEGER
31 * The number of values of M contained in the vector MVAL.
32 *
33 * MVAL (input) INTEGER array, dimension (NM)
34 * The values of the matrix row(column) dimension M.
35 *
36 * NP (input) INTEGER
37 * The number of values of P contained in the vector PVAL.
38 *
39 * PVAL (input) INTEGER array, dimension (NP)
40 * The values of the matrix row(column) dimension P.
41 *
42 * NN (input) INTEGER
43 * The number of values of N contained in the vector NVAL.
44 *
45 * NVAL (input) INTEGER array, dimension (NN)
46 * The values of the matrix column(row) dimension N.
47 *
48 * NMATS (input) INTEGER
49 * The number of matrix types to be tested for each combination
50 * of matrix dimensions. If NMATS >= NTYPES (the maximum
51 * number of matrix types), then all the different types are
52 * generated for testing. If NMATS < NTYPES, another input line
53 * is read to get the numbers of the matrix types to be used.
54 *
55 * ISEED (input/output) INTEGER array, dimension (4)
56 * On entry, the seed of the random number generator. The array
57 * elements should be between 0 and 4095, otherwise they will be
58 * reduced mod 4096, and ISEED(4) must be odd.
59 * On exit, the next seed in the random number sequence after
60 * all the test matrices have been generated.
61 *
62 * THRESH (input) DOUBLE PRECISION
63 * The threshold value for the test ratios. A result is
64 * included in the output file if RESULT >= THRESH. To have
65 * every test ratio printed, use THRESH = 0.
66 *
67 * NMAX (input) INTEGER
68 * The maximum value permitted for M or N, used in dimensioning
69 * the work arrays.
70 *
71 * A (workspace) DOUBLE PRECISION array, dimension (NMAX*NMAX)
72 *
73 * AF (workspace) DOUBLE PRECISION array, dimension (NMAX*NMAX)
74 *
75 * AQ (workspace) DOUBLE PRECISION array, dimension (NMAX*NMAX)
76 *
77 * AR (workspace) DOUBLE PRECISION array, dimension (NMAX*NMAX)
78 *
79 * TAUA (workspace) DOUBLE PRECISION array, dimension (NMAX)
80 *
81 * B (workspace) DOUBLE PRECISION array, dimension (NMAX*NMAX)
82 *
83 * BF (workspace) DOUBLE PRECISION array, dimension (NMAX*NMAX)
84 *
85 * BZ (workspace) DOUBLE PRECISION array, dimension (NMAX*NMAX)
86 *
87 * BT (workspace) DOUBLE PRECISION array, dimension (NMAX*NMAX)
88 *
89 * BWK (workspace) DOUBLE PRECISION array, dimension (NMAX*NMAX)
90 *
91 * TAUB (workspace) DOUBLE PRECISION array, dimension (NMAX)
92 *
93 * WORK (workspace) DOUBLE PRECISION array, dimension (NMAX*NMAX)
94 *
95 * RWORK (workspace) DOUBLE PRECISION array, dimension (NMAX)
96 *
97 * NIN (input) INTEGER
98 * The unit number for input.
99 *
100 * NOUT (input) INTEGER
101 * The unit number for output.
102 *
103 * INFO (output) INTEGER
104 * = 0 : successful exit
105 * > 0 : If DLATMS returns an error code, the absolute value
106 * of it is returned.
107 *
108 * =====================================================================
109 *
110 * .. Parameters ..
111 INTEGER NTESTS
112 PARAMETER ( NTESTS = 7 )
113 INTEGER NTYPES
114 PARAMETER ( NTYPES = 8 )
115 * ..
116 * .. Local Scalars ..
117 LOGICAL FIRSTT
118 CHARACTER DISTA, DISTB, TYPE
119 CHARACTER*3 PATH
120 INTEGER I, IINFO, IM, IMAT, IN, IP, KLA, KLB, KUA, KUB,
121 $ LDA, LDB, LWORK, M, MODEA, MODEB, N, NFAIL,
122 $ NRUN, NT, P
123 DOUBLE PRECISION ANORM, BNORM, CNDNMA, CNDNMB
124 * ..
125 * .. Local Arrays ..
126 LOGICAL DOTYPE( NTYPES )
127 DOUBLE PRECISION RESULT( NTESTS )
128 * ..
129 * .. External Subroutines ..
130 EXTERNAL ALAHDG, ALAREQ, ALASUM, DGQRTS, DGRQTS, DLATB9,
131 $ DLATMS
132 * ..
133 * .. Intrinsic Functions ..
134 INTRINSIC ABS
135 * ..
136 * .. Executable Statements ..
137 *
138 * Initialize constants.
139 *
140 PATH( 1: 3 ) = 'GQR'
141 INFO = 0
142 NRUN = 0
143 NFAIL = 0
144 FIRSTT = .TRUE.
145 CALL ALAREQ( PATH, NMATS, DOTYPE, NTYPES, NIN, NOUT )
146 LDA = NMAX
147 LDB = NMAX
148 LWORK = NMAX*NMAX
149 *
150 * Do for each value of M in MVAL.
151 *
152 DO 60 IM = 1, NM
153 M = MVAL( IM )
154 *
155 * Do for each value of P in PVAL.
156 *
157 DO 50 IP = 1, NP
158 P = PVAL( IP )
159 *
160 * Do for each value of N in NVAL.
161 *
162 DO 40 IN = 1, NN
163 N = NVAL( IN )
164 *
165 DO 30 IMAT = 1, NTYPES
166 *
167 * Do the tests only if DOTYPE( IMAT ) is true.
168 *
169 IF( .NOT.DOTYPE( IMAT ) )
170 $ GO TO 30
171 *
172 * Test DGGRQF
173 *
174 * Set up parameters with DLATB9 and generate test
175 * matrices A and B with DLATMS.
176 *
177 CALL DLATB9( 'GRQ', IMAT, M, P, N, TYPE, KLA, KUA,
178 $ KLB, KUB, ANORM, BNORM, MODEA, MODEB,
179 $ CNDNMA, CNDNMB, DISTA, DISTB )
180 *
181 * Generate M by N matrix A
182 *
183 CALL DLATMS( M, N, DISTA, ISEED, TYPE, RWORK, MODEA,
184 $ CNDNMA, ANORM, KLA, KUA, 'No packing', A,
185 $ LDA, WORK, IINFO )
186 IF( IINFO.NE.0 ) THEN
187 WRITE( NOUT, FMT = 9999 )IINFO
188 INFO = ABS( IINFO )
189 GO TO 30
190 END IF
191 *
192 * Generate P by N matrix B
193 *
194 CALL DLATMS( P, N, DISTB, ISEED, TYPE, RWORK, MODEB,
195 $ CNDNMB, BNORM, KLB, KUB, 'No packing', B,
196 $ LDB, WORK, IINFO )
197 IF( IINFO.NE.0 ) THEN
198 WRITE( NOUT, FMT = 9999 )IINFO
199 INFO = ABS( IINFO )
200 GO TO 30
201 END IF
202 *
203 NT = 4
204 *
205 CALL DGRQTS( M, P, N, A, AF, AQ, AR, LDA, TAUA, B, BF,
206 $ BZ, BT, BWK, LDB, TAUB, WORK, LWORK,
207 $ RWORK, RESULT )
208 *
209 * Print information about the tests that did not
210 * pass the threshold.
211 *
212 DO 10 I = 1, NT
213 IF( RESULT( I ).GE.THRESH ) THEN
214 IF( NFAIL.EQ.0 .AND. FIRSTT ) THEN
215 FIRSTT = .FALSE.
216 CALL ALAHDG( NOUT, 'GRQ' )
217 END IF
218 WRITE( NOUT, FMT = 9998 )M, P, N, IMAT, I,
219 $ RESULT( I )
220 NFAIL = NFAIL + 1
221 END IF
222 10 CONTINUE
223 NRUN = NRUN + NT
224 *
225 * Test DGGQRF
226 *
227 * Set up parameters with DLATB9 and generate test
228 * matrices A and B with DLATMS.
229 *
230 CALL DLATB9( 'GQR', IMAT, M, P, N, TYPE, KLA, KUA,
231 $ KLB, KUB, ANORM, BNORM, MODEA, MODEB,
232 $ CNDNMA, CNDNMB, DISTA, DISTB )
233 *
234 * Generate N-by-M matrix A
235 *
236 CALL DLATMS( N, M, DISTA, ISEED, TYPE, RWORK, MODEA,
237 $ CNDNMA, ANORM, KLA, KUA, 'No packing', A,
238 $ LDA, WORK, IINFO )
239 IF( IINFO.NE.0 ) THEN
240 WRITE( NOUT, FMT = 9999 )IINFO
241 INFO = ABS( IINFO )
242 GO TO 30
243 END IF
244 *
245 * Generate N-by-P matrix B
246 *
247 CALL DLATMS( N, P, DISTB, ISEED, TYPE, RWORK, MODEA,
248 $ CNDNMA, BNORM, KLB, KUB, 'No packing', B,
249 $ LDB, WORK, IINFO )
250 IF( IINFO.NE.0 ) THEN
251 WRITE( NOUT, FMT = 9999 )IINFO
252 INFO = ABS( IINFO )
253 GO TO 30
254 END IF
255 *
256 NT = 4
257 *
258 CALL DGQRTS( N, M, P, A, AF, AQ, AR, LDA, TAUA, B, BF,
259 $ BZ, BT, BWK, LDB, TAUB, WORK, LWORK,
260 $ RWORK, RESULT )
261 *
262 * Print information about the tests that did not
263 * pass the threshold.
264 *
265 DO 20 I = 1, NT
266 IF( RESULT( I ).GE.THRESH ) THEN
267 IF( NFAIL.EQ.0 .AND. FIRSTT ) THEN
268 FIRSTT = .FALSE.
269 CALL ALAHDG( NOUT, PATH )
270 END IF
271 WRITE( NOUT, FMT = 9997 )N, M, P, IMAT, I,
272 $ RESULT( I )
273 NFAIL = NFAIL + 1
274 END IF
275 20 CONTINUE
276 NRUN = NRUN + NT
277 *
278 30 CONTINUE
279 40 CONTINUE
280 50 CONTINUE
281 60 CONTINUE
282 *
283 * Print a summary of the results.
284 *
285 CALL ALASUM( PATH, NOUT, NFAIL, NRUN, 0 )
286 *
287 9999 FORMAT( ' DLATMS in DCKGQR: INFO = ', I5 )
288 9998 FORMAT( ' M=', I4, ' P=', I4, ', N=', I4, ', type ', I2,
289 $ ', test ', I2, ', ratio=', G13.6 )
290 9997 FORMAT( ' N=', I4, ' M=', I4, ', P=', I4, ', type ', I2,
291 $ ', test ', I2, ', ratio=', G13.6 )
292 RETURN
293 *
294 * End of DCKGQR
295 *
296 END