1*> \brief <b> SPBSV computes the solution to system of linear equations A * X = B for OTHER 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 SPBSV + dependencies
10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/spbsv.f">
11*> [TGZ]</a>
12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/spbsv.f">
13*> [ZIP]</a>
14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/spbsv.f">
15*> [TXT]</a>
16*> \endhtmlonly
17*
18*  Definition:
19*  ===========
20*
21*       SUBROUTINE SPBSV( UPLO, N, KD, NRHS, AB, LDAB, B, LDB, INFO )
22*
23*       .. Scalar Arguments ..
24*       CHARACTER          UPLO
25*       INTEGER            INFO, KD, LDAB, LDB, N, NRHS
26*       ..
27*       .. Array Arguments ..
28*       REAL               AB( LDAB, * ), B( LDB, * )
29*       ..
30*
31*
32*> \par Purpose:
33*  =============
34*>
35*> \verbatim
36*>
37*> SPBSV computes the solution to a real system of linear equations
38*>    A * X = B,
39*> where A is an N-by-N symmetric positive definite band matrix and X
40*> and B are N-by-NRHS matrices.
41*>
42*> The Cholesky decomposition is used to factor A as
43*>    A = U**T * U,  if UPLO = 'U', or
44*>    A = L * L**T,  if UPLO = 'L',
45*> where U is an upper triangular band matrix, and L is a lower
46*> triangular band matrix, with the same number of superdiagonals or
47*> subdiagonals as A.  The factored form of A is then used to solve the
48*> system of equations A * X = B.
49*> \endverbatim
50*
51*  Arguments:
52*  ==========
53*
54*> \param[in] UPLO
55*> \verbatim
56*>          UPLO is CHARACTER*1
57*>          = 'U':  Upper triangle of A is stored;
58*>          = 'L':  Lower triangle of A is stored.
59*> \endverbatim
60*>
61*> \param[in] N
62*> \verbatim
63*>          N is INTEGER
64*>          The number of linear equations, i.e., the order of the
65*>          matrix A.  N >= 0.
66*> \endverbatim
67*>
68*> \param[in] KD
69*> \verbatim
70*>          KD is INTEGER
71*>          The number of superdiagonals of the matrix A if UPLO = 'U',
72*>          or the number of subdiagonals if UPLO = 'L'.  KD >= 0.
73*> \endverbatim
74*>
75*> \param[in] NRHS
76*> \verbatim
77*>          NRHS is INTEGER
78*>          The number of right hand sides, i.e., the number of columns
79*>          of the matrix B.  NRHS >= 0.
80*> \endverbatim
81*>
82*> \param[in,out] AB
83*> \verbatim
84*>          AB is REAL array, dimension (LDAB,N)
85*>          On entry, the upper or lower triangle of the symmetric band
86*>          matrix A, stored in the first KD+1 rows of the array.  The
87*>          j-th column of A is stored in the j-th column of the array AB
88*>          as follows:
89*>          if UPLO = 'U', AB(KD+1+i-j,j) = A(i,j) for max(1,j-KD)<=i<=j;
90*>          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(N,j+KD).
91*>          See below for further details.
92*>
93*>          On exit, if INFO = 0, the triangular factor U or L from the
94*>          Cholesky factorization A = U**T*U or A = L*L**T of the band
95*>          matrix A, in the same storage format as A.
96*> \endverbatim
97*>
98*> \param[in] LDAB
99*> \verbatim
100*>          LDAB is INTEGER
101*>          The leading dimension of the array AB.  LDAB >= KD+1.
102*> \endverbatim
103*>
104*> \param[in,out] B
105*> \verbatim
106*>          B is REAL array, dimension (LDB,NRHS)
107*>          On entry, the N-by-NRHS right hand side matrix B.
108*>          On exit, if INFO = 0, the N-by-NRHS solution matrix X.
109*> \endverbatim
110*>
111*> \param[in] LDB
112*> \verbatim
113*>          LDB is INTEGER
114*>          The leading dimension of the array B.  LDB >= max(1,N).
115*> \endverbatim
116*>
117*> \param[out] INFO
118*> \verbatim
119*>          INFO is INTEGER
120*>          = 0:  successful exit
121*>          < 0:  if INFO = -i, the i-th argument had an illegal value
122*>          > 0:  if INFO = i, the leading minor of order i of A is not
123*>                positive definite, so the factorization could not be
124*>                completed, and the solution has not been computed.
125*> \endverbatim
126*
127*  Authors:
128*  ========
129*
130*> \author Univ. of Tennessee
131*> \author Univ. of California Berkeley
132*> \author Univ. of Colorado Denver
133*> \author NAG Ltd.
134*
135*> \ingroup realOTHERsolve
136*
137*> \par Further Details:
138*  =====================
139*>
140*> \verbatim
141*>
142*>  The band storage scheme is illustrated by the following example, when
143*>  N = 6, KD = 2, and UPLO = 'U':
144*>
145*>  On entry:                       On exit:
146*>
147*>      *    *   a13  a24  a35  a46      *    *   u13  u24  u35  u46
148*>      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
149*>     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
150*>
151*>  Similarly, if UPLO = 'L' the format of A is as follows:
152*>
153*>  On entry:                       On exit:
154*>
155*>     a11  a22  a33  a44  a55  a66     l11  l22  l33  l44  l55  l66
156*>     a21  a32  a43  a54  a65   *      l21  l32  l43  l54  l65   *
157*>     a31  a42  a53  a64   *    *      l31  l42  l53  l64   *    *
158*>
159*>  Array elements marked * are not used by the routine.
160*> \endverbatim
161*>
162*  =====================================================================
163      SUBROUTINE SPBSV( UPLO, N, KD, NRHS, AB, LDAB, B, LDB, INFO )
164*
165*  -- LAPACK driver routine --
166*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
167*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
168*
169*     .. Scalar Arguments ..
170      CHARACTER          UPLO
171      INTEGER            INFO, KD, LDAB, LDB, N, NRHS
172*     ..
173*     .. Array Arguments ..
174      REAL               AB( LDAB, * ), B( LDB, * )
175*     ..
176*
177*  =====================================================================
178*
179*     .. External Functions ..
180      LOGICAL            LSAME
181      EXTERNAL           LSAME
182*     ..
183*     .. External Subroutines ..
184      EXTERNAL           SPBTRF, SPBTRS, XERBLA
185*     ..
186*     .. Intrinsic Functions ..
187      INTRINSIC          MAX
188*     ..
189*     .. Executable Statements ..
190*
191*     Test the input parameters.
192*
193      INFO = 0
194      IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
195         INFO = -1
196      ELSE IF( N.LT.0 ) THEN
197         INFO = -2
198      ELSE IF( KD.LT.0 ) THEN
199         INFO = -3
200      ELSE IF( NRHS.LT.0 ) THEN
201         INFO = -4
202      ELSE IF( LDAB.LT.KD+1 ) THEN
203         INFO = -6
204      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
205         INFO = -8
206      END IF
207      IF( INFO.NE.0 ) THEN
208         CALL XERBLA( 'SPBSV ', -INFO )
209         RETURN
210      END IF
211*
212*     Compute the Cholesky factorization A = U**T*U or A = L*L**T.
213*
214      CALL SPBTRF( UPLO, N, KD, AB, LDAB, INFO )
215      IF( INFO.EQ.0 ) THEN
216*
217*        Solve the system A*X = B, overwriting B with X.
218*
219         CALL SPBTRS( UPLO, N, KD, NRHS, AB, LDAB, B, LDB, INFO )
220*
221      END IF
222      RETURN
223*
224*     End of SPBSV
225*
226      END
227