LAPACK  3.6.1
LAPACK: Linear Algebra PACKage
subroutine dgtsv ( integer  N,
integer  NRHS,
double precision, dimension( * )  DL,
double precision, dimension( * )  D,
double precision, dimension( * )  DU,
double precision, dimension( ldb, * )  B,
integer  LDB,
integer  INFO 
)

DGTSV computes the solution to system of linear equations A * X = B for GT matrices

Download DGTSV + dependencies [TGZ] [ZIP] [TXT]

Purpose:
 DGTSV  solves the equation

    A*X = B,

 where A is an n by n tridiagonal matrix, by Gaussian elimination with
 partial pivoting.

 Note that the equation  A**T*X = B  may be solved by interchanging the
 order of the arguments DU and DL.
Parameters
[in]N
          N is INTEGER
          The order of the matrix A.  N >= 0.
[in]NRHS
          NRHS is INTEGER
          The number of right hand sides, i.e., the number of columns
          of the matrix B.  NRHS >= 0.
[in,out]DL
          DL is DOUBLE PRECISION array, dimension (N-1)
          On entry, DL must contain the (n-1) sub-diagonal elements of
          A.

          On exit, DL is overwritten by the (n-2) elements of the
          second super-diagonal of the upper triangular matrix U from
          the LU factorization of A, in DL(1), ..., DL(n-2).
[in,out]D
          D is DOUBLE PRECISION array, dimension (N)
          On entry, D must contain the diagonal elements of A.

          On exit, D is overwritten by the n diagonal elements of U.
[in,out]DU
          DU is DOUBLE PRECISION array, dimension (N-1)
          On entry, DU must contain the (n-1) super-diagonal elements
          of A.

          On exit, DU is overwritten by the (n-1) elements of the first
          super-diagonal of U.
[in,out]B
          B is DOUBLE PRECISION array, dimension (LDB,NRHS)
          On entry, the N by NRHS matrix of right hand side matrix B.
          On exit, if INFO = 0, the N by NRHS solution matrix X.
[in]LDB
          LDB is INTEGER
          The leading dimension of the array B.  LDB >= max(1,N).
[out]INFO
          INFO is INTEGER
          = 0: successful exit
          < 0: if INFO = -i, the i-th argument had an illegal value
          > 0: if INFO = i, U(i,i) is exactly zero, and the solution
               has not been computed.  The factorization has not been
               completed unless i = N.
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Date
September 2012

Definition at line 129 of file dgtsv.f.

