1        2        3        4        5        6        7        8        9       10       11       12       13       14       15       16       17       18       19       20       21       22       23       24       25       26       27       28       29       30       31       32       33       34       35       36       37       38       39       40       41       42       43       44       45       46       47       48       49       50       51       52       53       54       55       56       57       58       59       60       61       62       63       64       65       66       67       68       69       70       71       72       73       74       75       76       77       78       79       80       81       82       83       84       85       86       87       88       89       90       91       92       93       94       95       96       97       98       99      100      101      102      103      104      105      106      107      108      109      110      111      112      113      114      115      116      117      118      119      120      121      122      123      124      125      126      127      128      129      130      131      132      133      134      135      136      137      138      139      140      141      142      143 SUBROUTINE ZGBSV( N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB, INFO ) * *  -- LAPACK driver routine (version 3.2) -- *  -- LAPACK is a software package provided by Univ. of Tennessee,    -- *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- *     November 2006 * *     .. Scalar Arguments ..       INTEGER            INFO, KL, KU, LDAB, LDB, N, NRHS *     .. *     .. Array Arguments ..       INTEGER            IPIV( * )       COMPLEX*16         AB( LDAB, * ), B( LDB, * ) *     .. * *  Purpose *  ======= * *  ZGBSV computes the solution to a complex system of linear equations *  A * X = B, where A is a band matrix of order N with KL subdiagonals *  and KU superdiagonals, and X and B are N-by-NRHS matrices. * *  The LU decomposition with partial pivoting and row interchanges is *  used to factor A as A = L * U, where L is a product of permutation *  and unit lower triangular matrices with KL subdiagonals, and U is *  upper triangular with KL+KU superdiagonals.  The factored form of A *  is then used to solve the system of equations A * X = B. * *  Arguments *  ========= * *  N       (input) INTEGER *          The number of linear equations, i.e., the order of the *          matrix A.  N >= 0. * *  KL      (input) INTEGER *          The number of subdiagonals within the band of A.  KL >= 0. * *  KU      (input) INTEGER *          The number of superdiagonals within the band of A.  KU >= 0. * *  NRHS    (input) INTEGER *          The number of right hand sides, i.e., the number of columns *          of the matrix B.  NRHS >= 0. * *  AB      (input/output) COMPLEX*16 array, dimension (LDAB,N) *          On entry, the matrix A in band storage, in rows KL+1 to *          2*KL+KU+1; rows 1 to KL of the array need not be set. *          The j-th column of A is stored in the j-th column of the *          array AB as follows: *          AB(KL+KU+1+i-j,j) = A(i,j) for max(1,j-KU)<=i<=min(N,j+KL) *          On exit, details of the factorization: U is stored as an *          upper triangular band matrix with KL+KU superdiagonals in *          rows 1 to KL+KU+1, and the multipliers used during the *          factorization are stored in rows KL+KU+2 to 2*KL+KU+1. *          See below for further details. * *  LDAB    (input) INTEGER *          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1. * *  IPIV    (output) INTEGER array, dimension (N) *          The pivot indices that define the permutation matrix P; *          row i of the matrix was interchanged with row IPIV(i). * *  B       (input/output) COMPLEX*16 array, dimension (LDB,NRHS) *          On entry, the N-by-NRHS right hand side matrix B. *          On exit, if INFO = 0, the N-by-NRHS solution matrix X. * *  LDB     (input) INTEGER *          The leading dimension of the array B.  LDB >= max(1,N). * *  INFO    (output) 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.  The factorization *                has been completed, but the factor U is exactly *                singular, and the solution has not been computed. * *  Further Details *  =============== * *  The band storage scheme is illustrated by the following example, when *  M = N = 6, KL = 2, KU = 1: * *  On entry:                       On exit: * *      *    *    *    +    +    +       *    *    *   u14  u25  u36 *      *    *    +    +    +    +       *    *   u13  u24  u35  u46 *      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56 *     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66 *     a21  a32  a43  a54  a65   *      m21  m32  m43  m54  m65   * *     a31  a42  a53  a64   *    *      m31  m42  m53  m64   *    * * *  Array elements marked * are not used by the routine; elements marked *  + need not be set on entry, but are required by the routine to store *  elements of U because of fill-in resulting from the row interchanges. * *  ===================================================================== * *     .. External Subroutines ..       EXTERNAL           XERBLA, ZGBTRF, ZGBTRS *     .. *     .. Intrinsic Functions ..       INTRINSIC          MAX *     .. *     .. Executable Statements .. * *     Test the input parameters. *       INFO = 0       IF( N.LT.0 ) THEN          INFO = -1       ELSE IF( KL.LT.0 ) THEN          INFO = -2       ELSE IF( KU.LT.0 ) THEN          INFO = -3       ELSE IF( NRHS.LT.0 ) THEN          INFO = -4       ELSE IF( LDAB.LT.2*KL+KU+1 ) THEN          INFO = -6       ELSE IF( LDB.LT.MAX( N, 1 ) ) THEN          INFO = -9       END IF       IF( INFO.NE.0 ) THEN          CALL XERBLA( 'ZGBSV ', -INFO )          RETURN       END IF * *     Compute the LU factorization of the band matrix A. *       CALL ZGBTRF( N, N, KL, KU, AB, LDAB, IPIV, INFO )       IF( INFO.EQ.0 ) THEN * *        Solve the system A*X = B, overwriting B with X. *          CALL ZGBTRS( 'No transpose', N, KL, KU, NRHS, AB, LDAB, IPIV,      \$                B, LDB, INFO )       END IF       RETURN * *     End of ZGBSV *       END