V3FIT
li_gesl.f
1  SUBROUTINE sgesl1 (A, LDA, N, 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, INTENT(IN) :: LDA, N, JOB
8  INTEGER, DIMENSION(N), INTENT(IN) :: IPVT
9  REAL(WP), DIMENSION(*), INTENT(IN) :: A
10  REAL(WP), DIMENSION(N), INTENT(INOUT) :: B
11 
12  CALL sgesl(a, lda, n, ipvt, b, job)
13 
14  END SUBROUTINE sgesl1
15 
16  SUBROUTINE dgesl1 (A, LDA, N, IPVT, B, JOB)
17  USE liprec, ONLY: wp => dp
18  IMPLICIT NONE
19 
20 C-----------------------------------------------
21 C D U M M Y A R G U M E N T S
22 C-----------------------------------------------
23  INTEGER, INTENT(IN) :: LDA, N, JOB
24  INTEGER, DIMENSION(N), INTENT(IN) :: IPVT
25  REAL(WP), DIMENSION(*), INTENT(IN) :: A
26  REAL(WP), DIMENSION(N), INTENT(INOUT) :: B
27 
28  CALL dgesl(a, lda, n, ipvt, b, job)
29 
30  END SUBROUTINE dgesl1
31 
32 #ifndef CRAY
33  SUBROUTINE sgesl (A, LDA, N, IPVT, B, JOB)
34  USE liprec, ONLY: wp => sp
35  IMPLICIT NONE
36 C-----------------------------------------------
37 C D U M M Y A R G U M E N T S
38 C-----------------------------------------------
39  INTEGER, INTENT(IN) :: LDA, N, JOB
40  INTEGER, DIMENSION(N), INTENT(IN) :: IPVT
41  REAL(WP), DIMENSION(LDA,N), INTENT(IN) :: A
42  REAL(WP), DIMENSION(N), INTENT(INOUT) :: B
43 C-----------------------------------------------
44 C L O C A L V A R I A B L E S
45 C-----------------------------------------------
46  INTEGER :: K, L, NM1
47  REAL(WP) :: ELEMENT
48 C-----------------------------------------------
49 c
50 c sgesl solves the real system
51 c a * x = b or trans(a) * x = b
52 c using the factors computed by sgeco or sgefa.
53 c
54 c on ENTRY
55 c
56 c a REAL(lda, n)
57 c the output from sgeco or sgefa.
58 c
59 c lda INTEGER
60 c the leading dimension of the array a .
61 c
62 c n INTEGER
63 c the order of the matrix a .
64 c
65 c ipvt INTEGER(n)
66 c the pivot vector from sgeco or sgefa.
67 c
68 c b REAL(n)
69 c the right hand side vector.
70 c
71 c job INTEGER
72 c = 0 to solve a*x = b ,
73 c = nonzero to solve trans(a)*x = b where
74 c trans(a) is the transpose.
75 c
76 c on RETURN
77 c
78 c b the solution vector x .
79 c
80 c error condition
81 c
82 c a division by zero will occur if the input factor contains a
83 c zero on the diagonal. technically this indicates singularity
84 c but it is often caused by improper arguments or improper
85 c setting of lda . it will not occur if the subroutines are
86 c called correctly and if sgeco has set rcond.gt.0.0
87 c or sgefa has set info.eq.0 .
88 c
89 c
90 c linpack. this version dated 08/14/78 .
91 c cleve moler, university of new mexico, argonne national lab.
92 c
93 c
94  nm1 = n - 1
95  IF (job .eq. 0) THEN
96 c
97 c job = 0 , solve a * x = b
98 c first solve l*y = b
99 c
100  IF (nm1 .ge. 1) THEN
101  DO k = 1, nm1
102  l = ipvt(k)
103  element = b(l)
104  IF (l .ne. k) THEN
105  b(l) = b(k)
106  b(k) = element
107  END IF
108 ! CALL bla_axpy(n-k,element,a(k+1,k),1,b(k+1),1)
109  b(k+1:n) = b(k+1:n) + element*a(k+1:n,k)
110  END DO
111  END IF
112 c
113 c now solve u*x = y
114 c
115  DO k = n, 1, -1
116  b(k) = b(k)/a(k,k)
117  element = -b(k)
118 ! CALL bla_axpy(k-1,element,a(1,k),1,b,1)
119  b(1:k-1) = b(1:k-1) + element*a(1:k-1,k)
120  END DO
121  ELSE
122 c
123 c job = nonzero, solve trans(a) * x = b
124 c first solve trans(u)*y = b
125 c
126  DO k = 1, n
127  element = sum(a(:k-1,k)*b(:k-1))
128  b(k) = (b(k)-element)/a(k,k)
129  END DO
130 c
131 c now solve trans(l)*x = y
132 c
133  IF (nm1 .ge. 1) THEN
134  DO k = nm1, 1, -1
135  b(k) = b(k) + sum(a(k+1:n,k)*b(k+1:n))
136  l = ipvt(k)
137  IF (l .ne. k) THEN
138  element = b(l)
139  b(l) = b(k)
140  b(k) = element
141  END IF
142  END DO
143  END IF
144  END IF
145 
146  END SUBROUTINE sgesl
147 
148  SUBROUTINE dgesl (A, LDA, N, IPVT, B, JOB)
149  USE liprec, ONLY: wp => dp
150  IMPLICIT NONE
151 C-----------------------------------------------
152 C D U M M Y A R G U M E N T S
153 C-----------------------------------------------
154  INTEGER, INTENT(IN) :: LDA, N, JOB
155  INTEGER, DIMENSION(N), INTENT(IN) :: IPVT
156  REAL(WP), DIMENSION(LDA,N), INTENT(IN) :: A
157  REAL(WP), DIMENSION(N), INTENT(INOUT) :: B
158 C-----------------------------------------------
159 C L O C A L V A R I A B L E S
160 C-----------------------------------------------
161  INTEGER :: K, L, NM1
162  REAL(WP) :: ELEMENT
163 C-----------------------------------------------
164 c
165 c sgesl solves the REAL system
166 c a * x = b or trans(a) * x = b
167 c using the factors computed by sgeco or sgefa.
168 c
169 c on ENTRY
170 c
171 c a REAL(lda, n)
172 c the output from sgeco or sgefa.
173 c
174 c lda INTEGER
175 c the leading DIMENSION of the array a .
176 c
177 c n INTEGER
178 c the order of the matrix a .
179 c
180 c ipvt INTEGER(n)
181 c the pivot vector from sgeco or sgefa.
182 c
183 c b REAL(n)
184 c the right hand side vector.
185 c
186 c job INTEGER
187 c = 0 to solve a*x = b ,
188 c = nonzero to solve trans(a)*x = b WHERE
189 c trans(a) is the TRANSPOSE.
190 c
191 c on RETURN
192 c
193 c b the solution vector x .
194 c
195 c error condition
196 c
197 c a division by zero will occur if the input factor contains a
198 c zero on the diagonal. technically this indicates singularity
199 c but it is often caused by improper arguments or improper
200 c setting of lda . it will not occur if the subroutines are
201 c called correctly and if sgeco has set rcond.gt.0.0
202 c or sgefa has set info.eq.0 .
203 c
204 c
205 c linpack. this version dated 08/14/78 .
206 c cleve moler, university of new mexico, argonne national lab.
207 c
208 c
209  nm1 = n - 1
210  IF (job .eq. 0) THEN
211 c
212 c job = 0 , solve a * x = b
213 c first solve l*y = b
214 c
215  IF (nm1 .ge. 1) THEN
216  DO k = 1, nm1
217  l = ipvt(k)
218  element = b(l)
219  IF (l .ne. k) THEN
220  b(l) = b(k)
221  b(k) = element
222  END IF
223 ! CALL bla_axpy(n-k,element,a(k+1,k),1,b(k+1),1)
224  b(k+1:n) = b(k+1:n) + element*a(k+1:n,k)
225  END DO
226  END IF
227 c
228 c now solve u*x = y
229 c
230  DO k = n, 1, -1
231  b(k) = b(k)/a(k,k)
232  element = -b(k)
233 ! CALL bla_axpy(k-1,element,a(1,k),1,b,1)
234  b(1:k-1) = b(1:k-1) + element*a(1:k-1,k)
235  END DO
236  ELSE
237 c
238 c job = nonzero, solve trans(a) * x = b
239 c first solve trans(u)*y = b
240 c
241  DO k = 1, n
242  element = sum(a(:k-1,k)*b(:k-1))
243  b(k) = (b(k)-element)/a(k,k)
244  END DO
245 c
246 c now solve trans(l)*x = y
247 c
248  IF (nm1 .ge. 1) THEN
249  DO k = nm1, 1, -1
250  b(k) = b(k) + sum(a(k+1:n,k)*b(k+1:n))
251  l = ipvt(k)
252  IF (l .ne. k) THEN
253  element = b(l)
254  b(l) = b(k)
255  b(k) = element
256  END IF
257  END DO
258  END IF
259  END IF
260 
261  END SUBROUTINE dgesl
262 #endif