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*> \date December 2016 116* 117*> \ingroup double_lin 118* 119* ===================================================================== 120 SUBROUTINE DLATB4( PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE, 121 $ CNDNUM, DIST ) 122* 123* -- LAPACK test routine (version 3.7.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* December 2016 127* 128* .. Scalar Arguments .. 129 CHARACTER DIST, TYPE 130 CHARACTER*3 PATH 131 INTEGER IMAT, KL, KU, M, MODE, N 132 DOUBLE PRECISION ANORM, CNDNUM 133* .. 134* 135* ===================================================================== 136* 137* .. Parameters .. 138 DOUBLE PRECISION SHRINK, TENTH 139 PARAMETER ( SHRINK = 0.25D0, TENTH = 0.1D+0 ) 140 DOUBLE PRECISION ONE 141 PARAMETER ( ONE = 1.0D+0 ) 142 DOUBLE PRECISION TWO 143 PARAMETER ( TWO = 2.0D+0 ) 144* .. 145* .. Local Scalars .. 146 LOGICAL FIRST 147 CHARACTER*2 C2 148 INTEGER MAT 149 DOUBLE PRECISION BADC1, BADC2, EPS, LARGE, SMALL 150* .. 151* .. External Functions .. 152 LOGICAL LSAMEN 153 DOUBLE PRECISION DLAMCH 154 EXTERNAL LSAMEN, DLAMCH 155* .. 156* .. Intrinsic Functions .. 157 INTRINSIC ABS, MAX, SQRT 158* .. 159* .. External Subroutines .. 160 EXTERNAL DLABAD 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 = DLAMCH( 'Precision' ) 175 BADC2 = TENTH / EPS 176 BADC1 = SQRT( BADC2 ) 177 SMALL = DLAMCH( '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 DLABAD( 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' ) ) THEN 343* 344* xPO, xPP: Set parameters to generate a 345* symmetric positive definite matrix. 346* 347* Set TYPE, the type of matrix to be generated. 348* 349 TYPE = C2( 1: 1 ) 350* 351* Set the lower and upper bandwidths. 352* 353 IF( IMAT.EQ.1 ) THEN 354 KL = 0 355 ELSE 356 KL = MAX( N-1, 0 ) 357 END IF 358 KU = KL 359* 360* Set the condition number and norm. 361* 362 IF( IMAT.EQ.6 ) THEN 363 CNDNUM = BADC1 364 ELSE IF( IMAT.EQ.7 ) THEN 365 CNDNUM = BADC2 366 ELSE 367 CNDNUM = TWO 368 END IF 369* 370 IF( IMAT.EQ.8 ) THEN 371 ANORM = SMALL 372 ELSE IF( IMAT.EQ.9 ) THEN 373 ANORM = LARGE 374 ELSE 375 ANORM = ONE 376 END IF 377* 378* 379 ELSE IF( LSAMEN( 2, C2, 'SY' ) .OR. LSAMEN( 2, C2, 'SP' ) ) THEN 380* 381* xSY, xSP: Set parameters to generate a 382* symmetric matrix. 383* 384* Set TYPE, the type of matrix to be generated. 385* 386 TYPE = C2( 1: 1 ) 387* 388* Set the lower and upper bandwidths. 389* 390 IF( IMAT.EQ.1 ) THEN 391 KL = 0 392 ELSE 393 KL = MAX( N-1, 0 ) 394 END IF 395 KU = KL 396* 397* Set the condition number and norm. 398* 399 IF( IMAT.EQ.7 ) THEN 400 CNDNUM = BADC1 401 ELSE IF( IMAT.EQ.8 ) THEN 402 CNDNUM = BADC2 403 ELSE 404 CNDNUM = TWO 405 END IF 406* 407 IF( IMAT.EQ.9 ) THEN 408 ANORM = SMALL 409 ELSE IF( IMAT.EQ.10 ) THEN 410 ANORM = LARGE 411 ELSE 412 ANORM = ONE 413 END IF 414* 415 ELSE IF( LSAMEN( 2, C2, 'PB' ) ) THEN 416* 417* xPB: Set parameters to generate a symmetric band matrix. 418* 419* Set TYPE, the type of matrix to be generated. 420* 421 TYPE = 'P' 422* 423* Set the norm and condition number. 424* 425 IF( IMAT.EQ.5 ) THEN 426 CNDNUM = BADC1 427 ELSE IF( IMAT.EQ.6 ) THEN 428 CNDNUM = BADC2 429 ELSE 430 CNDNUM = TWO 431 END IF 432* 433 IF( IMAT.EQ.7 ) THEN 434 ANORM = SMALL 435 ELSE IF( IMAT.EQ.8 ) THEN 436 ANORM = LARGE 437 ELSE 438 ANORM = ONE 439 END IF 440* 441 ELSE IF( LSAMEN( 2, C2, 'PT' ) ) THEN 442* 443* xPT: Set parameters to generate a symmetric positive definite 444* tridiagonal matrix. 445* 446 TYPE = 'P' 447 IF( IMAT.EQ.1 ) THEN 448 KL = 0 449 ELSE 450 KL = 1 451 END IF 452 KU = KL 453* 454* Set the condition number and norm. 455* 456 IF( IMAT.EQ.3 ) THEN 457 CNDNUM = BADC1 458 ELSE IF( IMAT.EQ.4 ) THEN 459 CNDNUM = BADC2 460 ELSE 461 CNDNUM = TWO 462 END IF 463* 464 IF( IMAT.EQ.5 .OR. IMAT.EQ.11 ) THEN 465 ANORM = SMALL 466 ELSE IF( IMAT.EQ.6 .OR. IMAT.EQ.12 ) THEN 467 ANORM = LARGE 468 ELSE 469 ANORM = ONE 470 END IF 471* 472 ELSE IF( LSAMEN( 2, C2, 'TR' ) .OR. LSAMEN( 2, C2, 'TP' ) ) THEN 473* 474* xTR, xTP: Set parameters to generate a triangular matrix 475* 476* Set TYPE, the type of matrix to be generated. 477* 478 TYPE = 'N' 479* 480* Set the lower and upper bandwidths. 481* 482 MAT = ABS( IMAT ) 483 IF( MAT.EQ.1 .OR. MAT.EQ.7 ) THEN 484 KL = 0 485 KU = 0 486 ELSE IF( IMAT.LT.0 ) THEN 487 KL = MAX( N-1, 0 ) 488 KU = 0 489 ELSE 490 KL = 0 491 KU = MAX( N-1, 0 ) 492 END IF 493* 494* Set the condition number and norm. 495* 496 IF( MAT.EQ.3 .OR. MAT.EQ.9 ) THEN 497 CNDNUM = BADC1 498 ELSE IF( MAT.EQ.4 ) THEN 499 CNDNUM = BADC2 500 ELSE IF( MAT.EQ.10 ) THEN 501 CNDNUM = BADC2 502 ELSE 503 CNDNUM = TWO 504 END IF 505* 506 IF( MAT.EQ.5 ) THEN 507 ANORM = SMALL 508 ELSE IF( MAT.EQ.6 ) THEN 509 ANORM = LARGE 510 ELSE 511 ANORM = ONE 512 END IF 513* 514 ELSE IF( LSAMEN( 2, C2, 'TB' ) ) THEN 515* 516* xTB: Set parameters to generate a triangular band matrix. 517* 518* Set TYPE, the type of matrix to be generated. 519* 520 TYPE = 'N' 521* 522* Set the norm and condition number. 523* 524 IF( IMAT.EQ.2 .OR. IMAT.EQ.8 ) THEN 525 CNDNUM = BADC1 526 ELSE IF( IMAT.EQ.3 .OR. IMAT.EQ.9 ) THEN 527 CNDNUM = BADC2 528 ELSE 529 CNDNUM = TWO 530 END IF 531* 532 IF( IMAT.EQ.4 ) THEN 533 ANORM = SMALL 534 ELSE IF( IMAT.EQ.5 ) THEN 535 ANORM = LARGE 536 ELSE 537 ANORM = ONE 538 END IF 539 END IF 540 IF( N.LE.1 ) 541 $ CNDNUM = ONE 542* 543 RETURN 544* 545* End of DLATB4 546* 547 END 548