LAPACK  3.10.1
LAPACK: Linear Algebra PACKage
dptcon.f
Go to the documentation of this file.
1 *> \brief \b DPTCON
2 *
3 * =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
7 *
8 *> \htmlonly
9 *> Download DPTCON + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dptcon.f">
11 *> [TGZ]</a>
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dptcon.f">
13 *> [ZIP]</a>
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dptcon.f">
15 *> [TXT]</a>
16 *> \endhtmlonly
17 *
18 * Definition:
19 * ===========
20 *
21 * SUBROUTINE DPTCON( N, D, E, ANORM, RCOND, WORK, INFO )
22 *
23 * .. Scalar Arguments ..
24 * INTEGER INFO, N
25 * DOUBLE PRECISION ANORM, RCOND
26 * ..
27 * .. Array Arguments ..
28 * DOUBLE PRECISION D( * ), E( * ), WORK( * )
29 * ..
30 *
31 *
32 *> \par Purpose:
33 * =============
34 *>
35 *> \verbatim
36 *>
37 *> DPTCON computes the reciprocal of the condition number (in the
38 *> 1-norm) of a real symmetric positive definite tridiagonal matrix
39 *> using the factorization A = L*D*L**T or A = U**T*D*U computed by
40 *> DPTTRF.
41 *>
42 *> Norm(inv(A)) is computed by a direct method, and the reciprocal of
43 *> the condition number is computed as
44 *> RCOND = 1 / (ANORM * norm(inv(A))).
45 *> \endverbatim
46 *
47 * Arguments:
48 * ==========
49 *
50 *> \param[in] N
51 *> \verbatim
52 *> N is INTEGER
53 *> The order of the matrix A. N >= 0.
54 *> \endverbatim
55 *>
56 *> \param[in] D
57 *> \verbatim
58 *> D is DOUBLE PRECISION array, dimension (N)
59 *> The n diagonal elements of the diagonal matrix D from the
60 *> factorization of A, as computed by DPTTRF.
61 *> \endverbatim
62 *>
63 *> \param[in] E
64 *> \verbatim
65 *> E is DOUBLE PRECISION array, dimension (N-1)
66 *> The (n-1) off-diagonal elements of the unit bidiagonal factor
67 *> U or L from the factorization of A, as computed by DPTTRF.
68 *> \endverbatim
69 *>
70 *> \param[in] ANORM
71 *> \verbatim
72 *> ANORM is DOUBLE PRECISION
73 *> The 1-norm of the original matrix A.
74 *> \endverbatim
75 *>
76 *> \param[out] RCOND
77 *> \verbatim
78 *> RCOND is DOUBLE PRECISION
79 *> The reciprocal of the condition number of the matrix A,
80 *> computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is the
81 *> 1-norm of inv(A) computed in this routine.
82 *> \endverbatim
83 *>
84 *> \param[out] WORK
85 *> \verbatim
86 *> WORK is DOUBLE PRECISION array, dimension (N)
87 *> \endverbatim
88 *>
89 *> \param[out] INFO
90 *> \verbatim
91 *> INFO is INTEGER
92 *> = 0: successful exit
93 *> < 0: if INFO = -i, the i-th argument had an illegal value
94 *> \endverbatim
95 *
96 * Authors:
97 * ========
98 *
99 *> \author Univ. of Tennessee
100 *> \author Univ. of California Berkeley
101 *> \author Univ. of Colorado Denver
102 *> \author NAG Ltd.
103 *
104 *> \ingroup doublePTcomputational
105 *
106 *> \par Further Details:
107 * =====================
108 *>
109 *> \verbatim
110 *>
111 *> The method used is described in Nicholas J. Higham, "Efficient
112 *> Algorithms for Computing the Condition Number of a Tridiagonal
113 *> Matrix", SIAM J. Sci. Stat. Comput., Vol. 7, No. 1, January 1986.
114 *> \endverbatim
115 *>
116 * =====================================================================
117  SUBROUTINE dptcon( N, D, E, ANORM, RCOND, WORK, INFO )
118 *
119 * -- LAPACK computational routine --
120 * -- LAPACK is a software package provided by Univ. of Tennessee, --
121 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
122 *
123 * .. Scalar Arguments ..
124  INTEGER INFO, N
125  DOUBLE PRECISION ANORM, RCOND
126 * ..
127 * .. Array Arguments ..
128  DOUBLE PRECISION D( * ), E( * ), WORK( * )
129 * ..
130 *
131 * =====================================================================
132 *
133 * .. Parameters ..
134  DOUBLE PRECISION ONE, ZERO
135  parameter( one = 1.0d+0, zero = 0.0d+0 )
136 * ..
137 * .. Local Scalars ..
138  INTEGER I, IX
139  DOUBLE PRECISION AINVNM
140 * ..
141 * .. External Functions ..
142  INTEGER IDAMAX
143  EXTERNAL idamax
144 * ..
145 * .. External Subroutines ..
146  EXTERNAL xerbla
147 * ..
148 * .. Intrinsic Functions ..
149  INTRINSIC abs
150 * ..
151 * .. Executable Statements ..
152 *
153 * Test the input arguments.
154 *
155  info = 0
156  IF( n.LT.0 ) THEN
157  info = -1
158  ELSE IF( anorm.LT.zero ) THEN
159  info = -4
160  END IF
161  IF( info.NE.0 ) THEN
162  CALL xerbla( 'DPTCON', -info )
163  RETURN
164  END IF
165 *
166 * Quick return if possible
167 *
168  rcond = zero
169  IF( n.EQ.0 ) THEN
170  rcond = one
171  RETURN
172  ELSE IF( anorm.EQ.zero ) THEN
173  RETURN
174  END IF
175 *
176 * Check that D(1:N) is positive.
177 *
178  DO 10 i = 1, n
179  IF( d( i ).LE.zero )
180  $ RETURN
181  10 CONTINUE
182 *
183 * Solve M(A) * x = e, where M(A) = (m(i,j)) is given by
184 *
185 * m(i,j) = abs(A(i,j)), i = j,
186 * m(i,j) = -abs(A(i,j)), i .ne. j,
187 *
188 * and e = [ 1, 1, ..., 1 ]**T. Note M(A) = M(L)*D*M(L)**T.
189 *
190 * Solve M(L) * x = e.
191 *
192  work( 1 ) = one
193  DO 20 i = 2, n
194  work( i ) = one + work( i-1 )*abs( e( i-1 ) )
195  20 CONTINUE
196 *
197 * Solve D * M(L)**T * x = b.
198 *
199  work( n ) = work( n ) / d( n )
200  DO 30 i = n - 1, 1, -1
201  work( i ) = work( i ) / d( i ) + work( i+1 )*abs( e( i ) )
202  30 CONTINUE
203 *
204 * Compute AINVNM = max(x(i)), 1<=i<=n.
205 *
206  ix = idamax( n, work, 1 )
207  ainvnm = abs( work( ix ) )
208 *
209 * Compute the reciprocal condition number.
210 *
211  IF( ainvnm.NE.zero )
212  $ rcond = ( one / ainvnm ) / anorm
213 *
214  RETURN
215 *
216 * End of DPTCON
217 *
218  END
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:60
subroutine dptcon(N, D, E, ANORM, RCOND, WORK, INFO)
DPTCON
Definition: dptcon.f:118