1*> \brief \b SDRVSP 2* 3* =========== DOCUMENTATION =========== 4* 5* Online html documentation available at 6* http://www.netlib.org/lapack/explore-html/ 7* 8* Definition: 9* =========== 10* 11* SUBROUTINE SDRVSP( DOTYPE, NN, NVAL, NRHS, THRESH, TSTERR, NMAX, 12* A, AFAC, AINV, B, X, XACT, WORK, RWORK, IWORK, 13* NOUT ) 14* 15* .. Scalar Arguments .. 16* LOGICAL TSTERR 17* INTEGER NMAX, NN, NOUT, NRHS 18* REAL THRESH 19* .. 20* .. Array Arguments .. 21* LOGICAL DOTYPE( * ) 22* INTEGER IWORK( * ), NVAL( * ) 23* REAL A( * ), AFAC( * ), AINV( * ), B( * ), 24* $ RWORK( * ), WORK( * ), X( * ), XACT( * ) 25* .. 26* 27* 28*> \par Purpose: 29* ============= 30*> 31*> \verbatim 32*> 33*> SDRVSP tests the driver routines SSPSV and -SVX. 34*> \endverbatim 35* 36* Arguments: 37* ========== 38* 39*> \param[in] DOTYPE 40*> \verbatim 41*> DOTYPE is LOGICAL array, dimension (NTYPES) 42*> The matrix types to be used for testing. Matrices of type j 43*> (for 1 <= j <= NTYPES) are used for testing if DOTYPE(j) = 44*> .TRUE.; if DOTYPE(j) = .FALSE., then type j is not used. 45*> \endverbatim 46*> 47*> \param[in] NN 48*> \verbatim 49*> NN is INTEGER 50*> The number of values of N contained in the vector NVAL. 51*> \endverbatim 52*> 53*> \param[in] NVAL 54*> \verbatim 55*> NVAL is INTEGER array, dimension (NN) 56*> The values of the matrix dimension N. 57*> \endverbatim 58*> 59*> \param[in] NRHS 60*> \verbatim 61*> NRHS is INTEGER 62*> The number of right hand side vectors to be generated for 63*> each linear system. 64*> \endverbatim 65*> 66*> \param[in] THRESH 67*> \verbatim 68*> THRESH is REAL 69*> The threshold value for the test ratios. A result is 70*> included in the output file if RESULT >= THRESH. To have 71*> every test ratio printed, use THRESH = 0. 72*> \endverbatim 73*> 74*> \param[in] TSTERR 75*> \verbatim 76*> TSTERR is LOGICAL 77*> Flag that indicates whether error exits are to be tested. 78*> \endverbatim 79*> 80*> \param[in] NMAX 81*> \verbatim 82*> NMAX is INTEGER 83*> The maximum value permitted for N, used in dimensioning the 84*> work arrays. 85*> \endverbatim 86*> 87*> \param[out] A 88*> \verbatim 89*> A is REAL array, dimension 90*> (NMAX*(NMAX+1)/2) 91*> \endverbatim 92*> 93*> \param[out] AFAC 94*> \verbatim 95*> AFAC is REAL array, dimension 96*> (NMAX*(NMAX+1)/2) 97*> \endverbatim 98*> 99*> \param[out] AINV 100*> \verbatim 101*> AINV is REAL array, dimension 102*> (NMAX*(NMAX+1)/2) 103*> \endverbatim 104*> 105*> \param[out] B 106*> \verbatim 107*> B is REAL array, dimension (NMAX*NRHS) 108*> \endverbatim 109*> 110*> \param[out] X 111*> \verbatim 112*> X is REAL array, dimension (NMAX*NRHS) 113*> \endverbatim 114*> 115*> \param[out] XACT 116*> \verbatim 117*> XACT is REAL array, dimension (NMAX*NRHS) 118*> \endverbatim 119*> 120*> \param[out] WORK 121*> \verbatim 122*> WORK is REAL array, dimension 123*> (NMAX*max(2,NRHS)) 124*> \endverbatim 125*> 126*> \param[out] RWORK 127*> \verbatim 128*> RWORK is REAL array, dimension (NMAX+2*NRHS) 129*> \endverbatim 130*> 131*> \param[out] IWORK 132*> \verbatim 133*> IWORK is INTEGER array, dimension (2*NMAX) 134*> \endverbatim 135*> 136*> \param[in] NOUT 137*> \verbatim 138*> NOUT is INTEGER 139*> The unit number for output. 140*> \endverbatim 141* 142* Authors: 143* ======== 144* 145*> \author Univ. of Tennessee 146*> \author Univ. of California Berkeley 147*> \author Univ. of Colorado Denver 148*> \author NAG Ltd. 149* 150*> \date December 2016 151* 152*> \ingroup single_lin 153* 154* ===================================================================== 155 SUBROUTINE SDRVSP( DOTYPE, NN, NVAL, NRHS, THRESH, TSTERR, NMAX, 156 $ A, AFAC, AINV, B, X, XACT, WORK, RWORK, IWORK, 157 $ NOUT ) 158* 159* -- LAPACK test routine (version 3.7.0) -- 160* -- LAPACK is a software package provided by Univ. of Tennessee, -- 161* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 162* December 2016 163* 164* .. Scalar Arguments .. 165 LOGICAL TSTERR 166 INTEGER NMAX, NN, NOUT, NRHS 167 REAL THRESH 168* .. 169* .. Array Arguments .. 170 LOGICAL DOTYPE( * ) 171 INTEGER IWORK( * ), NVAL( * ) 172 REAL A( * ), AFAC( * ), AINV( * ), B( * ), 173 $ RWORK( * ), WORK( * ), X( * ), XACT( * ) 174* .. 175* 176* ===================================================================== 177* 178* .. Parameters .. 179 REAL ONE, ZERO 180 PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 ) 181 INTEGER NTYPES, NTESTS 182 PARAMETER ( NTYPES = 10, NTESTS = 6 ) 183 INTEGER NFACT 184 PARAMETER ( NFACT = 2 ) 185* .. 186* .. Local Scalars .. 187 LOGICAL ZEROT 188 CHARACTER DIST, FACT, PACKIT, TYPE, UPLO, XTYPE 189 CHARACTER*3 PATH 190 INTEGER I, I1, I2, IFACT, IMAT, IN, INFO, IOFF, IUPLO, 191 $ IZERO, J, K, K1, KL, KU, LDA, LWORK, MODE, N, 192 $ NERRS, NFAIL, NIMAT, NPP, NRUN, NT 193 REAL AINVNM, ANORM, CNDNUM, RCOND, RCONDC 194* .. 195* .. Local Arrays .. 196 CHARACTER FACTS( NFACT ) 197 INTEGER ISEED( 4 ), ISEEDY( 4 ) 198 REAL RESULT( NTESTS ) 199* .. 200* .. External Functions .. 201 REAL SGET06, SLANSP 202 EXTERNAL SGET06, SLANSP 203* .. 204* .. External Subroutines .. 205 EXTERNAL ALADHD, ALAERH, ALASVM, SCOPY, SERRVX, SGET04, 206 $ SLACPY, SLARHS, SLASET, SLATB4, SLATMS, SPPT02, 207 $ SPPT05, SSPSV, SSPSVX, SSPT01, SSPTRF, SSPTRI 208* .. 209* .. Scalars in Common .. 210 LOGICAL LERR, OK 211 CHARACTER*32 SRNAMT 212 INTEGER INFOT, NUNIT 213* .. 214* .. Common blocks .. 215 COMMON / INFOC / INFOT, NUNIT, OK, LERR 216 COMMON / SRNAMC / SRNAMT 217* .. 218* .. Intrinsic Functions .. 219 INTRINSIC MAX, MIN 220* .. 221* .. Data statements .. 222 DATA ISEEDY / 1988, 1989, 1990, 1991 / 223 DATA FACTS / 'F', 'N' / 224* .. 225* .. Executable Statements .. 226* 227* Initialize constants and the random number seed. 228* 229 PATH( 1: 1 ) = 'Single precision' 230 PATH( 2: 3 ) = 'SP' 231 NRUN = 0 232 NFAIL = 0 233 NERRS = 0 234 DO 10 I = 1, 4 235 ISEED( I ) = ISEEDY( I ) 236 10 CONTINUE 237 LWORK = MAX( 2*NMAX, NMAX*NRHS ) 238* 239* Test the error exits 240* 241 IF( TSTERR ) 242 $ CALL SERRVX( PATH, NOUT ) 243 INFOT = 0 244* 245* Do for each value of N in NVAL 246* 247 DO 180 IN = 1, NN 248 N = NVAL( IN ) 249 LDA = MAX( N, 1 ) 250 NPP = N*( N+1 ) / 2 251 XTYPE = 'N' 252 NIMAT = NTYPES 253 IF( N.LE.0 ) 254 $ NIMAT = 1 255* 256 DO 170 IMAT = 1, NIMAT 257* 258* Do the tests only if DOTYPE( IMAT ) is true. 259* 260 IF( .NOT.DOTYPE( IMAT ) ) 261 $ GO TO 170 262* 263* Skip types 3, 4, 5, or 6 if the matrix size is too small. 264* 265 ZEROT = IMAT.GE.3 .AND. IMAT.LE.6 266 IF( ZEROT .AND. N.LT.IMAT-2 ) 267 $ GO TO 170 268* 269* Do first for UPLO = 'U', then for UPLO = 'L' 270* 271 DO 160 IUPLO = 1, 2 272 IF( IUPLO.EQ.1 ) THEN 273 UPLO = 'U' 274 PACKIT = 'C' 275 ELSE 276 UPLO = 'L' 277 PACKIT = 'R' 278 END IF 279* 280* Set up parameters with SLATB4 and generate a test matrix 281* with SLATMS. 282* 283 CALL SLATB4( PATH, IMAT, N, N, TYPE, KL, KU, ANORM, MODE, 284 $ CNDNUM, DIST ) 285* 286 SRNAMT = 'SLATMS' 287 CALL SLATMS( N, N, DIST, ISEED, TYPE, RWORK, MODE, 288 $ CNDNUM, ANORM, KL, KU, PACKIT, A, LDA, WORK, 289 $ INFO ) 290* 291* Check error code from SLATMS. 292* 293 IF( INFO.NE.0 ) THEN 294 CALL ALAERH( PATH, 'SLATMS', INFO, 0, UPLO, N, N, -1, 295 $ -1, -1, IMAT, NFAIL, NERRS, NOUT ) 296 GO TO 160 297 END IF 298* 299* For types 3-6, zero one or more rows and columns of the 300* matrix to test that INFO is returned correctly. 301* 302 IF( ZEROT ) THEN 303 IF( IMAT.EQ.3 ) THEN 304 IZERO = 1 305 ELSE IF( IMAT.EQ.4 ) THEN 306 IZERO = N 307 ELSE 308 IZERO = N / 2 + 1 309 END IF 310* 311 IF( IMAT.LT.6 ) THEN 312* 313* Set row and column IZERO to zero. 314* 315 IF( IUPLO.EQ.1 ) THEN 316 IOFF = ( IZERO-1 )*IZERO / 2 317 DO 20 I = 1, IZERO - 1 318 A( IOFF+I ) = ZERO 319 20 CONTINUE 320 IOFF = IOFF + IZERO 321 DO 30 I = IZERO, N 322 A( IOFF ) = ZERO 323 IOFF = IOFF + I 324 30 CONTINUE 325 ELSE 326 IOFF = IZERO 327 DO 40 I = 1, IZERO - 1 328 A( IOFF ) = ZERO 329 IOFF = IOFF + N - I 330 40 CONTINUE 331 IOFF = IOFF - IZERO 332 DO 50 I = IZERO, N 333 A( IOFF+I ) = ZERO 334 50 CONTINUE 335 END IF 336 ELSE 337 IOFF = 0 338 IF( IUPLO.EQ.1 ) THEN 339* 340* Set the first IZERO rows and columns to zero. 341* 342 DO 70 J = 1, N 343 I2 = MIN( J, IZERO ) 344 DO 60 I = 1, I2 345 A( IOFF+I ) = ZERO 346 60 CONTINUE 347 IOFF = IOFF + J 348 70 CONTINUE 349 ELSE 350* 351* Set the last IZERO rows and columns to zero. 352* 353 DO 90 J = 1, N 354 I1 = MAX( J, IZERO ) 355 DO 80 I = I1, N 356 A( IOFF+I ) = ZERO 357 80 CONTINUE 358 IOFF = IOFF + N - J 359 90 CONTINUE 360 END IF 361 END IF 362 ELSE 363 IZERO = 0 364 END IF 365* 366 DO 150 IFACT = 1, NFACT 367* 368* Do first for FACT = 'F', then for other values. 369* 370 FACT = FACTS( IFACT ) 371* 372* Compute the condition number for comparison with 373* the value returned by SSPSVX. 374* 375 IF( ZEROT ) THEN 376 IF( IFACT.EQ.1 ) 377 $ GO TO 150 378 RCONDC = ZERO 379* 380 ELSE IF( IFACT.EQ.1 ) THEN 381* 382* Compute the 1-norm of A. 383* 384 ANORM = SLANSP( '1', UPLO, N, A, RWORK ) 385* 386* Factor the matrix A. 387* 388 CALL SCOPY( NPP, A, 1, AFAC, 1 ) 389 CALL SSPTRF( UPLO, N, AFAC, IWORK, INFO ) 390* 391* Compute inv(A) and take its norm. 392* 393 CALL SCOPY( NPP, AFAC, 1, AINV, 1 ) 394 CALL SSPTRI( UPLO, N, AINV, IWORK, WORK, INFO ) 395 AINVNM = SLANSP( '1', UPLO, N, AINV, RWORK ) 396* 397* Compute the 1-norm condition number of A. 398* 399 IF( ANORM.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN 400 RCONDC = ONE 401 ELSE 402 RCONDC = ( ONE / ANORM ) / AINVNM 403 END IF 404 END IF 405* 406* Form an exact solution and set the right hand side. 407* 408 SRNAMT = 'SLARHS' 409 CALL SLARHS( PATH, XTYPE, UPLO, ' ', N, N, KL, KU, 410 $ NRHS, A, LDA, XACT, LDA, B, LDA, ISEED, 411 $ INFO ) 412 XTYPE = 'C' 413* 414* --- Test SSPSV --- 415* 416 IF( IFACT.EQ.2 ) THEN 417 CALL SCOPY( NPP, A, 1, AFAC, 1 ) 418 CALL SLACPY( 'Full', N, NRHS, B, LDA, X, LDA ) 419* 420* Factor the matrix and solve the system using SSPSV. 421* 422 SRNAMT = 'SSPSV ' 423 CALL SSPSV( UPLO, N, NRHS, AFAC, IWORK, X, LDA, 424 $ INFO ) 425* 426* Adjust the expected value of INFO to account for 427* pivoting. 428* 429 K = IZERO 430 IF( K.GT.0 ) THEN 431 100 CONTINUE 432 IF( IWORK( K ).LT.0 ) THEN 433 IF( IWORK( K ).NE.-K ) THEN 434 K = -IWORK( K ) 435 GO TO 100 436 END IF 437 ELSE IF( IWORK( K ).NE.K ) THEN 438 K = IWORK( K ) 439 GO TO 100 440 END IF 441 END IF 442* 443* Check error code from SSPSV . 444* 445 IF( INFO.NE.K ) THEN 446 CALL ALAERH( PATH, 'SSPSV ', INFO, K, UPLO, N, 447 $ N, -1, -1, NRHS, IMAT, NFAIL, 448 $ NERRS, NOUT ) 449 GO TO 120 450 ELSE IF( INFO.NE.0 ) THEN 451 GO TO 120 452 END IF 453* 454* Reconstruct matrix from factors and compute 455* residual. 456* 457 CALL SSPT01( UPLO, N, A, AFAC, IWORK, AINV, LDA, 458 $ RWORK, RESULT( 1 ) ) 459* 460* Compute residual of the computed solution. 461* 462 CALL SLACPY( 'Full', N, NRHS, B, LDA, WORK, LDA ) 463 CALL SPPT02( UPLO, N, NRHS, A, X, LDA, WORK, LDA, 464 $ RWORK, RESULT( 2 ) ) 465* 466* Check solution from generated exact solution. 467* 468 CALL SGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC, 469 $ RESULT( 3 ) ) 470 NT = 3 471* 472* Print information about the tests that did not pass 473* the threshold. 474* 475 DO 110 K = 1, NT 476 IF( RESULT( K ).GE.THRESH ) THEN 477 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 ) 478 $ CALL ALADHD( NOUT, PATH ) 479 WRITE( NOUT, FMT = 9999 )'SSPSV ', UPLO, N, 480 $ IMAT, K, RESULT( K ) 481 NFAIL = NFAIL + 1 482 END IF 483 110 CONTINUE 484 NRUN = NRUN + NT 485 120 CONTINUE 486 END IF 487* 488* --- Test SSPSVX --- 489* 490 IF( IFACT.EQ.2 .AND. NPP.GT.0 ) 491 $ CALL SLASET( 'Full', NPP, 1, ZERO, ZERO, AFAC, 492 $ NPP ) 493 CALL SLASET( 'Full', N, NRHS, ZERO, ZERO, X, LDA ) 494* 495* Solve the system and compute the condition number and 496* error bounds using SSPSVX. 497* 498 SRNAMT = 'SSPSVX' 499 CALL SSPSVX( FACT, UPLO, N, NRHS, A, AFAC, IWORK, B, 500 $ LDA, X, LDA, RCOND, RWORK, 501 $ RWORK( NRHS+1 ), WORK, IWORK( N+1 ), 502 $ INFO ) 503* 504* Adjust the expected value of INFO to account for 505* pivoting. 506* 507 K = IZERO 508 IF( K.GT.0 ) THEN 509 130 CONTINUE 510 IF( IWORK( K ).LT.0 ) THEN 511 IF( IWORK( K ).NE.-K ) THEN 512 K = -IWORK( K ) 513 GO TO 130 514 END IF 515 ELSE IF( IWORK( K ).NE.K ) THEN 516 K = IWORK( K ) 517 GO TO 130 518 END IF 519 END IF 520* 521* Check the error code from SSPSVX. 522* 523 IF( INFO.NE.K ) THEN 524 CALL ALAERH( PATH, 'SSPSVX', INFO, K, FACT // UPLO, 525 $ N, N, -1, -1, NRHS, IMAT, NFAIL, 526 $ NERRS, NOUT ) 527 GO TO 150 528 END IF 529* 530 IF( INFO.EQ.0 ) THEN 531 IF( IFACT.GE.2 ) THEN 532* 533* Reconstruct matrix from factors and compute 534* residual. 535* 536 CALL SSPT01( UPLO, N, A, AFAC, IWORK, AINV, LDA, 537 $ RWORK( 2*NRHS+1 ), RESULT( 1 ) ) 538 K1 = 1 539 ELSE 540 K1 = 2 541 END IF 542* 543* Compute residual of the computed solution. 544* 545 CALL SLACPY( 'Full', N, NRHS, B, LDA, WORK, LDA ) 546 CALL SPPT02( UPLO, N, NRHS, A, X, LDA, WORK, LDA, 547 $ RWORK( 2*NRHS+1 ), RESULT( 2 ) ) 548* 549* Check solution from generated exact solution. 550* 551 CALL SGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC, 552 $ RESULT( 3 ) ) 553* 554* Check the error bounds from iterative refinement. 555* 556 CALL SPPT05( UPLO, N, NRHS, A, B, LDA, X, LDA, 557 $ XACT, LDA, RWORK, RWORK( NRHS+1 ), 558 $ RESULT( 4 ) ) 559 ELSE 560 K1 = 6 561 END IF 562* 563* Compare RCOND from SSPSVX with the computed value 564* in RCONDC. 565* 566 RESULT( 6 ) = SGET06( RCOND, RCONDC ) 567* 568* Print information about the tests that did not pass 569* the threshold. 570* 571 DO 140 K = K1, 6 572 IF( RESULT( K ).GE.THRESH ) THEN 573 IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 ) 574 $ CALL ALADHD( NOUT, PATH ) 575 WRITE( NOUT, FMT = 9998 )'SSPSVX', FACT, UPLO, 576 $ N, IMAT, K, RESULT( K ) 577 NFAIL = NFAIL + 1 578 END IF 579 140 CONTINUE 580 NRUN = NRUN + 7 - K1 581* 582 150 CONTINUE 583* 584 160 CONTINUE 585 170 CONTINUE 586 180 CONTINUE 587* 588* Print a summary of the results. 589* 590 CALL ALASVM( PATH, NOUT, NFAIL, NRUN, NERRS ) 591* 592 9999 FORMAT( 1X, A, ', UPLO=''', A1, ''', N =', I5, ', type ', I2, 593 $ ', test ', I2, ', ratio =', G12.5 ) 594 9998 FORMAT( 1X, A, ', FACT=''', A1, ''', UPLO=''', A1, ''', N =', I5, 595 $ ', type ', I2, ', test ', I2, ', ratio =', G12.5 ) 596 RETURN 597* 598* End of SDRVSP 599* 600 END 601