comparison main/splines/dgtsv.f @ 0:6b33357c7561 octave-forge

Initial revision
author pkienzle
date Wed, 10 Oct 2001 19:54:49 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:6b33357c7561
1 SUBROUTINE DGTSV( N, NRHS, DL, D, DU, B, LDB, INFO )
2 *
3 * -- LAPACK routine (version 3.0) --
4 * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
5 * Courant Institute, Argonne National Lab, and Rice University
6 * October 31, 1999
7 *
8 * .. Scalar Arguments ..
9 INTEGER INFO, LDB, N, NRHS
10 * ..
11 * .. Array Arguments ..
12 DOUBLE PRECISION B( LDB, * ), D( * ), DL( * ), DU( * )
13 * ..
14 *
15 * Purpose
16 * =======
17 *
18 * DGTSV solves the equation
19 *
20 * A*X = B,
21 *
22 * where A is an n by n tridiagonal matrix, by Gaussian elimination with
23 * partial pivoting.
24 *
25 * Note that the equation A'*X = B may be solved by interchanging the
26 * order of the arguments DU and DL.
27 *
28 * Arguments
29 * =========
30 *
31 * N (input) INTEGER
32 * The order of the matrix A. N >= 0.
33 *
34 * NRHS (input) INTEGER
35 * The number of right hand sides, i.e., the number of columns
36 * of the matrix B. NRHS >= 0.
37 *
38 * DL (input/output) DOUBLE PRECISION array, dimension (N-1)
39 * On entry, DL must contain the (n-1) sub-diagonal elements of
40 * A.
41 *
42 * On exit, DL is overwritten by the (n-2) elements of the
43 * second super-diagonal of the upper triangular matrix U from
44 * the LU factorization of A, in DL(1), ..., DL(n-2).
45 *
46 * D (input/output) DOUBLE PRECISION array, dimension (N)
47 * On entry, D must contain the diagonal elements of A.
48 *
49 * On exit, D is overwritten by the n diagonal elements of U.
50 *
51 * DU (input/output) DOUBLE PRECISION array, dimension (N-1)
52 * On entry, DU must contain the (n-1) super-diagonal elements
53 * of A.
54 *
55 * On exit, DU is overwritten by the (n-1) elements of the first
56 * super-diagonal of U.
57 *
58 * B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
59 * On entry, the N by NRHS matrix of right hand side matrix B.
60 * On exit, if INFO = 0, the N by NRHS solution matrix X.
61 *
62 * LDB (input) INTEGER
63 * The leading dimension of the array B. LDB >= max(1,N).
64 *
65 * INFO (output) INTEGER
66 * = 0: successful exit
67 * < 0: if INFO = -i, the i-th argument had an illegal value
68 * > 0: if INFO = i, U(i,i) is exactly zero, and the solution
69 * has not been computed. The factorization has not been
70 * completed unless i = N.
71 *
72 * =====================================================================
73 *
74 * .. Parameters ..
75 DOUBLE PRECISION ZERO
76 PARAMETER ( ZERO = 0.0D+0 )
77 * ..
78 * .. Local Scalars ..
79 INTEGER I, J
80 DOUBLE PRECISION FACT, TEMP
81 * ..
82 * .. Intrinsic Functions ..
83 INTRINSIC ABS, MAX
84 * ..
85 * .. External Subroutines ..
86 EXTERNAL XERBLA
87 * ..
88 * .. Executable Statements ..
89 *
90 INFO = 0
91 IF( N.LT.0 ) THEN
92 INFO = -1
93 ELSE IF( NRHS.LT.0 ) THEN
94 INFO = -2
95 ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
96 INFO = -7
97 END IF
98 IF( INFO.NE.0 ) THEN
99 CALL XERBLA( 'DGTSV ', -INFO )
100 RETURN
101 END IF
102 *
103 IF( N.EQ.0 )
104 $ RETURN
105 *
106 IF( NRHS.EQ.1 ) THEN
107 DO 10 I = 1, N - 2
108 IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
109 *
110 * No row interchange required
111 *
112 IF( D( I ).NE.ZERO ) THEN
113 FACT = DL( I ) / D( I )
114 D( I+1 ) = D( I+1 ) - FACT*DU( I )
115 B( I+1, 1 ) = B( I+1, 1 ) - FACT*B( I, 1 )
116 ELSE
117 INFO = I
118 RETURN
119 END IF
120 DL( I ) = ZERO
121 ELSE
122 *
123 * Interchange rows I and I+1
124 *
125 FACT = D( I ) / DL( I )
126 D( I ) = DL( I )
127 TEMP = D( I+1 )
128 D( I+1 ) = DU( I ) - FACT*TEMP
129 DL( I ) = DU( I+1 )
130 DU( I+1 ) = -FACT*DL( I )
131 DU( I ) = TEMP
132 TEMP = B( I, 1 )
133 B( I, 1 ) = B( I+1, 1 )
134 B( I+1, 1 ) = TEMP - FACT*B( I+1, 1 )
135 END IF
136 10 CONTINUE
137 IF( N.GT.1 ) THEN
138 I = N - 1
139 IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
140 IF( D( I ).NE.ZERO ) THEN
141 FACT = DL( I ) / D( I )
142 D( I+1 ) = D( I+1 ) - FACT*DU( I )
143 B( I+1, 1 ) = B( I+1, 1 ) - FACT*B( I, 1 )
144 ELSE
145 INFO = I
146 RETURN
147 END IF
148 ELSE
149 FACT = D( I ) / DL( I )
150 D( I ) = DL( I )
151 TEMP = D( I+1 )
152 D( I+1 ) = DU( I ) - FACT*TEMP
153 DU( I ) = TEMP
154 TEMP = B( I, 1 )
155 B( I, 1 ) = B( I+1, 1 )
156 B( I+1, 1 ) = TEMP - FACT*B( I+1, 1 )
157 END IF
158 END IF
159 IF( D( N ).EQ.ZERO ) THEN
160 INFO = N
161 RETURN
162 END IF
163 ELSE
164 DO 40 I = 1, N - 2
165 IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
166 *
167 * No row interchange required
168 *
169 IF( D( I ).NE.ZERO ) THEN
170 FACT = DL( I ) / D( I )
171 D( I+1 ) = D( I+1 ) - FACT*DU( I )
172 DO 20 J = 1, NRHS
173 B( I+1, J ) = B( I+1, J ) - FACT*B( I, J )
174 20 CONTINUE
175 ELSE
176 INFO = I
177 RETURN
178 END IF
179 DL( I ) = ZERO
180 ELSE
181 *
182 * Interchange rows I and I+1
183 *
184 FACT = D( I ) / DL( I )
185 D( I ) = DL( I )
186 TEMP = D( I+1 )
187 D( I+1 ) = DU( I ) - FACT*TEMP
188 DL( I ) = DU( I+1 )
189 DU( I+1 ) = -FACT*DL( I )
190 DU( I ) = TEMP
191 DO 30 J = 1, NRHS
192 TEMP = B( I, J )
193 B( I, J ) = B( I+1, J )
194 B( I+1, J ) = TEMP - FACT*B( I+1, J )
195 30 CONTINUE
196 END IF
197 40 CONTINUE
198 IF( N.GT.1 ) THEN
199 I = N - 1
200 IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
201 IF( D( I ).NE.ZERO ) THEN
202 FACT = DL( I ) / D( I )
203 D( I+1 ) = D( I+1 ) - FACT*DU( I )
204 DO 50 J = 1, NRHS
205 B( I+1, J ) = B( I+1, J ) - FACT*B( I, J )
206 50 CONTINUE
207 ELSE
208 INFO = I
209 RETURN
210 END IF
211 ELSE
212 FACT = D( I ) / DL( I )
213 D( I ) = DL( I )
214 TEMP = D( I+1 )
215 D( I+1 ) = DU( I ) - FACT*TEMP
216 DU( I ) = TEMP
217 DO 60 J = 1, NRHS
218 TEMP = B( I, J )
219 B( I, J ) = B( I+1, J )
220 B( I+1, J ) = TEMP - FACT*B( I+1, J )
221 60 CONTINUE
222 END IF
223 END IF
224 IF( D( N ).EQ.ZERO ) THEN
225 INFO = N
226 RETURN
227 END IF
228 END IF
229 *
230 * Back solve with the matrix U from the factorization.
231 *
232 IF( NRHS.LE.2 ) THEN
233 J = 1
234 70 CONTINUE
235 B( N, J ) = B( N, J ) / D( N )
236 IF( N.GT.1 )
237 $ B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) / D( N-1 )
238 DO 80 I = N - 2, 1, -1
239 B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DL( I )*
240 $ B( I+2, J ) ) / D( I )
241 80 CONTINUE
242 IF( J.LT.NRHS ) THEN
243 J = J + 1
244 GO TO 70
245 END IF
246 ELSE
247 DO 100 J = 1, NRHS
248 B( N, J ) = B( N, J ) / D( N )
249 IF( N.GT.1 )
250 $ B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) /
251 $ D( N-1 )
252 DO 90 I = N - 2, 1, -1
253 B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DL( I )*
254 $ B( I+2, J ) ) / D( I )
255 90 CONTINUE
256 100 CONTINUE
257 END IF
258 *
259 RETURN
260 *
261 * End of DGTSV
262 *
263 END