SUBROUTINE DGTSV( N, NRHS, DL, D, DU, B, LDB, INFO )
INTEGER INFO, LDB, N, NRHS
DOUBLE PRECISION B( LDB, * ), D( * ), DL( * ), DU( * )
DOUBLE PRECISION ZERO
PARAMETER ( ZERO = 0.0D+0 )
INTEGER I, J
DOUBLE PRECISION FACT, TEMP
INTRINSIC ABS, MAX
EXTERNAL XERBLA
INFO = 0
IF( N.LT.0 ) THEN
INFO = -1
ELSE IF( NRHS.LT.0 ) THEN
INFO = -2
ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
INFO = -7
END IF
IF( INFO.NE.0 ) THEN
CALL XERBLA( 'DGTSV ', -INFO )
RETURN
END IF
IF( N.EQ.0 )
$ RETURN
IF( NRHS.EQ.1 ) THEN
DO 10 I = 1, N - 2
IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
IF( D( I ).NE.ZERO ) THEN
FACT = DL( I ) / D( I )
D( I+1 ) = D( I+1 ) - FACT*DU( I )
B( I+1, 1 ) = B( I+1, 1 ) - FACT*B( I, 1 )
ELSE
INFO = I
RETURN
END IF
DL( I ) = ZERO
ELSE
FACT = D( I ) / DL( I )
D( I ) = DL( I )
TEMP = D( I+1 )
D( I+1 ) = DU( I ) - FACT*TEMP
DL( I ) = DU( I+1 )
DU( I+1 ) = -FACT*DL( I )
DU( I ) = TEMP
TEMP = B( I, 1 )
B( I, 1 ) = B( I+1, 1 )
B( I+1, 1 ) = TEMP - FACT*B( I+1, 1 )
END IF
10 CONTINUE
IF( N.GT.1 ) THEN
I = N - 1
IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
IF( D( I ).NE.ZERO ) THEN
FACT = DL( I ) / D( I )
D( I+1 ) = D( I+1 ) - FACT*DU( I )
B( I+1, 1 ) = B( I+1, 1 ) - FACT*B( I, 1 )
ELSE
INFO = I
RETURN
END IF
ELSE
FACT = D( I ) / DL( I )
D( I ) = DL( I )
TEMP = D( I+1 )
D( I+1 ) = DU( I ) - FACT*TEMP
DU( I ) = TEMP
TEMP = B( I, 1 )
B( I, 1 ) = B( I+1, 1 )
B( I+1, 1 ) = TEMP - FACT*B( I+1, 1 )
END IF
END IF
IF( D( N ).EQ.ZERO ) THEN
INFO = N
RETURN
END IF
ELSE
DO 40 I = 1, N - 2
IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
IF( D( I ).NE.ZERO ) THEN
FACT = DL( I ) / D( I )
D( I+1 ) = D( I+1 ) - FACT*DU( I )
DO 20 J = 1, NRHS
B( I+1, J ) = B( I+1, J ) - FACT*B( I, J )
20 CONTINUE
ELSE
INFO = I
RETURN
END IF
DL( I ) = ZERO
ELSE
FACT = D( I ) / DL( I )
D( I ) = DL( I )
TEMP = D( I+1 )
D( I+1 ) = DU( I ) - FACT*TEMP
DL( I ) = DU( I+1 )
DU( I+1 ) = -FACT*DL( I )
DU( I ) = TEMP
DO 30 J = 1, NRHS
TEMP = B( I, J )
B( I, J ) = B( I+1, J )
B( I+1, J ) = TEMP - FACT*B( I+1, J )
30 CONTINUE
END IF
40 CONTINUE
IF( N.GT.1 ) THEN
I = N - 1
IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
IF( D( I ).NE.ZERO ) THEN
FACT = DL( I ) / D( I )
D( I+1 ) = D( I+1 ) - FACT*DU( I )
DO 50 J = 1, NRHS
B( I+1, J ) = B( I+1, J ) - FACT*B( I, J )
50 CONTINUE
ELSE
INFO = I
RETURN
END IF
ELSE
FACT = D( I ) / DL( I )
D( I ) = DL( I )
TEMP = D( I+1 )
D( I+1 ) = DU( I ) - FACT*TEMP
DU( I ) = TEMP
DO 60 J = 1, NRHS
TEMP = B( I, J )
B( I, J ) = B( I+1, J )
B( I+1, J ) = TEMP - FACT*B( I+1, J )
60 CONTINUE
END IF
END IF
IF( D( N ).EQ.ZERO ) THEN
INFO = N
RETURN
END IF
END IF
IF( NRHS.LE.2 ) THEN
J = 1
70 CONTINUE
B( N, J ) = B( N, J ) / D( N )
IF( N.GT.1 )
$ B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) / D( N-1 )
DO 80 I = N - 2, 1, -1
B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DL( I )*
$ B( I+2, J ) ) / D( I )
80 CONTINUE
IF( J.LT.NRHS ) THEN
J = J + 1
GO TO 70
END IF
ELSE
DO 100 J = 1, NRHS
B( N, J ) = B( N, J ) / D( N )
IF( N.GT.1 )
$ B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) /
$ D( N-1 )
DO 90 I = N - 2, 1, -1
B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DL( I )*
$ B( I+2, J ) ) / D( I )
90 CONTINUE
100 CONTINUE
END IF
RETURN
END