LAPACK  3.4.1
LAPACK: Linear Algebra PACKage
cgbmv.f
Go to the documentation of this file.
00001 *> \brief \b CGBMV
00002 *
00003 *  =========== DOCUMENTATION ===========
00004 *
00005 * Online html documentation available at 
00006 *            http://www.netlib.org/lapack/explore-html/ 
00007 *
00008 *  Definition:
00009 *  ===========
00010 *
00011 *       SUBROUTINE CGBMV(TRANS,M,N,KL,KU,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
00012 * 
00013 *       .. Scalar Arguments ..
00014 *       COMPLEX ALPHA,BETA
00015 *       INTEGER INCX,INCY,KL,KU,LDA,M,N
00016 *       CHARACTER TRANS
00017 *       ..
00018 *       .. Array Arguments ..
00019 *       COMPLEX A(LDA,*),X(*),Y(*)
00020 *       ..
00021 *  
00022 *
00023 *> \par Purpose:
00024 *  =============
00025 *>
00026 *> \verbatim
00027 *>
00028 *> CGBMV  performs one of the matrix-vector operations
00029 *>
00030 *>    y := alpha*A*x + beta*y,   or   y := alpha*A**T*x + beta*y,   or
00031 *>
00032 *>    y := alpha*A**H*x + beta*y,
00033 *>
00034 *> where alpha and beta are scalars, x and y are vectors and A is an
00035 *> m by n band matrix, with kl sub-diagonals and ku super-diagonals.
00036 *> \endverbatim
00037 *
00038 *  Arguments:
00039 *  ==========
00040 *
00041 *> \param[in] TRANS
00042 *> \verbatim
00043 *>          TRANS is CHARACTER*1
00044 *>           On entry, TRANS specifies the operation to be performed as
00045 *>           follows:
00046 *>
00047 *>              TRANS = 'N' or 'n'   y := alpha*A*x + beta*y.
00048 *>
00049 *>              TRANS = 'T' or 't'   y := alpha*A**T*x + beta*y.
00050 *>
00051 *>              TRANS = 'C' or 'c'   y := alpha*A**H*x + beta*y.
00052 *> \endverbatim
00053 *>
00054 *> \param[in] M
00055 *> \verbatim
00056 *>          M is INTEGER
00057 *>           On entry, M specifies the number of rows of the matrix A.
00058 *>           M must be at least zero.
00059 *> \endverbatim
00060 *>
00061 *> \param[in] N
00062 *> \verbatim
00063 *>          N is INTEGER
00064 *>           On entry, N specifies the number of columns of the matrix A.
00065 *>           N must be at least zero.
00066 *> \endverbatim
00067 *>
00068 *> \param[in] KL
00069 *> \verbatim
00070 *>          KL is INTEGER
00071 *>           On entry, KL specifies the number of sub-diagonals of the
00072 *>           matrix A. KL must satisfy  0 .le. KL.
00073 *> \endverbatim
00074 *>
00075 *> \param[in] KU
00076 *> \verbatim
00077 *>          KU is INTEGER
00078 *>           On entry, KU specifies the number of super-diagonals of the
00079 *>           matrix A. KU must satisfy  0 .le. KU.
00080 *> \endverbatim
00081 *>
00082 *> \param[in] ALPHA
00083 *> \verbatim
00084 *>          ALPHA is COMPLEX
00085 *>           On entry, ALPHA specifies the scalar alpha.
00086 *> \endverbatim
00087 *>
00088 *> \param[in] A
00089 *> \verbatim
00090 *>          A is COMPLEX array of DIMENSION ( LDA, n ).
00091 *>           Before entry, the leading ( kl + ku + 1 ) by n part of the
00092 *>           array A must contain the matrix of coefficients, supplied
00093 *>           column by column, with the leading diagonal of the matrix in
00094 *>           row ( ku + 1 ) of the array, the first super-diagonal
00095 *>           starting at position 2 in row ku, the first sub-diagonal
00096 *>           starting at position 1 in row ( ku + 2 ), and so on.
00097 *>           Elements in the array A that do not correspond to elements
00098 *>           in the band matrix (such as the top left ku by ku triangle)
00099 *>           are not referenced.
00100 *>           The following program segment will transfer a band matrix
00101 *>           from conventional full matrix storage to band storage:
00102 *>
00103 *>                 DO 20, J = 1, N
00104 *>                    K = KU + 1 - J
00105 *>                    DO 10, I = MAX( 1, J - KU ), MIN( M, J + KL )
00106 *>                       A( K + I, J ) = matrix( I, J )
00107 *>              10    CONTINUE
00108 *>              20 CONTINUE
00109 *> \endverbatim
00110 *>
00111 *> \param[in] LDA
00112 *> \verbatim
00113 *>          LDA is INTEGER
00114 *>           On entry, LDA specifies the first dimension of A as declared
00115 *>           in the calling (sub) program. LDA must be at least
00116 *>           ( kl + ku + 1 ).
00117 *> \endverbatim
00118 *>
00119 *> \param[in] X
00120 *> \verbatim
00121 *>          X is COMPLEX array of DIMENSION at least
00122 *>           ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n'
00123 *>           and at least
00124 *>           ( 1 + ( m - 1 )*abs( INCX ) ) otherwise.
00125 *>           Before entry, the incremented array X must contain the
00126 *>           vector x.
00127 *> \endverbatim
00128 *>
00129 *> \param[in] INCX
00130 *> \verbatim
00131 *>          INCX is INTEGER
00132 *>           On entry, INCX specifies the increment for the elements of
00133 *>           X. INCX must not be zero.
00134 *> \endverbatim
00135 *>
00136 *> \param[in] BETA
00137 *> \verbatim
00138 *>          BETA is COMPLEX
00139 *>           On entry, BETA specifies the scalar beta. When BETA is
00140 *>           supplied as zero then Y need not be set on input.
00141 *> \endverbatim
00142 *>
00143 *> \param[in,out] Y
00144 *> \verbatim
00145 *>          Y is COMPLEX array of DIMENSION at least
00146 *>           ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n'
00147 *>           and at least
00148 *>           ( 1 + ( n - 1 )*abs( INCY ) ) otherwise.
00149 *>           Before entry, the incremented array Y must contain the
00150 *>           vector y. On exit, Y is overwritten by the updated vector y.
00151 *> \endverbatim
00152 *>
00153 *> \param[in] INCY
00154 *> \verbatim
00155 *>          INCY is INTEGER
00156 *>           On entry, INCY specifies the increment for the elements of
00157 *>           Y. INCY must not be zero.
00158 *> \endverbatim
00159 *
00160 *  Authors:
00161 *  ========
00162 *
00163 *> \author Univ. of Tennessee 
00164 *> \author Univ. of California Berkeley 
00165 *> \author Univ. of Colorado Denver 
00166 *> \author NAG Ltd. 
00167 *
00168 *> \date November 2011
00169 *
00170 *> \ingroup complex_blas_level2
00171 *
00172 *> \par Further Details:
00173 *  =====================
00174 *>
00175 *> \verbatim
00176 *>
00177 *>  Level 2 Blas routine.
00178 *>  The vector and matrix arguments are not referenced when N = 0, or M = 0
00179 *>
00180 *>  -- Written on 22-October-1986.
00181 *>     Jack Dongarra, Argonne National Lab.
00182 *>     Jeremy Du Croz, Nag Central Office.
00183 *>     Sven Hammarling, Nag Central Office.
00184 *>     Richard Hanson, Sandia National Labs.
00185 *> \endverbatim
00186 *>
00187 *  =====================================================================
00188       SUBROUTINE CGBMV(TRANS,M,N,KL,KU,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
00189 *
00190 *  -- Reference BLAS level2 routine (version 3.4.0) --
00191 *  -- Reference BLAS is a software package provided by Univ. of Tennessee,    --
00192 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
00193 *     November 2011
00194 *
00195 *     .. Scalar Arguments ..
00196       COMPLEX ALPHA,BETA
00197       INTEGER INCX,INCY,KL,KU,LDA,M,N
00198       CHARACTER TRANS
00199 *     ..
00200 *     .. Array Arguments ..
00201       COMPLEX A(LDA,*),X(*),Y(*)
00202 *     ..
00203 *
00204 *  =====================================================================
00205 *
00206 *     .. Parameters ..
00207       COMPLEX ONE
00208       PARAMETER (ONE= (1.0E+0,0.0E+0))
00209       COMPLEX ZERO
00210       PARAMETER (ZERO= (0.0E+0,0.0E+0))
00211 *     ..
00212 *     .. Local Scalars ..
00213       COMPLEX TEMP
00214       INTEGER I,INFO,IX,IY,J,JX,JY,K,KUP1,KX,KY,LENX,LENY
00215       LOGICAL NOCONJ
00216 *     ..
00217 *     .. External Functions ..
00218       LOGICAL LSAME
00219       EXTERNAL LSAME
00220 *     ..
00221 *     .. External Subroutines ..
00222       EXTERNAL XERBLA
00223 *     ..
00224 *     .. Intrinsic Functions ..
00225       INTRINSIC CONJG,MAX,MIN
00226 *     ..
00227 *
00228 *     Test the input parameters.
00229 *
00230       INFO = 0
00231       IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.
00232      +    .NOT.LSAME(TRANS,'C')) THEN
00233           INFO = 1
00234       ELSE IF (M.LT.0) THEN
00235           INFO = 2
00236       ELSE IF (N.LT.0) THEN
00237           INFO = 3
00238       ELSE IF (KL.LT.0) THEN
00239           INFO = 4
00240       ELSE IF (KU.LT.0) THEN
00241           INFO = 5
00242       ELSE IF (LDA.LT. (KL+KU+1)) THEN
00243           INFO = 8
00244       ELSE IF (INCX.EQ.0) THEN
00245           INFO = 10
00246       ELSE IF (INCY.EQ.0) THEN
00247           INFO = 13
00248       END IF
00249       IF (INFO.NE.0) THEN
00250           CALL XERBLA('CGBMV ',INFO)
00251           RETURN
00252       END IF
00253 *
00254 *     Quick return if possible.
00255 *
00256       IF ((M.EQ.0) .OR. (N.EQ.0) .OR.
00257      +    ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN
00258 *
00259       NOCONJ = LSAME(TRANS,'T')
00260 *
00261 *     Set  LENX  and  LENY, the lengths of the vectors x and y, and set
00262 *     up the start points in  X  and  Y.
00263 *
00264       IF (LSAME(TRANS,'N')) THEN
00265           LENX = N
00266           LENY = M
00267       ELSE
00268           LENX = M
00269           LENY = N
00270       END IF
00271       IF (INCX.GT.0) THEN
00272           KX = 1
00273       ELSE
00274           KX = 1 - (LENX-1)*INCX
00275       END IF
00276       IF (INCY.GT.0) THEN
00277           KY = 1
00278       ELSE
00279           KY = 1 - (LENY-1)*INCY
00280       END IF
00281 *
00282 *     Start the operations. In this version the elements of A are
00283 *     accessed sequentially with one pass through the band part of A.
00284 *
00285 *     First form  y := beta*y.
00286 *
00287       IF (BETA.NE.ONE) THEN
00288           IF (INCY.EQ.1) THEN
00289               IF (BETA.EQ.ZERO) THEN
00290                   DO 10 I = 1,LENY
00291                       Y(I) = ZERO
00292    10             CONTINUE
00293               ELSE
00294                   DO 20 I = 1,LENY
00295                       Y(I) = BETA*Y(I)
00296    20             CONTINUE
00297               END IF
00298           ELSE
00299               IY = KY
00300               IF (BETA.EQ.ZERO) THEN
00301                   DO 30 I = 1,LENY
00302                       Y(IY) = ZERO
00303                       IY = IY + INCY
00304    30             CONTINUE
00305               ELSE
00306                   DO 40 I = 1,LENY
00307                       Y(IY) = BETA*Y(IY)
00308                       IY = IY + INCY
00309    40             CONTINUE
00310               END IF
00311           END IF
00312       END IF
00313       IF (ALPHA.EQ.ZERO) RETURN
00314       KUP1 = KU + 1
00315       IF (LSAME(TRANS,'N')) THEN
00316 *
00317 *        Form  y := alpha*A*x + y.
00318 *
00319           JX = KX
00320           IF (INCY.EQ.1) THEN
00321               DO 60 J = 1,N
00322                   IF (X(JX).NE.ZERO) THEN
00323                       TEMP = ALPHA*X(JX)
00324                       K = KUP1 - J
00325                       DO 50 I = MAX(1,J-KU),MIN(M,J+KL)
00326                           Y(I) = Y(I) + TEMP*A(K+I,J)
00327    50                 CONTINUE
00328                   END IF
00329                   JX = JX + INCX
00330    60         CONTINUE
00331           ELSE
00332               DO 80 J = 1,N
00333                   IF (X(JX).NE.ZERO) THEN
00334                       TEMP = ALPHA*X(JX)
00335                       IY = KY
00336                       K = KUP1 - J
00337                       DO 70 I = MAX(1,J-KU),MIN(M,J+KL)
00338                           Y(IY) = Y(IY) + TEMP*A(K+I,J)
00339                           IY = IY + INCY
00340    70                 CONTINUE
00341                   END IF
00342                   JX = JX + INCX
00343                   IF (J.GT.KU) KY = KY + INCY
00344    80         CONTINUE
00345           END IF
00346       ELSE
00347 *
00348 *        Form  y := alpha*A**T*x + y  or  y := alpha*A**H*x + y.
00349 *
00350           JY = KY
00351           IF (INCX.EQ.1) THEN
00352               DO 110 J = 1,N
00353                   TEMP = ZERO
00354                   K = KUP1 - J
00355                   IF (NOCONJ) THEN
00356                       DO 90 I = MAX(1,J-KU),MIN(M,J+KL)
00357                           TEMP = TEMP + A(K+I,J)*X(I)
00358    90                 CONTINUE
00359                   ELSE
00360                       DO 100 I = MAX(1,J-KU),MIN(M,J+KL)
00361                           TEMP = TEMP + CONJG(A(K+I,J))*X(I)
00362   100                 CONTINUE
00363                   END IF
00364                   Y(JY) = Y(JY) + ALPHA*TEMP
00365                   JY = JY + INCY
00366   110         CONTINUE
00367           ELSE
00368               DO 140 J = 1,N
00369                   TEMP = ZERO
00370                   IX = KX
00371                   K = KUP1 - J
00372                   IF (NOCONJ) THEN
00373                       DO 120 I = MAX(1,J-KU),MIN(M,J+KL)
00374                           TEMP = TEMP + A(K+I,J)*X(IX)
00375                           IX = IX + INCX
00376   120                 CONTINUE
00377                   ELSE
00378                       DO 130 I = MAX(1,J-KU),MIN(M,J+KL)
00379                           TEMP = TEMP + CONJG(A(K+I,J))*X(IX)
00380                           IX = IX + INCX
00381   130                 CONTINUE
00382                   END IF
00383                   Y(JY) = Y(JY) + ALPHA*TEMP
00384                   JY = JY + INCY
00385                   IF (J.GT.KU) KX = KX + INCX
00386   140         CONTINUE
00387           END IF
00388       END IF
00389 *
00390       RETURN
00391 *
00392 *     End of CGBMV .
00393 *
00394       END
 All Files Functions