131
132
133
134
135
136 IMPLICIT NONE
137
138
139 CHARACTER UPLO
140 INTEGER N, NRHS, LDA, LDB, LWORK, INFO
141
142
143 INTEGER IPIV( * )
144 REAL A( LDA, * ), B( LDB, * ), WORK( * )
145
146
147
148
149 REAL ONE
150 parameter( one = 1.0e+0 )
151
152
153 LOGICAL LQUERY, UPPER
154 INTEGER K, KP, LWKOPT
155
156
157 LOGICAL LSAME
159
160
162
163
164 INTRINSIC max
165
166
167
168 info = 0
169 upper =
lsame( uplo,
'U' )
170 lquery = ( lwork.EQ.-1 )
171 IF( .NOT.upper .AND. .NOT.
lsame( uplo,
'L' ) )
THEN
172 info = -1
173 ELSE IF( n.LT.0 ) THEN
174 info = -2
175 ELSE IF( nrhs.LT.0 ) THEN
176 info = -3
177 ELSE IF( lda.LT.max( 1, n ) ) THEN
178 info = -5
179 ELSE IF( ldb.LT.max( 1, n ) ) THEN
180 info = -8
181 ELSE IF( lwork.LT.max( 1, 3*n-2 ) .AND. .NOT.lquery ) THEN
182 info = -10
183 END IF
184 IF( info.NE.0 ) THEN
185 CALL xerbla(
'SSYTRS_AA', -info )
186 RETURN
187 ELSE IF( lquery ) THEN
188 lwkopt = (3*n-2)
189 work( 1 ) = lwkopt
190 RETURN
191 END IF
192
193
194
195 IF( n.EQ.0 .OR. nrhs.EQ.0 )
196 $ RETURN
197
198 IF( upper ) THEN
199
200
201
202
203
204 IF( n.GT.1 ) THEN
205
206
207
208 k = 1
209 DO WHILE ( k.LE.n )
210 kp = ipiv( k )
211 IF( kp.NE.k )
212 $
CALL sswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
213 k = k + 1
214 END DO
215
216
217
218 CALL strsm(
'L',
'U',
'T',
'U', n-1, nrhs, one, a( 1, 2 ),
219 $ lda, b( 2, 1 ), ldb)
220 END IF
221
222
223
224
225
226 CALL slacpy(
'F', 1, n, a(1, 1), lda+1, work(n), 1)
227 IF( n.GT.1 ) THEN
228 CALL slacpy(
'F', 1, n-1, a(1, 2), lda+1, work(1), 1)
229 CALL slacpy(
'F', 1, n-1, a(1, 2), lda+1, work(2*n), 1)
230 END IF
231 CALL sgtsv(n, nrhs, work(1), work(n), work(2*n), b, ldb,
232 $ info)
233
234
235
236 IF( n.GT.1 ) THEN
237
238
239
240
241 CALL strsm(
'L',
'U',
'N',
'U', n-1, nrhs, one, a( 1, 2 ),
242 $ lda, b(2, 1), ldb)
243
244
245
246 k = n
247 DO WHILE ( k.GE.1 )
248 kp = ipiv( k )
249 IF( kp.NE.k )
250 $
CALL sswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
251 k = k - 1
252 END DO
253 END IF
254
255 ELSE
256
257
258
259
260
261 IF( n.GT.1 ) THEN
262
263
264
265 k = 1
266 DO WHILE ( k.LE.n )
267 kp = ipiv( k )
268 IF( kp.NE.k )
269 $
CALL sswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
270 k = k + 1
271 END DO
272
273
274
275 CALL strsm(
'L',
'L',
'N',
'U', n-1, nrhs, one, a( 2, 1),
276 $ lda, b(2, 1), ldb)
277 END IF
278
279
280
281
282
283 CALL slacpy(
'F', 1, n, a(1, 1), lda+1, work(n), 1)
284 IF( n.GT.1 ) THEN
285 CALL slacpy(
'F', 1, n-1, a(2, 1), lda+1, work(1), 1)
286 CALL slacpy(
'F', 1, n-1, a(2, 1), lda+1, work(2*n), 1)
287 END IF
288 CALL sgtsv(n, nrhs, work(1), work(n), work(2*n), b, ldb,
289 $ info)
290
291
292
293 IF( n.GT.1 ) THEN
294
295
296
297 CALL strsm(
'L',
'L',
'T',
'U', n-1, nrhs, one, a( 2, 1 ),
298 $ lda, b( 2, 1 ), ldb)
299
300
301
302 k = n
303 DO WHILE ( k.GE.1 )
304 kp = ipiv( k )
305 IF( kp.NE.k )
306 $
CALL sswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
307 k = k - 1
308 END DO
309 END IF
310
311 END IF
312
313 RETURN
314
315
316
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.
subroutine xerbla(SRNAME, INFO)
XERBLA
logical function lsame(CA, CB)
LSAME
subroutine sgtsv(N, NRHS, DL, D, DU, B, LDB, INFO)
SGTSV computes the solution to system of linear equations A * X = B for GT matrices
subroutine sswap(N, SX, INCX, SY, INCY)
SSWAP
subroutine strsm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
STRSM