File:  [local] / rpl / lapack / lapack / dgtsv.f
Revision 1.19: download - view: text, annotated - select for diffs - revision graph
Mon Aug 7 08:38:51 2023 UTC (9 months, 1 week 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> DGTSV 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 DGTSV + dependencies
   10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dgtsv.f">
   11: *> [TGZ]</a>
   12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dgtsv.f">
   13: *> [ZIP]</a>
   14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dgtsv.f">
   15: *> [TXT]</a>
   16: *> \endhtmlonly
   17: *
   18: *  Definition:
   19: *  ===========
   20: *
   21: *       SUBROUTINE DGTSV( N, NRHS, DL, D, DU, B, LDB, INFO )
   22: *
   23: *       .. Scalar Arguments ..
   24: *       INTEGER            INFO, LDB, N, NRHS
   25: *       ..
   26: *       .. Array Arguments ..
   27: *       DOUBLE PRECISION   B( LDB, * ), D( * ), DL( * ), DU( * )
   28: *       ..
   29: *
   30: *
   31: *> \par Purpose:
   32: *  =============
   33: *>
   34: *> \verbatim
   35: *>
   36: *> DGTSV  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 DOUBLE PRECISION array, dimension (N-1)
   66: *>          On entry, DL must contain the (n-1) sub-diagonal elements of
   67: *>          A.
   68: *>
   69: *>          On exit, DL is overwritten by the (n-2) elements of the
   70: *>          second super-diagonal of the upper triangular matrix U from
   71: *>          the LU factorization of A, in DL(1), ..., DL(n-2).
   72: *> \endverbatim
   73: *>
   74: *> \param[in,out] D
   75: *> \verbatim
   76: *>          D is DOUBLE PRECISION array, dimension (N)
   77: *>          On entry, D must contain the diagonal elements of A.
   78: *>
   79: *>          On exit, D is overwritten by the n diagonal elements of U.
   80: *> \endverbatim
   81: *>
   82: *> \param[in,out] DU
   83: *> \verbatim
   84: *>          DU is DOUBLE PRECISION array, dimension (N-1)
   85: *>          On entry, DU must contain the (n-1) super-diagonal elements
   86: *>          of A.
   87: *>
   88: *>          On exit, DU is overwritten by the (n-1) elements of the first
   89: *>          super-diagonal of U.
   90: *> \endverbatim
   91: *>
   92: *> \param[in,out] B
   93: *> \verbatim
   94: *>          B is DOUBLE PRECISION array, dimension (LDB,NRHS)
   95: *>          On entry, the N by NRHS matrix of right hand side matrix B.
   96: *>          On exit, if INFO = 0, the N by NRHS solution matrix X.
   97: *> \endverbatim
   98: *>
   99: *> \param[in] LDB
  100: *> \verbatim
  101: *>          LDB is INTEGER
  102: *>          The leading dimension of the array B.  LDB >= max(1,N).
  103: *> \endverbatim
  104: *>
  105: *> \param[out] INFO
  106: *> \verbatim
  107: *>          INFO is INTEGER
  108: *>          = 0: successful exit
  109: *>          < 0: if INFO = -i, the i-th argument had an illegal value
  110: *>          > 0: if INFO = i, U(i,i) is exactly zero, and the solution
  111: *>               has not been computed.  The factorization has not been
  112: *>               completed unless i = N.
  113: *> \endverbatim
  114: *
  115: *  Authors:
  116: *  ========
  117: *
  118: *> \author Univ. of Tennessee
  119: *> \author Univ. of California Berkeley
  120: *> \author Univ. of Colorado Denver
  121: *> \author NAG Ltd.
  122: *
  123: *> \ingroup doubleGTsolve
  124: *
  125: *  =====================================================================
  126:       SUBROUTINE DGTSV( N, NRHS, DL, D, DU, B, LDB, INFO )
  127: *
  128: *  -- LAPACK driver routine --
  129: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
  130: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  131: *
  132: *     .. Scalar Arguments ..
  133:       INTEGER            INFO, LDB, N, NRHS
  134: *     ..
  135: *     .. Array Arguments ..
  136:       DOUBLE PRECISION   B( LDB, * ), D( * ), DL( * ), DU( * )
  137: *     ..
  138: *
  139: *  =====================================================================
  140: *
  141: *     .. Parameters ..
  142:       DOUBLE PRECISION   ZERO
  143:       PARAMETER          ( ZERO = 0.0D+0 )
  144: *     ..
  145: *     .. Local Scalars ..
  146:       INTEGER            I, J
  147:       DOUBLE PRECISION   FACT, TEMP
  148: *     ..
  149: *     .. Intrinsic Functions ..
  150:       INTRINSIC          ABS, MAX
  151: *     ..
  152: *     .. External Subroutines ..
  153:       EXTERNAL           XERBLA
  154: *     ..
  155: *     .. Executable Statements ..
  156: *
  157:       INFO = 0
  158:       IF( N.LT.0 ) THEN
  159:          INFO = -1
  160:       ELSE IF( NRHS.LT.0 ) THEN
  161:          INFO = -2
  162:       ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
  163:          INFO = -7
  164:       END IF
  165:       IF( INFO.NE.0 ) THEN
  166:          CALL XERBLA( 'DGTSV ', -INFO )
  167:          RETURN
  168:       END IF
  169: *
  170:       IF( N.EQ.0 )
  171:      $   RETURN
  172: *
  173:       IF( NRHS.EQ.1 ) THEN
  174:          DO 10 I = 1, N - 2
  175:             IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
  176: *
  177: *              No row interchange required
  178: *
  179:                IF( D( I ).NE.ZERO ) THEN
  180:                   FACT = DL( I ) / D( I )
  181:                   D( I+1 ) = D( I+1 ) - FACT*DU( I )
  182:                   B( I+1, 1 ) = B( I+1, 1 ) - FACT*B( I, 1 )
  183:                ELSE
  184:                   INFO = I
  185:                   RETURN
  186:                END IF
  187:                DL( I ) = ZERO
  188:             ELSE
  189: *
  190: *              Interchange rows I and I+1
  191: *
  192:                FACT = D( I ) / DL( I )
  193:                D( I ) = DL( I )
  194:                TEMP = D( I+1 )
  195:                D( I+1 ) = DU( I ) - FACT*TEMP
  196:                DL( I ) = DU( I+1 )
  197:                DU( I+1 ) = -FACT*DL( I )
  198:                DU( I ) = TEMP
  199:                TEMP = B( I, 1 )
  200:                B( I, 1 ) = B( I+1, 1 )
  201:                B( I+1, 1 ) = TEMP - FACT*B( I+1, 1 )
  202:             END IF
  203:    10    CONTINUE
  204:          IF( N.GT.1 ) THEN
  205:             I = N - 1
  206:             IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
  207:                IF( D( I ).NE.ZERO ) THEN
  208:                   FACT = DL( I ) / D( I )
  209:                   D( I+1 ) = D( I+1 ) - FACT*DU( I )
  210:                   B( I+1, 1 ) = B( I+1, 1 ) - FACT*B( I, 1 )
  211:                ELSE
  212:                   INFO = I
  213:                   RETURN
  214:                END IF
  215:             ELSE
  216:                FACT = D( I ) / DL( I )
  217:                D( I ) = DL( I )
  218:                TEMP = D( I+1 )
  219:                D( I+1 ) = DU( I ) - FACT*TEMP
  220:                DU( I ) = TEMP
  221:                TEMP = B( I, 1 )
  222:                B( I, 1 ) = B( I+1, 1 )
  223:                B( I+1, 1 ) = TEMP - FACT*B( I+1, 1 )
  224:             END IF
  225:          END IF
  226:          IF( D( N ).EQ.ZERO ) THEN
  227:             INFO = N
  228:             RETURN
  229:          END IF
  230:       ELSE
  231:          DO 40 I = 1, N - 2
  232:             IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
  233: *
  234: *              No row interchange required
  235: *
  236:                IF( D( I ).NE.ZERO ) THEN
  237:                   FACT = DL( I ) / D( I )
  238:                   D( I+1 ) = D( I+1 ) - FACT*DU( I )
  239:                   DO 20 J = 1, NRHS
  240:                      B( I+1, J ) = B( I+1, J ) - FACT*B( I, J )
  241:    20             CONTINUE
  242:                ELSE
  243:                   INFO = I
  244:                   RETURN
  245:                END IF
  246:                DL( I ) = ZERO
  247:             ELSE
  248: *
  249: *              Interchange rows I and I+1
  250: *
  251:                FACT = D( I ) / DL( I )
  252:                D( I ) = DL( I )
  253:                TEMP = D( I+1 )
  254:                D( I+1 ) = DU( I ) - FACT*TEMP
  255:                DL( I ) = DU( I+1 )
  256:                DU( I+1 ) = -FACT*DL( I )
  257:                DU( I ) = TEMP
  258:                DO 30 J = 1, NRHS
  259:                   TEMP = B( I, J )
  260:                   B( I, J ) = B( I+1, J )
  261:                   B( I+1, J ) = TEMP - FACT*B( I+1, J )
  262:    30          CONTINUE
  263:             END IF
  264:    40    CONTINUE
  265:          IF( N.GT.1 ) THEN
  266:             I = N - 1
  267:             IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
  268:                IF( D( I ).NE.ZERO ) THEN
  269:                   FACT = DL( I ) / D( I )
  270:                   D( I+1 ) = D( I+1 ) - FACT*DU( I )
  271:                   DO 50 J = 1, NRHS
  272:                      B( I+1, J ) = B( I+1, J ) - FACT*B( I, J )
  273:    50             CONTINUE
  274:                ELSE
  275:                   INFO = I
  276:                   RETURN
  277:                END IF
  278:             ELSE
  279:                FACT = D( I ) / DL( I )
  280:                D( I ) = DL( I )
  281:                TEMP = D( I+1 )
  282:                D( I+1 ) = DU( I ) - FACT*TEMP
  283:                DU( I ) = TEMP
  284:                DO 60 J = 1, NRHS
  285:                   TEMP = B( I, J )
  286:                   B( I, J ) = B( I+1, J )
  287:                   B( I+1, J ) = TEMP - FACT*B( I+1, J )
  288:    60          CONTINUE
  289:             END IF
  290:          END IF
  291:          IF( D( N ).EQ.ZERO ) THEN
  292:             INFO = N
  293:             RETURN
  294:          END IF
  295:       END IF
  296: *
  297: *     Back solve with the matrix U from the factorization.
  298: *
  299:       IF( NRHS.LE.2 ) THEN
  300:          J = 1
  301:    70    CONTINUE
  302:          B( N, J ) = B( N, J ) / D( N )
  303:          IF( N.GT.1 )
  304:      $      B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) / D( N-1 )
  305:          DO 80 I = N - 2, 1, -1
  306:             B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DL( I )*
  307:      $                  B( I+2, J ) ) / D( I )
  308:    80    CONTINUE
  309:          IF( J.LT.NRHS ) THEN
  310:             J = J + 1
  311:             GO TO 70
  312:          END IF
  313:       ELSE
  314:          DO 100 J = 1, NRHS
  315:             B( N, J ) = B( N, J ) / D( N )
  316:             IF( N.GT.1 )
  317:      $         B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) /
  318:      $                       D( N-1 )
  319:             DO 90 I = N - 2, 1, -1
  320:                B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DL( I )*
  321:      $                     B( I+2, J ) ) / D( I )
  322:    90       CONTINUE
  323:   100    CONTINUE
  324:       END IF
  325: *
  326:       RETURN
  327: *
  328: *     End of DGTSV
  329: *
  330:       END

CVSweb interface <joel.bertrand@systella.fr>