129 *
130 * -- LAPACK driver routine (version 3.4.2) --
131 * -- LAPACK is a software package provided by Univ. of Tennessee, --
132 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
133 * September 2012
134 *
135 * .. Scalar Arguments ..
136  INTEGER info, ldb, n, nrhs
137 * ..
138 * .. Array Arguments ..
139  DOUBLE PRECISION b( ldb, * ), d( * ), dl( * ), du( * )
140 * ..
141 *
142 * =====================================================================
143 *
144 * .. Parameters ..
145  DOUBLE PRECISION zero
146  parameter ( zero = 0.0d+0 )
147 * ..
148 * .. Local Scalars ..
149  INTEGER i, j
150  DOUBLE PRECISION fact, temp
151 * ..
152 * .. Intrinsic Functions ..
153  INTRINSIC abs, max
154 * ..
155 * .. External Subroutines ..
156  EXTERNAL xerbla
157 * ..
158 * .. Executable Statements ..
159 *
160  info = 0
161  IF( n.LT.0 ) THEN
162  info = -1
163  ELSE IF( nrhs.LT.0 ) THEN
164  info = -2
165  ELSE IF( ldb.LT.max( 1, n ) ) THEN
166  info = -7
167  END IF
168  IF( info.NE.0 ) THEN
169  CALL xerbla( 'DGTSV ', -info )
170  RETURN
171  END IF
172 *
173  IF( n.EQ.0 )
174  $ RETURN
175 *
176  IF( nrhs.EQ.1 ) THEN
177  DO 10 i = 1, n - 2
178  IF( abs( d( i ) ).GE.abs( dl( i ) ) ) THEN
179 *
180 * No row interchange required
181 *
182  IF( d( i ).NE.zero ) THEN
183  fact = dl( i ) / d( i )
184  d( i+1 ) = d( i+1 ) - fact*du( i )
185  b( i+1, 1 ) = b( i+1, 1 ) - fact*b( i, 1 )
186  ELSE
187  info = i
188  RETURN
189  END IF
190  dl( i ) = zero
191  ELSE
192 *
193 * Interchange rows I and I+1
194 *
195  fact = d( i ) / dl( i )
196  d( i ) = dl( i )
197  temp = d( i+1 )
198  d( i+1 ) = du( i ) - fact*temp
199  dl( i ) = du( i+1 )
200  du( i+1 ) = -fact*dl( i )
201  du( i ) = temp
202  temp = b( i, 1 )
203  b( i, 1 ) = b( i+1, 1 )
204  b( i+1, 1 ) = temp - fact*b( i+1, 1 )
205  END IF
206  10 CONTINUE
207  IF( n.GT.1 ) THEN
208  i = n - 1
209  IF( abs( d( i ) ).GE.abs( dl( i ) ) ) THEN
210  IF( d( i ).NE.zero ) THEN
211  fact = dl( i ) / d( i )
212  d( i+1 ) = d( i+1 ) - fact*du( i )
213  b( i+1, 1 ) = b( i+1, 1 ) - fact*b( i, 1 )
214  ELSE
215  info = i
216  RETURN
217  END IF
218  ELSE
219  fact = d( i ) / dl( i )
220  d( i ) = dl( i )
221  temp = d( i+1 )
222  d( i+1 ) = du( i ) - fact*temp
223  du( i ) = temp
224  temp = b( i, 1 )
225  b( i, 1 ) = b( i+1, 1 )
226  b( i+1, 1 ) = temp - fact*b( i+1, 1 )
227  END IF
228  END IF
229  IF( d( n ).EQ.zero ) THEN
230  info = n
231  RETURN
232  END IF
233  ELSE
234  DO 40 i = 1, n - 2
235  IF( abs( d( i ) ).GE.abs( dl( i ) ) ) THEN
236 *
237 * No row interchange required
238 *
239  IF( d( i ).NE.zero ) THEN
240  fact = dl( i ) / d( i )
241  d( i+1 ) = d( i+1 ) - fact*du( i )
242  DO 20 j = 1, nrhs
243  b( i+1, j ) = b( i+1, j ) - fact*b( i, j )
244  20 CONTINUE
245  ELSE
246  info = i
247  RETURN
248  END IF
249  dl( i ) = zero
250  ELSE
251 *
252 * Interchange rows I and I+1
253 *
254  fact = d( i ) / dl( i )
255  d( i ) = dl( i )
256  temp = d( i+1 )
257  d( i+1 ) = du( i ) - fact*temp
258  dl( i ) = du( i+1 )
259  du( i+1 ) = -fact*dl( i )
260  du( i ) = temp
261  DO 30 j = 1, nrhs
262  temp = b( i, j )
263  b( i, j ) = b( i+1, j )
264  b( i+1, j ) = temp - fact*b( i+1, j )
265  30 CONTINUE
266  END IF
267  40 CONTINUE
268  IF( n.GT.1 ) THEN
269  i = n - 1
270  IF( abs( d( i ) ).GE.abs( dl( i ) ) ) THEN
271  IF( d( i ).NE.zero ) THEN
272  fact = dl( i ) / d( i )
273  d( i+1 ) = d( i+1 ) - fact*du( i )
274  DO 50 j = 1, nrhs
275  b( i+1, j ) = b( i+1, j ) - fact*b( i, j )
276  50 CONTINUE
277  ELSE
278  info = i
279  RETURN
280  END IF
281  ELSE
282  fact = d( i ) / dl( i )
283  d( i ) = dl( i )
284  temp = d( i+1 )
285  d( i+1 ) = du( i ) - fact*temp
286  du( i ) = temp
287  DO 60 j = 1, nrhs
288  temp = b( i, j )
289  b( i, j ) = b( i+1, j )
290  b( i+1, j ) = temp - fact*b( i+1, j )
291  60 CONTINUE
292  END IF
293  END IF
294  IF( d( n ).EQ.zero ) THEN
295  info = n
296  RETURN
297  END IF
298  END IF
299 *
300 * Back solve with the matrix U from the factorization.
301 *
302  IF( nrhs.LE.2 ) THEN
303  j = 1
304  70 CONTINUE
305  b( n, j ) = b( n, j ) / d( n )
306  IF( n.GT.1 )
307  $ b( n-1, j ) = ( b( n-1, j )-du( n-1 )*b( n, j ) ) / d( n-1 )
308  DO 80 i = n - 2, 1, -1
309  b( i, j ) = ( b( i, j )-du( i )*b( i+1, j )-dl( i )*
310  $ b( i+2, j ) ) / d( i )
311  80 CONTINUE
312  IF( j.LT.nrhs ) THEN
313  j = j + 1
314  GO TO 70
315  END IF
316  ELSE
317  DO 100 j = 1, nrhs
318  b( n, j ) = b( n, j ) / d( n )
319  IF( n.GT.1 )
320  $ b( n-1, j ) = ( b( n-1, j )-du( n-1 )*b( n, j ) ) /
321  $ d( n-1 )
322  DO 90 i = n - 2, 1, -1
323  b( i, j ) = ( b( i, j )-du( i )*b( i+1, j )-dl( i )*
324  $ b( i+2, j ) ) / d( i )
325  90 CONTINUE
326  100 CONTINUE
327  END IF
328 *
329  RETURN
330 *
331 * End of DGTSV
332 *
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:62

Here is the call graph for this function:

Here is the caller graph for this function: