File:  [local] / rpl / lapack / lapack / zgbtrs.f
Revision 1.17: download - view: text, annotated - select for diffs - revision graph
Mon Aug 7 08:39:16 2023 UTC (8 months, 3 weeks ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_35, rpl-4_1_34, HEAD
Première mise à jour de lapack et blas.

    1: *> \brief \b ZGBTRS
    2: *
    3: *  =========== DOCUMENTATION ===========
    4: *
    5: * Online html documentation available at
    6: *            http://www.netlib.org/lapack/explore-html/
    7: *
    8: *> \htmlonly
    9: *> Download ZGBTRS + dependencies
   10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zgbtrs.f">
   11: *> [TGZ]</a>
   12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zgbtrs.f">
   13: *> [ZIP]</a>
   14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zgbtrs.f">
   15: *> [TXT]</a>
   16: *> \endhtmlonly
   17: *
   18: *  Definition:
   19: *  ===========
   20: *
   21: *       SUBROUTINE ZGBTRS( TRANS, N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB,
   22: *                          INFO )
   23: *
   24: *       .. Scalar Arguments ..
   25: *       CHARACTER          TRANS
   26: *       INTEGER            INFO, KL, KU, LDAB, LDB, N, NRHS
   27: *       ..
   28: *       .. Array Arguments ..
   29: *       INTEGER            IPIV( * )
   30: *       COMPLEX*16         AB( LDAB, * ), B( LDB, * )
   31: *       ..
   32: *
   33: *
   34: *> \par Purpose:
   35: *  =============
   36: *>
   37: *> \verbatim
   38: *>
   39: *> ZGBTRS solves a system of linear equations
   40: *>    A * X = B,  A**T * X = B,  or  A**H * X = B
   41: *> with a general band matrix A using the LU factorization computed
   42: *> by ZGBTRF.
   43: *> \endverbatim
   44: *
   45: *  Arguments:
   46: *  ==========
   47: *
   48: *> \param[in] TRANS
   49: *> \verbatim
   50: *>          TRANS is CHARACTER*1
   51: *>          Specifies the form of the system of equations.
   52: *>          = 'N':  A * X = B     (No transpose)
   53: *>          = 'T':  A**T * X = B  (Transpose)
   54: *>          = 'C':  A**H * X = B  (Conjugate transpose)
   55: *> \endverbatim
   56: *>
   57: *> \param[in] N
   58: *> \verbatim
   59: *>          N is INTEGER
   60: *>          The order of the matrix A.  N >= 0.
   61: *> \endverbatim
   62: *>
   63: *> \param[in] KL
   64: *> \verbatim
   65: *>          KL is INTEGER
   66: *>          The number of subdiagonals within the band of A.  KL >= 0.
   67: *> \endverbatim
   68: *>
   69: *> \param[in] KU
   70: *> \verbatim
   71: *>          KU is INTEGER
   72: *>          The number of superdiagonals within the band of A.  KU >= 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] AB
   83: *> \verbatim
   84: *>          AB is COMPLEX*16 array, dimension (LDAB,N)
   85: *>          Details of the LU factorization of the band matrix A, as
   86: *>          computed by ZGBTRF.  U is stored as an upper triangular band
   87: *>          matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and
   88: *>          the multipliers used during the factorization are stored in
   89: *>          rows KL+KU+2 to 2*KL+KU+1.
   90: *> \endverbatim
   91: *>
   92: *> \param[in] LDAB
   93: *> \verbatim
   94: *>          LDAB is INTEGER
   95: *>          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
   96: *> \endverbatim
   97: *>
   98: *> \param[in] IPIV
   99: *> \verbatim
  100: *>          IPIV is INTEGER array, dimension (N)
  101: *>          The pivot indices; for 1 <= i <= N, row i of the matrix was
  102: *>          interchanged with row IPIV(i).
  103: *> \endverbatim
  104: *>
  105: *> \param[in,out] B
  106: *> \verbatim
  107: *>          B is COMPLEX*16 array, dimension (LDB,NRHS)
  108: *>          On entry, the right hand side matrix B.
  109: *>          On exit, the solution matrix X.
  110: *> \endverbatim
  111: *>
  112: *> \param[in] LDB
  113: *> \verbatim
  114: *>          LDB is INTEGER
  115: *>          The leading dimension of the array B.  LDB >= max(1,N).
  116: *> \endverbatim
  117: *>
  118: *> \param[out] INFO
  119: *> \verbatim
  120: *>          INFO is INTEGER
  121: *>          = 0:  successful exit
  122: *>          < 0:  if INFO = -i, the i-th argument had an illegal value
  123: *> \endverbatim
  124: *
  125: *  Authors:
  126: *  ========
  127: *
  128: *> \author Univ. of Tennessee
  129: *> \author Univ. of California Berkeley
  130: *> \author Univ. of Colorado Denver
  131: *> \author NAG Ltd.
  132: *
  133: *> \ingroup complex16GBcomputational
  134: *
  135: *  =====================================================================
  136:       SUBROUTINE ZGBTRS( TRANS, N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB,
  137:      $                   INFO )
  138: *
  139: *  -- LAPACK computational routine --
  140: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
  141: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  142: *
  143: *     .. Scalar Arguments ..
  144:       CHARACTER          TRANS
  145:       INTEGER            INFO, KL, KU, LDAB, LDB, N, NRHS
  146: *     ..
  147: *     .. Array Arguments ..
  148:       INTEGER            IPIV( * )
  149:       COMPLEX*16         AB( LDAB, * ), B( LDB, * )
  150: *     ..
  151: *
  152: *  =====================================================================
  153: *
  154: *     .. Parameters ..
  155:       COMPLEX*16         ONE
  156:       PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
  157: *     ..
  158: *     .. Local Scalars ..
  159:       LOGICAL            LNOTI, NOTRAN
  160:       INTEGER            I, J, KD, L, LM
  161: *     ..
  162: *     .. External Functions ..
  163:       LOGICAL            LSAME
  164:       EXTERNAL           LSAME
  165: *     ..
  166: *     .. External Subroutines ..
  167:       EXTERNAL           XERBLA, ZGEMV, ZGERU, ZLACGV, ZSWAP, ZTBSV
  168: *     ..
  169: *     .. Intrinsic Functions ..
  170:       INTRINSIC          MAX, MIN
  171: *     ..
  172: *     .. Executable Statements ..
  173: *
  174: *     Test the input parameters.
  175: *
  176:       INFO = 0
  177:       NOTRAN = LSAME( TRANS, 'N' )
  178:       IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
  179:      $    LSAME( TRANS, 'C' ) ) THEN
  180:          INFO = -1
  181:       ELSE IF( N.LT.0 ) THEN
  182:          INFO = -2
  183:       ELSE IF( KL.LT.0 ) THEN
  184:          INFO = -3
  185:       ELSE IF( KU.LT.0 ) THEN
  186:          INFO = -4
  187:       ELSE IF( NRHS.LT.0 ) THEN
  188:          INFO = -5
  189:       ELSE IF( LDAB.LT.( 2*KL+KU+1 ) ) THEN
  190:          INFO = -7
  191:       ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
  192:          INFO = -10
  193:       END IF
  194:       IF( INFO.NE.0 ) THEN
  195:          CALL XERBLA( 'ZGBTRS', -INFO )
  196:          RETURN
  197:       END IF
  198: *
  199: *     Quick return if possible
  200: *
  201:       IF( N.EQ.0 .OR. NRHS.EQ.0 )
  202:      $   RETURN
  203: *
  204:       KD = KU + KL + 1
  205:       LNOTI = KL.GT.0
  206: *
  207:       IF( NOTRAN ) THEN
  208: *
  209: *        Solve  A*X = B.
  210: *
  211: *        Solve L*X = B, overwriting B with X.
  212: *
  213: *        L is represented as a product of permutations and unit lower
  214: *        triangular matrices L = P(1) * L(1) * ... * P(n-1) * L(n-1),
  215: *        where each transformation L(i) is a rank-one modification of
  216: *        the identity matrix.
  217: *
  218:          IF( LNOTI ) THEN
  219:             DO 10 J = 1, N - 1
  220:                LM = MIN( KL, N-J )
  221:                L = IPIV( J )
  222:                IF( L.NE.J )
  223:      $            CALL ZSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
  224:                CALL ZGERU( LM, NRHS, -ONE, AB( KD+1, J ), 1, B( J, 1 ),
  225:      $                     LDB, B( J+1, 1 ), LDB )
  226:    10       CONTINUE
  227:          END IF
  228: *
  229:          DO 20 I = 1, NRHS
  230: *
  231: *           Solve U*X = B, overwriting B with X.
  232: *
  233:             CALL ZTBSV( 'Upper', 'No transpose', 'Non-unit', N, KL+KU,
  234:      $                  AB, LDAB, B( 1, I ), 1 )
  235:    20    CONTINUE
  236: *
  237:       ELSE IF( LSAME( TRANS, 'T' ) ) THEN
  238: *
  239: *        Solve A**T * X = B.
  240: *
  241:          DO 30 I = 1, NRHS
  242: *
  243: *           Solve U**T * X = B, overwriting B with X.
  244: *
  245:             CALL ZTBSV( 'Upper', 'Transpose', 'Non-unit', N, KL+KU, AB,
  246:      $                  LDAB, B( 1, I ), 1 )
  247:    30    CONTINUE
  248: *
  249: *        Solve L**T * X = B, overwriting B with X.
  250: *
  251:          IF( LNOTI ) THEN
  252:             DO 40 J = N - 1, 1, -1
  253:                LM = MIN( KL, N-J )
  254:                CALL ZGEMV( 'Transpose', LM, NRHS, -ONE, B( J+1, 1 ),
  255:      $                     LDB, AB( KD+1, J ), 1, ONE, B( J, 1 ), LDB )
  256:                L = IPIV( J )
  257:                IF( L.NE.J )
  258:      $            CALL ZSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
  259:    40       CONTINUE
  260:          END IF
  261: *
  262:       ELSE
  263: *
  264: *        Solve A**H * X = B.
  265: *
  266:          DO 50 I = 1, NRHS
  267: *
  268: *           Solve U**H * X = B, overwriting B with X.
  269: *
  270:             CALL ZTBSV( 'Upper', 'Conjugate transpose', 'Non-unit', N,
  271:      $                  KL+KU, AB, LDAB, B( 1, I ), 1 )
  272:    50    CONTINUE
  273: *
  274: *        Solve L**H * X = B, overwriting B with X.
  275: *
  276:          IF( LNOTI ) THEN
  277:             DO 60 J = N - 1, 1, -1
  278:                LM = MIN( KL, N-J )
  279:                CALL ZLACGV( NRHS, B( J, 1 ), LDB )
  280:                CALL ZGEMV( 'Conjugate transpose', LM, NRHS, -ONE,
  281:      $                     B( J+1, 1 ), LDB, AB( KD+1, J ), 1, ONE,
  282:      $                     B( J, 1 ), LDB )
  283:                CALL ZLACGV( NRHS, B( J, 1 ), LDB )
  284:                L = IPIV( J )
  285:                IF( L.NE.J )
  286:      $            CALL ZSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
  287:    60       CONTINUE
  288:          END IF
  289:       END IF
  290:       RETURN
  291: *
  292: *     End of ZGBTRS
  293: *
  294:       END

CVSweb interface <joel.bertrand@systella.fr>