LAPACK  3.10.0
LAPACK: Linear Algebra PACKage
dpttrf.f
Go to the documentation of this file.
1 *> \brief \b DPTTRF
2 *
3 * =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
7 *
8 *> \htmlonly
9 *> Download DPTTRF + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dpttrf.f">
11 *> [TGZ]</a>
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dpttrf.f">
13 *> [ZIP]</a>
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dpttrf.f">
15 *> [TXT]</a>
16 *> \endhtmlonly
17 *
18 * Definition:
19 * ===========
20 *
21 * SUBROUTINE DPTTRF( N, D, E, INFO )
22 *
23 * .. Scalar Arguments ..
24 * INTEGER INFO, N
25 * ..
26 * .. Array Arguments ..
27 * DOUBLE PRECISION D( * ), E( * )
28 * ..
29 *
30 *
31 *> \par Purpose:
32 * =============
33 *>
34 *> \verbatim
35 *>
36 *> DPTTRF computes the L*D*L**T factorization of a real symmetric
37 *> positive definite tridiagonal matrix A. The factorization may also
38 *> be regarded as having the form A = U**T*D*U.
39 *> \endverbatim
40 *
41 * Arguments:
42 * ==========
43 *
44 *> \param[in] N
45 *> \verbatim
46 *> N is INTEGER
47 *> The order of the matrix A. N >= 0.
48 *> \endverbatim
49 *>
50 *> \param[in,out] D
51 *> \verbatim
52 *> D is DOUBLE PRECISION array, dimension (N)
53 *> On entry, the n diagonal elements of the tridiagonal matrix
54 *> A. On exit, the n diagonal elements of the diagonal matrix
55 *> D from the L*D*L**T factorization of A.
56 *> \endverbatim
57 *>
58 *> \param[in,out] E
59 *> \verbatim
60 *> E is DOUBLE PRECISION array, dimension (N-1)
61 *> On entry, the (n-1) subdiagonal elements of the tridiagonal
62 *> matrix A. On exit, the (n-1) subdiagonal elements of the
63 *> unit bidiagonal factor L from the L*D*L**T factorization of A.
64 *> E can also be regarded as the superdiagonal of the unit
65 *> bidiagonal factor U from the U**T*D*U factorization of A.
66 *> \endverbatim
67 *>
68 *> \param[out] INFO
69 *> \verbatim
70 *> INFO is INTEGER
71 *> = 0: successful exit
72 *> < 0: if INFO = -k, the k-th argument had an illegal value
73 *> > 0: if INFO = k, the leading minor of order k is not
74 *> positive definite; if k < N, the factorization could not
75 *> be completed, while if k = N, the factorization was
76 *> completed, but D(N) <= 0.
77 *> \endverbatim
78 *
79 * Authors:
80 * ========
81 *
82 *> \author Univ. of Tennessee
83 *> \author Univ. of California Berkeley
84 *> \author Univ. of Colorado Denver
85 *> \author NAG Ltd.
86 *
87 *> \ingroup doublePTcomputational
88 *
89 * =====================================================================
90  SUBROUTINE dpttrf( N, D, E, INFO )
91 *
92 * -- LAPACK computational routine --
93 * -- LAPACK is a software package provided by Univ. of Tennessee, --
94 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
95 *
96 * .. Scalar Arguments ..
97  INTEGER INFO, N
98 * ..
99 * .. Array Arguments ..
100  DOUBLE PRECISION D( * ), E( * )
101 * ..
102 *
103 * =====================================================================
104 *
105 * .. Parameters ..
106  DOUBLE PRECISION ZERO
107  parameter( zero = 0.0d+0 )
108 * ..
109 * .. Local Scalars ..
110  INTEGER I, I4
111  DOUBLE PRECISION EI
112 * ..
113 * .. External Subroutines ..
114  EXTERNAL xerbla
115 * ..
116 * .. Intrinsic Functions ..
117  INTRINSIC mod
118 * ..
119 * .. Executable Statements ..
120 *
121 * Test the input parameters.
122 *
123  info = 0
124  IF( n.LT.0 ) THEN
125  info = -1
126  CALL xerbla( 'DPTTRF', -info )
127  RETURN
128  END IF
129 *
130 * Quick return if possible
131 *
132  IF( n.EQ.0 )
133  $ RETURN
134 *
135 * Compute the L*D*L**T (or U**T*D*U) factorization of A.
136 *
137  i4 = mod( n-1, 4 )
138  DO 10 i = 1, i4
139  IF( d( i ).LE.zero ) THEN
140  info = i
141  GO TO 30
142  END IF
143  ei = e( i )
144  e( i ) = ei / d( i )
145  d( i+1 ) = d( i+1 ) - e( i )*ei
146  10 CONTINUE
147 *
148  DO 20 i = i4 + 1, n - 4, 4
149 *
150 * Drop out of the loop if d(i) <= 0: the matrix is not positive
151 * definite.
152 *
153  IF( d( i ).LE.zero ) THEN
154  info = i
155  GO TO 30
156  END IF
157 *
158 * Solve for e(i) and d(i+1).
159 *
160  ei = e( i )
161  e( i ) = ei / d( i )
162  d( i+1 ) = d( i+1 ) - e( i )*ei
163 *
164  IF( d( i+1 ).LE.zero ) THEN
165  info = i + 1
166  GO TO 30
167  END IF
168 *
169 * Solve for e(i+1) and d(i+2).
170 *
171  ei = e( i+1 )
172  e( i+1 ) = ei / d( i+1 )
173  d( i+2 ) = d( i+2 ) - e( i+1 )*ei
174 *
175  IF( d( i+2 ).LE.zero ) THEN
176  info = i + 2
177  GO TO 30
178  END IF
179 *
180 * Solve for e(i+2) and d(i+3).
181 *
182  ei = e( i+2 )
183  e( i+2 ) = ei / d( i+2 )
184  d( i+3 ) = d( i+3 ) - e( i+2 )*ei
185 *
186  IF( d( i+3 ).LE.zero ) THEN
187  info = i + 3
188  GO TO 30
189  END IF
190 *
191 * Solve for e(i+3) and d(i+4).
192 *
193  ei = e( i+3 )
194  e( i+3 ) = ei / d( i+3 )
195  d( i+4 ) = d( i+4 ) - e( i+3 )*ei
196  20 CONTINUE
197 *
198 * Check d(n) for positive definiteness.
199 *
200  IF( d( n ).LE.zero )
201  $ info = n
202 *
203  30 CONTINUE
204  RETURN
205 *
206 * End of DPTTRF
207 *
208  END
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:60
subroutine dpttrf(N, D, E, INFO)
DPTTRF
Definition: dpttrf.f:91