155
156
157
158
159
160
161 CHARACTER DIAG, TRANS, UPLO
162 INTEGER INFO, LDA, LDB, N, NRHS
163
164
165 INTEGER IPIV( * )
166 DOUBLE PRECISION A( LDA, * ), B( LDB, * )
167
168
169
170
171
172 DOUBLE PRECISION ONE
173 parameter( one = 1.0d+0 )
174
175
176 LOGICAL NOUNIT
177 INTEGER J, K, KP
178 DOUBLE PRECISION D11, D12, D21, D22, T1, T2
179
180
181 LOGICAL LSAME
183
184
186
187
188 INTRINSIC abs, max
189
190
191
192
193
194 info = 0
195 IF( .NOT.
lsame( uplo,
'U' ) .AND. .NOT.
lsame( uplo,
'L' ) )
THEN
196 info = -1
197 ELSE IF( .NOT.
lsame( trans,
'N' ) .AND. .NOT.
198 $
lsame( trans,
'T' ) .AND. .NOT.
lsame( trans,
'C' ) )
THEN
199 info = -2
200 ELSE IF( .NOT.
lsame( diag,
'U' ) .AND. .NOT.
lsame( diag,
'N' ) )
201 $ THEN
202 info = -3
203 ELSE IF( n.LT.0 ) THEN
204 info = -4
205 ELSE IF( lda.LT.max( 1, n ) ) THEN
206 info = -6
207 ELSE IF( ldb.LT.max( 1, n ) ) THEN
208 info = -9
209 END IF
210 IF( info.NE.0 ) THEN
211 CALL xerbla(
'DLAVSY ', -info )
212 RETURN
213 END IF
214
215
216
217 IF( n.EQ.0 )
218 $ RETURN
219
220 nounit =
lsame( diag,
'N' )
221
222
223
224
225
226 IF(
lsame( trans,
'N' ) )
THEN
227
228
229
230
231 IF(
lsame( uplo,
'U' ) )
THEN
232
233
234
235 k = 1
236 10 CONTINUE
237 IF( k.GT.n )
238 $ GO TO 30
239 IF( ipiv( k ).GT.0 ) THEN
240
241
242
243
244
245 IF( nounit )
246 $
CALL dscal( nrhs, a( k, k ), b( k, 1 ), ldb )
247
248
249
250 IF( k.GT.1 ) THEN
251
252
253
254 CALL dger( k-1, nrhs, one, a( 1, k ), 1, b( k, 1 ),
255 $ ldb, b( 1, 1 ), ldb )
256
257
258
259 kp = ipiv( k )
260 IF( kp.NE.k )
261 $
CALL dswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
262 END IF
263 k = k + 1
264 ELSE
265
266
267
268
269
270 IF( nounit ) THEN
271 d11 = a( k, k )
272 d22 = a( k+1, k+1 )
273 d12 = a( k, k+1 )
274 d21 = d12
275 DO 20 j = 1, nrhs
276 t1 = b( k, j )
277 t2 = b( k+1, j )
278 b( k, j ) = d11*t1 + d12*t2
279 b( k+1, j ) = d21*t1 + d22*t2
280 20 CONTINUE
281 END IF
282
283
284
285 IF( k.GT.1 ) THEN
286
287
288
289 CALL dger( k-1, nrhs, one, a( 1, k ), 1, b( k, 1 ),
290 $ ldb, b( 1, 1 ), ldb )
291 CALL dger( k-1, nrhs, one, a( 1, k+1 ), 1,
292 $ b( k+1, 1 ), ldb, b( 1, 1 ), ldb )
293
294
295
296 kp = abs( ipiv( k ) )
297 IF( kp.NE.k )
298 $
CALL dswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
299 END IF
300 k = k + 2
301 END IF
302 GO TO 10
303 30 CONTINUE
304
305
306
307
308 ELSE
309
310
311
312 k = n
313 40 CONTINUE
314 IF( k.LT.1 )
315 $ GO TO 60
316
317
318
319
320 IF( ipiv( k ).GT.0 ) THEN
321
322
323
324
325
326 IF( nounit )
327 $
CALL dscal( nrhs, a( k, k ), b( k, 1 ), ldb )
328
329
330
331 IF( k.NE.n ) THEN
332 kp = ipiv( k )
333
334
335
336 CALL dger( n-k, nrhs, one, a( k+1, k ), 1, b( k, 1 ),
337 $ ldb, b( k+1, 1 ), ldb )
338
339
340
341
342 IF( kp.NE.k )
343 $
CALL dswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
344 END IF
345 k = k - 1
346
347 ELSE
348
349
350
351
352
353 IF( nounit ) THEN
354 d11 = a( k-1, k-1 )
355 d22 = a( k, k )
356 d21 = a( k, k-1 )
357 d12 = d21
358 DO 50 j = 1, nrhs
359 t1 = b( k-1, j )
360 t2 = b( k, j )
361 b( k-1, j ) = d11*t1 + d12*t2
362 b( k, j ) = d21*t1 + d22*t2
363 50 CONTINUE
364 END IF
365
366
367
368 IF( k.NE.n ) THEN
369
370
371
372 CALL dger( n-k, nrhs, one, a( k+1, k ), 1, b( k, 1 ),
373 $ ldb, b( k+1, 1 ), ldb )
374 CALL dger( n-k, nrhs, one, a( k+1, k-1 ), 1,
375 $ b( k-1, 1 ), ldb, b( k+1, 1 ), ldb )
376
377
378
379
380 kp = abs( ipiv( k ) )
381 IF( kp.NE.k )
382 $
CALL dswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
383 END IF
384 k = k - 2
385 END IF
386 GO TO 40
387 60 CONTINUE
388 END IF
389
390
391
392
393
394 ELSE
395
396
397
398
399
400 IF(
lsame( uplo,
'U' ) )
THEN
401
402
403
404 k = n
405 70 CONTINUE
406 IF( k.LT.1 )
407 $ GO TO 90
408
409
410
411 IF( ipiv( k ).GT.0 ) THEN
412 IF( k.GT.1 ) THEN
413
414
415
416 kp = ipiv( k )
417 IF( kp.NE.k )
418 $
CALL dswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
419
420
421
422 CALL dgemv(
'Transpose', k-1, nrhs, one, b, ldb,
423 $ a( 1, k ), 1, one, b( k, 1 ), ldb )
424 END IF
425 IF( nounit )
426 $
CALL dscal( nrhs, a( k, k ), b( k, 1 ), ldb )
427 k = k - 1
428
429
430
431 ELSE
432 IF( k.GT.2 ) THEN
433
434
435
436 kp = abs( ipiv( k ) )
437 IF( kp.NE.k-1 )
438 $
CALL dswap( nrhs, b( k-1, 1 ), ldb, b( kp, 1 ),
439 $ ldb )
440
441
442
443 CALL dgemv(
'Transpose', k-2, nrhs, one, b, ldb,
444 $ a( 1, k ), 1, one, b( k, 1 ), ldb )
445 CALL dgemv(
'Transpose', k-2, nrhs, one, b, ldb,
446 $ a( 1, k-1 ), 1, one, b( k-1, 1 ), ldb )
447 END IF
448
449
450
451 IF( nounit ) THEN
452 d11 = a( k-1, k-1 )
453 d22 = a( k, k )
454 d12 = a( k-1, k )
455 d21 = d12
456 DO 80 j = 1, nrhs
457 t1 = b( k-1, j )
458 t2 = b( k, j )
459 b( k-1, j ) = d11*t1 + d12*t2
460 b( k, j ) = d21*t1 + d22*t2
461 80 CONTINUE
462 END IF
463 k = k - 2
464 END IF
465 GO TO 70
466 90 CONTINUE
467
468
469
470
471
472 ELSE
473
474
475
476 k = 1
477 100 CONTINUE
478 IF( k.GT.n )
479 $ GO TO 120
480
481
482
483 IF( ipiv( k ).GT.0 ) THEN
484 IF( k.LT.n ) THEN
485
486
487
488 kp = ipiv( k )
489 IF( kp.NE.k )
490 $
CALL dswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
491
492
493
494 CALL dgemv(
'Transpose', n-k, nrhs, one, b( k+1, 1 ),
495 $ ldb, a( k+1, k ), 1, one, b( k, 1 ), ldb )
496 END IF
497 IF( nounit )
498 $
CALL dscal( nrhs, a( k, k ), b( k, 1 ), ldb )
499 k = k + 1
500
501
502
503 ELSE
504 IF( k.LT.n-1 ) THEN
505
506
507
508 kp = abs( ipiv( k ) )
509 IF( kp.NE.k+1 )
510 $
CALL dswap( nrhs, b( k+1, 1 ), ldb, b( kp, 1 ),
511 $ ldb )
512
513
514
515 CALL dgemv(
'Transpose', n-k-1, nrhs, one,
516 $ b( k+2, 1 ), ldb, a( k+2, k+1 ), 1, one,
517 $ b( k+1, 1 ), ldb )
518 CALL dgemv(
'Transpose', n-k-1, nrhs, one,
519 $ b( k+2, 1 ), ldb, a( k+2, k ), 1, one,
520 $ b( k, 1 ), ldb )
521 END IF
522
523
524
525 IF( nounit ) THEN
526 d11 = a( k, k )
527 d22 = a( k+1, k+1 )
528 d21 = a( k+1, k )
529 d12 = d21
530 DO 110 j = 1, nrhs
531 t1 = b( k, j )
532 t2 = b( k+1, j )
533 b( k, j ) = d11*t1 + d12*t2
534 b( k+1, j ) = d21*t1 + d22*t2
535 110 CONTINUE
536 END IF
537 k = k + 2
538 END IF
539 GO TO 100
540 120 CONTINUE
541 END IF
542
543 END IF
544 RETURN
545
546
547
subroutine xerbla(srname, info)
subroutine dgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
DGEMV
subroutine dger(m, n, alpha, x, incx, y, incy, a, lda)
DGER
logical function lsame(ca, cb)
LSAME
subroutine dscal(n, da, dx, incx)
DSCAL
subroutine dswap(n, dx, incx, dy, incy)
DSWAP