⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsymv.f

📁 网络带宽测试工具
💻 F
字号:
      SUBROUTINE DSYMV ( UPLO, N, ALPHA, A, LDA, X, INCX,     $                   BETA, Y, INCY )! ----------------------------------------------------------------------      Use      numerics      Implicit None*     .. Scalar Arguments ..      Real(l_)   ALPHA, BETA      INTEGER            INCX, INCY, LDA, N      CHARACTER*1        UPLO*     .. Array Arguments ..      Real(l_)   A( LDA, * ), X( * ), Y( * )*     ..**  Purpose*  =======**  DSYMV  performs the matrix-vector  operation**     y := alpha*A*x + beta*y,**  where alpha and beta are scalars, x and y are n element vectors and*  A is an n by n symmetric matrix.**  Parameters*  ==========**  UPLO   - CHARACTER*1.*           On entry, UPLO specifies whether the upper or lower*           triangular part of the array A is to be referenced as*           follows:**              UPLO = 'U' or 'u'   Only the upper triangular part of A*                                  is to be referenced.**              UPLO = 'L' or 'l'   Only the lower triangular part of A*                                  is to be referenced.**           Unchanged on exit.**  N      - INTEGER.*           On entry, N specifies the order of the matrix A.*           N must be at least zero.*           Unchanged on exit.**  ALPHA  - Real(l_).*           On entry, ALPHA specifies the scalar alpha.*           Unchanged on exit.**  A      - Real(l_) array of DIMENSION ( LDA, n ).*           Before entry with  UPLO = 'U' or 'u', the leading n by n*           upper triangular part of the array A must contain the upper*           triangular part of the symmetric matrix and the strictly*           lower triangular part of A is not referenced.*           Before entry with UPLO = 'L' or 'l', the leading n by n*           lower triangular part of the array A must contain the lower*           triangular part of the symmetric matrix and the strictly*           upper triangular part of A is not referenced.*           Unchanged on exit.**  LDA    - INTEGER.*           On entry, LDA specifies the first dimension of A as declared*           in the calling (sub) program. LDA must be at least*           max( 1, n ).*           Unchanged on exit.**  X      - Real(l_) array of dimension at least*           ( 1 + ( n - 1 )*abs( INCX ) ).*           Before entry, the incremented array X must contain the n*           element vector x.*           Unchanged on exit.**  INCX   - INTEGER.*           On entry, INCX specifies the increment for the elements of*           X. INCX must not be zero.*           Unchanged on exit.**  BETA   - Real(l_).*           On entry, BETA specifies the scalar beta. When BETA is*           supplied as zero then Y need not be set on input.*           Unchanged on exit.**  Y      - Real(l_) array of dimension at least*           ( 1 + ( n - 1 )*abs( INCY ) ).*           Before entry, the incremented array Y must contain the n*           element vector y. On exit, Y is overwritten by the updated*           vector y.**  INCY   - INTEGER.*           On entry, INCY specifies the increment for the elements of*           Y. INCY must not be zero.*           Unchanged on exit.***  Level 2 Blas routine.**  -- Written on 22-October-1986.*     Jack Dongarra, Argonne National Lab.*     Jeremy Du Croz, Nag Central Office.*     Sven Hammarling, Nag Central Office.*     Richard Hanson, Sandia National Labs.***     .. Parameters ..      Real(l_)   ONE         , ZERO      PARAMETER        ( ONE = 1.0_l_, ZERO = 0.0_l_ )*     .. Local Scalars ..      Real(l_)   TEMP1, TEMP2      INTEGER            I, INFO, IX, IY, J, JX, JY, KX, KY*     .. External Functions ..      LOGICAL            LSAME      EXTERNAL           LSAME*     .. External Subroutines ..      EXTERNAL           XERBLA*     .. Intrinsic Functions ..      INTRINSIC          MAX*     ..*     .. Executable Statements ..**     Test the input parameters.*      INFO = 0      IF     ( .NOT.LSAME( UPLO, 'U' ).AND.     $         .NOT.LSAME( UPLO, 'L' )      )THEN         INFO = 1      ELSE IF( N.LT.0 )THEN         INFO = 2      ELSE IF( LDA.LT.MAX( 1, N ) )THEN         INFO = 5      ELSE IF( INCX.EQ.0 )THEN         INFO = 7      ELSE IF( INCY.EQ.0 )THEN         INFO = 10      END IF      IF( INFO.NE.0 )THEN         CALL XERBLA( 'DSYMV ', INFO )         RETURN      END IF**     Quick return if possible.*      IF( ( N.EQ.0 ).OR.( ( ALPHA.EQ.ZERO ).AND.( BETA.EQ.ONE ) ) )     $   RETURN**     Set up the start points in  X  and  Y.*      IF( INCX.GT.0 )THEN         KX = 1      ELSE         KX = 1 - ( N - 1 )*INCX      END IF      IF( INCY.GT.0 )THEN         KY = 1      ELSE         KY = 1 - ( N - 1 )*INCY      END IF**     Start the operations. In this version the elements of A are*     accessed sequentially with one pass through the triangular part*     of A.**     First form  y := beta*y.*      IF( BETA.NE.ONE )THEN         IF( INCY.EQ.1 )THEN            IF( BETA.EQ.ZERO )THEN               DO 10, I = 1, N                  Y( I ) = ZERO   10          CONTINUE            ELSE               DO 20, I = 1, N                  Y( I ) = BETA*Y( I )   20          CONTINUE            END IF         ELSE            IY = KY            IF( BETA.EQ.ZERO )THEN               DO 30, I = 1, N                  Y( IY ) = ZERO                  IY      = IY   + INCY   30          CONTINUE            ELSE               DO 40, I = 1, N                  Y( IY ) = BETA*Y( IY )                  IY      = IY           + INCY   40          CONTINUE            END IF         END IF      END IF      IF( ALPHA.EQ.ZERO )     $   RETURN      IF( LSAME( UPLO, 'U' ) )THEN**        Form  y  when A is stored in upper triangle.*         IF( ( INCX.EQ.1 ).AND.( INCY.EQ.1 ) )THEN            DO 60, J = 1, N               TEMP1 = ALPHA*X( J )               TEMP2 = ZERO               DO 50, I = 1, J - 1                  Y( I ) = Y( I ) + TEMP1*A( I, J )                  TEMP2  = TEMP2  + A( I, J )*X( I )   50          CONTINUE               Y( J ) = Y( J ) + TEMP1*A( J, J ) + ALPHA*TEMP2   60       CONTINUE         ELSE            JX = KX            JY = KY            DO 80, J = 1, N               TEMP1 = ALPHA*X( JX )               TEMP2 = ZERO               IX    = KX               IY    = KY               DO 70, I = 1, J - 1                  Y( IY ) = Y( IY ) + TEMP1*A( I, J )                  TEMP2   = TEMP2   + A( I, J )*X( IX )                  IX      = IX      + INCX                  IY      = IY      + INCY   70          CONTINUE               Y( JY ) = Y( JY ) + TEMP1*A( J, J ) + ALPHA*TEMP2               JX      = JX      + INCX               JY      = JY      + INCY   80       CONTINUE         END IF      ELSE**        Form  y  when A is stored in lower triangle.*         IF( ( INCX.EQ.1 ).AND.( INCY.EQ.1 ) )THEN            DO 100, J = 1, N               TEMP1  = ALPHA*X( J )               TEMP2  = ZERO               Y( J ) = Y( J )       + TEMP1*A( J, J )               DO 90, I = J + 1, N                  Y( I ) = Y( I ) + TEMP1*A( I, J )                  TEMP2  = TEMP2  + A( I, J )*X( I )   90          CONTINUE               Y( J ) = Y( J ) + ALPHA*TEMP2  100       CONTINUE         ELSE            JX = KX            JY = KY            DO 120, J = 1, N               TEMP1   = ALPHA*X( JX )               TEMP2   = ZERO               Y( JY ) = Y( JY )       + TEMP1*A( J, J )               IX      = JX               IY      = JY               DO 110, I = J + 1, N                  IX      = IX      + INCX                  IY      = IY      + INCY                  Y( IY ) = Y( IY ) + TEMP1*A( I, J )                  TEMP2   = TEMP2   + A( I, J )*X( IX )  110          CONTINUE               Y( JY ) = Y( JY ) + ALPHA*TEMP2               JX      = JX      + INCX               JY      = JY      + INCY  120       CONTINUE         END IF      END IF*      RETURN**     End of DSYMV .*      END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -