1 SUBROUTINE CPTT01( N, D, E, DF, EF, WORK, RESID )
2 *
3 * -- LAPACK test routine (version 3.1) --
4 * Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
5 * November 2006
6 *
7 * .. Scalar Arguments ..
8 INTEGER N
9 REAL RESID
10 * ..
11 * .. Array Arguments ..
12 REAL D( * ), DF( * )
13 COMPLEX E( * ), EF( * ), WORK( * )
14 * ..
15 *
16 * Purpose
17 * =======
18 *
19 * CPTT01 reconstructs a tridiagonal matrix A from its L*D*L'
20 * factorization and computes the residual
21 * norm(L*D*L' - A) / ( n * norm(A) * EPS ),
22 * where EPS is the machine epsilon.
23 *
24 * Arguments
25 * =========
26 *
27 * N (input) INTEGTER
28 * The order of the matrix A.
29 *
30 * D (input) REAL array, dimension (N)
31 * The n diagonal elements of the tridiagonal matrix A.
32 *
33 * E (input) COMPLEX array, dimension (N-1)
34 * The (n-1) subdiagonal elements of the tridiagonal matrix A.
35 *
36 * DF (input) REAL array, dimension (N)
37 * The n diagonal elements of the factor L from the L*D*L'
38 * factorization of A.
39 *
40 * EF (input) COMPLEX array, dimension (N-1)
41 * The (n-1) subdiagonal elements of the factor L from the
42 * L*D*L' factorization of A.
43 *
44 * WORK (workspace) COMPLEX array, dimension (2*N)
45 *
46 * RESID (output) REAL
47 * norm(L*D*L' - A) / (n * norm(A) * EPS)
48 *
49 * =====================================================================
50 *
51 * .. Parameters ..
52 REAL ONE, ZERO
53 PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 )
54 * ..
55 * .. Local Scalars ..
56 INTEGER I
57 REAL ANORM, EPS
58 COMPLEX DE
59 * ..
60 * .. External Functions ..
61 REAL SLAMCH
62 EXTERNAL SLAMCH
63 * ..
64 * .. Intrinsic Functions ..
65 INTRINSIC ABS, CONJG, MAX, REAL
66 * ..
67 * .. Executable Statements ..
68 *
69 * Quick return if possible
70 *
71 IF( N.LE.0 ) THEN
72 RESID = ZERO
73 RETURN
74 END IF
75 *
76 EPS = SLAMCH( 'Epsilon' )
77 *
78 * Construct the difference L*D*L' - A.
79 *
80 WORK( 1 ) = DF( 1 ) - D( 1 )
81 DO 10 I = 1, N - 1
82 DE = DF( I )*EF( I )
83 WORK( N+I ) = DE - E( I )
84 WORK( 1+I ) = DE*CONJG( EF( I ) ) + DF( I+1 ) - D( I+1 )
85 10 CONTINUE
86 *
87 * Compute the 1-norms of the tridiagonal matrices A and WORK.
88 *
89 IF( N.EQ.1 ) THEN
90 ANORM = D( 1 )
91 RESID = ABS( WORK( 1 ) )
92 ELSE
93 ANORM = MAX( D( 1 )+ABS( E( 1 ) ), D( N )+ABS( E( N-1 ) ) )
94 RESID = MAX( ABS( WORK( 1 ) )+ABS( WORK( N+1 ) ),
95 $ ABS( WORK( N ) )+ABS( WORK( 2*N-1 ) ) )
96 DO 20 I = 2, N - 1
97 ANORM = MAX( ANORM, D( I )+ABS( E( I ) )+ABS( E( I-1 ) ) )
98 RESID = MAX( RESID, ABS( WORK( I ) )+ABS( WORK( N+I-1 ) )+
99 $ ABS( WORK( N+I ) ) )
100 20 CONTINUE
101 END IF
102 *
103 * Compute norm(L*D*L' - A) / (n * norm(A) * EPS)
104 *
105 IF( ANORM.LE.ZERO ) THEN
106 IF( RESID.NE.ZERO )
107 $ RESID = ONE / EPS
108 ELSE
109 RESID = ( ( RESID / REAL( N ) ) / ANORM ) / EPS
110 END IF
111 *
112 RETURN
113 *
114 * End of CPTT01
115 *
116 END
2 *
3 * -- LAPACK test routine (version 3.1) --
4 * Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
5 * November 2006
6 *
7 * .. Scalar Arguments ..
8 INTEGER N
9 REAL RESID
10 * ..
11 * .. Array Arguments ..
12 REAL D( * ), DF( * )
13 COMPLEX E( * ), EF( * ), WORK( * )
14 * ..
15 *
16 * Purpose
17 * =======
18 *
19 * CPTT01 reconstructs a tridiagonal matrix A from its L*D*L'
20 * factorization and computes the residual
21 * norm(L*D*L' - A) / ( n * norm(A) * EPS ),
22 * where EPS is the machine epsilon.
23 *
24 * Arguments
25 * =========
26 *
27 * N (input) INTEGTER
28 * The order of the matrix A.
29 *
30 * D (input) REAL array, dimension (N)
31 * The n diagonal elements of the tridiagonal matrix A.
32 *
33 * E (input) COMPLEX array, dimension (N-1)
34 * The (n-1) subdiagonal elements of the tridiagonal matrix A.
35 *
36 * DF (input) REAL array, dimension (N)
37 * The n diagonal elements of the factor L from the L*D*L'
38 * factorization of A.
39 *
40 * EF (input) COMPLEX array, dimension (N-1)
41 * The (n-1) subdiagonal elements of the factor L from the
42 * L*D*L' factorization of A.
43 *
44 * WORK (workspace) COMPLEX array, dimension (2*N)
45 *
46 * RESID (output) REAL
47 * norm(L*D*L' - A) / (n * norm(A) * EPS)
48 *
49 * =====================================================================
50 *
51 * .. Parameters ..
52 REAL ONE, ZERO
53 PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 )
54 * ..
55 * .. Local Scalars ..
56 INTEGER I
57 REAL ANORM, EPS
58 COMPLEX DE
59 * ..
60 * .. External Functions ..
61 REAL SLAMCH
62 EXTERNAL SLAMCH
63 * ..
64 * .. Intrinsic Functions ..
65 INTRINSIC ABS, CONJG, MAX, REAL
66 * ..
67 * .. Executable Statements ..
68 *
69 * Quick return if possible
70 *
71 IF( N.LE.0 ) THEN
72 RESID = ZERO
73 RETURN
74 END IF
75 *
76 EPS = SLAMCH( 'Epsilon' )
77 *
78 * Construct the difference L*D*L' - A.
79 *
80 WORK( 1 ) = DF( 1 ) - D( 1 )
81 DO 10 I = 1, N - 1
82 DE = DF( I )*EF( I )
83 WORK( N+I ) = DE - E( I )
84 WORK( 1+I ) = DE*CONJG( EF( I ) ) + DF( I+1 ) - D( I+1 )
85 10 CONTINUE
86 *
87 * Compute the 1-norms of the tridiagonal matrices A and WORK.
88 *
89 IF( N.EQ.1 ) THEN
90 ANORM = D( 1 )
91 RESID = ABS( WORK( 1 ) )
92 ELSE
93 ANORM = MAX( D( 1 )+ABS( E( 1 ) ), D( N )+ABS( E( N-1 ) ) )
94 RESID = MAX( ABS( WORK( 1 ) )+ABS( WORK( N+1 ) ),
95 $ ABS( WORK( N ) )+ABS( WORK( 2*N-1 ) ) )
96 DO 20 I = 2, N - 1
97 ANORM = MAX( ANORM, D( I )+ABS( E( I ) )+ABS( E( I-1 ) ) )
98 RESID = MAX( RESID, ABS( WORK( I ) )+ABS( WORK( N+I-1 ) )+
99 $ ABS( WORK( N+I ) ) )
100 20 CONTINUE
101 END IF
102 *
103 * Compute norm(L*D*L' - A) / (n * norm(A) * EPS)
104 *
105 IF( ANORM.LE.ZERO ) THEN
106 IF( RESID.NE.ZERO )
107 $ RESID = ONE / EPS
108 ELSE
109 RESID = ( ( RESID / REAL( N ) ) / ANORM ) / EPS
110 END IF
111 *
112 RETURN
113 *
114 * End of CPTT01
115 *
116 END