00001 SUBROUTINE CCHKSY( DOTYPE, NN, NVAL, NNB, NBVAL, NNS, NSVAL,
00002 $ THRESH, TSTERR, NMAX, A, AFAC, AINV, B, X,
00003 $ XACT, WORK, RWORK, IWORK, NOUT )
00004
00005
00006
00007
00008
00009
00010 LOGICAL TSTERR
00011 INTEGER NMAX, NN, NNB, NNS, NOUT
00012 REAL THRESH
00013
00014
00015 LOGICAL DOTYPE( * )
00016 INTEGER IWORK( * ), NBVAL( * ), NSVAL( * ), 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
00086
00087
00088
00089
00090
00091
00092 REAL ZERO
00093 PARAMETER ( ZERO = 0.0E+0 )
00094 INTEGER NTYPES
00095 PARAMETER ( NTYPES = 11 )
00096 INTEGER NTESTS
00097 PARAMETER ( NTESTS = 8 )
00098
00099
00100 LOGICAL TRFCON, ZEROT
00101 CHARACTER DIST, TYPE, UPLO, XTYPE
00102 CHARACTER*3 PATH
00103 INTEGER I, I1, I2, IMAT, IN, INB, INFO, IOFF, IRHS,
00104 $ IUPLO, IZERO, J, K, KL, KU, LDA, LWORK, MODE,
00105 $ N, NB, NERRS, NFAIL, NIMAT, NRHS, NRUN, NT
00106 REAL ANORM, CNDNUM, RCOND, RCONDC
00107
00108
00109 CHARACTER UPLOS( 2 )
00110 INTEGER ISEED( 4 ), ISEEDY( 4 )
00111 REAL RESULT( NTESTS )
00112
00113
00114 REAL CLANSY, SGET06
00115 EXTERNAL CLANSY, SGET06
00116
00117
00118 EXTERNAL ALAERH, ALAHD, ALASUM, CERRSY, CGET04, CLACPY,
00119 $ CLARHS, CLATB4, CLATMS, CLATSY, CPOT05, CSYCON,
00120 $ CSYRFS, CSYT01, CSYT02, CSYT03, CSYTRF, CSYTRI,
00121 $ CSYTRS, XLAENV
00122
00123
00124 INTRINSIC MAX, MIN
00125
00126
00127 LOGICAL LERR, OK
00128 CHARACTER*32 SRNAMT
00129 INTEGER INFOT, NUNIT
00130
00131
00132 COMMON / INFOC / INFOT, NUNIT, OK, LERR
00133 COMMON / SRNAMC / SRNAMT
00134
00135
00136 DATA ISEEDY / 1988, 1989, 1990, 1991 /
00137 DATA UPLOS / 'U', 'L' /
00138
00139
00140
00141
00142
00143 PATH( 1: 1 ) = 'Complex precision'
00144 PATH( 2: 3 ) = 'SY'
00145 NRUN = 0
00146 NFAIL = 0
00147 NERRS = 0
00148 DO 10 I = 1, 4
00149 ISEED( I ) = ISEEDY( I )
00150 10 CONTINUE
00151
00152
00153
00154 IF( TSTERR )
00155 $ CALL CERRSY( PATH, NOUT )
00156 INFOT = 0
00157
00158
00159
00160 DO 180 IN = 1, NN
00161 N = NVAL( IN )
00162 LDA = MAX( N, 1 )
00163 XTYPE = 'N'
00164 NIMAT = NTYPES
00165 IF( N.LE.0 )
00166 $ NIMAT = 1
00167
00168 IZERO = 0
00169 DO 170 IMAT = 1, NIMAT
00170
00171
00172
00173 IF( .NOT.DOTYPE( IMAT ) )
00174 $ GO TO 170
00175
00176
00177
00178 ZEROT = IMAT.GE.3 .AND. IMAT.LE.6
00179 IF( ZEROT .AND. N.LT.IMAT-2 )
00180 $ GO TO 170
00181
00182
00183
00184 DO 160 IUPLO = 1, 2
00185 UPLO = UPLOS( IUPLO )
00186
00187 IF( IMAT.NE.NTYPES ) THEN
00188
00189
00190
00191
00192 CALL CLATB4( PATH, IMAT, N, N, TYPE, KL, KU, ANORM,
00193 $ MODE, CNDNUM, DIST )
00194
00195 SRNAMT = 'CLATMS'
00196 CALL CLATMS( N, N, DIST, ISEED, TYPE, RWORK, MODE,
00197 $ CNDNUM, ANORM, KL, KU, 'N', A, LDA, WORK,
00198 $ INFO )
00199
00200
00201
00202 IF( INFO.NE.0 ) THEN
00203 CALL ALAERH( PATH, 'CLATMS', INFO, 0, UPLO, N, N,
00204 $ -1, -1, -1, IMAT, NFAIL, NERRS, NOUT )
00205 GO TO 160
00206 END IF
00207
00208
00209
00210
00211 IF( ZEROT ) THEN
00212 IF( IMAT.EQ.3 ) THEN
00213 IZERO = 1
00214 ELSE IF( IMAT.EQ.4 ) THEN
00215 IZERO = N
00216 ELSE
00217 IZERO = N / 2 + 1
00218 END IF
00219
00220 IF( IMAT.LT.6 ) THEN
00221
00222
00223
00224 IF( IUPLO.EQ.1 ) THEN
00225 IOFF = ( IZERO-1 )*LDA
00226 DO 20 I = 1, IZERO - 1
00227 A( IOFF+I ) = ZERO
00228 20 CONTINUE
00229 IOFF = IOFF + IZERO
00230 DO 30 I = IZERO, N
00231 A( IOFF ) = ZERO
00232 IOFF = IOFF + LDA
00233 30 CONTINUE
00234 ELSE
00235 IOFF = IZERO
00236 DO 40 I = 1, IZERO - 1
00237 A( IOFF ) = ZERO
00238 IOFF = IOFF + LDA
00239 40 CONTINUE
00240 IOFF = IOFF - IZERO
00241 DO 50 I = IZERO, N
00242 A( IOFF+I ) = ZERO
00243 50 CONTINUE
00244 END IF
00245 ELSE
00246 IF( IUPLO.EQ.1 ) THEN
00247
00248
00249
00250 IOFF = 0
00251 DO 70 J = 1, N
00252 I2 = MIN( J, IZERO )
00253 DO 60 I = 1, I2
00254 A( IOFF+I ) = ZERO
00255 60 CONTINUE
00256 IOFF = IOFF + LDA
00257 70 CONTINUE
00258 ELSE
00259
00260
00261
00262 IOFF = 0
00263 DO 90 J = 1, N
00264 I1 = MAX( J, IZERO )
00265 DO 80 I = I1, N
00266 A( IOFF+I ) = ZERO
00267 80 CONTINUE
00268 IOFF = IOFF + LDA
00269 90 CONTINUE
00270 END IF
00271 END IF
00272 ELSE
00273 IZERO = 0
00274 END IF
00275 ELSE
00276
00277
00278
00279
00280 CALL CLATSY( UPLO, N, A, LDA, ISEED )
00281 END IF
00282
00283
00284
00285 DO 150 INB = 1, NNB
00286 NB = NBVAL( INB )
00287 CALL XLAENV( 1, NB )
00288
00289
00290
00291
00292 CALL CLACPY( UPLO, N, N, A, LDA, AFAC, LDA )
00293 LWORK = MAX( 2, NB )*LDA
00294 SRNAMT = 'CSYTRF'
00295 CALL CSYTRF( UPLO, N, AFAC, LDA, IWORK, AINV, LWORK,
00296 $ INFO )
00297
00298
00299
00300
00301 K = IZERO
00302 IF( K.GT.0 ) THEN
00303 100 CONTINUE
00304 IF( IWORK( K ).LT.0 ) THEN
00305 IF( IWORK( K ).NE.-K ) THEN
00306 K = -IWORK( K )
00307 GO TO 100
00308 END IF
00309 ELSE IF( IWORK( K ).NE.K ) THEN
00310 K = IWORK( K )
00311 GO TO 100
00312 END IF
00313 END IF
00314
00315
00316
00317 IF( INFO.NE.K )
00318 $ CALL ALAERH( PATH, 'CSYTRF', INFO, K, UPLO, N, N,
00319 $ -1, -1, NB, IMAT, NFAIL, NERRS, NOUT )
00320 IF( INFO.NE.0 ) THEN
00321 TRFCON = .TRUE.
00322 ELSE
00323 TRFCON = .FALSE.
00324 END IF
00325
00326
00327
00328
00329 CALL CSYT01( UPLO, N, A, LDA, AFAC, LDA, IWORK, AINV,
00330 $ LDA, RWORK, RESULT( 1 ) )
00331 NT = 1
00332
00333
00334
00335
00336 IF( INB.EQ.1 .AND. .NOT.TRFCON ) THEN
00337 CALL CLACPY( UPLO, N, N, AFAC, LDA, AINV, LDA )
00338 SRNAMT = 'CSYTRI'
00339 CALL CSYTRI( UPLO, N, AINV, LDA, IWORK, WORK,
00340 $ INFO )
00341
00342
00343
00344 IF( INFO.NE.0 )
00345 $ CALL ALAERH( PATH, 'CSYTRI', INFO, 0, UPLO, N,
00346 $ N, -1, -1, -1, IMAT, NFAIL, NERRS,
00347 $ NOUT )
00348
00349 CALL CSYT03( UPLO, N, A, LDA, AINV, LDA, WORK, LDA,
00350 $ RWORK, RCONDC, RESULT( 2 ) )
00351 NT = 2
00352 END IF
00353
00354
00355
00356
00357 DO 110 K = 1, NT
00358 IF( RESULT( K ).GE.THRESH ) THEN
00359 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
00360 $ CALL ALAHD( NOUT, PATH )
00361 WRITE( NOUT, FMT = 9999 )UPLO, N, NB, IMAT, K,
00362 $ RESULT( K )
00363 NFAIL = NFAIL + 1
00364 END IF
00365 110 CONTINUE
00366 NRUN = NRUN + NT
00367
00368
00369
00370
00371 IF( INB.GT.1 )
00372 $ GO TO 150
00373
00374
00375
00376 IF( TRFCON ) THEN
00377 RCONDC = ZERO
00378 GO TO 140
00379 END IF
00380
00381 DO 130 IRHS = 1, NNS
00382 NRHS = NSVAL( IRHS )
00383
00384
00385
00386
00387 SRNAMT = 'CLARHS'
00388 CALL CLARHS( PATH, XTYPE, UPLO, ' ', N, N, KL, KU,
00389 $ NRHS, A, LDA, XACT, LDA, B, LDA,
00390 $ ISEED, INFO )
00391 CALL CLACPY( 'Full', N, NRHS, B, LDA, X, LDA )
00392
00393 SRNAMT = 'CSYTRS'
00394 CALL CSYTRS( UPLO, N, NRHS, AFAC, LDA, IWORK, X,
00395 $ LDA, INFO )
00396
00397
00398
00399 IF( INFO.NE.0 )
00400 $ CALL ALAERH( PATH, 'CSYTRS', INFO, 0, UPLO, N,
00401 $ N, -1, -1, NRHS, IMAT, NFAIL,
00402 $ NERRS, NOUT )
00403
00404 CALL CLACPY( 'Full', N, NRHS, B, LDA, WORK, LDA )
00405 CALL CSYT02( UPLO, N, NRHS, A, LDA, X, LDA, WORK,
00406 $ LDA, RWORK, RESULT( 3 ) )
00407
00408
00409
00410
00411 CALL CGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
00412 $ RESULT( 4 ) )
00413
00414
00415
00416
00417 SRNAMT = 'CSYRFS'
00418 CALL CSYRFS( UPLO, N, NRHS, A, LDA, AFAC, LDA,
00419 $ IWORK, B, LDA, X, LDA, RWORK,
00420 $ RWORK( NRHS+1 ), WORK,
00421 $ RWORK( 2*NRHS+1 ), INFO )
00422
00423
00424
00425 IF( INFO.NE.0 )
00426 $ CALL ALAERH( PATH, 'CSYRFS', INFO, 0, UPLO, N,
00427 $ N, -1, -1, NRHS, IMAT, NFAIL,
00428 $ NERRS, NOUT )
00429
00430 CALL CGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
00431 $ RESULT( 5 ) )
00432 CALL CPOT05( UPLO, N, NRHS, A, LDA, B, LDA, X, LDA,
00433 $ XACT, LDA, RWORK, RWORK( NRHS+1 ),
00434 $ RESULT( 6 ) )
00435
00436
00437
00438
00439 DO 120 K = 3, 7
00440 IF( RESULT( K ).GE.THRESH ) THEN
00441 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
00442 $ CALL ALAHD( NOUT, PATH )
00443 WRITE( NOUT, FMT = 9998 )UPLO, N, NRHS,
00444 $ IMAT, K, RESULT( K )
00445 NFAIL = NFAIL + 1
00446 END IF
00447 120 CONTINUE
00448 NRUN = NRUN + 5
00449 130 CONTINUE
00450
00451
00452
00453
00454 140 CONTINUE
00455 ANORM = CLANSY( '1', UPLO, N, A, LDA, RWORK )
00456 SRNAMT = 'CSYCON'
00457 CALL CSYCON( UPLO, N, AFAC, LDA, IWORK, ANORM, RCOND,
00458 $ WORK, INFO )
00459
00460
00461
00462 IF( INFO.NE.0 )
00463 $ CALL ALAERH( PATH, 'CSYCON', INFO, 0, UPLO, N, N,
00464 $ -1, -1, -1, IMAT, NFAIL, NERRS, NOUT )
00465
00466 RESULT( 8 ) = SGET06( RCOND, RCONDC )
00467
00468
00469
00470
00471 IF( RESULT( 8 ).GE.THRESH ) THEN
00472 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
00473 $ CALL ALAHD( NOUT, PATH )
00474 WRITE( NOUT, FMT = 9997 )UPLO, N, IMAT, 8,
00475 $ RESULT( 8 )
00476 NFAIL = NFAIL + 1
00477 END IF
00478 NRUN = NRUN + 1
00479 150 CONTINUE
00480 160 CONTINUE
00481 170 CONTINUE
00482 180 CONTINUE
00483
00484
00485
00486 CALL ALASUM( PATH, NOUT, NFAIL, NRUN, NERRS )
00487
00488 9999 FORMAT( ' UPLO = ''', A1, ''', N =', I5, ', NB =', I4, ', type ',
00489 $ I2, ', test ', I2, ', ratio =', G12.5 )
00490 9998 FORMAT( ' UPLO = ''', A1, ''', N =', I5, ', NRHS=', I3, ', type ',
00491 $ I2, ', test(', I2, ') =', G12.5 )
00492 9997 FORMAT( ' UPLO = ''', A1, ''', N =', I5, ',', 10X, ' type ', I2,
00493 $ ', test(', I2, ') =', G12.5 )
00494 RETURN
00495
00496
00497
00498 END