171
172
173
174
175
176
177 LOGICAL TSTERR
178 INTEGER NMAX, NN, NNB, NNS, NOUT
179 REAL THRESH
180
181
182 LOGICAL DOTYPE( * )
183 INTEGER IWORK( * ), NBVAL( * ), NSVAL( * ), NVAL( * )
184 REAL RWORK( * )
185 COMPLEX A( * ), AFAC( * ), AINV( * ), B( * ),
186 $ WORK( * ), X( * ), XACT( * )
187
188
189
190
191
192 REAL ZERO
193 parameter( zero = 0.0e+0 )
194 COMPLEX CZERO
195 parameter( czero = ( 0.0e+0, 0.0e+0 ) )
196 INTEGER NTYPES
197 parameter( ntypes = 11 )
198 INTEGER NTESTS
199 parameter( ntests = 9 )
200
201
202 LOGICAL TRFCON, ZEROT
203 CHARACTER DIST, TYPE, UPLO, XTYPE
204 CHARACTER*3 PATH
205 INTEGER I, I1, I2, IMAT, IN, INB, INFO, IOFF, IRHS,
206 $ IUPLO, IZERO, J, K, KL, KU, LDA, LWORK, MODE,
207 $ N, NB, NERRS, NFAIL, NIMAT, NRHS, NRUN, NT
208 REAL ANORM, CNDNUM, RCOND, RCONDC
209
210
211 CHARACTER UPLOS( 2 )
212 INTEGER ISEED( 4 ), ISEEDY( 4 )
213 REAL RESULT( NTESTS )
214
215
216 REAL SGET06, CLANSY
218
219
224
225
226 INTRINSIC max, min
227
228
229 LOGICAL LERR, OK
230 CHARACTER*32 SRNAMT
231 INTEGER INFOT, NUNIT
232
233
234 COMMON / infoc / infot, nunit, ok, lerr
235 COMMON / srnamc / srnamt
236
237
238 DATA iseedy / 1988, 1989, 1990, 1991 /
239 DATA uplos / 'U', 'L' /
240
241
242
243
244
245 path( 1: 1 ) = 'Complex precision'
246 path( 2: 3 ) = 'SY'
247 nrun = 0
248 nfail = 0
249 nerrs = 0
250 DO 10 i = 1, 4
251 iseed( i ) = iseedy( i )
252 10 CONTINUE
253
254
255
256 IF( tsterr )
257 $
CALL cerrsy( path, nout )
258 infot = 0
259
260
261
262
264
265
266
267 DO 180 in = 1, nn
268 n = nval( in )
269 lda = max( n, 1 )
270 xtype = 'N'
271 nimat = ntypes
272 IF( n.LE.0 )
273 $ nimat = 1
274
275 izero = 0
276
277
278
279 DO 170 imat = 1, nimat
280
281
282
283 IF( .NOT.dotype( imat ) )
284 $ GO TO 170
285
286
287
288 zerot = imat.GE.3 .AND. imat.LE.6
289 IF( zerot .AND. n.LT.imat-2 )
290 $ GO TO 170
291
292
293
294 DO 160 iuplo = 1, 2
295 uplo = uplos( iuplo )
296
297
298
299 IF( imat.NE.ntypes ) THEN
300
301
302
303
304 CALL clatb4( path, imat, n, n,
TYPE, KL, KU, ANORM,
305 $ MODE, CNDNUM, DIST )
306
307
308
309 srnamt = 'CLATMS'
310 CALL clatms( n, n, dist, iseed,
TYPE, RWORK, MODE,
311 $ CNDNUM, ANORM, KL, KU, 'N', A, LDA, WORK,
312 $ INFO )
313
314
315
316 IF( info.NE.0 ) THEN
317 CALL alaerh( path,
'CLATMS', info, 0, uplo, n, n,
318 $ -1, -1, -1, imat, nfail, nerrs, nout )
319
320
321
322 GO TO 160
323 END IF
324
325
326
327
328
329 IF( zerot ) THEN
330 IF( imat.EQ.3 ) THEN
331 izero = 1
332 ELSE IF( imat.EQ.4 ) THEN
333 izero = n
334 ELSE
335 izero = n / 2 + 1
336 END IF
337
338 IF( imat.LT.6 ) THEN
339
340
341
342 IF( iuplo.EQ.1 ) THEN
343 ioff = ( izero-1 )*lda
344 DO 20 i = 1, izero - 1
345 a( ioff+i ) = czero
346 20 CONTINUE
347 ioff = ioff + izero
348 DO 30 i = izero, n
349 a( ioff ) = czero
350 ioff = ioff + lda
351 30 CONTINUE
352 ELSE
353 ioff = izero
354 DO 40 i = 1, izero - 1
355 a( ioff ) = czero
356 ioff = ioff + lda
357 40 CONTINUE
358 ioff = ioff - izero
359 DO 50 i = izero, n
360 a( ioff+i ) = czero
361 50 CONTINUE
362 END IF
363 ELSE
364 IF( iuplo.EQ.1 ) THEN
365
366
367
368 ioff = 0
369 DO 70 j = 1, n
370 i2 = min( j, izero )
371 DO 60 i = 1, i2
372 a( ioff+i ) = czero
373 60 CONTINUE
374 ioff = ioff + lda
375 70 CONTINUE
376 ELSE
377
378
379
380 ioff = 0
381 DO 90 j = 1, n
382 i1 = max( j, izero )
383 DO 80 i = i1, n
384 a( ioff+i ) = czero
385 80 CONTINUE
386 ioff = ioff + lda
387 90 CONTINUE
388 END IF
389 END IF
390 ELSE
391 izero = 0
392 END IF
393
394 ELSE
395
396
397
398
399
400 CALL clatsy( uplo, n, a, lda, iseed )
401
402 END IF
403
404
405
406
407
408
409 DO 150 inb = 1, nnb
410
411
412
413
414 nb = nbval( inb )
416
417
418
419
420
421 CALL clacpy( uplo, n, n, a, lda, afac, lda )
422
423
424
425
426
427
428 lwork = max( 2, nb )*lda
429 srnamt = 'CSYTRF'
430 CALL csytrf( uplo, n, afac, lda, iwork, ainv, lwork,
431 $ info )
432
433
434
435
436 k = izero
437 IF( k.GT.0 ) THEN
438 100 CONTINUE
439 IF( iwork( k ).LT.0 ) THEN
440 IF( iwork( k ).NE.-k ) THEN
441 k = -iwork( k )
442 GO TO 100
443 END IF
444 ELSE IF( iwork( k ).NE.k ) THEN
445 k = iwork( k )
446 GO TO 100
447 END IF
448 END IF
449
450
451
452 IF( info.NE.k )
453 $
CALL alaerh( path,
'CSYTRF', info, k, uplo, n, n,
454 $ -1, -1, nb, imat, nfail, nerrs, nout )
455
456
457
458 IF( info.NE.0 ) THEN
459 trfcon = .true.
460 ELSE
461 trfcon = .false.
462 END IF
463
464
465
466
467 CALL csyt01( uplo, n, a, lda, afac, lda, iwork, ainv,
468 $ lda, rwork, result( 1 ) )
469 nt = 1
470
471
472
473
474
475
476
477 IF( inb.EQ.1 .AND. .NOT.trfcon ) THEN
478 CALL clacpy( uplo, n, n, afac, lda, ainv, lda )
479 srnamt = 'CSYTRI2'
480 lwork = (n+nb+1)*(nb+3)
481 CALL csytri2( uplo, n, ainv, lda, iwork, work,
482 $ lwork, info )
483
484
485
486 IF( info.NE.0 )
487 $
CALL alaerh( path,
'CSYTRI2', info, 0, uplo, n,
488 $ n, -1, -1, -1, imat, nfail, nerrs,
489 $ nout )
490
491
492
493
494 CALL csyt03( uplo, n, a, lda, ainv, lda, work, lda,
495 $ rwork, rcondc, result( 2 ) )
496 nt = 2
497 END IF
498
499
500
501
502 DO 110 k = 1, nt
503 IF( result( k ).GE.thresh ) THEN
504 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
505 $
CALL alahd( nout, path )
506 WRITE( nout, fmt = 9999 )uplo, n, nb, imat, k,
507 $ result( k )
508 nfail = nfail + 1
509 END IF
510 110 CONTINUE
511 nrun = nrun + nt
512
513
514
515
516 IF( inb.GT.1 )
517 $ GO TO 150
518
519
520
521 IF( trfcon ) THEN
522 rcondc = zero
523 GO TO 140
524 END IF
525
526
527
528 DO 130 irhs = 1, nns
529 nrhs = nsval( irhs )
530
531
532
533
534
535
536
537 srnamt = 'CLARHS'
538 CALL clarhs( path, xtype, uplo,
' ', n, n, kl, ku,
539 $ nrhs, a, lda, xact, lda, b, lda,
540 $ iseed, info )
541 CALL clacpy(
'Full', n, nrhs, b, lda, x, lda )
542
543 srnamt = 'CSYTRS'
544 CALL csytrs( uplo, n, nrhs, afac, lda, iwork, x,
545 $ lda, info )
546
547
548
549 IF( info.NE.0 )
550 $
CALL alaerh( path,
'CSYTRS', info, 0, uplo, n,
551 $ n, -1, -1, nrhs, imat, nfail,
552 $ nerrs, nout )
553
554 CALL clacpy(
'Full', n, nrhs, b, lda, work, lda )
555
556
557
558 CALL csyt02( uplo, n, nrhs, a, lda, x, lda, work,
559 $ lda, rwork, result( 3 ) )
560
561
562
563
564
565
566
567 srnamt = 'CLARHS'
568 CALL clarhs( path, xtype, uplo,
' ', n, n, kl, ku,
569 $ nrhs, a, lda, xact, lda, b, lda,
570 $ iseed, info )
571 CALL clacpy(
'Full', n, nrhs, b, lda, x, lda )
572
573 srnamt = 'CSYTRS2'
574 CALL csytrs2( uplo, n, nrhs, afac, lda, iwork, x,
575 $ lda, work, info )
576
577
578
579 IF( info.NE.0 )
580 $
CALL alaerh( path,
'CSYTRS2', info, 0, uplo, n,
581 $ n, -1, -1, nrhs, imat, nfail,
582 $ nerrs, nout )
583
584 CALL clacpy(
'Full', n, nrhs, b, lda, work, lda )
585
586
587
588 CALL csyt02( uplo, n, nrhs, a, lda, x, lda, work,
589 $ lda, rwork, result( 4 ) )
590
591
592
593
594 CALL cget04( n, nrhs, x, lda, xact, lda, rcondc,
595 $ result( 5 ) )
596
597
598
599
600 srnamt = 'CSYRFS'
601 CALL csyrfs( uplo, n, nrhs, a, lda, afac, lda,
602 $ iwork, b, lda, x, lda, rwork,
603 $ rwork( nrhs+1 ), work,
604 $ rwork( 2*nrhs+1 ), info )
605
606
607
608 IF( info.NE.0 )
609 $
CALL alaerh( path,
'CSYRFS', info, 0, uplo, n,
610 $ n, -1, -1, nrhs, imat, nfail,
611 $ nerrs, nout )
612
613 CALL cget04( n, nrhs, x, lda, xact, lda, rcondc,
614 $ result( 6 ) )
615 CALL cpot05( uplo, n, nrhs, a, lda, b, lda, x, lda,
616 $ xact, lda, rwork, rwork( nrhs+1 ),
617 $ result( 7 ) )
618
619
620
621
622 DO 120 k = 3, 8
623 IF( result( k ).GE.thresh ) THEN
624 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
625 $
CALL alahd( nout, path )
626 WRITE( nout, fmt = 9998 )uplo, n, nrhs,
627 $ imat, k, result( k )
628 nfail = nfail + 1
629 END IF
630 120 CONTINUE
631 nrun = nrun + 6
632
633
634
635 130 CONTINUE
636
637
638
639
640 140 CONTINUE
641 anorm =
clansy(
'1', uplo, n, a, lda, rwork )
642 srnamt = 'CSYCON'
643 CALL csycon( uplo, n, afac, lda, iwork, anorm, rcond,
644 $ work, info )
645
646
647
648 IF( info.NE.0 )
649 $
CALL alaerh( path,
'CSYCON', info, 0, uplo, n, n,
650 $ -1, -1, -1, imat, nfail, nerrs, nout )
651
652
653
654 result( 9 ) =
sget06( rcond, rcondc )
655
656
657
658
659 IF( result( 9 ).GE.thresh ) THEN
660 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
661 $
CALL alahd( nout, path )
662 WRITE( nout, fmt = 9997 )uplo, n, imat, 9,
663 $ result( 9 )
664 nfail = nfail + 1
665 END IF
666 nrun = nrun + 1
667 150 CONTINUE
668 160 CONTINUE
669 170 CONTINUE
670 180 CONTINUE
671
672
673
674 CALL alasum( path, nout, nfail, nrun, nerrs )
675
676 9999 FORMAT( ' UPLO = ''', a1, ''', N =', i5, ', NB =', i4, ', type ',
677 $ i2, ', test ', i2, ', ratio =', g12.5 )
678 9998 FORMAT( ' UPLO = ''', a1, ''', N =', i5, ', NRHS=', i3, ', type ',
679 $ i2, ', test(', i2, ') =', g12.5 )
680 9997 FORMAT( ' UPLO = ''', a1, ''', N =', i5, ',', 10x, ' type ', i2,
681 $ ', test(', i2, ') =', g12.5 )
682 RETURN
683
684
685
subroutine alasum(type, nout, nfail, nrun, nerrs)
ALASUM
subroutine clarhs(path, xtype, uplo, trans, m, n, kl, ku, nrhs, a, lda, x, ldx, b, ldb, iseed, info)
CLARHS
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 cerrsy(path, nunit)
CERRSY
subroutine cget04(n, nrhs, x, ldx, xact, ldxact, rcond, resid)
CGET04
subroutine clatb4(path, imat, m, n, type, kl, ku, anorm, mode, cndnum, dist)
CLATB4
subroutine clatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
CLATMS
subroutine clatsy(uplo, n, x, ldx, iseed)
CLATSY
subroutine cpot05(uplo, n, nrhs, a, lda, b, ldb, x, ldx, xact, ldxact, ferr, berr, reslts)
CPOT05
subroutine csyt01(uplo, n, a, lda, afac, ldafac, ipiv, c, ldc, rwork, resid)
CSYT01
subroutine csyt02(uplo, n, nrhs, a, lda, x, ldx, b, ldb, rwork, resid)
CSYT02
subroutine csyt03(uplo, n, a, lda, ainv, ldainv, work, ldwork, rwork, rcond, resid)
CSYT03
subroutine csycon(uplo, n, a, lda, ipiv, anorm, rcond, work, info)
CSYCON
subroutine csyrfs(uplo, n, nrhs, a, lda, af, ldaf, ipiv, b, ldb, x, ldx, ferr, berr, work, rwork, info)
CSYRFS
subroutine csytrf(uplo, n, a, lda, ipiv, work, lwork, info)
CSYTRF
subroutine csytri2(uplo, n, a, lda, ipiv, work, lwork, info)
CSYTRI2
subroutine csytrs2(uplo, n, nrhs, a, lda, ipiv, b, ldb, work, info)
CSYTRS2
subroutine csytrs(uplo, n, nrhs, a, lda, ipiv, b, ldb, info)
CSYTRS
subroutine clacpy(uplo, m, n, a, lda, b, ldb)
CLACPY copies all or part of one two-dimensional array to another.
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,...
real function sget06(rcond, rcondc)
SGET06