1*> \brief \b DLATB4 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 DLATB4( 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* DOUBLE PRECISION ANORM, CNDNUM 19* .. 20* 21* 22*> \par Purpose: 23* ============= 24*> 25*> \verbatim 26*> 27*> DLATB4 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 DOUBLE PRECISION 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 DOUBLE PRECISION 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*> \ingroup double_lin 116* 117* ===================================================================== 118 SUBROUTINE DLATB4( PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE, 119 $ CNDNUM, DIST ) 120* 121* -- LAPACK test routine -- 122* -- LAPACK is a software package provided by Univ. of Tennessee, -- 123* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 124* 125* .. Scalar Arguments .. 126 CHARACTER DIST, TYPE 127 CHARACTER*3 PATH 128 INTEGER IMAT, KL, KU, M, MODE, N 129 DOUBLE PRECISION ANORM, CNDNUM 130* .. 131* 132* ===================================================================== 133* 134* .. Parameters .. 135 DOUBLE PRECISION SHRINK, TENTH 136 PARAMETER ( SHRINK = 0.25D0, TENTH = 0.1D+0 ) 137 DOUBLE PRECISION ONE 138 PARAMETER ( ONE = 1.0D+0 ) 139 DOUBLE PRECISION TWO 140 PARAMETER ( TWO = 2.0D+0 ) 141* .. 142* .. Local Scalars .. 143 LOGICAL FIRST 144 CHARACTER*2 C2 145 INTEGER MAT 146 DOUBLE PRECISION BADC1, BADC2, EPS, LARGE, SMALL 147* .. 148* .. External Functions .. 149 LOGICAL LSAMEN 150 DOUBLE PRECISION DLAMCH 151 EXTERNAL LSAMEN, DLAMCH 152* .. 153* .. Intrinsic Functions .. 154 INTRINSIC ABS, MAX, SQRT 155* .. 156* .. External Subroutines .. 157 EXTERNAL DLABAD 158* .. 159* .. Save statement .. 160 SAVE EPS, SMALL, LARGE, BADC1, BADC2, FIRST 161* .. 162* .. Data statements .. 163 DATA FIRST / .TRUE. / 164* .. 165* .. Executable Statements .. 166* 167* Set some constants for use in the subroutine. 168* 169 IF( FIRST ) THEN 170 FIRST = .FALSE. 171 EPS = DLAMCH( 'Precision' ) 172 BADC2 = TENTH / EPS 173 BADC1 = SQRT( BADC2 ) 174 SMALL = DLAMCH( 'Safe minimum' ) 175 LARGE = ONE / SMALL 176* 177* If it looks like we're on a Cray, take the square root of 178* SMALL and LARGE to avoid overflow and underflow problems. 179* 180 CALL DLABAD( SMALL, LARGE ) 181 SMALL = SHRINK*( SMALL / EPS ) 182 LARGE = ONE / SMALL 183 END IF 184* 185 C2 = PATH( 2: 3 ) 186* 187* Set some parameters we don't plan to change. 188* 189 DIST = 'S' 190 MODE = 3 191* 192 IF( LSAMEN( 2, C2, 'QR' ) .OR. LSAMEN( 2, C2, 'LQ' ) .OR. 193 $ LSAMEN( 2, C2, 'QL' ) .OR. LSAMEN( 2, C2, 'RQ' ) ) THEN 194* 195* xQR, xLQ, xQL, xRQ: Set parameters to generate a general 196* M x N matrix. 197* 198* Set TYPE, the type of matrix to be generated. 199* 200 TYPE = 'N' 201* 202* Set the lower and upper bandwidths. 203* 204 IF( IMAT.EQ.1 ) THEN 205 KL = 0 206 KU = 0 207 ELSE IF( IMAT.EQ.2 ) THEN 208 KL = 0 209 KU = MAX( N-1, 0 ) 210 ELSE IF( IMAT.EQ.3 ) THEN 211 KL = MAX( M-1, 0 ) 212 KU = 0 213 ELSE 214 KL = MAX( M-1, 0 ) 215 KU = MAX( N-1, 0 ) 216 END IF 217* 218* Set the condition number and norm. 219* 220 IF( IMAT.EQ.5 ) THEN 221 CNDNUM = BADC1 222 ELSE IF( IMAT.EQ.6 ) THEN 223 CNDNUM = BADC2 224 ELSE 225 CNDNUM = TWO 226 END IF 227* 228 IF( IMAT.EQ.7 ) THEN 229 ANORM = SMALL 230 ELSE IF( IMAT.EQ.8 ) THEN 231 ANORM = LARGE 232 ELSE 233 ANORM = ONE 234 END IF 235* 236 ELSE IF( LSAMEN( 2, C2, 'GE' ) ) THEN 237* 238* xGE: Set parameters to generate a general M x N matrix. 239* 240* Set TYPE, the type of matrix to be generated. 241* 242 TYPE = 'N' 243* 244* Set the lower and upper bandwidths. 245* 246 IF( IMAT.EQ.1 ) THEN 247 KL = 0 248 KU = 0 249 ELSE IF( IMAT.EQ.2 ) THEN 250 KL = 0 251 KU = MAX( N-1, 0 ) 252 ELSE IF( IMAT.EQ.3 ) THEN 253 KL = MAX( M-1, 0 ) 254 KU = 0 255 ELSE 256 KL = MAX( M-1, 0 ) 257 KU = MAX( N-1, 0 ) 258 END IF 259* 260* Set the condition number and norm. 261* 262 IF( IMAT.EQ.8 ) THEN 263 CNDNUM = BADC1 264 ELSE IF( IMAT.EQ.9 ) THEN 265 CNDNUM = BADC2 266 ELSE 267 CNDNUM = TWO 268 END IF 269* 270 IF( IMAT.EQ.10 ) THEN 271 ANORM = SMALL 272 ELSE IF( IMAT.EQ.11 ) THEN 273 ANORM = LARGE 274 ELSE 275 ANORM = ONE 276 END IF 277* 278 ELSE IF( LSAMEN( 2, C2, 'GB' ) ) THEN 279* 280* xGB: Set parameters to generate a general banded matrix. 281* 282* Set TYPE, the type of matrix to be generated. 283* 284 TYPE = 'N' 285* 286* Set the condition number and norm. 287* 288 IF( IMAT.EQ.5 ) THEN 289 CNDNUM = BADC1 290 ELSE IF( IMAT.EQ.6 ) THEN 291 CNDNUM = TENTH*BADC2 292 ELSE 293 CNDNUM = TWO 294 END IF 295* 296 IF( IMAT.EQ.7 ) THEN 297 ANORM = SMALL 298 ELSE IF( IMAT.EQ.8 ) THEN 299 ANORM = LARGE 300 ELSE 301 ANORM = ONE 302 END IF 303* 304 ELSE IF( LSAMEN( 2, C2, 'GT' ) ) THEN 305* 306* xGT: Set parameters to generate a general tridiagonal matrix. 307* 308* Set TYPE, the type of matrix to be generated. 309* 310 TYPE = 'N' 311* 312* Set the lower and upper bandwidths. 313* 314 IF( IMAT.EQ.1 ) THEN 315 KL = 0 316 ELSE 317 KL = 1 318 END IF 319 KU = KL 320* 321* Set the condition number and norm. 322* 323 IF( IMAT.EQ.3 ) THEN 324 CNDNUM = BADC1 325 ELSE IF( IMAT.EQ.4 ) THEN 326 CNDNUM = BADC2 327 ELSE 328 CNDNUM = TWO 329 END IF 330* 331 IF( IMAT.EQ.5 .OR. IMAT.EQ.11 ) THEN 332 ANORM = SMALL 333 ELSE IF( IMAT.EQ.6 .OR. IMAT.EQ.12 ) THEN 334 ANORM = LARGE 335 ELSE 336 ANORM = ONE 337 END IF 338* 339 ELSE IF( LSAMEN( 2, C2, 'PO' ) .OR. LSAMEN( 2, C2, 'PP' ) ) THEN 340* 341* xPO, xPP: Set parameters to generate a 342* symmetric positive definite matrix. 343* 344* Set TYPE, the type of matrix to be generated. 345* 346 TYPE = C2( 1: 1 ) 347* 348* Set the lower and upper bandwidths. 349* 350 IF( IMAT.EQ.1 ) THEN 351 KL = 0 352 ELSE 353 KL = MAX( N-1, 0 ) 354 END IF 355 KU = KL 356* 357* Set the condition number and norm. 358* 359 IF( IMAT.EQ.6 ) THEN 360 CNDNUM = BADC1 361 ELSE IF( IMAT.EQ.7 ) THEN 362 CNDNUM = BADC2 363 ELSE 364 CNDNUM = TWO 365 END IF 366* 367 IF( IMAT.EQ.8 ) THEN 368 ANORM = SMALL 369 ELSE IF( IMAT.EQ.9 ) THEN 370 ANORM = LARGE 371 ELSE 372 ANORM = ONE 373 END IF 374* 375* 376 ELSE IF( LSAMEN( 2, C2, 'SY' ) .OR. LSAMEN( 2, C2, 'SP' ) ) THEN 377* 378* xSY, xSP: Set parameters to generate a 379* symmetric matrix. 380* 381* Set TYPE, the type of matrix to be generated. 382* 383 TYPE = C2( 1: 1 ) 384* 385* Set the lower and upper bandwidths. 386* 387 IF( IMAT.EQ.1 ) THEN 388 KL = 0 389 ELSE 390 KL = MAX( N-1, 0 ) 391 END IF 392 KU = KL 393* 394* Set the condition number and norm. 395* 396 IF( IMAT.EQ.7 ) THEN 397 CNDNUM = BADC1 398 ELSE IF( IMAT.EQ.8 ) THEN 399 CNDNUM = BADC2 400 ELSE 401 CNDNUM = TWO 402 END IF 403* 404 IF( IMAT.EQ.9 ) THEN 405 ANORM = SMALL 406 ELSE IF( IMAT.EQ.10 ) THEN 407 ANORM = LARGE 408 ELSE 409 ANORM = ONE 410 END IF 411* 412 ELSE IF( LSAMEN( 2, C2, 'PB' ) ) THEN 413* 414* xPB: Set parameters to generate a symmetric band matrix. 415* 416* Set TYPE, the type of matrix to be generated. 417* 418 TYPE = 'P' 419* 420* Set the norm and condition number. 421* 422 IF( IMAT.EQ.5 ) THEN 423 CNDNUM = BADC1 424 ELSE IF( IMAT.EQ.6 ) THEN 425 CNDNUM = BADC2 426 ELSE 427 CNDNUM = TWO 428 END IF 429* 430 IF( IMAT.EQ.7 ) THEN 431 ANORM = SMALL 432 ELSE IF( IMAT.EQ.8 ) THEN 433 ANORM = LARGE 434 ELSE 435 ANORM = ONE 436 END IF 437* 438 ELSE IF( LSAMEN( 2, C2, 'PT' ) ) THEN 439* 440* xPT: Set parameters to generate a symmetric positive definite 441* tridiagonal matrix. 442* 443 TYPE = 'P' 444 IF( IMAT.EQ.1 ) THEN 445 KL = 0 446 ELSE 447 KL = 1 448 END IF 449 KU = KL 450* 451* Set the condition number and norm. 452* 453 IF( IMAT.EQ.3 ) THEN 454 CNDNUM = BADC1 455 ELSE IF( IMAT.EQ.4 ) THEN 456 CNDNUM = BADC2 457 ELSE 458 CNDNUM = TWO 459 END IF 460* 461 IF( IMAT.EQ.5 .OR. IMAT.EQ.11 ) THEN 462 ANORM = SMALL 463 ELSE IF( IMAT.EQ.6 .OR. IMAT.EQ.12 ) THEN 464 ANORM = LARGE 465 ELSE 466 ANORM = ONE 467 END IF 468* 469 ELSE IF( LSAMEN( 2, C2, 'TR' ) .OR. LSAMEN( 2, C2, 'TP' ) ) THEN 470* 471* xTR, xTP: Set parameters to generate a triangular matrix 472* 473* Set TYPE, the type of matrix to be generated. 474* 475 TYPE = 'N' 476* 477* Set the lower and upper bandwidths. 478* 479 MAT = ABS( IMAT ) 480 IF( MAT.EQ.1 .OR. MAT.EQ.7 ) THEN 481 KL = 0 482 KU = 0 483 ELSE IF( IMAT.LT.0 ) THEN 484 KL = MAX( N-1, 0 ) 485 KU = 0 486 ELSE 487 KL = 0 488 KU = MAX( N-1, 0 ) 489 END IF 490* 491* Set the condition number and norm. 492* 493 IF( MAT.EQ.3 .OR. MAT.EQ.9 ) THEN 494 CNDNUM = BADC1 495 ELSE IF( MAT.EQ.4 ) THEN 496 CNDNUM = BADC2 497 ELSE IF( MAT.EQ.10 ) THEN 498 CNDNUM = BADC2 499 ELSE 500 CNDNUM = TWO 501 END IF 502* 503 IF( MAT.EQ.5 ) THEN 504 ANORM = SMALL 505 ELSE IF( MAT.EQ.6 ) THEN 506 ANORM = LARGE 507 ELSE 508 ANORM = ONE 509 END IF 510* 511 ELSE IF( LSAMEN( 2, C2, 'TB' ) ) THEN 512* 513* xTB: Set parameters to generate a triangular band matrix. 514* 515* Set TYPE, the type of matrix to be generated. 516* 517 TYPE = 'N' 518* 519* Set the norm and condition number. 520* 521 IF( IMAT.EQ.2 .OR. IMAT.EQ.8 ) THEN 522 CNDNUM = BADC1 523 ELSE IF( IMAT.EQ.3 .OR. IMAT.EQ.9 ) THEN 524 CNDNUM = BADC2 525 ELSE 526 CNDNUM = TWO 527 END IF 528* 529 IF( IMAT.EQ.4 ) THEN 530 ANORM = SMALL 531 ELSE IF( IMAT.EQ.5 ) THEN 532 ANORM = LARGE 533 ELSE 534 ANORM = ONE 535 END IF 536 END IF 537 IF( N.LE.1 ) 538 $ CNDNUM = ONE 539* 540 RETURN 541* 542* End of DLATB4 543* 544 END 545