1*> \brief <b> CGTSV computes the solution to system of linear equations A * X = B for GT matrices </b>
2*
3*  =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6*            http://www.netlib.org/lapack/explore-html/
7*
8*> \htmlonly
9*> Download CGTSV + dependencies
10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/cgtsv.f">
11*> [TGZ]</a>
12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/cgtsv.f">
13*> [ZIP]</a>
14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/cgtsv.f">
15*> [TXT]</a>
16*> \endhtmlonly
17*
18*  Definition:
19*  ===========
20*
21*       SUBROUTINE CGTSV( N, NRHS, DL, D, DU, B, LDB, INFO )
22*
23*       .. Scalar Arguments ..
24*       INTEGER            INFO, LDB, N, NRHS
25*       ..
26*       .. Array Arguments ..
27*       COMPLEX            B( LDB, * ), D( * ), DL( * ), DU( * )
28*       ..
29*
30*
31*> \par Purpose:
32*  =============
33*>
34*> \verbatim
35*>
36*> CGTSV  solves the equation
37*>
38*>    A*X = B,
39*>
40*> where A is an N-by-N tridiagonal matrix, by Gaussian elimination with
41*> partial pivoting.
42*>
43*> Note that the equation  A**T *X = B  may be solved by interchanging the
44*> order of the arguments DU and DL.
45*> \endverbatim
46*
47*  Arguments:
48*  ==========
49*
50*> \param[in] N
51*> \verbatim
52*>          N is INTEGER
53*>          The order of the matrix A.  N >= 0.
54*> \endverbatim
55*>
56*> \param[in] NRHS
57*> \verbatim
58*>          NRHS is INTEGER
59*>          The number of right hand sides, i.e., the number of columns
60*>          of the matrix B.  NRHS >= 0.
61*> \endverbatim
62*>
63*> \param[in,out] DL
64*> \verbatim
65*>          DL is COMPLEX array, dimension (N-1)
66*>          On entry, DL must contain the (n-1) subdiagonal elements of
67*>          A.
68*>          On exit, DL is overwritten by the (n-2) elements of the
69*>          second superdiagonal of the upper triangular matrix U from
70*>          the LU factorization of A, in DL(1), ..., DL(n-2).
71*> \endverbatim
72*>
73*> \param[in,out] D
74*> \verbatim
75*>          D is COMPLEX array, dimension (N)
76*>          On entry, D must contain the diagonal elements of A.
77*>          On exit, D is overwritten by the n diagonal elements of U.
78*> \endverbatim
79*>
80*> \param[in,out] DU
81*> \verbatim
82*>          DU is COMPLEX array, dimension (N-1)
83*>          On entry, DU must contain the (n-1) superdiagonal elements
84*>          of A.
85*>          On exit, DU is overwritten by the (n-1) elements of the first
86*>          superdiagonal of U.
87*> \endverbatim
88*>
89*> \param[in,out] B
90*> \verbatim
91*>          B is COMPLEX array, dimension (LDB,NRHS)
92*>          On entry, the N-by-NRHS right hand side matrix B.
93*>          On exit, if INFO = 0, the N-by-NRHS solution matrix X.
94*> \endverbatim
95*>
96*> \param[in] LDB
97*> \verbatim
98*>          LDB is INTEGER
99*>          The leading dimension of the array B.  LDB >= max(1,N).
100*> \endverbatim
101*>
102*> \param[out] INFO
103*> \verbatim
104*>          INFO is INTEGER
105*>          = 0:  successful exit
106*>          < 0:  if INFO = -i, the i-th argument had an illegal value
107*>          > 0:  if INFO = i, U(i,i) is exactly zero, and the solution
108*>                has not been computed.  The factorization has not been
109*>                completed unless i = N.
110*> \endverbatim
111*
112*  Authors:
113*  ========
114*
115*> \author Univ. of Tennessee
116*> \author Univ. of California Berkeley
117*> \author Univ. of Colorado Denver
118*> \author NAG Ltd.
119*
120*> \date December 2016
121*
122*> \ingroup complexGTsolve
123*
124*  =====================================================================
125      SUBROUTINE CGTSV( N, NRHS, DL, D, DU, B, LDB, INFO )
126*
127*  -- LAPACK driver routine (version 3.7.0) --
128*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
129*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
130*     December 2016
131*
132*     .. Scalar Arguments ..
133      INTEGER            INFO, LDB, N, NRHS
134*     ..
135*     .. Array Arguments ..
136      COMPLEX            B( LDB, * ), D( * ), DL( * ), DU( * )
137*     ..
138*
139*  =====================================================================
140*
141*     .. Parameters ..
142      COMPLEX            ZERO
143      PARAMETER          ( ZERO = ( 0.0E+0, 0.0E+0 ) )
144*     ..
145*     .. Local Scalars ..
146      INTEGER            J, K
147      COMPLEX            MULT, TEMP, ZDUM
148*     ..
149*     .. Intrinsic Functions ..
150      INTRINSIC          ABS, AIMAG, MAX, REAL
151*     ..
152*     .. External Subroutines ..
153      EXTERNAL           XERBLA
154*     ..
155*     .. Statement Functions ..
156      REAL               CABS1
157*     ..
158*     .. Statement Function definitions ..
159      CABS1( ZDUM ) = ABS( REAL( ZDUM ) ) + ABS( AIMAG( ZDUM ) )
160*     ..
161*     .. Executable Statements ..
162*
163      INFO = 0
164      IF( N.LT.0 ) THEN
165         INFO = -1
166      ELSE IF( NRHS.LT.0 ) THEN
167         INFO = -2
168      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
169         INFO = -7
170      END IF
171      IF( INFO.NE.0 ) THEN
172         CALL XERBLA( 'CGTSV ', -INFO )
173         RETURN
174      END IF
175*
176      IF( N.EQ.0 )
177     $   RETURN
178*
179      DO 30 K = 1, N - 1
180         IF( DL( K ).EQ.ZERO ) THEN
181*
182*           Subdiagonal is zero, no elimination is required.
183*
184            IF( D( K ).EQ.ZERO ) THEN
185*
186*              Diagonal is zero: set INFO = K and return; a unique
187*              solution can not be found.
188*
189               INFO = K
190               RETURN
191            END IF
192         ELSE IF( CABS1( D( K ) ).GE.CABS1( DL( K ) ) ) THEN
193*
194*           No row interchange required
195*
196            MULT = DL( K ) / D( K )
197            D( K+1 ) = D( K+1 ) - MULT*DU( K )
198            DO 10 J = 1, NRHS
199               B( K+1, J ) = B( K+1, J ) - MULT*B( K, J )
200   10       CONTINUE
201            IF( K.LT.( N-1 ) )
202     $         DL( K ) = ZERO
203         ELSE
204*
205*           Interchange rows K and K+1
206*
207            MULT = D( K ) / DL( K )
208            D( K ) = DL( K )
209            TEMP = D( K+1 )
210            D( K+1 ) = DU( K ) - MULT*TEMP
211            IF( K.LT.( N-1 ) ) THEN
212               DL( K ) = DU( K+1 )
213               DU( K+1 ) = -MULT*DL( K )
214            END IF
215            DU( K ) = TEMP
216            DO 20 J = 1, NRHS
217               TEMP = B( K, J )
218               B( K, J ) = B( K+1, J )
219               B( K+1, J ) = TEMP - MULT*B( K+1, J )
220   20       CONTINUE
221         END IF
222   30 CONTINUE
223      IF( D( N ).EQ.ZERO ) THEN
224         INFO = N
225         RETURN
226      END IF
227*
228*     Back solve with the matrix U from the factorization.
229*
230      DO 50 J = 1, NRHS
231         B( N, J ) = B( N, J ) / D( N )
232         IF( N.GT.1 )
233     $      B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) / D( N-1 )
234         DO 40 K = N - 2, 1, -1
235            B( K, J ) = ( B( K, J )-DU( K )*B( K+1, J )-DL( K )*
236     $                  B( K+2, J ) ) / D( K )
237   40    CONTINUE
238   50 CONTINUE
239*
240      RETURN
241*
242*     End of CGTSV
243*
244      END
245