171
172
173
174
175
176 IMPLICIT NONE
177
178
179 LOGICAL TSTERR
180 INTEGER NN, NNB, NNS, NMAX, NOUT
181 DOUBLE PRECISION THRESH
182
183
184 LOGICAL DOTYPE( * )
185 INTEGER IWORK( * ), NBVAL( * ), NSVAL( * ), NVAL( * )
186 DOUBLE PRECISION RWORK( * )
187 COMPLEX*16 A( * ), AFAC( * ), AINV( * ), B( * ),
188 $ WORK( * ), X( * ), XACT( * )
189
190
191
192
193
194 DOUBLE PRECISION ZERO
195 parameter( zero = 0.0d+0 )
196 COMPLEX*16 CZERO
197 parameter( czero = ( 0.0d+0, 0.0d+0 ) )
198 INTEGER NTYPES
199 parameter( ntypes = 10 )
200 INTEGER NTESTS
201 parameter( ntests = 9 )
202
203
204 LOGICAL ZEROT
205 CHARACTER DIST, TYPE, UPLO, XTYPE
206 CHARACTER*3 PATH, MATPATH
207 INTEGER I, I1, I2, IMAT, IN, INB, INFO, IOFF, IRHS,
208 $ IUPLO, IZERO, J, K, KL, KU, LDA, LWORK, MODE,
209 $ N, NB, NERRS, NFAIL, NIMAT, NRHS, NRUN, NT
210 DOUBLE PRECISION ANORM, CNDNUM
211
212
213 CHARACTER UPLOS( 2 )
214 INTEGER ISEED( 4 ), ISEEDY( 4 )
215 DOUBLE PRECISION RESULT( NTESTS )
216
217
221
222
223 INTRINSIC max, min
224
225
226 LOGICAL LERR, OK
227 CHARACTER*32 SRNAMT
228 INTEGER INFOT, NUNIT
229
230
231 COMMON / infoc / infot, nunit, ok, lerr
232 COMMON / srnamc / srnamt
233
234
235 DATA iseedy / 1988, 1989, 1990, 1991 /
236 DATA uplos / 'U', 'L' /
237
238
239
240
241
242
243
244 path( 1: 1 ) = 'Zomplex precision'
245 path( 2: 3 ) = 'SA'
246
247
248
249 matpath( 1: 1 ) = 'Zomplex precision'
250 matpath( 2: 3 ) = 'SY'
251 nrun = 0
252 nfail = 0
253 nerrs = 0
254 DO 10 i = 1, 4
255 iseed( i ) = iseedy( i )
256 10 CONTINUE
257
258
259
260 IF( tsterr )
261 $
CALL zerrsy( path, nout )
262 infot = 0
263
264
265
266
268
269
270
271 DO 180 in = 1, nn
272 n = nval( in )
273 IF( n .GT. nmax ) THEN
274 nfail = nfail + 1
275 WRITE(nout, 9995) 'M ', n, nmax
276 GO TO 180
277 END IF
278 lda = max( n, 1 )
279 xtype = 'N'
280 nimat = ntypes
281 IF( n.LE.0 )
282 $ nimat = 1
283
284 izero = 0
285
286
287
288 DO 170 imat = 1, nimat
289
290
291
292 IF( .NOT.dotype( imat ) )
293 $ GO TO 170
294
295
296
297 zerot = imat.GE.3 .AND. imat.LE.6
298 IF( zerot .AND. n.LT.imat-2 )
299 $ GO TO 170
300
301
302
303 DO 160 iuplo = 1, 2
304 uplo = uplos( iuplo )
305
306
307
308
309
310
311
312 CALL zlatb4( matpath, imat, n, n,
TYPE, KL, KU,
313 $ ANORM, MODE, CNDNUM, DIST )
314
315
316
317 srnamt = 'ZLATMS'
318 CALL zlatms( n, n, dist, iseed,
TYPE, RWORK, MODE,
319 $ CNDNUM, ANORM, KL, KU, UPLO, A, LDA, WORK,
320 $ INFO )
321
322
323
324 IF( info.NE.0 ) THEN
325 CALL alaerh( path,
'ZLATMS', info, 0, uplo, n, n, -1,
326 $ -1, -1, imat, nfail, nerrs, nout )
327
328
329
330 GO TO 160
331 END IF
332
333
334
335
336
337 IF( zerot ) THEN
338 IF( imat.EQ.3 ) THEN
339 izero = 1
340 ELSE IF( imat.EQ.4 ) THEN
341 izero = n
342 ELSE
343 izero = n / 2 + 1
344 END IF
345
346 IF( imat.LT.6 ) THEN
347
348
349
350 IF( iuplo.EQ.1 ) THEN
351 ioff = ( izero-1 )*lda
352 DO 20 i = 1, izero - 1
353 a( ioff+i ) = czero
354 20 CONTINUE
355 ioff = ioff + izero
356 DO 30 i = izero, n
357 a( ioff ) = czero
358 ioff = ioff + lda
359 30 CONTINUE
360 ELSE
361 ioff = izero
362 DO 40 i = 1, izero - 1
363 a( ioff ) = czero
364 ioff = ioff + lda
365 40 CONTINUE
366 ioff = ioff - izero
367 DO 50 i = izero, n
368 a( ioff+i ) = czero
369 50 CONTINUE
370 END IF
371 ELSE
372 IF( iuplo.EQ.1 ) THEN
373
374
375
376 ioff = 0
377 DO 70 j = 1, n
378 i2 = min( j, izero )
379 DO 60 i = 1, i2
380 a( ioff+i ) = czero
381 60 CONTINUE
382 ioff = ioff + lda
383 70 CONTINUE
384 izero = 1
385 ELSE
386
387
388
389 ioff = 0
390 DO 90 j = 1, n
391 i1 = max( j, izero )
392 DO 80 i = i1, n
393 a( ioff+i ) = czero
394 80 CONTINUE
395 ioff = ioff + lda
396 90 CONTINUE
397 END IF
398 END IF
399 ELSE
400 izero = 0
401 END IF
402
403
404
405
406
407 DO 150 inb = 1, nnb
408
409
410
411
412 nb = nbval( inb )
414
415
416
417
418
419 CALL zlacpy( uplo, n, n, a, lda, afac, lda )
420
421
422
423
424
425
426 srnamt = 'ZSYTRF_AA'
427 lwork = max( 1, n*nb + n )
428 CALL zsytrf_aa( uplo, n, afac, lda, iwork, ainv,
429 $ lwork, info )
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448 k = 0
449
450
451
452
453 IF( info.NE.k ) THEN
454 CALL alaerh( path,
'ZSYTRF_AA', info, k, uplo,
455 $ n, n, -1, -1, nb, imat, nfail, nerrs,
456 $ nout )
457 END IF
458
459
460
461
462 CALL zsyt01_aa( uplo, n, a, lda, afac, lda, iwork,
463 $ ainv, lda, rwork, result( 1 ) )
464 nt = 1
465
466
467
468
469
470 DO 110 k = 1, nt
471 IF( result( k ).GE.thresh ) THEN
472 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
473 $
CALL alahd( nout, path )
474 WRITE( nout, fmt = 9999 )uplo, n, nb, imat, k,
475 $ result( k )
476 nfail = nfail + 1
477 END IF
478 110 CONTINUE
479 nrun = nrun + nt
480
481
482
483 IF( info.NE.0 ) THEN
484 GO TO 140
485 END IF
486
487
488
489 DO 130 irhs = 1, nns
490 nrhs = nsval( irhs )
491
492
493
494
495
496
497
498 srnamt = 'ZLARHS'
499 CALL zlarhs( matpath, xtype, uplo,
' ', n, n,
500 $ kl, ku, nrhs, a, lda, xact, lda,
501 $ b, lda, iseed, info )
502 CALL zlacpy(
'Full', n, nrhs, b, lda, x, lda )
503
504 srnamt = 'ZSYTRS_AA'
505 lwork = max( 1, 3*n-2 )
506 CALL zsytrs_aa( uplo, n, nrhs, afac, lda,
507 $ iwork, x, lda, work, lwork,
508 $ info )
509
510
511
512 IF( info.NE.0 ) THEN
513 IF( izero.EQ.0 ) THEN
514 CALL alaerh( path,
'ZSYTRS_AA', info, 0,
515 $ uplo, n, n, -1, -1, nrhs, imat,
516 $ nfail, nerrs, nout )
517 END IF
518 ELSE
519 CALL zlacpy(
'Full', n, nrhs, b, lda, work, lda
520 $ )
521
522
523
524 CALL zsyt02( uplo, n, nrhs, a, lda, x, lda,
525 $ work, lda, rwork, result( 2 ) )
526
527
528
529
530
531 DO 120 k = 2, 2
532 IF( result( k ).GE.thresh ) THEN
533 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
534 $
CALL alahd( nout, path )
535 WRITE( nout, fmt = 9998 )uplo, n, nrhs,
536 $ imat, k, result( k )
537 nfail = nfail + 1
538 END IF
539 120 CONTINUE
540 END IF
541 nrun = nrun + 1
542
543
544
545 130 CONTINUE
546 140 CONTINUE
547 150 CONTINUE
548 160 CONTINUE
549 170 CONTINUE
550 180 CONTINUE
551
552
553
554 CALL alasum( path, nout, nfail, nrun, nerrs )
555
556 9999 FORMAT( ' UPLO = ''', a1, ''', N =', i5, ', NB =', i4, ', type ',
557 $ i2, ', test ', i2, ', ratio =', g12.5 )
558 9998 FORMAT( ' UPLO = ''', a1, ''', N =', i5, ', NRHS=', i3, ', type ',
559 $ i2, ', test(', i2, ') =', g12.5 )
560 9995 FORMAT( ' Invalid input value: ', a4, '=', i6, '; must be <=',
561 $ i6 )
562 RETURN
563
564
565
subroutine alasum(type, nout, nfail, nrun, nerrs)
ALASUM
subroutine xlaenv(ispec, nvalue)
XLAENV
subroutine zlarhs(path, xtype, uplo, trans, m, n, kl, ku, nrhs, a, lda, x, ldx, b, ldb, iseed, info)
ZLARHS
subroutine alaerh(path, subnam, info, infoe, opts, m, n, kl, ku, n5, imat, nfail, nerrs, nout)
ALAERH
subroutine alahd(iounit, path)
ALAHD
subroutine zsytrf_aa(uplo, n, a, lda, ipiv, work, lwork, info)
ZSYTRF_AA
subroutine zsytrs_aa(uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info)
ZSYTRS_AA
subroutine zlacpy(uplo, m, n, a, lda, b, ldb)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zerrsy(path, nunit)
ZERRSY
subroutine zlatb4(path, imat, m, n, type, kl, ku, anorm, mode, cndnum, dist)
ZLATB4
subroutine zlatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
ZLATMS
subroutine zsyt01_aa(uplo, n, a, lda, afac, ldafac, ipiv, c, ldc, rwork, resid)
ZSYT01
subroutine zsyt02(uplo, n, nrhs, a, lda, x, ldx, b, ldb, rwork, resid)
ZSYT02