00001 SUBROUTINE CDRVSY( DOTYPE, NN, NVAL, NRHS, THRESH, TSTERR, NMAX,
00002 $ A, AFAC, AINV, B, X, XACT, WORK, RWORK, IWORK,
00003 $ NOUT )
00004
00005
00006
00007
00008
00009
00010 LOGICAL TSTERR
00011 INTEGER NMAX, NN, NOUT, NRHS
00012 REAL THRESH
00013
00014
00015 LOGICAL DOTYPE( * )
00016 INTEGER IWORK( * ), NVAL( * )
00017 REAL RWORK( * )
00018 COMPLEX A( * ), AFAC( * ), AINV( * ), B( * ),
00019 $ WORK( * ), X( * ), XACT( * )
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 REAL ONE, ZERO
00086 PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 )
00087 INTEGER NTYPES, NTESTS
00088 PARAMETER ( NTYPES = 11, NTESTS = 6 )
00089 INTEGER NFACT
00090 PARAMETER ( NFACT = 2 )
00091
00092
00093 LOGICAL ZEROT
00094 CHARACTER DIST, EQUED, FACT, TYPE, UPLO, XTYPE
00095 CHARACTER*3 PATH
00096 INTEGER I, I1, I2, IFACT, IMAT, IN, INFO, IOFF, IUPLO,
00097 $ IZERO, J, K, K1, KL, KU, LDA, LWORK, MODE, N,
00098 $ NB, NBMIN, NERRS, NFAIL, NIMAT, NRUN, NT,
00099 $ N_ERR_BNDS
00100 REAL AINVNM, ANORM, CNDNUM, RCOND, RCONDC,
00101 $ RPVGRW_SVXX
00102
00103
00104 CHARACTER FACTS( NFACT ), UPLOS( 2 )
00105 INTEGER ISEED( 4 ), ISEEDY( 4 )
00106 REAL RESULT( NTESTS ), BERR( NRHS ),
00107 $ ERRBNDS_N( NRHS, 3 ), ERRBNDS_C( NRHS, 3 )
00108
00109
00110 REAL CLANSY, SGET06
00111 EXTERNAL CLANSY, SGET06
00112
00113
00114 EXTERNAL ALADHD, ALAERH, ALASVM, CERRVX, CGET04, CLACPY,
00115 $ CLARHS, CLASET, CLATB4, CLATMS, CLATSY, CPOT05,
00116 $ CSYSV, CSYSVX, CSYT01, CSYT02, CSYTRF, CSYTRI,
00117 $ XLAENV, CSYSVXX
00118
00119
00120 LOGICAL LERR, OK
00121 CHARACTER*32 SRNAMT
00122 INTEGER INFOT, NUNIT
00123
00124
00125 COMMON / INFOC / INFOT, NUNIT, OK, LERR
00126 COMMON / SRNAMC / SRNAMT
00127
00128
00129 INTRINSIC CMPLX, MAX, MIN
00130
00131
00132 DATA ISEEDY / 1988, 1989, 1990, 1991 /
00133 DATA UPLOS / 'U', 'L' / , FACTS / 'F', 'N' /
00134
00135
00136
00137
00138
00139 PATH( 1: 1 ) = 'Complex precision'
00140 PATH( 2: 3 ) = 'SY'
00141 NRUN = 0
00142 NFAIL = 0
00143 NERRS = 0
00144 DO 10 I = 1, 4
00145 ISEED( I ) = ISEEDY( I )
00146 10 CONTINUE
00147 LWORK = MAX( 2*NMAX, NMAX*NRHS )
00148
00149
00150
00151 IF( TSTERR )
00152 $ CALL CERRVX( PATH, NOUT )
00153 INFOT = 0
00154
00155
00156
00157 NB = 1
00158 NBMIN = 2
00159 CALL XLAENV( 1, NB )
00160 CALL XLAENV( 2, NBMIN )
00161
00162
00163
00164 DO 180 IN = 1, NN
00165 N = NVAL( IN )
00166 LDA = MAX( N, 1 )
00167 XTYPE = 'N'
00168 NIMAT = NTYPES
00169 IF( N.LE.0 )
00170 $ NIMAT = 1
00171
00172 DO 170 IMAT = 1, NIMAT
00173
00174
00175
00176 IF( .NOT.DOTYPE( IMAT ) )
00177 $ GO TO 170
00178
00179
00180
00181 ZEROT = IMAT.GE.3 .AND. IMAT.LE.6
00182 IF( ZEROT .AND. N.LT.IMAT-2 )
00183 $ GO TO 170
00184
00185
00186
00187 DO 160 IUPLO = 1, 2
00188 UPLO = UPLOS( IUPLO )
00189
00190 IF( IMAT.NE.NTYPES ) THEN
00191
00192
00193
00194
00195 CALL CLATB4( PATH, IMAT, N, N, TYPE, KL, KU, ANORM,
00196 $ MODE, CNDNUM, DIST )
00197
00198 SRNAMT = 'CLATMS'
00199 CALL CLATMS( N, N, DIST, ISEED, TYPE, RWORK, MODE,
00200 $ CNDNUM, ANORM, KL, KU, UPLO, A, LDA,
00201 $ WORK, INFO )
00202
00203
00204
00205 IF( INFO.NE.0 ) THEN
00206 CALL ALAERH( PATH, 'CLATMS', INFO, 0, UPLO, N, N,
00207 $ -1, -1, -1, IMAT, NFAIL, NERRS, NOUT )
00208 GO TO 160
00209 END IF
00210
00211
00212
00213
00214 IF( ZEROT ) THEN
00215 IF( IMAT.EQ.3 ) THEN
00216 IZERO = 1
00217 ELSE IF( IMAT.EQ.4 ) THEN
00218 IZERO = N
00219 ELSE
00220 IZERO = N / 2 + 1
00221 END IF
00222
00223 IF( IMAT.LT.6 ) THEN
00224
00225
00226
00227 IF( IUPLO.EQ.1 ) THEN
00228 IOFF = ( IZERO-1 )*LDA
00229 DO 20 I = 1, IZERO - 1
00230 A( IOFF+I ) = ZERO
00231 20 CONTINUE
00232 IOFF = IOFF + IZERO
00233 DO 30 I = IZERO, N
00234 A( IOFF ) = ZERO
00235 IOFF = IOFF + LDA
00236 30 CONTINUE
00237 ELSE
00238 IOFF = IZERO
00239 DO 40 I = 1, IZERO - 1
00240 A( IOFF ) = ZERO
00241 IOFF = IOFF + LDA
00242 40 CONTINUE
00243 IOFF = IOFF - IZERO
00244 DO 50 I = IZERO, N
00245 A( IOFF+I ) = ZERO
00246 50 CONTINUE
00247 END IF
00248 ELSE
00249 IF( IUPLO.EQ.1 ) THEN
00250
00251
00252
00253 IOFF = 0
00254 DO 70 J = 1, N
00255 I2 = MIN( J, IZERO )
00256 DO 60 I = 1, I2
00257 A( IOFF+I ) = ZERO
00258 60 CONTINUE
00259 IOFF = IOFF + LDA
00260 70 CONTINUE
00261 ELSE
00262
00263
00264
00265 IOFF = 0
00266 DO 90 J = 1, N
00267 I1 = MAX( J, IZERO )
00268 DO 80 I = I1, N
00269 A( IOFF+I ) = ZERO
00270 80 CONTINUE
00271 IOFF = IOFF + LDA
00272 90 CONTINUE
00273 END IF
00274 END IF
00275 ELSE
00276 IZERO = 0
00277 END IF
00278 ELSE
00279
00280
00281
00282
00283 CALL CLATSY( UPLO, N, A, LDA, ISEED )
00284 END IF
00285
00286 DO 150 IFACT = 1, NFACT
00287
00288
00289
00290 FACT = FACTS( IFACT )
00291
00292
00293
00294
00295 IF( ZEROT ) THEN
00296 IF( IFACT.EQ.1 )
00297 $ GO TO 150
00298 RCONDC = ZERO
00299
00300 ELSE IF( IFACT.EQ.1 ) THEN
00301
00302
00303
00304 ANORM = CLANSY( '1', UPLO, N, A, LDA, RWORK )
00305
00306
00307
00308 CALL CLACPY( UPLO, N, N, A, LDA, AFAC, LDA )
00309 CALL CSYTRF( UPLO, N, AFAC, LDA, IWORK, WORK,
00310 $ LWORK, INFO )
00311
00312
00313
00314 CALL CLACPY( UPLO, N, N, AFAC, LDA, AINV, LDA )
00315 CALL CSYTRI( UPLO, N, AINV, LDA, IWORK, WORK,
00316 $ INFO )
00317 AINVNM = CLANSY( '1', UPLO, N, AINV, LDA, RWORK )
00318
00319
00320
00321 IF( ANORM.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN
00322 RCONDC = ONE
00323 ELSE
00324 RCONDC = ( ONE / ANORM ) / AINVNM
00325 END IF
00326 END IF
00327
00328
00329
00330 SRNAMT = 'CLARHS'
00331 CALL CLARHS( PATH, XTYPE, UPLO, ' ', N, N, KL, KU,
00332 $ NRHS, A, LDA, XACT, LDA, B, LDA, ISEED,
00333 $ INFO )
00334 XTYPE = 'C'
00335
00336
00337
00338 IF( IFACT.EQ.2 ) THEN
00339 CALL CLACPY( UPLO, N, N, A, LDA, AFAC, LDA )
00340 CALL CLACPY( 'Full', N, NRHS, B, LDA, X, LDA )
00341
00342
00343
00344 SRNAMT = 'CSYSV '
00345 CALL CSYSV( UPLO, N, NRHS, AFAC, LDA, IWORK, X,
00346 $ LDA, WORK, LWORK, INFO )
00347
00348
00349
00350
00351 K = IZERO
00352 IF( K.GT.0 ) THEN
00353 100 CONTINUE
00354 IF( IWORK( K ).LT.0 ) THEN
00355 IF( IWORK( K ).NE.-K ) THEN
00356 K = -IWORK( K )
00357 GO TO 100
00358 END IF
00359 ELSE IF( IWORK( K ).NE.K ) THEN
00360 K = IWORK( K )
00361 GO TO 100
00362 END IF
00363 END IF
00364
00365
00366
00367 IF( INFO.NE.K ) THEN
00368 CALL ALAERH( PATH, 'CSYSV ', INFO, K, UPLO, N,
00369 $ N, -1, -1, NRHS, IMAT, NFAIL,
00370 $ NERRS, NOUT )
00371 GO TO 120
00372 ELSE IF( INFO.NE.0 ) THEN
00373 GO TO 120
00374 END IF
00375
00376
00377
00378
00379 CALL CSYT01( UPLO, N, A, LDA, AFAC, LDA, IWORK,
00380 $ AINV, LDA, RWORK, RESULT( 1 ) )
00381
00382
00383
00384 CALL CLACPY( 'Full', N, NRHS, B, LDA, WORK, LDA )
00385 CALL CSYT02( UPLO, N, NRHS, A, LDA, X, LDA, WORK,
00386 $ LDA, RWORK, RESULT( 2 ) )
00387
00388
00389
00390 CALL CGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
00391 $ RESULT( 3 ) )
00392 NT = 3
00393
00394
00395
00396
00397 DO 110 K = 1, NT
00398 IF( RESULT( K ).GE.THRESH ) THEN
00399 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
00400 $ CALL ALADHD( NOUT, PATH )
00401 WRITE( NOUT, FMT = 9999 )'CSYSV ', UPLO, N,
00402 $ IMAT, K, RESULT( K )
00403 NFAIL = NFAIL + 1
00404 END IF
00405 110 CONTINUE
00406 NRUN = NRUN + NT
00407 120 CONTINUE
00408 END IF
00409
00410
00411
00412 IF( IFACT.EQ.2 )
00413 $ CALL CLASET( UPLO, N, N, CMPLX( ZERO ),
00414 $ CMPLX( ZERO ), AFAC, LDA )
00415 CALL CLASET( 'Full', N, NRHS, CMPLX( ZERO ),
00416 $ CMPLX( ZERO ), X, LDA )
00417
00418
00419
00420
00421 SRNAMT = 'CSYSVX'
00422 CALL CSYSVX( FACT, UPLO, N, NRHS, A, LDA, AFAC, LDA,
00423 $ IWORK, B, LDA, X, LDA, RCOND, RWORK,
00424 $ RWORK( NRHS+1 ), WORK, LWORK,
00425 $ RWORK( 2*NRHS+1 ), INFO )
00426
00427
00428
00429
00430 K = IZERO
00431 IF( K.GT.0 ) THEN
00432 130 CONTINUE
00433 IF( IWORK( K ).LT.0 ) THEN
00434 IF( IWORK( K ).NE.-K ) THEN
00435 K = -IWORK( K )
00436 GO TO 130
00437 END IF
00438 ELSE IF( IWORK( K ).NE.K ) THEN
00439 K = IWORK( K )
00440 GO TO 130
00441 END IF
00442 END IF
00443
00444
00445
00446 IF( INFO.NE.K ) THEN
00447 CALL ALAERH( PATH, 'CSYSVX', INFO, K, FACT // UPLO,
00448 $ N, N, -1, -1, NRHS, IMAT, NFAIL,
00449 $ NERRS, NOUT )
00450 GO TO 150
00451 END IF
00452
00453 IF( INFO.EQ.0 ) THEN
00454 IF( IFACT.GE.2 ) THEN
00455
00456
00457
00458
00459 CALL CSYT01( UPLO, N, A, LDA, AFAC, LDA, IWORK,
00460 $ AINV, LDA, RWORK( 2*NRHS+1 ),
00461 $ RESULT( 1 ) )
00462 K1 = 1
00463 ELSE
00464 K1 = 2
00465 END IF
00466
00467
00468
00469 CALL CLACPY( 'Full', N, NRHS, B, LDA, WORK, LDA )
00470 CALL CSYT02( UPLO, N, NRHS, A, LDA, X, LDA, WORK,
00471 $ LDA, RWORK( 2*NRHS+1 ), RESULT( 2 ) )
00472
00473
00474
00475 CALL CGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
00476 $ RESULT( 3 ) )
00477
00478
00479
00480 CALL CPOT05( UPLO, N, NRHS, A, LDA, B, LDA, X, LDA,
00481 $ XACT, LDA, RWORK, RWORK( NRHS+1 ),
00482 $ RESULT( 4 ) )
00483 ELSE
00484 K1 = 6
00485 END IF
00486
00487
00488
00489
00490 RESULT( 6 ) = SGET06( RCOND, RCONDC )
00491
00492
00493
00494
00495 DO 140 K = K1, 6
00496 IF( RESULT( K ).GE.THRESH ) THEN
00497 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
00498 $ CALL ALADHD( NOUT, PATH )
00499 WRITE( NOUT, FMT = 9998 )'CSYSVX', FACT, UPLO,
00500 $ N, IMAT, K, RESULT( K )
00501 NFAIL = NFAIL + 1
00502 END IF
00503 140 CONTINUE
00504 NRUN = NRUN + 7 - K1
00505
00506
00507
00508
00509
00510 IF( IFACT.EQ.2 )
00511 $ CALL CLASET( UPLO, N, N, CMPLX( ZERO ),
00512 $ CMPLX( ZERO ), AFAC, LDA )
00513 CALL CLASET( 'Full', N, NRHS, CMPLX( ZERO ),
00514 $ CMPLX( ZERO ), X, LDA )
00515
00516
00517
00518
00519 SRNAMT = 'CSYSVXX'
00520 N_ERR_BNDS = 3
00521 EQUED = 'N'
00522 CALL CSYSVXX( FACT, UPLO, N, NRHS, A, LDA, AFAC,
00523 $ LDA, IWORK, EQUED, WORK( N+1 ), B, LDA, X,
00524 $ LDA, RCOND, RPVGRW_SVXX, BERR, N_ERR_BNDS,
00525 $ ERRBNDS_N, ERRBNDS_C, 0, ZERO, WORK,
00526 $ IWORK( N+1 ), INFO )
00527
00528
00529
00530
00531 K = IZERO
00532 IF( K.GT.0 ) THEN
00533 135 CONTINUE
00534 IF( IWORK( K ).LT.0 ) THEN
00535 IF( IWORK( K ).NE.-K ) THEN
00536 K = -IWORK( K )
00537 GO TO 135
00538 END IF
00539 ELSE IF( IWORK( K ).NE.K ) THEN
00540 K = IWORK( K )
00541 GO TO 135
00542 END IF
00543 END IF
00544
00545
00546
00547 IF( INFO.NE.K ) THEN
00548 CALL ALAERH( PATH, 'CSYSVXX', INFO, K,
00549 $ FACT // UPLO, N, N, -1, -1, NRHS, IMAT, NFAIL,
00550 $ NERRS, NOUT )
00551 GO TO 150
00552 END IF
00553
00554 IF( INFO.EQ.0 ) THEN
00555 IF( IFACT.GE.2 ) THEN
00556
00557
00558
00559
00560 CALL CSYT01( UPLO, N, A, LDA, AFAC, LDA, IWORK,
00561 $ AINV, LDA, RWORK(2*NRHS+1),
00562 $ RESULT( 1 ) )
00563 K1 = 1
00564 ELSE
00565 K1 = 2
00566 END IF
00567
00568
00569
00570 CALL CLACPY( 'Full', N, NRHS, B, LDA, WORK, LDA )
00571 CALL CSYT02( UPLO, N, NRHS, A, LDA, X, LDA, WORK,
00572 $ LDA, RWORK( 2*NRHS+1 ), RESULT( 2 ) )
00573 RESULT( 2 ) = 0.0
00574
00575
00576
00577 CALL CGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
00578 $ RESULT( 3 ) )
00579
00580
00581
00582 CALL CPOT05( UPLO, N, NRHS, A, LDA, B, LDA, X, LDA,
00583 $ XACT, LDA, RWORK, RWORK( NRHS+1 ),
00584 $ RESULT( 4 ) )
00585 ELSE
00586 K1 = 6
00587 END IF
00588
00589
00590
00591
00592 RESULT( 6 ) = SGET06( RCOND, RCONDC )
00593
00594
00595
00596
00597 DO 85 K = K1, 6
00598 IF( RESULT( K ).GE.THRESH ) THEN
00599 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
00600 $ CALL ALADHD( NOUT, PATH )
00601 WRITE( NOUT, FMT = 9998 )'CSYSVXX',
00602 $ FACT, UPLO, N, IMAT, K,
00603 $ RESULT( K )
00604 NFAIL = NFAIL + 1
00605 END IF
00606 85 CONTINUE
00607 NRUN = NRUN + 7 - K1
00608
00609 150 CONTINUE
00610
00611 160 CONTINUE
00612 170 CONTINUE
00613 180 CONTINUE
00614
00615
00616
00617 CALL ALASVM( PATH, NOUT, NFAIL, NRUN, NERRS )
00618
00619
00620
00621
00622 CALL CEBCHVXX(THRESH, PATH)
00623
00624 9999 FORMAT( 1X, A, ', UPLO=''', A1, ''', N =', I5, ', type ', I2,
00625 $ ', test ', I2, ', ratio =', G12.5 )
00626 9998 FORMAT( 1X, A, ', FACT=''', A1, ''', UPLO=''', A1, ''', N =', I5,
00627 $ ', type ', I2, ', test ', I2, ', ratio =', G12.5 )
00628 RETURN
00629
00630
00631
00632 END