V3FIT
All Classes Namespaces Files Functions Variables Enumerations Macros Pages
li_gbsl.f
1  SUBROUTINE sgbsl1 (ABD, LDA, N, ML, MU, IPVT, B, JOB)
2  USE liprec, ONLY: wp => sp
3  IMPLICIT NONE
4 C-----------------------------------------------
5 C D U M M Y A R G U M E N T S
6 C-----------------------------------------------
7  INTEGER LDA, N, ML, MU, JOB
8  INTEGER, DIMENSION(N) :: IPVT
9  REAL(WP), DIMENSION(*) :: ABD
10  REAL(WP), DIMENSION(N) :: B
11 
12  CALL sgbsl (abd, lda, n, ml, mu, ipvt, b, job)
13 
14  END SUBROUTINE sgbsl1
15 
16  SUBROUTINE dgbsl1 (ABD, LDA, N, ML, MU, IPVT, B, JOB)
17  USE liprec, ONLY: wp => dp
18  IMPLICIT NONE
19 C-----------------------------------------------
20 C D U M M Y A R G U M E N T S
21 C-----------------------------------------------
22  INTEGER LDA, N, ML, MU, JOB
23  INTEGER, DIMENSION(N) :: IPVT
24  REAL(WP), DIMENSION(*) :: ABD
25  REAL(WP), DIMENSION(N) :: B
26 
27  CALL dgbsl (abd, lda, n, ml, mu, ipvt, b, job)
28 
29  END SUBROUTINE dgbsl1
30 
31 #ifndef CRAY
32  SUBROUTINE sgbsl (ABD, LDA, N, ML, MU, IPVT, B, JOB)
33  USE liprec, ONLY: wp => sp
34  IMPLICIT NONE
35 C-----------------------------------------------
36 C D U M M Y A R G U M E N T S
37 C-----------------------------------------------
38  INTEGER LDA, N, ML, MU, JOB
39  INTEGER, DIMENSION(N) :: IPVT
40  REAL(WP), DIMENSION(LDA,N) :: ABD
41  REAL(WP), DIMENSION(N) :: B
42 C-----------------------------------------------
43 C L O C A L V A R I A B L E S
44 C-----------------------------------------------
45  INTEGER :: K, KB, L, LA, LB, LM, M, NM1
46  REAL(WP) :: T
47 C-----------------------------------------------
48 C E X T E R N A L F U N C T I O N S
49 C-----------------------------------------------
50  REAL(WP) , EXTERNAL :: sdot
51  EXTERNAL saxpy
52 C-----------------------------------------------
53 c
54 c sgbsl solves the real band system
55 c a * x = b or trans(a) * x = b
56 c using the factors computed by sgbco or sgbfa.
57 c
58 c on ENTRY
59 c
60 c abd REAL(lda, n)
61 c the output from sgbco or sgbfa.
62 c
63 c lda INTEGER
64 c the leading DIMENSION of the array abd .
65 c
66 c n INTEGER
67 c the order of the original matrix.
68 c
69 c ml INTEGER
70 c number of diagonals below the main diagonal.
71 c
72 c mu INTEGER
73 c number of diagonals above the main diagonal.
74 c
75 c ipvt INTEGER(n)
76 c the pivot vector from sgbco or sgbfa.
77 c
78 c b REAL(n)
79 c the right hand side vector.
80 c
81 c job INTEGER
82 c = 0 to solve a*x = b ,
83 c = nonzero to solve trans(a)*x = b , WHERE
84 c trans(a) is the TRANSPOSE.
85 c
86 c on RETURN
87 c
88 c b the solution vector x .
89 c
90 c error condition
91 c
92 c a division by zero will occur if the input factor contains a
93 c zero on the diagonal. technically this indicates singularity
94 c but it is often caused by improper arguments or improper
95 c setting of lda . it will not occur if the subroutines are
96 c called correctly and if sgbco has set rcond .gt. 0.0
97 c or sgbfa has set info .eq. 0 .
98 c
99 c to compute inverse(a) * c where c is a matrix
100 c with p columns
101 c call sgbco(abd,lda,n,ml,mu,ipvt,rcond,z)
102 c if (rcond is too small) go to ...
103 c do 10 j = 1, p
104 c call sgbsl(abd,lda,n,ml,mu,ipvt,c(1,j),0)
105 c 10 continue
106 c
107 c linpack. this version dated 08/14/78 .
108 c cleve moler, university of new mexico, argonne national lab.
109 c
110 c subroutines and functions
111 c
112 c blas saxpy ,sdot
113 c fortran min
114 c
115 c internal variables
116 c
117 c
118  m = mu + ml + 1
119  nm1 = n - 1
120  IF (job .eq. 0) THEN
121 c
122 c job = 0 , solve a * x = b
123 c first solve l*y = b
124 c
125  IF (ml .ne. 0) THEN
126  DO k = 1, nm1
127  lm = min(ml,n - k)
128  l = ipvt(k)
129  t = b(l)
130  IF (l .ne. k) THEN
131  b(l) = b(k)
132  b(k) = t
133  END IF
134  CALL saxpy (lm, t, abd(m+1,k), 1, b(k+1), 1)
135  END DO
136  END IF
137 c
138 c now solve u*x = y
139 c
140  DO kb = 1, n
141  k = n + 1 - kb
142  b(k) = b(k)/abd(m,k)
143  lm = min(k,m) - 1
144  la = m - lm
145  lb = k - lm
146  t = -b(k)
147  CALL saxpy (lm, t, abd(la,k), 1, b(lb), 1)
148  END DO
149  ELSE
150 c
151 c job = nonzero, solve trans(a) * x = b
152 c first solve trans(u)*y = b
153 c
154  DO k = 1, n
155  lm = min(k,m) - 1
156  la = m - lm
157  lb = k - lm
158  t = sdot(lm,abd(la,k),1,b(lb),1)
159  b(k) = (b(k)-t)/abd(m,k)
160  END DO
161 c
162 c now solve trans(l)*x = y
163 c
164  IF (ml .ne. 0) THEN
165  DO kb = 1, nm1
166  k = n - kb
167  lm = min(ml,n - k)
168  b(k) = b(k) + sdot(lm,abd(m+1,k),1,b(k+1),1)
169  l = ipvt(k)
170  IF (l .ne. k) THEN
171  t = b(l)
172  b(l) = b(k)
173  b(k) = t
174  END IF
175  END DO
176  END IF
177  END IF
178 
179  END SUBROUTINE sgbsl
180 
181  SUBROUTINE dgbsl (ABD, LDA, N, ML, MU, IPVT, B, JOB)
182  USE liprec, ONLY: wp => dp
183  IMPLICIT NONE
184 C-----------------------------------------------
185 C D U M M Y A R G U M E N T S
186 C-----------------------------------------------
187  INTEGER LDA, N, ML, MU, JOB
188  INTEGER, DIMENSION(N) :: IPVT
189  REAL(WP), DIMENSION(LDA,N) :: ABD
190  REAL(WP), DIMENSION(N) :: B
191 C-----------------------------------------------
192 C L O C A L V A R I A B L E S
193 C-----------------------------------------------
194  INTEGER :: K, KB, L, LA, LB, LM, M, NM1
195  REAL(WP) :: T
196 C-----------------------------------------------
197 C E X T E R N A L F U N C T I O N S
198 C-----------------------------------------------
199  REAL(WP) , EXTERNAL :: ddot
200  EXTERNAL daxpy
201 C-----------------------------------------------
202 c
203 c sgbsl solves the REAL band system
204 c a * x = b or trans(a) * x = b
205 c using the factors computed by sgbco or sgbfa.
206 c
207 c on ENTRY
208 c
209 c abd REAL(lda, n)
210 c the output from sgbco or sgbfa.
211 c
212 c lda INTEGER
213 c the leading DIMENSION of the array abd .
214 c
215 c n INTEGER
216 c the order of the original matrix.
217 c
218 c ml INTEGER
219 c number of diagonals below the main diagonal.
220 c
221 c mu INTEGER
222 c number of diagonals above the main diagonal.
223 c
224 c ipvt INTEGER(n)
225 c the pivot vector from sgbco or sgbfa.
226 c
227 c b REAL(n)
228 c the right hand side vector.
229 c
230 c job INTEGER
231 c = 0 to solve a*x = b ,
232 c = nonzero to solve trans(a)*x = b , WHERE
233 c trans(a) is the TRANSPOSE.
234 c
235 c on RETURN
236 c
237 c b the solution vector x .
238 c
239 c error condition
240 c
241 c a division by zero will occur if the input factor contains a
242 c zero on the diagonal. technically this indicates singularity
243 c but it is often caused by improper arguments or improper
244 c setting of lda . it will not occur if the subroutines are
245 c called correctly and if sgbco has set rcond .gt. 0.0
246 c or sgbfa has set info .eq. 0 .
247 c
248 c to compute inverse(a) * c where c is a matrix
249 c with p columns
250 c call sgbco(abd,lda,n,ml,mu,ipvt,rcond,z)
251 c if (rcond is too small) go to ...
252 c do 10 j = 1, p
253 c call sgbsl(abd,lda,n,ml,mu,ipvt,c(1,j),0)
254 c 10 continue
255 c
256 c linpack. this version dated 08/14/78 .
257 c cleve moler, university of new mexico, argonne national lab.
258 c
259 c subroutines and functions
260 c
261 c blas daxpy ,ddot
262 c fortran min
263 c
264 c internal variables
265 c
266 c
267  m = mu + ml + 1
268  nm1 = n - 1
269  IF (job .eq. 0) THEN
270 c
271 c job = 0 , solve a * x = b
272 c first solve l*y = b
273 c
274  IF (ml .ne. 0) THEN
275  DO k = 1, nm1
276  lm = min(ml,n - k)
277  l = ipvt(k)
278  t = b(l)
279  IF (l .ne. k) THEN
280  b(l) = b(k)
281  b(k) = t
282  END IF
283  CALL daxpy (lm, t, abd(m+1,k), 1, b(k+1), 1)
284  END DO
285  END IF
286 c
287 c now solve u*x = y
288 c
289  DO kb = 1, n
290  k = n + 1 - kb
291  b(k) = b(k)/abd(m,k)
292  lm = min(k,m) - 1
293  la = m - lm
294  lb = k - lm
295  t = -b(k)
296  CALL daxpy (lm, t, abd(la,k), 1, b(lb), 1)
297  END DO
298  ELSE
299 c
300 c job = nonzero, solve trans(a) * x = b
301 c first solve trans(u)*y = b
302 c
303  DO k = 1, n
304  lm = min(k,m) - 1
305  la = m - lm
306  lb = k - lm
307  t = ddot(lm,abd(la,k),1,b(lb),1)
308  b(k) = (b(k)-t)/abd(m,k)
309  END DO
310 c
311 c now solve trans(l)*x = y
312 c
313  IF (ml .ne. 0) THEN
314  DO kb = 1, nm1
315  k = n - kb
316  lm = min(ml,n - k)
317  b(k) = b(k) + ddot(lm,abd(m+1,k),1,b(k+1),1)
318  l = ipvt(k)
319  IF (l .ne. k) THEN
320  t = b(l)
321  b(l) = b(k)
322  b(k) = t
323  END IF
324  END DO
325  END IF
326  END IF
327 
328  END SUBROUTINE dgbsl
329 #endif