LAPACK 3.11.0
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches

◆ dpttrf()

subroutine dpttrf ( integer  N,
double precision, dimension( * )  D,
double precision, dimension( * )  E,
integer  INFO 
)

DPTTRF

Download DPTTRF + dependencies [TGZ] [ZIP] [TXT]

Purpose:
 DPTTRF computes the L*D*L**T factorization of a real symmetric
 positive definite tridiagonal matrix A.  The factorization may also
 be regarded as having the form A = U**T*D*U.
Parameters
[in]N
          N is INTEGER
          The order of the matrix A.  N >= 0.
[in,out]D
          D is DOUBLE PRECISION array, dimension (N)
          On entry, the n diagonal elements of the tridiagonal matrix
          A.  On exit, the n diagonal elements of the diagonal matrix
          D from the L*D*L**T factorization of A.
[in,out]E
          E is DOUBLE PRECISION array, dimension (N-1)
          On entry, the (n-1) subdiagonal elements of the tridiagonal
          matrix A.  On exit, the (n-1) subdiagonal elements of the
          unit bidiagonal factor L from the L*D*L**T factorization of A.
          E can also be regarded as the superdiagonal of the unit
          bidiagonal factor U from the U**T*D*U factorization of A.
[out]INFO
          INFO is INTEGER
          = 0: successful exit
          < 0: if INFO = -k, the k-th argument had an illegal value
          > 0: if INFO = k, the leading minor of order k is not
               positive definite; if k < N, the factorization could not
               be completed, while if k = N, the factorization was
               completed, but D(N) <= 0.
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.

Definition at line 90 of file dpttrf.f.

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*
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:60
Here is the call graph for this function:
Here is the caller graph for this function: