82 IMPLICIT NONE
83
84
85
86
87
88
89 CHARACTER TSSW
90 INTEGER M, N, MB, NB
91
92 REAL RESULT(6)
93
94
95
96
97
98 COMPLEX, ALLOCATABLE :: AF(:,:), Q(:,:),
99 $ R(:,:), RWORK(:), WORK( : ), T(:),
100 $ CF(:,:), DF(:,:), A(:,:), C(:,:), D(:,:), LQ(:,:)
101
102
103 REAL ZERO
104 COMPLEX ONE, CZERO
105 parameter( zero = 0.0, one = (1.0,0.0), czero=(0.0,0.0) )
106
107
108 LOGICAL TESTZEROS, TS
109 INTEGER INFO, J, K, L, LWORK, TSIZE, MNB
110 REAL ANORM, EPS, RESID, CNORM, DNORM
111
112
113 INTEGER ISEED( 4 )
114 COMPLEX TQUERY( 5 ), WORKQUERY( 1 )
115
116
117 REAL SLAMCH, CLANGE, CLANSY
118 LOGICAL LSAME
119 INTEGER ILAENV
121
122
124
125 CHARACTER*32 srnamt
126
127
128 COMMON / srnamc / srnamt
129
130
131 DATA iseed / 1988, 1989, 1990, 1991 /
132
133
134
135 ts =
lsame(tssw,
'TS')
136
137
138
139 testzeros = .false.
140
146
147
148
149 ALLOCATE ( a(m,n), af(m,n), q(l,l), r(m,l), rwork(l),
150 $ c(m,n), cf(m,n),
151 $ d(n,m), df(n,m), lq(l,n) )
152
153
154
155 DO j=1,n
156 CALL clarnv( 2, iseed, m, a( 1, j ) )
157 END DO
158 IF (testzeros) THEN
159 IF (m.GE.4) THEN
160 DO j=1,n
161 CALL clarnv( 2, iseed, m/2, a( m/4, j ) )
162 END DO
163 END IF
164 END IF
165 CALL clacpy(
'Full', m, n, a, m, af, m )
166
167 IF (ts) THEN
168
169
170
171 CALL cgeqr( m, n, af, m, tquery, -1, workquery, -1, info )
172 tsize = int( tquery( 1 ) )
173 lwork = int( workquery( 1 ) )
174 CALL cgemqr(
'L',
'N', m, m, k, af, m, tquery, tsize, cf, m,
175 $ workquery, -1, info)
176 lwork =
max( lwork, int( workquery( 1 ) ) )
177 CALL cgemqr(
'L',
'N', m, n, k, af, m, tquery, tsize, cf, m,
178 $ workquery, -1, info)
179 lwork =
max( lwork, int( workquery( 1 ) ) )
180 CALL cgemqr(
'L',
'C', m, n, k, af, m, tquery, tsize, cf, m,
181 $ workquery, -1, info)
182 lwork =
max( lwork, int( workquery( 1 ) ) )
183 CALL cgemqr(
'R',
'N', n, m, k, af, m, tquery, tsize, df, n,
184 $ workquery, -1, info)
185 lwork =
max( lwork, int( workquery( 1 ) ) )
186 CALL cgemqr(
'R',
'C', n, m, k, af, m, tquery, tsize, df, n,
187 $ workquery, -1, info)
188 lwork =
max( lwork, int( workquery( 1 ) ) )
189 ALLOCATE ( t( tsize ) )
190 ALLOCATE ( work( lwork ) )
191 srnamt = 'CGEQR'
192 CALL cgeqr( m, n, af, m, t, tsize, work, lwork, info )
193
194
195
196 CALL claset(
'Full', m, m, czero, one, q, m )
197 srnamt = 'CGEMQR'
198 CALL cgemqr(
'L',
'N', m, m, k, af, m, t, tsize, q, m,
199 $ work, lwork, info )
200
201
202
203 CALL claset(
'Full', m, n, czero, czero, r, m )
204 CALL clacpy(
'Upper', m, n, af, m, r, m )
205
206
207
208 CALL cgemm(
'C',
'N', m, n, m, -one, q, m, a, m, one, r, m )
209 anorm =
clange(
'1', m, n, a, m, rwork )
210 resid =
clange(
'1', m, n, r, m, rwork )
211 IF( anorm.GT.zero ) THEN
212 result( 1 ) = resid / (eps*
max(1,m)*anorm)
213 ELSE
214 result( 1 ) = zero
215 END IF
216
217
218
219 CALL claset(
'Full', m, m, czero, one, r, m )
220 CALL cherk(
'U',
'C', m, m, real(-one), q, m, real(one), r, m )
221 resid =
clansy(
'1',
'Upper', m, r, m, rwork )
222 result( 2 ) = resid / (eps*
max(1,m))
223
224
225
226 DO j=1,n
227 CALL clarnv( 2, iseed, m, c( 1, j ) )
228 END DO
229 cnorm =
clange(
'1', m, n, c, m, rwork)
230 CALL clacpy(
'Full', m, n, c, m, cf, m )
231
232
233
234 srnamt = 'CGEMQR'
235 CALL cgemqr(
'L',
'N', m, n, k, af, m, t, tsize, cf, m,
236 $ work, lwork, info)
237
238
239
240 CALL cgemm(
'N',
'N', m, n, m, -one, q, m, c, m, one, cf, m )
241 resid =
clange(
'1', m, n, cf, m, rwork )
242 IF( cnorm.GT.zero ) THEN
243 result( 3 ) = resid / (eps*
max(1,m)*cnorm)
244 ELSE
245 result( 3 ) = zero
246 END IF
247
248
249
250 CALL clacpy(
'Full', m, n, c, m, cf, m )
251
252
253
254 srnamt = 'CGEMQR'
255 CALL cgemqr(
'L',
'C', m, n, k, af, m, t, tsize, cf, m,
256 $ work, lwork, info)
257
258
259
260 CALL cgemm(
'C',
'N', m, n, m, -one, q, m, c, m, one, cf, m )
261 resid =
clange(
'1', m, n, cf, m, rwork )
262 IF( cnorm.GT.zero ) THEN
263 result( 4 ) = resid / (eps*
max(1,m)*cnorm)
264 ELSE
265 result( 4 ) = zero
266 END IF
267
268
269
270 DO j=1,m
271 CALL clarnv( 2, iseed, n, d( 1, j ) )
272 END DO
273 dnorm =
clange(
'1', n, m, d, n, rwork)
274 CALL clacpy(
'Full', n, m, d, n, df, n )
275
276
277
278 srnamt = 'CGEMQR'
279 CALL cgemqr(
'R',
'N', n, m, k, af, m, t, tsize, df, n,
280 $ work, lwork, info)
281
282
283
284 CALL cgemm(
'N',
'N', n, m, m, -one, d, n, q, m, one, df, n )
285 resid =
clange(
'1', n, m, df, n, rwork )
286 IF( dnorm.GT.zero ) THEN
287 result( 5 ) = resid / (eps*
max(1,m)*dnorm)
288 ELSE
289 result( 5 ) = zero
290 END IF
291
292
293
294 CALL clacpy(
'Full', n, m, d, n, df, n )
295
296
297
298 CALL cgemqr(
'R',
'C', n, m, k, af, m, t, tsize, df, n,
299 $ work, lwork, info)
300
301
302
303 CALL cgemm(
'N',
'C', n, m, m, -one, d, n, q, m, one, df, n )
304 resid =
clange(
'1', n, m, df, n, rwork )
305 IF( cnorm.GT.zero ) THEN
306 result( 6 ) = resid / (eps*
max(1,m)*dnorm)
307 ELSE
308 result( 6 ) = zero
309 END IF
310
311
312
313 ELSE
314 CALL cgelq( m, n, af, m, tquery, -1, workquery, -1, info )
315 tsize = int( tquery( 1 ) )
316 lwork = int( workquery( 1 ) )
317 CALL cgemlq(
'R',
'N', n, n, k, af, m, tquery, tsize, q, n,
318 $ workquery, -1, info )
319 lwork =
max( lwork, int( workquery( 1 ) ) )
320 CALL cgemlq(
'L',
'N', n, m, k, af, m, tquery, tsize, df, n,
321 $ workquery, -1, info)
322 lwork =
max( lwork, int( workquery( 1 ) ) )
323 CALL cgemlq(
'L',
'C', n, m, k, af, m, tquery, tsize, df, n,
324 $ workquery, -1, info)
325 lwork =
max( lwork, int( workquery( 1 ) ) )
326 CALL cgemlq(
'R',
'N', m, n, k, af, m, tquery, tsize, cf, m,
327 $ workquery, -1, info)
328 lwork =
max( lwork, int( workquery( 1 ) ) )
329 CALL cgemlq(
'R',
'C', m, n, k, af, m, tquery, tsize, cf, m,
330 $ workquery, -1, info)
331 lwork =
max( lwork, int( workquery( 1 ) ) )
332 ALLOCATE ( t( tsize ) )
333 ALLOCATE ( work( lwork ) )
334 srnamt = 'CGELQ'
335 CALL cgelq( m, n, af, m, t, tsize, work, lwork, info )
336
337
338
339
340 CALL claset(
'Full', n, n, czero, one, q, n )
341 srnamt = 'CGEMLQ'
342 CALL cgemlq(
'R',
'N', n, n, k, af, m, t, tsize, q, n,
343 $ work, lwork, info )
344
345
346
347 CALL claset(
'Full', m, n, czero, czero, lq, l )
348 CALL clacpy(
'Lower', m, n, af, m, lq, l )
349
350
351
352 CALL cgemm(
'N',
'C', m, n, n, -one, a, m, q, n, one, lq, l )
353 anorm =
clange(
'1', m, n, a, m, rwork )
354 resid =
clange(
'1', m, n, lq, l, rwork )
355 IF( anorm.GT.zero ) THEN
356 result( 1 ) = resid / (eps*
max(1,n)*anorm)
357 ELSE
358 result( 1 ) = zero
359 END IF
360
361
362
363 CALL claset(
'Full', n, n, czero, one, lq, l )
364 CALL cherk(
'U',
'C', n, n, real(-one), q, n, real(one), lq, l)
365 resid =
clansy(
'1',
'Upper', n, lq, l, rwork )
366 result( 2 ) = resid / (eps*
max(1,n))
367
368
369
370 DO j=1,m
371 CALL clarnv( 2, iseed, n, d( 1, j ) )
372 END DO
373 dnorm =
clange(
'1', n, m, d, n, rwork)
374 CALL clacpy(
'Full', n, m, d, n, df, n )
375
376
377
378 CALL cgemlq(
'L',
'N', n, m, k, af, m, t, tsize, df, n,
379 $ work, lwork, info)
380
381
382
383 CALL cgemm(
'N',
'N', n, m, n, -one, q, n, d, n, one, df, n )
384 resid =
clange(
'1', n, m, df, n, rwork )
385 IF( dnorm.GT.zero ) THEN
386 result( 3 ) = resid / (eps*
max(1,n)*dnorm)
387 ELSE
388 result( 3 ) = zero
389 END IF
390
391
392
393 CALL clacpy(
'Full', n, m, d, n, df, n )
394
395
396
397 CALL cgemlq(
'L',
'C', n, m, k, af, m, t, tsize, df, n,
398 $ work, lwork, info)
399
400
401
402 CALL cgemm(
'C',
'N', n, m, n, -one, q, n, d, n, one, df, n )
403 resid =
clange(
'1', n, m, df, n, rwork )
404 IF( dnorm.GT.zero ) THEN
405 result( 4 ) = resid / (eps*
max(1,n)*dnorm)
406 ELSE
407 result( 4 ) = zero
408 END IF
409
410
411
412 DO j=1,n
413 CALL clarnv( 2, iseed, m, c( 1, j ) )
414 END DO
415 cnorm =
clange(
'1', m, n, c, m, rwork)
416 CALL clacpy(
'Full', m, n, c, m, cf, m )
417
418
419
420 CALL cgemlq(
'R',
'N', m, n, k, af, m, t, tsize, cf, m,
421 $ work, lwork, info)
422
423
424
425 CALL cgemm(
'N',
'N', m, n, n, -one, c, m, q, n, one, cf, m )
426 resid =
clange(
'1', n, m, df, n, rwork )
427 IF( cnorm.GT.zero ) THEN
428 result( 5 ) = resid / (eps*
max(1,n)*cnorm)
429 ELSE
430 result( 5 ) = zero
431 END IF
432
433
434
435 CALL clacpy(
'Full', m, n, c, m, cf, m )
436
437
438
439 CALL cgemlq(
'R',
'C', m, n, k, af, m, t, tsize, cf, m,
440 $ work, lwork, info)
441
442
443
444 CALL cgemm(
'N',
'C', m, n, n, -one, c, m, q, n, one, cf, m )
445 resid =
clange(
'1', m, n, cf, m, rwork )
446 IF( cnorm.GT.zero ) THEN
447 result( 6 ) = resid / (eps*
max(1,n)*cnorm)
448 ELSE
449 result( 6 ) = zero
450 END IF
451
452 END IF
453
454
455
456 DEALLOCATE ( a, af, q, r, rwork, work, t, c, d, cf, df)
457
458 RETURN
subroutine cgelq(m, n, a, lda, t, tsize, work, lwork, info)
CGELQ
subroutine cgemlq(side, trans, m, n, k, a, lda, t, tsize, c, ldc, work, lwork, info)
CGEMLQ
subroutine cgemqr(side, trans, m, n, k, a, lda, t, tsize, c, ldc, work, lwork, info)
CGEMQR
subroutine cgeqr(m, n, a, lda, t, tsize, work, lwork, info)
CGEQR
integer function ilaenv(ispec, name, opts, n1, n2, n3, n4)
ILAENV
logical function lsame(ca, cb)
LSAME
real function clange(norm, m, n, a, lda, work)
CLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
subroutine clacpy(uplo, m, n, a, lda, b, ldb)
CLACPY copies all or part of one two-dimensional array to another.
subroutine claset(uplo, m, n, alpha, beta, a, lda)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine clarnv(idist, iseed, n, x)
CLARNV returns a vector of random numbers from a uniform or normal distribution.
real function clansy(norm, uplo, n, a, lda, work)
CLANSY returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
subroutine cherk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
CHERK
subroutine cgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
CGEMM
real function slamch(cmach)
SLAMCH