201
202
203
204
205
206
207 LOGICAL TSTERR
208 INTEGER NM, NMAX, NN, NNB, NOUT, NRHS
209 REAL THRESH
210
211
212 LOGICAL DOTYPE( * )
213 INTEGER IWORK( * ), MVAL( * ), NBVAL( * ), NVAL( * ),
214 $ NXVAL( * )
215 REAL A( * ), AC( * ), AF( * ), AQ( * ), AR( * ),
216 $ B( * ), RWORK( * ), TAU( * ), WORK( * ),
217 $ X( * ), XACT( * )
218
219
220
221
222
223 INTEGER NTESTS
224 parameter( ntests = 9 )
225 INTEGER NTYPES
226 parameter( ntypes = 8 )
227 REAL ZERO
228 parameter( zero = 0.0e0 )
229
230
231 CHARACTER DIST, TYPE
232 CHARACTER*3 PATH
233 INTEGER I, IK, IM, IMAT, IN, INB, INFO, K, KL, KU, LDA,
234 $ LWORK, M, MINMN, MODE, N, NB, NERRS, NFAIL, NK,
235 $ NRUN, NT, NX
236 REAL ANORM, CNDNUM
237
238
239 INTEGER ISEED( 4 ), ISEEDY( 4 ), KVAL( 4 )
240 REAL RESULT( NTESTS )
241
242
243 LOGICAL SGENND
245
246
250
251
252 INTRINSIC max, min
253
254
255 LOGICAL LERR, OK
256 CHARACTER*32 SRNAMT
257 INTEGER INFOT, NUNIT
258
259
260 COMMON / infoc / infot, nunit, ok, lerr
261 COMMON / srnamc / srnamt
262
263
264 DATA iseedy / 1988, 1989, 1990, 1991 /
265
266
267
268
269
270 path( 1: 1 ) = 'Single precision'
271 path( 2: 3 ) = 'QR'
272 nrun = 0
273 nfail = 0
274 nerrs = 0
275 DO 10 i = 1, 4
276 iseed( i ) = iseedy( i )
277 10 CONTINUE
278
279
280
281 IF( tsterr )
282 $
CALL serrqr( path, nout )
283 infot = 0
285
286 lda = nmax
287 lwork = nmax*max( nmax, nrhs )
288
289
290
291 DO 70 im = 1, nm
292 m = mval( im )
293
294
295
296 DO 60 in = 1, nn
297 n = nval( in )
298 minmn = min( m, n )
299 DO 50 imat = 1, ntypes
300
301
302
303 IF( .NOT.dotype( imat ) )
304 $ GO TO 50
305
306
307
308
309 CALL slatb4( path, imat, m, n,
TYPE, KL, KU, ANORM, MODE,
310 $ CNDNUM, DIST )
311
312 srnamt = 'SLATMS'
313 CALL slatms( m, n, dist, iseed,
TYPE, RWORK, MODE,
314 $ CNDNUM, ANORM, KL, KU, 'No packing', A, LDA,
315 $ WORK, INFO )
316
317
318
319 IF( info.NE.0 ) THEN
320 CALL alaerh( path,
'SLATMS', info, 0,
' ', m, n, -1,
321 $ -1, -1, imat, nfail, nerrs, nout )
322 GO TO 50
323 END IF
324
325
326
327
328
329 kval( 1 ) = minmn
330 kval( 2 ) = 0
331 kval( 3 ) = 1
332 kval( 4 ) = minmn / 2
333 IF( minmn.EQ.0 ) THEN
334 nk = 1
335 ELSE IF( minmn.EQ.1 ) THEN
336 nk = 2
337 ELSE IF( minmn.LE.3 ) THEN
338 nk = 3
339 ELSE
340 nk = 4
341 END IF
342
343
344
345 DO 40 ik = 1, nk
346 k = kval( ik )
347
348
349
350 DO 30 inb = 1, nnb
351 nb = nbval( inb )
353 nx = nxval( inb )
355 DO i = 1, ntests
356 result( i ) = zero
357 END DO
358 nt = 2
359 IF( ik.EQ.1 ) THEN
360
361
362
363 CALL sqrt01( m, n, a, af, aq, ar, lda, tau,
364 $ work, lwork, rwork, result( 1 ) )
365
366
367
368 CALL sqrt01p( m, n, a, af, aq, ar, lda, tau,
369 $ work, lwork, rwork, result( 8 ) )
370
371 IF( .NOT.
sgennd( m, n, af, lda ) )
372 $ result( 9 ) = 2*thresh
373 nt = nt + 1
374 ELSE IF( m.GE.n ) THEN
375
376
377
378
379 CALL sqrt02( m, n, k, a, af, aq, ar, lda, tau,
380 $ work, lwork, rwork, result( 1 ) )
381 END IF
382 IF( m.GE.k ) THEN
383
384
385
386
387 CALL sqrt03( m, n, k, af, ac, ar, aq, lda, tau,
388 $ work, lwork, rwork, result( 3 ) )
389 nt = nt + 4
390
391
392
393
394
395 IF( k.EQ.n .AND. inb.EQ.1 ) THEN
396
397
398
399
400 srnamt = 'SLARHS'
401 CALL slarhs( path,
'New',
'Full',
402 $ 'No transpose', m, n, 0, 0,
403 $ nrhs, a, lda, xact, lda, b, lda,
404 $ iseed, info )
405
406 CALL slacpy(
'Full', m, nrhs, b, lda, x,
407 $ lda )
408
409
410
411
412 CALL slacpy(
'Full', m, n, a, lda, af, lda )
413
414 srnamt = 'SGELS'
415 CALL sgels(
'No transpose', m, n, nrhs, af,
416 $ lda, x, lda, work, lwork, info )
417
418
419
420 IF( info.NE.0 )
421 $
CALL alaerh( path,
'SGELS', info, 0,
'N',
422 $ m, n, nrhs, -1, nb, imat,
423 $ nfail, nerrs, nout )
424
425 CALL sget02(
'No transpose', m, n, nrhs, a,
426 $ lda, x, lda, b, lda, rwork,
427 $ result( 7 ) )
428 nt = nt + 1
429 END IF
430 END IF
431
432
433
434
435 DO 20 i = 1, ntests
436 IF( result( i ).GE.thresh ) THEN
437 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
438 $
CALL alahd( nout, path )
439 WRITE( nout, fmt = 9999 )m, n, k, nb, nx,
440 $ imat, i, result( i )
441 nfail = nfail + 1
442 END IF
443 20 CONTINUE
444 nrun = nrun + ntests
445 30 CONTINUE
446 40 CONTINUE
447 50 CONTINUE
448 60 CONTINUE
449 70 CONTINUE
450
451
452
453 CALL alasum( path, nout, nfail, nrun, nerrs )
454
455 9999 FORMAT( ' M=', i5, ', N=', i5, ', K=', i5, ', NB=', i4, ', NX=',
456 $ i5, ', type ', i2, ', test(', i2, ')=', g12.5 )
457 RETURN
458
459
460
subroutine alasum(type, nout, nfail, nrun, nerrs)
ALASUM
subroutine sget02(trans, m, n, nrhs, a, lda, x, ldx, b, ldb, rwork, resid)
SGET02
subroutine slarhs(path, xtype, uplo, trans, m, n, kl, ku, nrhs, a, lda, x, ldx, b, ldb, iseed, info)
SLARHS
subroutine xlaenv(ispec, nvalue)
XLAENV
subroutine alaerh(path, subnam, info, infoe, opts, m, n, kl, ku, n5, imat, nfail, nerrs, nout)
ALAERH
subroutine alahd(iounit, path)
ALAHD
subroutine sgels(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, info)
SGELS solves overdetermined or underdetermined systems for GE matrices
subroutine slacpy(uplo, m, n, a, lda, b, ldb)
SLACPY copies all or part of one two-dimensional array to another.
subroutine serrqr(path, nunit)
SERRQR
logical function sgennd(m, n, a, lda)
SGENND
subroutine slatb4(path, imat, m, n, type, kl, ku, anorm, mode, cndnum, dist)
SLATB4
subroutine slatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
SLATMS
subroutine sqrt01(m, n, a, af, q, r, lda, tau, work, lwork, rwork, result)
SQRT01
subroutine sqrt01p(m, n, a, af, q, r, lda, tau, work, lwork, rwork, result)
SQRT01P
subroutine sqrt02(m, n, k, a, af, q, r, lda, tau, work, lwork, rwork, result)
SQRT02
subroutine sqrt03(m, n, k, af, c, cc, q, lda, tau, work, lwork, rwork, result)
SQRT03