1*> \brief \b SLATB4 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 SLATB4( PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE, 12* CNDNUM, DIST ) 13* 14* .. Scalar Arguments .. 15* CHARACTER DIST, TYPE 16* CHARACTER*3 PATH 17* INTEGER IMAT, KL, KU, M, MODE, N 18* REAL ANORM, CNDNUM 19* .. 20* 21* 22*> \par Purpose: 23* ============= 24*> 25*> \verbatim 26*> 27*> SLATB4 sets parameters for the matrix generator based on the type of 28*> matrix to be generated. 29*> \endverbatim 30* 31* Arguments: 32* ========== 33* 34*> \param[in] PATH 35*> \verbatim 36*> PATH is CHARACTER*3 37*> The LAPACK path name. 38*> \endverbatim 39*> 40*> \param[in] IMAT 41*> \verbatim 42*> IMAT is INTEGER 43*> An integer key describing which matrix to generate for this 44*> path. 45*> \endverbatim 46*> 47*> \param[in] M 48*> \verbatim 49*> M is INTEGER 50*> The number of rows in the matrix to be generated. 51*> \endverbatim 52*> 53*> \param[in] N 54*> \verbatim 55*> N is INTEGER 56*> The number of columns in the matrix to be generated. 57*> \endverbatim 58*> 59*> \param[out] TYPE 60*> \verbatim 61*> TYPE is CHARACTER*1 62*> The type of the matrix to be generated: 63*> = 'S': symmetric matrix 64*> = 'P': symmetric positive (semi)definite matrix 65*> = 'N': nonsymmetric matrix 66*> \endverbatim 67*> 68*> \param[out] KL 69*> \verbatim 70*> KL is INTEGER 71*> The lower band width of the matrix to be generated. 72*> \endverbatim 73*> 74*> \param[out] KU 75*> \verbatim 76*> KU is INTEGER 77*> The upper band width of the matrix to be generated. 78*> \endverbatim 79*> 80*> \param[out] ANORM 81*> \verbatim 82*> ANORM is REAL 83*> The desired norm of the matrix to be generated. The diagonal 84*> matrix of singular values or eigenvalues is scaled by this 85*> value. 86*> \endverbatim 87*> 88*> \param[out] MODE 89*> \verbatim 90*> MODE is INTEGER 91*> A key indicating how to choose the vector of eigenvalues. 92*> \endverbatim 93*> 94*> \param[out] CNDNUM 95*> \verbatim 96*> CNDNUM is REAL 97*> The desired condition number. 98*> \endverbatim 99*> 100*> \param[out] DIST 101*> \verbatim 102*> DIST is CHARACTER*1 103*> The type of distribution to be used by the random number 104*> generator. 105*> \endverbatim 106* 107* Authors: 108* ======== 109* 110*> \author Univ. of Tennessee 111*> \author Univ. of California Berkeley 112*> \author Univ. of Colorado Denver 113*> \author NAG Ltd. 114* 115*> \date November 2011 116* 117*> \ingroup single_lin 118* 119* ===================================================================== 120 SUBROUTINE SLATB4( PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE, 121 $ CNDNUM, DIST ) 122* 123* -- LAPACK test routine (version 3.4.0) -- 124* -- LAPACK is a software package provided by Univ. of Tennessee, -- 125* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 126* November 2011 127* 128* .. Scalar Arguments .. 129 CHARACTER DIST, TYPE 130 CHARACTER*3 PATH 131 INTEGER IMAT, KL, KU, M, MODE, N 132 REAL ANORM, CNDNUM 133* .. 134* 135* ===================================================================== 136* 137* .. Parameters .. 138 REAL SHRINK, TENTH 139 PARAMETER ( SHRINK = 0.25E0, TENTH = 0.1E+0 ) 140 REAL ONE 141 PARAMETER ( ONE = 1.0E+0 ) 142 REAL TWO 143 PARAMETER ( TWO = 2.0E+0 ) 144* .. 145* .. Local Scalars .. 146 LOGICAL FIRST 147 CHARACTER*2 C2 148 INTEGER MAT 149 REAL BADC1, BADC2, EPS, LARGE, SMALL 150* .. 151* .. External Functions .. 152 LOGICAL LSAMEN 153 REAL SLAMCH 154 EXTERNAL LSAMEN, SLAMCH 155* .. 156* .. Intrinsic Functions .. 157 INTRINSIC ABS, MAX, SQRT 158* .. 159* .. External Subroutines .. 160 EXTERNAL SLABAD 161* .. 162* .. Save statement .. 163 SAVE EPS, SMALL, LARGE, BADC1, BADC2, FIRST 164* .. 165* .. Data statements .. 166 DATA FIRST / .TRUE. / 167* .. 168* .. Executable Statements .. 169* 170* Set some constants for use in the subroutine. 171* 172 IF( FIRST ) THEN 173 FIRST = .FALSE. 174 EPS = SLAMCH( 'Precision' ) 175 BADC2 = TENTH / EPS 176 BADC1 = SQRT( BADC2 ) 177 SMALL = SLAMCH( 'Safe minimum' ) 178 LARGE = ONE / SMALL 179* 180* If it looks like we're on a Cray, take the square root of 181* SMALL and LARGE to avoid overflow and underflow problems. 182* 183 CALL SLABAD( SMALL, LARGE ) 184 SMALL = SHRINK*( SMALL / EPS ) 185 LARGE = ONE / SMALL 186 END IF 187* 188 C2 = PATH( 2: 3 ) 189* 190* Set some parameters we don't plan to change. 191* 192 DIST = 'S' 193 MODE = 3 194* 195 IF( LSAMEN( 2, C2, 'QR' ) .OR. LSAMEN( 2, C2, 'LQ' ) .OR. 196 $ LSAMEN( 2, C2, 'QL' ) .OR. LSAMEN( 2, C2, 'RQ' ) ) THEN 197* 198* xQR, xLQ, xQL, xRQ: Set parameters to generate a general 199* M x N matrix. 200* 201* Set TYPE, the type of matrix to be generated. 202* 203 TYPE = 'N' 204* 205* Set the lower and upper bandwidths. 206* 207 IF( IMAT.EQ.1 ) THEN 208 KL = 0 209 KU = 0 210 ELSE IF( IMAT.EQ.2 ) THEN 211 KL = 0 212 KU = MAX( N-1, 0 ) 213 ELSE IF( IMAT.EQ.3 ) THEN 214 KL = MAX( M-1, 0 ) 215 KU = 0 216 ELSE 217 KL = MAX( M-1, 0 ) 218 KU = MAX( N-1, 0 ) 219 END IF 220* 221* Set the condition number and norm. 222* 223 IF( IMAT.EQ.5 ) THEN 224 CNDNUM = BADC1 225 ELSE IF( IMAT.EQ.6 ) THEN 226 CNDNUM = BADC2 227 ELSE 228 CNDNUM = TWO 229 END IF 230* 231 IF( IMAT.EQ.7 ) THEN 232 ANORM = SMALL 233 ELSE IF( IMAT.EQ.8 ) THEN 234 ANORM = LARGE 235 ELSE 236 ANORM = ONE 237 END IF 238* 239 ELSE IF( LSAMEN( 2, C2, 'GE' ) ) THEN 240* 241* xGE: Set parameters to generate a general M x N matrix. 242* 243* Set TYPE, the type of matrix to be generated. 244* 245 TYPE = 'N' 246* 247* Set the lower and upper bandwidths. 248* 249 IF( IMAT.EQ.1 ) THEN 250 KL = 0 251 KU = 0 252 ELSE IF( IMAT.EQ.2 ) THEN 253 KL = 0 254 KU = MAX( N-1, 0 ) 255 ELSE IF( IMAT.EQ.3 ) THEN 256 KL = MAX( M-1, 0 ) 257 KU = 0 258 ELSE 259 KL = MAX( M-1, 0 ) 260 KU = MAX( N-1, 0 ) 261 END IF 262* 263* Set the condition number and norm. 264* 265 IF( IMAT.EQ.8 ) THEN 266 CNDNUM = BADC1 267 ELSE IF( IMAT.EQ.9 ) THEN 268 CNDNUM = BADC2 269 ELSE 270 CNDNUM = TWO 271 END IF 272* 273 IF( IMAT.EQ.10 ) THEN 274 ANORM = SMALL 275 ELSE IF( IMAT.EQ.11 ) THEN 276 ANORM = LARGE 277 ELSE 278 ANORM = ONE 279 END IF 280* 281 ELSE IF( LSAMEN( 2, C2, 'GB' ) ) THEN 282* 283* xGB: Set parameters to generate a general banded matrix. 284* 285* Set TYPE, the type of matrix to be generated. 286* 287 TYPE = 'N' 288* 289* Set the condition number and norm. 290* 291 IF( IMAT.EQ.5 ) THEN 292 CNDNUM = BADC1 293 ELSE IF( IMAT.EQ.6 ) THEN 294 CNDNUM = TENTH*BADC2 295 ELSE 296 CNDNUM = TWO 297 END IF 298* 299 IF( IMAT.EQ.7 ) THEN 300 ANORM = SMALL 301 ELSE IF( IMAT.EQ.8 ) THEN 302 ANORM = LARGE 303 ELSE 304 ANORM = ONE 305 END IF 306* 307 ELSE IF( LSAMEN( 2, C2, 'GT' ) ) THEN 308* 309* xGT: Set parameters to generate a general tridiagonal matrix. 310* 311* Set TYPE, the type of matrix to be generated. 312* 313 TYPE = 'N' 314* 315* Set the lower and upper bandwidths. 316* 317 IF( IMAT.EQ.1 ) THEN 318 KL = 0 319 ELSE 320 KL = 1 321 END IF 322 KU = KL 323* 324* Set the condition number and norm. 325* 326 IF( IMAT.EQ.3 ) THEN 327 CNDNUM = BADC1 328 ELSE IF( IMAT.EQ.4 ) THEN 329 CNDNUM = BADC2 330 ELSE 331 CNDNUM = TWO 332 END IF 333* 334 IF( IMAT.EQ.5 .OR. IMAT.EQ.11 ) THEN 335 ANORM = SMALL 336 ELSE IF( IMAT.EQ.6 .OR. IMAT.EQ.12 ) THEN 337 ANORM = LARGE 338 ELSE 339 ANORM = ONE 340 END IF 341* 342 ELSE IF( LSAMEN( 2, C2, 'PO' ) .OR. LSAMEN( 2, C2, 'PP' ) .OR. 343 $ LSAMEN( 2, C2, 'SY' ) .OR. LSAMEN( 2, C2, 'SP' ) ) THEN 344* 345* xPO, xPP, xSY, xSP: Set parameters to generate a 346* symmetric matrix. 347* 348* Set TYPE, the type of matrix to be generated. 349* 350 TYPE = C2( 1: 1 ) 351* 352* Set the lower and upper bandwidths. 353* 354 IF( IMAT.EQ.1 ) THEN 355 KL = 0 356 ELSE 357 KL = MAX( N-1, 0 ) 358 END IF 359 KU = KL 360* 361* Set the condition number and norm. 362* 363 IF( IMAT.EQ.6 ) THEN 364 CNDNUM = BADC1 365 ELSE IF( IMAT.EQ.7 ) THEN 366 CNDNUM = BADC2 367 ELSE 368 CNDNUM = TWO 369 END IF 370* 371 IF( IMAT.EQ.8 ) THEN 372 ANORM = SMALL 373 ELSE IF( IMAT.EQ.9 ) THEN 374 ANORM = LARGE 375 ELSE 376 ANORM = ONE 377 END IF 378* 379 ELSE IF( LSAMEN( 2, C2, 'PB' ) ) THEN 380* 381* xPB: Set parameters to generate a symmetric band matrix. 382* 383* Set TYPE, the type of matrix to be generated. 384* 385 TYPE = 'P' 386* 387* Set the norm and condition number. 388* 389 IF( IMAT.EQ.5 ) THEN 390 CNDNUM = BADC1 391 ELSE IF( IMAT.EQ.6 ) THEN 392 CNDNUM = BADC2 393 ELSE 394 CNDNUM = TWO 395 END IF 396* 397 IF( IMAT.EQ.7 ) THEN 398 ANORM = SMALL 399 ELSE IF( IMAT.EQ.8 ) THEN 400 ANORM = LARGE 401 ELSE 402 ANORM = ONE 403 END IF 404* 405 ELSE IF( LSAMEN( 2, C2, 'PT' ) ) THEN 406* 407* xPT: Set parameters to generate a symmetric positive definite 408* tridiagonal matrix. 409* 410 TYPE = 'P' 411 IF( IMAT.EQ.1 ) THEN 412 KL = 0 413 ELSE 414 KL = 1 415 END IF 416 KU = KL 417* 418* Set the condition number and norm. 419* 420 IF( IMAT.EQ.3 ) THEN 421 CNDNUM = BADC1 422 ELSE IF( IMAT.EQ.4 ) THEN 423 CNDNUM = BADC2 424 ELSE 425 CNDNUM = TWO 426 END IF 427* 428 IF( IMAT.EQ.5 .OR. IMAT.EQ.11 ) THEN 429 ANORM = SMALL 430 ELSE IF( IMAT.EQ.6 .OR. IMAT.EQ.12 ) THEN 431 ANORM = LARGE 432 ELSE 433 ANORM = ONE 434 END IF 435* 436 ELSE IF( LSAMEN( 2, C2, 'TR' ) .OR. LSAMEN( 2, C2, 'TP' ) ) THEN 437* 438* xTR, xTP: Set parameters to generate a triangular matrix 439* 440* Set TYPE, the type of matrix to be generated. 441* 442 TYPE = 'N' 443* 444* Set the lower and upper bandwidths. 445* 446 MAT = ABS( IMAT ) 447 IF( MAT.EQ.1 .OR. MAT.EQ.7 ) THEN 448 KL = 0 449 KU = 0 450 ELSE IF( IMAT.LT.0 ) THEN 451 KL = MAX( N-1, 0 ) 452 KU = 0 453 ELSE 454 KL = 0 455 KU = MAX( N-1, 0 ) 456 END IF 457* 458* Set the condition number and norm. 459* 460 IF( MAT.EQ.3 .OR. MAT.EQ.9 ) THEN 461 CNDNUM = BADC1 462 ELSE IF( MAT.EQ.4 ) THEN 463 CNDNUM = BADC2 464 ELSE IF( MAT.EQ.10 ) THEN 465 CNDNUM = BADC2 466 ELSE 467 CNDNUM = TWO 468 END IF 469* 470 IF( MAT.EQ.5 ) THEN 471 ANORM = SMALL 472 ELSE IF( MAT.EQ.6 ) THEN 473 ANORM = LARGE 474 ELSE 475 ANORM = ONE 476 END IF 477* 478 ELSE IF( LSAMEN( 2, C2, 'TB' ) ) THEN 479* 480* xTB: Set parameters to generate a triangular band matrix. 481* 482* Set TYPE, the type of matrix to be generated. 483* 484 TYPE = 'N' 485* 486* Set the norm and condition number. 487* 488 IF( IMAT.EQ.2 .OR. IMAT.EQ.8 ) THEN 489 CNDNUM = BADC1 490 ELSE IF( IMAT.EQ.3 .OR. IMAT.EQ.9 ) THEN 491 CNDNUM = BADC2 492 ELSE 493 CNDNUM = TWO 494 END IF 495* 496 IF( IMAT.EQ.4 ) THEN 497 ANORM = SMALL 498 ELSE IF( IMAT.EQ.5 ) THEN 499 ANORM = LARGE 500 ELSE 501 ANORM = ONE 502 END IF 503 END IF 504 IF( N.LE.1 ) 505 $ CNDNUM = ONE 506* 507 RETURN 508* 509* End of SLATB4 510* 511 END 512