File:  [local] / rpl / lapack / blas / dgemv.f
Revision 1.8: download - view: text, annotated - select for diffs - revision graph
Mon Nov 21 20:37:07 2011 UTC (12 years, 6 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_8, rpl-4_1_7, rpl-4_1_6, rpl-4_1_5, rpl-4_1_4, HEAD
Mise à jour de blas.

    1: *> \brief \b DGEMV
    2: *
    3: *  =========== DOCUMENTATION ===========
    4: *
    5: * Online html documentation available at 
    6: *            http://www.netlib.org/lapack/explore-html/ 
    7: *
    8: *  Definition:
    9: *  ===========
   10: *
   11: *       SUBROUTINE DGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
   12:    13: *       .. Scalar Arguments ..
   14: *       DOUBLE PRECISION ALPHA,BETA
   15: *       INTEGER INCX,INCY,LDA,M,N
   16: *       CHARACTER TRANS
   17: *       ..
   18: *       .. Array Arguments ..
   19: *       DOUBLE PRECISION A(LDA,*),X(*),Y(*)
   20: *       ..
   21: *  
   22: *
   23: *> \par Purpose:
   24: *  =============
   25: *>
   26: *> \verbatim
   27: *>
   28: *> DGEMV  performs one of the matrix-vector operations
   29: *>
   30: *>    y := alpha*A*x + beta*y,   or   y := alpha*A**T*x + beta*y,
   31: *>
   32: *> where alpha and beta are scalars, x and y are vectors and A is an
   33: *> m by n matrix.
   34: *> \endverbatim
   35: *
   36: *  Arguments:
   37: *  ==========
   38: *
   39: *> \param[in] TRANS
   40: *> \verbatim
   41: *>          TRANS is CHARACTER*1
   42: *>           On entry, TRANS specifies the operation to be performed as
   43: *>           follows:
   44: *>
   45: *>              TRANS = 'N' or 'n'   y := alpha*A*x + beta*y.
   46: *>
   47: *>              TRANS = 'T' or 't'   y := alpha*A**T*x + beta*y.
   48: *>
   49: *>              TRANS = 'C' or 'c'   y := alpha*A**T*x + beta*y.
   50: *> \endverbatim
   51: *>
   52: *> \param[in] M
   53: *> \verbatim
   54: *>          M is INTEGER
   55: *>           On entry, M specifies the number of rows of the matrix A.
   56: *>           M must be at least zero.
   57: *> \endverbatim
   58: *>
   59: *> \param[in] N
   60: *> \verbatim
   61: *>          N is INTEGER
   62: *>           On entry, N specifies the number of columns of the matrix A.
   63: *>           N must be at least zero.
   64: *> \endverbatim
   65: *>
   66: *> \param[in] ALPHA
   67: *> \verbatim
   68: *>          ALPHA is DOUBLE PRECISION.
   69: *>           On entry, ALPHA specifies the scalar alpha.
   70: *> \endverbatim
   71: *>
   72: *> \param[in] A
   73: *> \verbatim
   74: *>          A is DOUBLE PRECISION array of DIMENSION ( LDA, n ).
   75: *>           Before entry, the leading m by n part of the array A must
   76: *>           contain the matrix of coefficients.
   77: *> \endverbatim
   78: *>
   79: *> \param[in] LDA
   80: *> \verbatim
   81: *>          LDA is INTEGER
   82: *>           On entry, LDA specifies the first dimension of A as declared
   83: *>           in the calling (sub) program. LDA must be at least
   84: *>           max( 1, m ).
   85: *> \endverbatim
   86: *>
   87: *> \param[in] X
   88: *> \verbatim
   89: *>          X is DOUBLE PRECISION array of DIMENSION at least
   90: *>           ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n'
   91: *>           and at least
   92: *>           ( 1 + ( m - 1 )*abs( INCX ) ) otherwise.
   93: *>           Before entry, the incremented array X must contain the
   94: *>           vector x.
   95: *> \endverbatim
   96: *>
   97: *> \param[in] INCX
   98: *> \verbatim
   99: *>          INCX is INTEGER
  100: *>           On entry, INCX specifies the increment for the elements of
  101: *>           X. INCX must not be zero.
  102: *> \endverbatim
  103: *>
  104: *> \param[in] BETA
  105: *> \verbatim
  106: *>          BETA is DOUBLE PRECISION.
  107: *>           On entry, BETA specifies the scalar beta. When BETA is
  108: *>           supplied as zero then Y need not be set on input.
  109: *> \endverbatim
  110: *>
  111: *> \param[in,out] Y
  112: *> \verbatim
  113: *>          Y is DOUBLE PRECISION array of DIMENSION at least
  114: *>           ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n'
  115: *>           and at least
  116: *>           ( 1 + ( n - 1 )*abs( INCY ) ) otherwise.
  117: *>           Before entry with BETA non-zero, the incremented array Y
  118: *>           must contain the vector y. On exit, Y is overwritten by the
  119: *>           updated vector y.
  120: *> \endverbatim
  121: *>
  122: *> \param[in] INCY
  123: *> \verbatim
  124: *>          INCY is INTEGER
  125: *>           On entry, INCY specifies the increment for the elements of
  126: *>           Y. INCY must not be zero.
  127: *> \endverbatim
  128: *
  129: *  Authors:
  130: *  ========
  131: *
  132: *> \author Univ. of Tennessee 
  133: *> \author Univ. of California Berkeley 
  134: *> \author Univ. of Colorado Denver 
  135: *> \author NAG Ltd. 
  136: *
  137: *> \date November 2011
  138: *
  139: *> \ingroup double_blas_level2
  140: *
  141: *> \par Further Details:
  142: *  =====================
  143: *>
  144: *> \verbatim
  145: *>
  146: *>  Level 2 Blas routine.
  147: *>  The vector and matrix arguments are not referenced when N = 0, or M = 0
  148: *>
  149: *>  -- Written on 22-October-1986.
  150: *>     Jack Dongarra, Argonne National Lab.
  151: *>     Jeremy Du Croz, Nag Central Office.
  152: *>     Sven Hammarling, Nag Central Office.
  153: *>     Richard Hanson, Sandia National Labs.
  154: *> \endverbatim
  155: *>
  156: *  =====================================================================
  157:       SUBROUTINE DGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
  158: *
  159: *  -- Reference BLAS level2 routine (version 3.4.0) --
  160: *  -- Reference BLAS is a software package provided by Univ. of Tennessee,    --
  161: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  162: *     November 2011
  163: *
  164: *     .. Scalar Arguments ..
  165:       DOUBLE PRECISION ALPHA,BETA
  166:       INTEGER INCX,INCY,LDA,M,N
  167:       CHARACTER TRANS
  168: *     ..
  169: *     .. Array Arguments ..
  170:       DOUBLE PRECISION A(LDA,*),X(*),Y(*)
  171: *     ..
  172: *
  173: *  =====================================================================
  174: *
  175: *     .. Parameters ..
  176:       DOUBLE PRECISION ONE,ZERO
  177:       PARAMETER (ONE=1.0D+0,ZERO=0.0D+0)
  178: *     ..
  179: *     .. Local Scalars ..
  180:       DOUBLE PRECISION TEMP
  181:       INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY,LENX,LENY
  182: *     ..
  183: *     .. External Functions ..
  184:       LOGICAL LSAME
  185:       EXTERNAL LSAME
  186: *     ..
  187: *     .. External Subroutines ..
  188:       EXTERNAL XERBLA
  189: *     ..
  190: *     .. Intrinsic Functions ..
  191:       INTRINSIC MAX
  192: *     ..
  193: *
  194: *     Test the input parameters.
  195: *
  196:       INFO = 0
  197:       IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.
  198:      +    .NOT.LSAME(TRANS,'C')) THEN
  199:           INFO = 1
  200:       ELSE IF (M.LT.0) THEN
  201:           INFO = 2
  202:       ELSE IF (N.LT.0) THEN
  203:           INFO = 3
  204:       ELSE IF (LDA.LT.MAX(1,M)) THEN
  205:           INFO = 6
  206:       ELSE IF (INCX.EQ.0) THEN
  207:           INFO = 8
  208:       ELSE IF (INCY.EQ.0) THEN
  209:           INFO = 11
  210:       END IF
  211:       IF (INFO.NE.0) THEN
  212:           CALL XERBLA('DGEMV ',INFO)
  213:           RETURN
  214:       END IF
  215: *
  216: *     Quick return if possible.
  217: *
  218:       IF ((M.EQ.0) .OR. (N.EQ.0) .OR.
  219:      +    ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN
  220: *
  221: *     Set  LENX  and  LENY, the lengths of the vectors x and y, and set
  222: *     up the start points in  X  and  Y.
  223: *
  224:       IF (LSAME(TRANS,'N')) THEN
  225:           LENX = N
  226:           LENY = M
  227:       ELSE
  228:           LENX = M
  229:           LENY = N
  230:       END IF
  231:       IF (INCX.GT.0) THEN
  232:           KX = 1
  233:       ELSE
  234:           KX = 1 - (LENX-1)*INCX
  235:       END IF
  236:       IF (INCY.GT.0) THEN
  237:           KY = 1
  238:       ELSE
  239:           KY = 1 - (LENY-1)*INCY
  240:       END IF
  241: *
  242: *     Start the operations. In this version the elements of A are
  243: *     accessed sequentially with one pass through A.
  244: *
  245: *     First form  y := beta*y.
  246: *
  247:       IF (BETA.NE.ONE) THEN
  248:           IF (INCY.EQ.1) THEN
  249:               IF (BETA.EQ.ZERO) THEN
  250:                   DO 10 I = 1,LENY
  251:                       Y(I) = ZERO
  252:    10             CONTINUE
  253:               ELSE
  254:                   DO 20 I = 1,LENY
  255:                       Y(I) = BETA*Y(I)
  256:    20             CONTINUE
  257:               END IF
  258:           ELSE
  259:               IY = KY
  260:               IF (BETA.EQ.ZERO) THEN
  261:                   DO 30 I = 1,LENY
  262:                       Y(IY) = ZERO
  263:                       IY = IY + INCY
  264:    30             CONTINUE
  265:               ELSE
  266:                   DO 40 I = 1,LENY
  267:                       Y(IY) = BETA*Y(IY)
  268:                       IY = IY + INCY
  269:    40             CONTINUE
  270:               END IF
  271:           END IF
  272:       END IF
  273:       IF (ALPHA.EQ.ZERO) RETURN
  274:       IF (LSAME(TRANS,'N')) THEN
  275: *
  276: *        Form  y := alpha*A*x + y.
  277: *
  278:           JX = KX
  279:           IF (INCY.EQ.1) THEN
  280:               DO 60 J = 1,N
  281:                   IF (X(JX).NE.ZERO) THEN
  282:                       TEMP = ALPHA*X(JX)
  283:                       DO 50 I = 1,M
  284:                           Y(I) = Y(I) + TEMP*A(I,J)
  285:    50                 CONTINUE
  286:                   END IF
  287:                   JX = JX + INCX
  288:    60         CONTINUE
  289:           ELSE
  290:               DO 80 J = 1,N
  291:                   IF (X(JX).NE.ZERO) THEN
  292:                       TEMP = ALPHA*X(JX)
  293:                       IY = KY
  294:                       DO 70 I = 1,M
  295:                           Y(IY) = Y(IY) + TEMP*A(I,J)
  296:                           IY = IY + INCY
  297:    70                 CONTINUE
  298:                   END IF
  299:                   JX = JX + INCX
  300:    80         CONTINUE
  301:           END IF
  302:       ELSE
  303: *
  304: *        Form  y := alpha*A**T*x + y.
  305: *
  306:           JY = KY
  307:           IF (INCX.EQ.1) THEN
  308:               DO 100 J = 1,N
  309:                   TEMP = ZERO
  310:                   DO 90 I = 1,M
  311:                       TEMP = TEMP + A(I,J)*X(I)
  312:    90             CONTINUE
  313:                   Y(JY) = Y(JY) + ALPHA*TEMP
  314:                   JY = JY + INCY
  315:   100         CONTINUE
  316:           ELSE
  317:               DO 120 J = 1,N
  318:                   TEMP = ZERO
  319:                   IX = KX
  320:                   DO 110 I = 1,M
  321:                       TEMP = TEMP + A(I,J)*X(IX)
  322:                       IX = IX + INCX
  323:   110             CONTINUE
  324:                   Y(JY) = Y(JY) + ALPHA*TEMP
  325:                   JY = JY + INCY
  326:   120         CONTINUE
  327:           END IF
  328:       END IF
  329: *
  330:       RETURN
  331: *
  332: *     End of DGEMV .
  333: *
  334:       END

CVSweb interface <joel.bertrand@systella.fr>