File: RELATIVE:/../../../mfix.git/model/DGTSV.f
1
2 SUBROUTINE DGTSV( N, NRHS, DL, D, DU, B, LDB, INFO )
3
4
5
6
7
8
9
10
11 INTEGER INFO, LDB, N, NRHS
12
13
14 DOUBLE PRECISION B( LDB, * ), D( * ), DL( * ), DU( * )
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77 DOUBLE PRECISION ZERO
78 PARAMETER ( ZERO = 0.0D+0 )
79
80
81 INTEGER I, J
82 DOUBLE PRECISION FACT, TEMP
83
84
85 INTRINSIC ABS, MAX
86
87
88 EXTERNAL XERBLA
89
90
91
92 = 0
93 IF( N.LT.0 ) THEN
94 INFO = -1
95 ELSE IF( NRHS.LT.0 ) THEN
96 INFO = -2
97 ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
98 INFO = -7
99 END IF
100 IF( INFO.NE.0 ) THEN
101 CALL XERBLA( 'DGTSV ', -INFO )
102 RETURN
103 END IF
104
105 IF( N.EQ.0 ) RETURN
106
107 IF( NRHS.EQ.1 ) THEN
108 DO 10 I = 1, N - 2
109 IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
110
111
112
113 IF( D( I ).NE.ZERO ) THEN
114 FACT = DL( I ) / D( I )
115 D( I+1 ) = D( I+1 ) - FACT*DU( I )
116 B( I+1, 1 ) = B( I+1, 1 ) - FACT*B( I, 1 )
117 ELSE
118 INFO = I
119 RETURN
120 END IF
121 DL( I ) = ZERO
122 ELSE
123
124
125
126 = D( I ) / DL( I )
127 D( I ) = DL( I )
128 TEMP = D( I+1 )
129 D( I+1 ) = DU( I ) - FACT*TEMP
130 DL( I ) = DU( I+1 )
131 DU( I+1 ) = -FACT*DL( I )
132 DU( I ) = TEMP
133 TEMP = B( I, 1 )
134 B( I, 1 ) = B( I+1, 1 )
135 B( I+1, 1 ) = TEMP - FACT*B( I+1, 1 )
136 END IF
137 10 CONTINUE
138 IF( N.GT.1 ) THEN
139 I = N - 1
140 IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
141 IF( D( I ).NE.ZERO ) THEN
142 FACT = DL( I ) / D( I )
143 D( I+1 ) = D( I+1 ) - FACT*DU( I )
144 B( I+1, 1 ) = B( I+1, 1 ) - FACT*B( I, 1 )
145 ELSE
146 INFO = I
147 RETURN
148 END IF
149 ELSE
150 FACT = D( I ) / DL( I )
151 D( I ) = DL( I )
152 TEMP = D( I+1 )
153 D( I+1 ) = DU( I ) - FACT*TEMP
154 DU( I ) = TEMP
155 TEMP = B( I, 1 )
156 B( I, 1 ) = B( I+1, 1 )
157 B( I+1, 1 ) = TEMP - FACT*B( I+1, 1 )
158 END IF
159 END IF
160 IF( D( N ).EQ.ZERO ) THEN
161 INFO = N
162 RETURN
163 END IF
164 ELSE
165 DO 40 I = 1, N - 2
166 IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
167
168
169
170 IF( D( I ).NE.ZERO ) THEN
171 FACT = DL( I ) / D( I )
172 D( I+1 ) = D( I+1 ) - FACT*DU( I )
173 DO 20 J = 1, NRHS
174 B( I+1, J ) = B( I+1, J ) - FACT*B( I, J )
175 20 CONTINUE
176 ELSE
177 INFO = I
178 RETURN
179 END IF
180 DL( I ) = ZERO
181 ELSE
182
183
184
185 = D( I ) / DL( I )
186 D( I ) = DL( I )
187 TEMP = D( I+1 )
188 D( I+1 ) = DU( I ) - FACT*TEMP
189 DL( I ) = DU( I+1 )
190 DU( I+1 ) = -FACT*DL( I )
191 DU( I ) = TEMP
192 DO 30 J = 1, NRHS
193 TEMP = B( I, J )
194 B( I, J ) = B( I+1, J )
195 B( I+1, J ) = TEMP - FACT*B( I+1, J )
196 30 CONTINUE
197 END IF
198 40 CONTINUE
199 IF( N.GT.1 ) THEN
200 I = N - 1
201 IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
202 IF( D( I ).NE.ZERO ) THEN
203 FACT = DL( I ) / D( I )
204 D( I+1 ) = D( I+1 ) - FACT*DU( I )
205 DO 50 J = 1, NRHS
206 B( I+1, J ) = B( I+1, J ) - FACT*B( I, J )
207 50 CONTINUE
208 ELSE
209 INFO = I
210 RETURN
211 END IF
212 ELSE
213 FACT = D( I ) / DL( I )
214 D( I ) = DL( I )
215 TEMP = D( I+1 )
216 D( I+1 ) = DU( I ) - FACT*TEMP
217 DU( I ) = TEMP
218 DO 60 J = 1, NRHS
219 TEMP = B( I, J )
220 B( I, J ) = B( I+1, J )
221 B( I+1, J ) = TEMP - FACT*B( I+1, J )
222 60 CONTINUE
223 END IF
224 END IF
225 IF( D( N ).EQ.ZERO ) THEN
226 INFO = N
227 RETURN
228 END IF
229 END IF
230
231
232
233 IF( NRHS.LE.2 ) THEN
234 J = 1
235 70 CONTINUE
236 B( N, J ) = B( N, J ) / D( N )
237 IF( N.GT.1 ) &
238 B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) / D( N-1 )
239 DO 80 I = N - 2, 1, -1
240 B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DL( I )* &
241 B( I+2, J ) ) / D( I )
242 80 CONTINUE
243 IF( J.LT.NRHS ) THEN
244 J = J + 1
245 GO TO 70
246 END IF
247 ELSE
248 DO 100 J = 1, NRHS
249 B( N, J ) = B( N, J ) / D( N )
250 IF( N.GT.1 ) &
251 B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) / &
252 D( N-1 )
253 DO 90 I = N - 2, 1, -1
254 B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DL( I )*&
255 B( I+2, J ) ) / D( I )
256 90 CONTINUE
257 100 CONTINUE
258 END IF
259
260 RETURN
261
262
263
264 END SUBROUTINE DGTSV
265
266