LAPACK 3.3.0
|
00001 SUBROUTINE DLATTR( IMAT, UPLO, TRANS, DIAG, ISEED, N, A, LDA, B, 00002 $ WORK, INFO ) 00003 * 00004 * -- LAPACK test routine (version 3.1) -- 00005 * Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. 00006 * November 2006 00007 * 00008 * .. Scalar Arguments .. 00009 CHARACTER DIAG, TRANS, UPLO 00010 INTEGER IMAT, INFO, LDA, N 00011 * .. 00012 * .. Array Arguments .. 00013 INTEGER ISEED( 4 ) 00014 DOUBLE PRECISION A( LDA, * ), B( * ), WORK( * ) 00015 * .. 00016 * 00017 * Purpose 00018 * ======= 00019 * 00020 * DLATTR generates a triangular test matrix. 00021 * IMAT and UPLO uniquely specify the properties of the test 00022 * matrix, which is returned in the array A. 00023 * 00024 * Arguments 00025 * ========= 00026 * 00027 * IMAT (input) INTEGER 00028 * An integer key describing which matrix to generate for this 00029 * path. 00030 * 00031 * UPLO (input) CHARACTER*1 00032 * Specifies whether the matrix A will be upper or lower 00033 * triangular. 00034 * = 'U': Upper triangular 00035 * = 'L': Lower triangular 00036 * 00037 * TRANS (input) CHARACTER*1 00038 * Specifies whether the matrix or its transpose will be used. 00039 * = 'N': No transpose 00040 * = 'T': Transpose 00041 * = 'C': Conjugate transpose (= Transpose) 00042 * 00043 * DIAG (output) CHARACTER*1 00044 * Specifies whether or not the matrix A is unit triangular. 00045 * = 'N': Non-unit triangular 00046 * = 'U': Unit triangular 00047 * 00048 * ISEED (input/output) INTEGER array, dimension (4) 00049 * The seed vector for the random number generator (used in 00050 * DLATMS). Modified on exit. 00051 * 00052 * N (input) INTEGER 00053 * The order of the matrix to be generated. 00054 * 00055 * A (output) DOUBLE PRECISION array, dimension (LDA,N) 00056 * The triangular matrix A. If UPLO = 'U', the leading n by n 00057 * upper triangular part of the array A contains the upper 00058 * triangular matrix, and the strictly lower triangular part of 00059 * A is not referenced. If UPLO = 'L', the leading n by n lower 00060 * triangular part of the array A contains the lower triangular 00061 * matrix, and the strictly upper triangular part of A is not 00062 * referenced. If DIAG = 'U', the diagonal elements of A are 00063 * set so that A(k,k) = k for 1 <= k <= n. 00064 * 00065 * LDA (input) INTEGER 00066 * The leading dimension of the array A. LDA >= max(1,N). 00067 * 00068 * B (output) DOUBLE PRECISION array, dimension (N) 00069 * The right hand side vector, if IMAT > 10. 00070 * 00071 * WORK (workspace) DOUBLE PRECISION array, dimension (3*N) 00072 * 00073 * INFO (output) INTEGER 00074 * = 0: successful exit 00075 * < 0: if INFO = -k, the k-th argument had an illegal value 00076 * 00077 * ===================================================================== 00078 * 00079 * .. Parameters .. 00080 DOUBLE PRECISION ONE, TWO, ZERO 00081 PARAMETER ( ONE = 1.0D+0, TWO = 2.0D+0, ZERO = 0.0D+0 ) 00082 * .. 00083 * .. Local Scalars .. 00084 LOGICAL UPPER 00085 CHARACTER DIST, TYPE 00086 CHARACTER*3 PATH 00087 INTEGER I, IY, J, JCOUNT, KL, KU, MODE 00088 DOUBLE PRECISION ANORM, BIGNUM, BNORM, BSCAL, C, CNDNUM, PLUS1, 00089 $ PLUS2, RA, RB, REXP, S, SFAC, SMLNUM, STAR1, 00090 $ TEXP, TLEFT, TSCAL, ULP, UNFL, X, Y, Z 00091 * .. 00092 * .. External Functions .. 00093 LOGICAL LSAME 00094 INTEGER IDAMAX 00095 DOUBLE PRECISION DLAMCH, DLARND 00096 EXTERNAL LSAME, IDAMAX, DLAMCH, DLARND 00097 * .. 00098 * .. External Subroutines .. 00099 EXTERNAL DCOPY, DLABAD, DLARNV, DLATB4, DLATMS, DROT, 00100 $ DROTG, DSCAL, DSWAP 00101 * .. 00102 * .. Intrinsic Functions .. 00103 INTRINSIC ABS, DBLE, MAX, SIGN, SQRT 00104 * .. 00105 * .. Executable Statements .. 00106 * 00107 PATH( 1: 1 ) = 'Double precision' 00108 PATH( 2: 3 ) = 'TR' 00109 UNFL = DLAMCH( 'Safe minimum' ) 00110 ULP = DLAMCH( 'Epsilon' )*DLAMCH( 'Base' ) 00111 SMLNUM = UNFL 00112 BIGNUM = ( ONE-ULP ) / SMLNUM 00113 CALL DLABAD( SMLNUM, BIGNUM ) 00114 IF( ( IMAT.GE.7 .AND. IMAT.LE.10 ) .OR. IMAT.EQ.18 ) THEN 00115 DIAG = 'U' 00116 ELSE 00117 DIAG = 'N' 00118 END IF 00119 INFO = 0 00120 * 00121 * Quick return if N.LE.0. 00122 * 00123 IF( N.LE.0 ) 00124 $ RETURN 00125 * 00126 * Call DLATB4 to set parameters for SLATMS. 00127 * 00128 UPPER = LSAME( UPLO, 'U' ) 00129 IF( UPPER ) THEN 00130 CALL DLATB4( PATH, IMAT, N, N, TYPE, KL, KU, ANORM, MODE, 00131 $ CNDNUM, DIST ) 00132 ELSE 00133 CALL DLATB4( PATH, -IMAT, N, N, TYPE, KL, KU, ANORM, MODE, 00134 $ CNDNUM, DIST ) 00135 END IF 00136 * 00137 * IMAT <= 6: Non-unit triangular matrix 00138 * 00139 IF( IMAT.LE.6 ) THEN 00140 CALL DLATMS( N, N, DIST, ISEED, TYPE, B, MODE, CNDNUM, ANORM, 00141 $ KL, KU, 'No packing', A, LDA, WORK, INFO ) 00142 * 00143 * IMAT > 6: Unit triangular matrix 00144 * The diagonal is deliberately set to something other than 1. 00145 * 00146 * IMAT = 7: Matrix is the identity 00147 * 00148 ELSE IF( IMAT.EQ.7 ) THEN 00149 IF( UPPER ) THEN 00150 DO 20 J = 1, N 00151 DO 10 I = 1, J - 1 00152 A( I, J ) = ZERO 00153 10 CONTINUE 00154 A( J, J ) = J 00155 20 CONTINUE 00156 ELSE 00157 DO 40 J = 1, N 00158 A( J, J ) = J 00159 DO 30 I = J + 1, N 00160 A( I, J ) = ZERO 00161 30 CONTINUE 00162 40 CONTINUE 00163 END IF 00164 * 00165 * IMAT > 7: Non-trivial unit triangular matrix 00166 * 00167 * Generate a unit triangular matrix T with condition CNDNUM by 00168 * forming a triangular matrix with known singular values and 00169 * filling in the zero entries with Givens rotations. 00170 * 00171 ELSE IF( IMAT.LE.10 ) THEN 00172 IF( UPPER ) THEN 00173 DO 60 J = 1, N 00174 DO 50 I = 1, J - 1 00175 A( I, J ) = ZERO 00176 50 CONTINUE 00177 A( J, J ) = J 00178 60 CONTINUE 00179 ELSE 00180 DO 80 J = 1, N 00181 A( J, J ) = J 00182 DO 70 I = J + 1, N 00183 A( I, J ) = ZERO 00184 70 CONTINUE 00185 80 CONTINUE 00186 END IF 00187 * 00188 * Since the trace of a unit triangular matrix is 1, the product 00189 * of its singular values must be 1. Let s = sqrt(CNDNUM), 00190 * x = sqrt(s) - 1/sqrt(s), y = sqrt(2/(n-2))*x, and z = x**2. 00191 * The following triangular matrix has singular values s, 1, 1, 00192 * ..., 1, 1/s: 00193 * 00194 * 1 y y y ... y y z 00195 * 1 0 0 ... 0 0 y 00196 * 1 0 ... 0 0 y 00197 * . ... . . . 00198 * . . . . 00199 * 1 0 y 00200 * 1 y 00201 * 1 00202 * 00203 * To fill in the zeros, we first multiply by a matrix with small 00204 * condition number of the form 00205 * 00206 * 1 0 0 0 0 ... 00207 * 1 + * 0 0 ... 00208 * 1 + 0 0 0 00209 * 1 + * 0 0 00210 * 1 + 0 0 00211 * ... 00212 * 1 + 0 00213 * 1 0 00214 * 1 00215 * 00216 * Each element marked with a '*' is formed by taking the product 00217 * of the adjacent elements marked with '+'. The '*'s can be 00218 * chosen freely, and the '+'s are chosen so that the inverse of 00219 * T will have elements of the same magnitude as T. If the *'s in 00220 * both T and inv(T) have small magnitude, T is well conditioned. 00221 * The two offdiagonals of T are stored in WORK. 00222 * 00223 * The product of these two matrices has the form 00224 * 00225 * 1 y y y y y . y y z 00226 * 1 + * 0 0 . 0 0 y 00227 * 1 + 0 0 . 0 0 y 00228 * 1 + * . . . . 00229 * 1 + . . . . 00230 * . . . . . 00231 * . . . . 00232 * 1 + y 00233 * 1 y 00234 * 1 00235 * 00236 * Now we multiply by Givens rotations, using the fact that 00237 * 00238 * [ c s ] [ 1 w ] [ -c -s ] = [ 1 -w ] 00239 * [ -s c ] [ 0 1 ] [ s -c ] [ 0 1 ] 00240 * and 00241 * [ -c -s ] [ 1 0 ] [ c s ] = [ 1 0 ] 00242 * [ s -c ] [ w 1 ] [ -s c ] [ -w 1 ] 00243 * 00244 * where c = w / sqrt(w**2+4) and s = 2 / sqrt(w**2+4). 00245 * 00246 STAR1 = 0.25D0 00247 SFAC = 0.5D0 00248 PLUS1 = SFAC 00249 DO 90 J = 1, N, 2 00250 PLUS2 = STAR1 / PLUS1 00251 WORK( J ) = PLUS1 00252 WORK( N+J ) = STAR1 00253 IF( J+1.LE.N ) THEN 00254 WORK( J+1 ) = PLUS2 00255 WORK( N+J+1 ) = ZERO 00256 PLUS1 = STAR1 / PLUS2 00257 REXP = DLARND( 2, ISEED ) 00258 STAR1 = STAR1*( SFAC**REXP ) 00259 IF( REXP.LT.ZERO ) THEN 00260 STAR1 = -SFAC**( ONE-REXP ) 00261 ELSE 00262 STAR1 = SFAC**( ONE+REXP ) 00263 END IF 00264 END IF 00265 90 CONTINUE 00266 * 00267 X = SQRT( CNDNUM ) - 1 / SQRT( CNDNUM ) 00268 IF( N.GT.2 ) THEN 00269 Y = SQRT( 2.D0 / ( N-2 ) )*X 00270 ELSE 00271 Y = ZERO 00272 END IF 00273 Z = X*X 00274 * 00275 IF( UPPER ) THEN 00276 IF( N.GT.3 ) THEN 00277 CALL DCOPY( N-3, WORK, 1, A( 2, 3 ), LDA+1 ) 00278 IF( N.GT.4 ) 00279 $ CALL DCOPY( N-4, WORK( N+1 ), 1, A( 2, 4 ), LDA+1 ) 00280 END IF 00281 DO 100 J = 2, N - 1 00282 A( 1, J ) = Y 00283 A( J, N ) = Y 00284 100 CONTINUE 00285 A( 1, N ) = Z 00286 ELSE 00287 IF( N.GT.3 ) THEN 00288 CALL DCOPY( N-3, WORK, 1, A( 3, 2 ), LDA+1 ) 00289 IF( N.GT.4 ) 00290 $ CALL DCOPY( N-4, WORK( N+1 ), 1, A( 4, 2 ), LDA+1 ) 00291 END IF 00292 DO 110 J = 2, N - 1 00293 A( J, 1 ) = Y 00294 A( N, J ) = Y 00295 110 CONTINUE 00296 A( N, 1 ) = Z 00297 END IF 00298 * 00299 * Fill in the zeros using Givens rotations. 00300 * 00301 IF( UPPER ) THEN 00302 DO 120 J = 1, N - 1 00303 RA = A( J, J+1 ) 00304 RB = 2.0D0 00305 CALL DROTG( RA, RB, C, S ) 00306 * 00307 * Multiply by [ c s; -s c] on the left. 00308 * 00309 IF( N.GT.J+1 ) 00310 $ CALL DROT( N-J-1, A( J, J+2 ), LDA, A( J+1, J+2 ), 00311 $ LDA, C, S ) 00312 * 00313 * Multiply by [-c -s; s -c] on the right. 00314 * 00315 IF( J.GT.1 ) 00316 $ CALL DROT( J-1, A( 1, J+1 ), 1, A( 1, J ), 1, -C, -S ) 00317 * 00318 * Negate A(J,J+1). 00319 * 00320 A( J, J+1 ) = -A( J, J+1 ) 00321 120 CONTINUE 00322 ELSE 00323 DO 130 J = 1, N - 1 00324 RA = A( J+1, J ) 00325 RB = 2.0D0 00326 CALL DROTG( RA, RB, C, S ) 00327 * 00328 * Multiply by [ c -s; s c] on the right. 00329 * 00330 IF( N.GT.J+1 ) 00331 $ CALL DROT( N-J-1, A( J+2, J+1 ), 1, A( J+2, J ), 1, C, 00332 $ -S ) 00333 * 00334 * Multiply by [-c s; -s -c] on the left. 00335 * 00336 IF( J.GT.1 ) 00337 $ CALL DROT( J-1, A( J, 1 ), LDA, A( J+1, 1 ), LDA, -C, 00338 $ S ) 00339 * 00340 * Negate A(J+1,J). 00341 * 00342 A( J+1, J ) = -A( J+1, J ) 00343 130 CONTINUE 00344 END IF 00345 * 00346 * IMAT > 10: Pathological test cases. These triangular matrices 00347 * are badly scaled or badly conditioned, so when used in solving a 00348 * triangular system they may cause overflow in the solution vector. 00349 * 00350 ELSE IF( IMAT.EQ.11 ) THEN 00351 * 00352 * Type 11: Generate a triangular matrix with elements between 00353 * -1 and 1. Give the diagonal norm 2 to make it well-conditioned. 00354 * Make the right hand side large so that it requires scaling. 00355 * 00356 IF( UPPER ) THEN 00357 DO 140 J = 1, N 00358 CALL DLARNV( 2, ISEED, J, A( 1, J ) ) 00359 A( J, J ) = SIGN( TWO, A( J, J ) ) 00360 140 CONTINUE 00361 ELSE 00362 DO 150 J = 1, N 00363 CALL DLARNV( 2, ISEED, N-J+1, A( J, J ) ) 00364 A( J, J ) = SIGN( TWO, A( J, J ) ) 00365 150 CONTINUE 00366 END IF 00367 * 00368 * Set the right hand side so that the largest value is BIGNUM. 00369 * 00370 CALL DLARNV( 2, ISEED, N, B ) 00371 IY = IDAMAX( N, B, 1 ) 00372 BNORM = ABS( B( IY ) ) 00373 BSCAL = BIGNUM / MAX( ONE, BNORM ) 00374 CALL DSCAL( N, BSCAL, B, 1 ) 00375 * 00376 ELSE IF( IMAT.EQ.12 ) THEN 00377 * 00378 * Type 12: Make the first diagonal element in the solve small to 00379 * cause immediate overflow when dividing by T(j,j). 00380 * In type 12, the offdiagonal elements are small (CNORM(j) < 1). 00381 * 00382 CALL DLARNV( 2, ISEED, N, B ) 00383 TSCAL = ONE / MAX( ONE, DBLE( N-1 ) ) 00384 IF( UPPER ) THEN 00385 DO 160 J = 1, N 00386 CALL DLARNV( 2, ISEED, J, A( 1, J ) ) 00387 CALL DSCAL( J-1, TSCAL, A( 1, J ), 1 ) 00388 A( J, J ) = SIGN( ONE, A( J, J ) ) 00389 160 CONTINUE 00390 A( N, N ) = SMLNUM*A( N, N ) 00391 ELSE 00392 DO 170 J = 1, N 00393 CALL DLARNV( 2, ISEED, N-J+1, A( J, J ) ) 00394 IF( N.GT.J ) 00395 $ CALL DSCAL( N-J, TSCAL, A( J+1, J ), 1 ) 00396 A( J, J ) = SIGN( ONE, A( J, J ) ) 00397 170 CONTINUE 00398 A( 1, 1 ) = SMLNUM*A( 1, 1 ) 00399 END IF 00400 * 00401 ELSE IF( IMAT.EQ.13 ) THEN 00402 * 00403 * Type 13: Make the first diagonal element in the solve small to 00404 * cause immediate overflow when dividing by T(j,j). 00405 * In type 13, the offdiagonal elements are O(1) (CNORM(j) > 1). 00406 * 00407 CALL DLARNV( 2, ISEED, N, B ) 00408 IF( UPPER ) THEN 00409 DO 180 J = 1, N 00410 CALL DLARNV( 2, ISEED, J, A( 1, J ) ) 00411 A( J, J ) = SIGN( ONE, A( J, J ) ) 00412 180 CONTINUE 00413 A( N, N ) = SMLNUM*A( N, N ) 00414 ELSE 00415 DO 190 J = 1, N 00416 CALL DLARNV( 2, ISEED, N-J+1, A( J, J ) ) 00417 A( J, J ) = SIGN( ONE, A( J, J ) ) 00418 190 CONTINUE 00419 A( 1, 1 ) = SMLNUM*A( 1, 1 ) 00420 END IF 00421 * 00422 ELSE IF( IMAT.EQ.14 ) THEN 00423 * 00424 * Type 14: T is diagonal with small numbers on the diagonal to 00425 * make the growth factor underflow, but a small right hand side 00426 * chosen so that the solution does not overflow. 00427 * 00428 IF( UPPER ) THEN 00429 JCOUNT = 1 00430 DO 210 J = N, 1, -1 00431 DO 200 I = 1, J - 1 00432 A( I, J ) = ZERO 00433 200 CONTINUE 00434 IF( JCOUNT.LE.2 ) THEN 00435 A( J, J ) = SMLNUM 00436 ELSE 00437 A( J, J ) = ONE 00438 END IF 00439 JCOUNT = JCOUNT + 1 00440 IF( JCOUNT.GT.4 ) 00441 $ JCOUNT = 1 00442 210 CONTINUE 00443 ELSE 00444 JCOUNT = 1 00445 DO 230 J = 1, N 00446 DO 220 I = J + 1, N 00447 A( I, J ) = ZERO 00448 220 CONTINUE 00449 IF( JCOUNT.LE.2 ) THEN 00450 A( J, J ) = SMLNUM 00451 ELSE 00452 A( J, J ) = ONE 00453 END IF 00454 JCOUNT = JCOUNT + 1 00455 IF( JCOUNT.GT.4 ) 00456 $ JCOUNT = 1 00457 230 CONTINUE 00458 END IF 00459 * 00460 * Set the right hand side alternately zero and small. 00461 * 00462 IF( UPPER ) THEN 00463 B( 1 ) = ZERO 00464 DO 240 I = N, 2, -2 00465 B( I ) = ZERO 00466 B( I-1 ) = SMLNUM 00467 240 CONTINUE 00468 ELSE 00469 B( N ) = ZERO 00470 DO 250 I = 1, N - 1, 2 00471 B( I ) = ZERO 00472 B( I+1 ) = SMLNUM 00473 250 CONTINUE 00474 END IF 00475 * 00476 ELSE IF( IMAT.EQ.15 ) THEN 00477 * 00478 * Type 15: Make the diagonal elements small to cause gradual 00479 * overflow when dividing by T(j,j). To control the amount of 00480 * scaling needed, the matrix is bidiagonal. 00481 * 00482 TEXP = ONE / MAX( ONE, DBLE( N-1 ) ) 00483 TSCAL = SMLNUM**TEXP 00484 CALL DLARNV( 2, ISEED, N, B ) 00485 IF( UPPER ) THEN 00486 DO 270 J = 1, N 00487 DO 260 I = 1, J - 2 00488 A( I, J ) = 0.D0 00489 260 CONTINUE 00490 IF( J.GT.1 ) 00491 $ A( J-1, J ) = -ONE 00492 A( J, J ) = TSCAL 00493 270 CONTINUE 00494 B( N ) = ONE 00495 ELSE 00496 DO 290 J = 1, N 00497 DO 280 I = J + 2, N 00498 A( I, J ) = 0.D0 00499 280 CONTINUE 00500 IF( J.LT.N ) 00501 $ A( J+1, J ) = -ONE 00502 A( J, J ) = TSCAL 00503 290 CONTINUE 00504 B( 1 ) = ONE 00505 END IF 00506 * 00507 ELSE IF( IMAT.EQ.16 ) THEN 00508 * 00509 * Type 16: One zero diagonal element. 00510 * 00511 IY = N / 2 + 1 00512 IF( UPPER ) THEN 00513 DO 300 J = 1, N 00514 CALL DLARNV( 2, ISEED, J, A( 1, J ) ) 00515 IF( J.NE.IY ) THEN 00516 A( J, J ) = SIGN( TWO, A( J, J ) ) 00517 ELSE 00518 A( J, J ) = ZERO 00519 END IF 00520 300 CONTINUE 00521 ELSE 00522 DO 310 J = 1, N 00523 CALL DLARNV( 2, ISEED, N-J+1, A( J, J ) ) 00524 IF( J.NE.IY ) THEN 00525 A( J, J ) = SIGN( TWO, A( J, J ) ) 00526 ELSE 00527 A( J, J ) = ZERO 00528 END IF 00529 310 CONTINUE 00530 END IF 00531 CALL DLARNV( 2, ISEED, N, B ) 00532 CALL DSCAL( N, TWO, B, 1 ) 00533 * 00534 ELSE IF( IMAT.EQ.17 ) THEN 00535 * 00536 * Type 17: Make the offdiagonal elements large to cause overflow 00537 * when adding a column of T. In the non-transposed case, the 00538 * matrix is constructed to cause overflow when adding a column in 00539 * every other step. 00540 * 00541 TSCAL = UNFL / ULP 00542 TSCAL = ( ONE-ULP ) / TSCAL 00543 DO 330 J = 1, N 00544 DO 320 I = 1, N 00545 A( I, J ) = 0.D0 00546 320 CONTINUE 00547 330 CONTINUE 00548 TEXP = ONE 00549 IF( UPPER ) THEN 00550 DO 340 J = N, 2, -2 00551 A( 1, J ) = -TSCAL / DBLE( N+1 ) 00552 A( J, J ) = ONE 00553 B( J ) = TEXP*( ONE-ULP ) 00554 A( 1, J-1 ) = -( TSCAL / DBLE( N+1 ) ) / DBLE( N+2 ) 00555 A( J-1, J-1 ) = ONE 00556 B( J-1 ) = TEXP*DBLE( N*N+N-1 ) 00557 TEXP = TEXP*2.D0 00558 340 CONTINUE 00559 B( 1 ) = ( DBLE( N+1 ) / DBLE( N+2 ) )*TSCAL 00560 ELSE 00561 DO 350 J = 1, N - 1, 2 00562 A( N, J ) = -TSCAL / DBLE( N+1 ) 00563 A( J, J ) = ONE 00564 B( J ) = TEXP*( ONE-ULP ) 00565 A( N, J+1 ) = -( TSCAL / DBLE( N+1 ) ) / DBLE( N+2 ) 00566 A( J+1, J+1 ) = ONE 00567 B( J+1 ) = TEXP*DBLE( N*N+N-1 ) 00568 TEXP = TEXP*2.D0 00569 350 CONTINUE 00570 B( N ) = ( DBLE( N+1 ) / DBLE( N+2 ) )*TSCAL 00571 END IF 00572 * 00573 ELSE IF( IMAT.EQ.18 ) THEN 00574 * 00575 * Type 18: Generate a unit triangular matrix with elements 00576 * between -1 and 1, and make the right hand side large so that it 00577 * requires scaling. 00578 * 00579 IF( UPPER ) THEN 00580 DO 360 J = 1, N 00581 CALL DLARNV( 2, ISEED, J-1, A( 1, J ) ) 00582 A( J, J ) = ZERO 00583 360 CONTINUE 00584 ELSE 00585 DO 370 J = 1, N 00586 IF( J.LT.N ) 00587 $ CALL DLARNV( 2, ISEED, N-J, A( J+1, J ) ) 00588 A( J, J ) = ZERO 00589 370 CONTINUE 00590 END IF 00591 * 00592 * Set the right hand side so that the largest value is BIGNUM. 00593 * 00594 CALL DLARNV( 2, ISEED, N, B ) 00595 IY = IDAMAX( N, B, 1 ) 00596 BNORM = ABS( B( IY ) ) 00597 BSCAL = BIGNUM / MAX( ONE, BNORM ) 00598 CALL DSCAL( N, BSCAL, B, 1 ) 00599 * 00600 ELSE IF( IMAT.EQ.19 ) THEN 00601 * 00602 * Type 19: Generate a triangular matrix with elements between 00603 * BIGNUM/(n-1) and BIGNUM so that at least one of the column 00604 * norms will exceed BIGNUM. 00605 * 1/3/91: DLATRS no longer can handle this case 00606 * 00607 TLEFT = BIGNUM / MAX( ONE, DBLE( N-1 ) ) 00608 TSCAL = BIGNUM*( DBLE( N-1 ) / MAX( ONE, DBLE( N ) ) ) 00609 IF( UPPER ) THEN 00610 DO 390 J = 1, N 00611 CALL DLARNV( 2, ISEED, J, A( 1, J ) ) 00612 DO 380 I = 1, J 00613 A( I, J ) = SIGN( TLEFT, A( I, J ) ) + TSCAL*A( I, J ) 00614 380 CONTINUE 00615 390 CONTINUE 00616 ELSE 00617 DO 410 J = 1, N 00618 CALL DLARNV( 2, ISEED, N-J+1, A( J, J ) ) 00619 DO 400 I = J, N 00620 A( I, J ) = SIGN( TLEFT, A( I, J ) ) + TSCAL*A( I, J ) 00621 400 CONTINUE 00622 410 CONTINUE 00623 END IF 00624 CALL DLARNV( 2, ISEED, N, B ) 00625 CALL DSCAL( N, TWO, B, 1 ) 00626 END IF 00627 * 00628 * Flip the matrix if the transpose will be used. 00629 * 00630 IF( .NOT.LSAME( TRANS, 'N' ) ) THEN 00631 IF( UPPER ) THEN 00632 DO 420 J = 1, N / 2 00633 CALL DSWAP( N-2*J+1, A( J, J ), LDA, A( J+1, N-J+1 ), 00634 $ -1 ) 00635 420 CONTINUE 00636 ELSE 00637 DO 430 J = 1, N / 2 00638 CALL DSWAP( N-2*J+1, A( J, J ), 1, A( N-J+1, J+1 ), 00639 $ -LDA ) 00640 430 CONTINUE 00641 END IF 00642 END IF 00643 * 00644 RETURN 00645 * 00646 * End of DLATTR 00647 * 00648 END