📄 zlattp.f
字号:
AP( JX+J-I+1 ) = -DCONJG( S )*AP( JX+J-I ) -
$ C*AP( JX+J-I+1 )
AP( JX+J-I ) = CTEMP
JX = JX + N - I + 1
160 CONTINUE
END IF
*
* Negate A(J+1,J).
*
AP( JC+1 ) = -AP( JC+1 )
JC = JCNEXT
170 CONTINUE
END IF
*
* IMAT > 10: Pathological test cases. These triangular matrices
* are badly scaled or badly conditioned, so when used in solving a
* triangular system they may cause overflow in the solution vector.
*
ELSE IF( IMAT.EQ.11 ) THEN
*
* Type 11: Generate a triangular matrix with elements between
* -1 and 1. Give the diagonal norm 2 to make it well-conditioned.
* Make the right hand side large so that it requires scaling.
*
IF( UPPER ) THEN
JC = 1
DO 180 J = 1, N
CALL ZLARNV( 4, ISEED, J-1, AP( JC ) )
AP( JC+J-1 ) = ZLARND( 5, ISEED )*TWO
JC = JC + J
180 CONTINUE
ELSE
JC = 1
DO 190 J = 1, N
IF( J.LT.N )
$ CALL ZLARNV( 4, ISEED, N-J, AP( JC+1 ) )
AP( JC ) = ZLARND( 5, ISEED )*TWO
JC = JC + N - J + 1
190 CONTINUE
END IF
*
* Set the right hand side so that the largest value is BIGNUM.
*
CALL ZLARNV( 2, ISEED, N, B )
IY = IZAMAX( N, B, 1 )
BNORM = ABS( B( IY ) )
BSCAL = BIGNUM / MAX( ONE, BNORM )
CALL ZDSCAL( N, BSCAL, B, 1 )
*
ELSE IF( IMAT.EQ.12 ) THEN
*
* Type 12: Make the first diagonal element in the solve small to
* cause immediate overflow when dividing by T(j,j).
* In type 12, the offdiagonal elements are small (CNORM(j) < 1).
*
CALL ZLARNV( 2, ISEED, N, B )
TSCAL = ONE / MAX( ONE, DBLE( N-1 ) )
IF( UPPER ) THEN
JC = 1
DO 200 J = 1, N
CALL ZLARNV( 4, ISEED, J-1, AP( JC ) )
CALL ZDSCAL( J-1, TSCAL, AP( JC ), 1 )
AP( JC+J-1 ) = ZLARND( 5, ISEED )
JC = JC + J
200 CONTINUE
AP( N*( N+1 ) / 2 ) = SMLNUM*AP( N*( N+1 ) / 2 )
ELSE
JC = 1
DO 210 J = 1, N
CALL ZLARNV( 2, ISEED, N-J, AP( JC+1 ) )
CALL ZDSCAL( N-J, TSCAL, AP( JC+1 ), 1 )
AP( JC ) = ZLARND( 5, ISEED )
JC = JC + N - J + 1
210 CONTINUE
AP( 1 ) = SMLNUM*AP( 1 )
END IF
*
ELSE IF( IMAT.EQ.13 ) THEN
*
* Type 13: Make the first diagonal element in the solve small to
* cause immediate overflow when dividing by T(j,j).
* In type 13, the offdiagonal elements are O(1) (CNORM(j) > 1).
*
CALL ZLARNV( 2, ISEED, N, B )
IF( UPPER ) THEN
JC = 1
DO 220 J = 1, N
CALL ZLARNV( 4, ISEED, J-1, AP( JC ) )
AP( JC+J-1 ) = ZLARND( 5, ISEED )
JC = JC + J
220 CONTINUE
AP( N*( N+1 ) / 2 ) = SMLNUM*AP( N*( N+1 ) / 2 )
ELSE
JC = 1
DO 230 J = 1, N
CALL ZLARNV( 4, ISEED, N-J, AP( JC+1 ) )
AP( JC ) = ZLARND( 5, ISEED )
JC = JC + N - J + 1
230 CONTINUE
AP( 1 ) = SMLNUM*AP( 1 )
END IF
*
ELSE IF( IMAT.EQ.14 ) THEN
*
* Type 14: T is diagonal with small numbers on the diagonal to
* make the growth factor underflow, but a small right hand side
* chosen so that the solution does not overflow.
*
IF( UPPER ) THEN
JCOUNT = 1
JC = ( N-1 )*N / 2 + 1
DO 250 J = N, 1, -1
DO 240 I = 1, J - 1
AP( JC+I-1 ) = ZERO
240 CONTINUE
IF( JCOUNT.LE.2 ) THEN
AP( JC+J-1 ) = SMLNUM*ZLARND( 5, ISEED )
ELSE
AP( JC+J-1 ) = ZLARND( 5, ISEED )
END IF
JCOUNT = JCOUNT + 1
IF( JCOUNT.GT.4 )
$ JCOUNT = 1
JC = JC - J + 1
250 CONTINUE
ELSE
JCOUNT = 1
JC = 1
DO 270 J = 1, N
DO 260 I = J + 1, N
AP( JC+I-J ) = ZERO
260 CONTINUE
IF( JCOUNT.LE.2 ) THEN
AP( JC ) = SMLNUM*ZLARND( 5, ISEED )
ELSE
AP( JC ) = ZLARND( 5, ISEED )
END IF
JCOUNT = JCOUNT + 1
IF( JCOUNT.GT.4 )
$ JCOUNT = 1
JC = JC + N - J + 1
270 CONTINUE
END IF
*
* Set the right hand side alternately zero and small.
*
IF( UPPER ) THEN
B( 1 ) = ZERO
DO 280 I = N, 2, -2
B( I ) = ZERO
B( I-1 ) = SMLNUM*ZLARND( 5, ISEED )
280 CONTINUE
ELSE
B( N ) = ZERO
DO 290 I = 1, N - 1, 2
B( I ) = ZERO
B( I+1 ) = SMLNUM*ZLARND( 5, ISEED )
290 CONTINUE
END IF
*
ELSE IF( IMAT.EQ.15 ) THEN
*
* Type 15: Make the diagonal elements small to cause gradual
* overflow when dividing by T(j,j). To control the amount of
* scaling needed, the matrix is bidiagonal.
*
TEXP = ONE / MAX( ONE, DBLE( N-1 ) )
TSCAL = SMLNUM**TEXP
CALL ZLARNV( 4, ISEED, N, B )
IF( UPPER ) THEN
JC = 1
DO 310 J = 1, N
DO 300 I = 1, J - 2
AP( JC+I-1 ) = ZERO
300 CONTINUE
IF( J.GT.1 )
$ AP( JC+J-2 ) = DCMPLX( -ONE, -ONE )
AP( JC+J-1 ) = TSCAL*ZLARND( 5, ISEED )
JC = JC + J
310 CONTINUE
B( N ) = DCMPLX( ONE, ONE )
ELSE
JC = 1
DO 330 J = 1, N
DO 320 I = J + 2, N
AP( JC+I-J ) = ZERO
320 CONTINUE
IF( J.LT.N )
$ AP( JC+1 ) = DCMPLX( -ONE, -ONE )
AP( JC ) = TSCAL*ZLARND( 5, ISEED )
JC = JC + N - J + 1
330 CONTINUE
B( 1 ) = DCMPLX( ONE, ONE )
END IF
*
ELSE IF( IMAT.EQ.16 ) THEN
*
* Type 16: One zero diagonal element.
*
IY = N / 2 + 1
IF( UPPER ) THEN
JC = 1
DO 340 J = 1, N
CALL ZLARNV( 4, ISEED, J, AP( JC ) )
IF( J.NE.IY ) THEN
AP( JC+J-1 ) = ZLARND( 5, ISEED )*TWO
ELSE
AP( JC+J-1 ) = ZERO
END IF
JC = JC + J
340 CONTINUE
ELSE
JC = 1
DO 350 J = 1, N
CALL ZLARNV( 4, ISEED, N-J+1, AP( JC ) )
IF( J.NE.IY ) THEN
AP( JC ) = ZLARND( 5, ISEED )*TWO
ELSE
AP( JC ) = ZERO
END IF
JC = JC + N - J + 1
350 CONTINUE
END IF
CALL ZLARNV( 2, ISEED, N, B )
CALL ZDSCAL( N, TWO, B, 1 )
*
ELSE IF( IMAT.EQ.17 ) THEN
*
* Type 17: Make the offdiagonal elements large to cause overflow
* when adding a column of T. In the non-transposed case, the
* matrix is constructed to cause overflow when adding a column in
* every other step.
*
TSCAL = UNFL / ULP
TSCAL = ( ONE-ULP ) / TSCAL
DO 360 J = 1, N*( N+1 ) / 2
AP( J ) = ZERO
360 CONTINUE
TEXP = ONE
IF( UPPER ) THEN
JC = ( N-1 )*N / 2 + 1
DO 370 J = N, 2, -2
AP( JC ) = -TSCAL / DBLE( N+1 )
AP( JC+J-1 ) = ONE
B( J ) = TEXP*( ONE-ULP )
JC = JC - J + 1
AP( JC ) = -( TSCAL / DBLE( N+1 ) ) / DBLE( N+2 )
AP( JC+J-2 ) = ONE
B( J-1 ) = TEXP*DBLE( N*N+N-1 )
TEXP = TEXP*TWO
JC = JC - J + 2
370 CONTINUE
B( 1 ) = ( DBLE( N+1 ) / DBLE( N+2 ) )*TSCAL
ELSE
JC = 1
DO 380 J = 1, N - 1, 2
AP( JC+N-J ) = -TSCAL / DBLE( N+1 )
AP( JC ) = ONE
B( J ) = TEXP*( ONE-ULP )
JC = JC + N - J + 1
AP( JC+N-J-1 ) = -( TSCAL / DBLE( N+1 ) ) / DBLE( N+2 )
AP( JC ) = ONE
B( J+1 ) = TEXP*DBLE( N*N+N-1 )
TEXP = TEXP*TWO
JC = JC + N - J
380 CONTINUE
B( N ) = ( DBLE( N+1 ) / DBLE( N+2 ) )*TSCAL
END IF
*
ELSE IF( IMAT.EQ.18 ) THEN
*
* Type 18: Generate a unit triangular matrix with elements
* between -1 and 1, and make the right hand side large so that it
* requires scaling.
*
IF( UPPER ) THEN
JC = 1
DO 390 J = 1, N
CALL ZLARNV( 4, ISEED, J-1, AP( JC ) )
AP( JC+J-1 ) = ZERO
JC = JC + J
390 CONTINUE
ELSE
JC = 1
DO 400 J = 1, N
IF( J.LT.N )
$ CALL ZLARNV( 4, ISEED, N-J, AP( JC+1 ) )
AP( JC ) = ZERO
JC = JC + N - J + 1
400 CONTINUE
END IF
*
* Set the right hand side so that the largest value is BIGNUM.
*
CALL ZLARNV( 2, ISEED, N, B )
IY = IZAMAX( N, B, 1 )
BNORM = ABS( B( IY ) )
BSCAL = BIGNUM / MAX( ONE, BNORM )
CALL ZDSCAL( N, BSCAL, B, 1 )
*
ELSE IF( IMAT.EQ.19 ) THEN
*
* Type 19: Generate a triangular matrix with elements between
* BIGNUM/(n-1) and BIGNUM so that at least one of the column
* norms will exceed BIGNUM.
* 1/3/91: ZLATPS no longer can handle this case
*
TLEFT = BIGNUM / MAX( ONE, DBLE( N-1 ) )
TSCAL = BIGNUM*( DBLE( N-1 ) / MAX( ONE, DBLE( N ) ) )
IF( UPPER ) THEN
JC = 1
DO 420 J = 1, N
CALL ZLARNV( 5, ISEED, J, AP( JC ) )
CALL DLARNV( 1, ISEED, J, RWORK )
DO 410 I = 1, J
AP( JC+I-1 ) = AP( JC+I-1 )*( TLEFT+RWORK( I )*TSCAL )
410 CONTINUE
JC = JC + J
420 CONTINUE
ELSE
JC = 1
DO 440 J = 1, N
CALL ZLARNV( 5, ISEED, N-J+1, AP( JC ) )
CALL DLARNV( 1, ISEED, N-J+1, RWORK )
DO 430 I = J, N
AP( JC+I-J ) = AP( JC+I-J )*
$ ( TLEFT+RWORK( I-J+1 )*TSCAL )
430 CONTINUE
JC = JC + N - J + 1
440 CONTINUE
END IF
CALL ZLARNV( 2, ISEED, N, B )
CALL ZDSCAL( N, TWO, B, 1 )
END IF
*
* Flip the matrix across its counter-diagonal if the transpose will
* be used.
*
IF( .NOT.LSAME( TRANS, 'N' ) ) THEN
IF( UPPER ) THEN
JJ = 1
JR = N*( N+1 ) / 2
DO 460 J = 1, N / 2
JL = JJ
DO 450 I = J, N - J
T = AP( JR-I+J )
AP( JR-I+J ) = AP( JL )
AP( JL ) = T
JL = JL + I
450 CONTINUE
JJ = JJ + J + 1
JR = JR - ( N-J+1 )
460 CONTINUE
ELSE
JL = 1
JJ = N*( N+1 ) / 2
DO 480 J = 1, N / 2
JR = JJ
DO 470 I = J, N - J
T = AP( JL+I-J )
AP( JL+I-J ) = AP( JR )
AP( JR ) = T
JR = JR - I
470 CONTINUE
JL = JL + N - J + 1
JJ = JJ - J - 1
480 CONTINUE
END IF
END IF
*
RETURN
*
* End of ZLATTP
*
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -