ScaLAPACK  2.0.2
ScaLAPACK: Scalable Linear Algebra PACKage
pbzvecadd.f
Go to the documentation of this file.
00001       SUBROUTINE PBZVECADD( ICONTXT, MODE, N, ALPHA, X, INCX, BETA, Y,
00002      $                      INCY )
00003 *
00004 *  -- PB-BLAS routine (version 2.1) --
00005 *     University of Tennessee, Knoxville, Oak Ridge National Laboratory.
00006 *     April 28, 1996
00007 *
00008 *     .. Scalar Arguments ..
00009       CHARACTER*1           MODE
00010       INTEGER               ICONTXT, INCX, INCY, N
00011       COMPLEX*16            ALPHA, BETA
00012 *     ..
00013 *     .. Array Arguments ..
00014       COMPLEX*16            X( * ), Y( * )
00015 *
00016 *     ..
00017 *
00018 *  Purpose
00019 *  =======
00020 *
00021 *  PBZVECADD performs a vector X to be added to Y
00022 *    Y := alpha*op(X) + beta*Y,
00023 *  where alpha and beta are scalars, and X and Y are n vectors,
00024 *  and op(X) = X**H if MODE = 'C',
00025 *
00026 *  Arguments
00027 *  =========
00028 *
00029 *  ICONTXT (input) INTEGER
00030 *          ICONTXT is the BLACS mechanism for partitioning communication
00031 *          space.  A defining property of a context is that a message in
00032 *          a context cannot be sent or received in another context.  The
00033 *          BLACS context includes the definition of a grid, and each
00034 *          process' coordinates in it.
00035 *
00036 *  MODE   (input) CHARACTER*1
00037 *          Specifies the transposed, or conjugate transposed vector X
00038 *          to be added to the vector Y
00039 *          = 'C': Conjugate vector X is added for complex data set.
00040 *                 Y = alpha * X**H + beta * Y
00041 *          ELSE : Vector X is added.  Y = alpha*X + beta*Y
00042 *                 if MODE = 'V', BLAS routine may be used.
00043 *
00044 *  N       (input) INTEGER
00045 *          The number of elements of the vectors X and Y to be added.
00046 *          N >= 0.
00047 *
00048 *  ALPHA   (input) COMPLEX*16
00049 *          ALPHA specifies the scalar alpha.
00050 *
00051 *  X       (input) COMPLEX*16 array of DIMENSION at least
00052 *          ( 1 + ( N - 1 )*abs( INCX ) )
00053 *          The incremented array X must contain the vector X.
00054 *
00055 *  INCX    (input) INTEGER
00056 *          INCX specifies the increment for the elements of X.
00057 *          INCX <> 0.
00058 *
00059 *  BETA    (input) COMPLEX*16
00060 *          BETA specifies the scalar beta.
00061 *
00062 *  Y       (input/output) COMPLEX*16 array of DIMENSION at least
00063 *          ( 1 + ( N - 1 )*abs( INCY ) )
00064 *          On entry with BETA non-zero, the incremented array Y must
00065 *          contain the vector Y.
00066 *          On exit, Y is overwritten by the updated vector Y.
00067 *
00068 *  INCY  - (input) INTEGER
00069 *          INCY specifies the increment for the elements of Y.
00070 *          INCY <> 0.
00071 *
00072 *  =====================================================================
00073 *
00074 *     ..
00075 *     .. Parameters ..
00076       COMPLEX*16         ZERO, ONE
00077       PARAMETER        ( ZERO = ( 0.0D+0, 0.0D+0 ) )
00078       PARAMETER        ( ONE  = ( 1.0D+0, 0.0D+0 ) )
00079 *     ..
00080 *     .. Local Scalars ..
00081       INTEGER            I, IX, IY
00082 *     ..
00083 *     .. External Functions ..
00084       LOGICAL            LSAME
00085       EXTERNAL           LSAME
00086 *     ..
00087 *     .. External Subroutines ..
00088       EXTERNAL           ZSCAL, ZCOPY, ZAXPY
00089 *     ..
00090 *     .. Intrinsic Functions ..
00091       INTRINSIC          DCONJG
00092 *     ..
00093 *     .. Executable Statements ..
00094 *
00095       IF( N.LE.0 .OR. ( ALPHA.EQ.ZERO .AND. BETA.EQ.ONE ) ) RETURN
00096 *
00097       IF( ALPHA.EQ.ZERO ) THEN
00098          IF( BETA.EQ.ZERO ) THEN
00099             IF( INCY.EQ.1 ) THEN
00100                DO 10 I = 1, N
00101                   Y( I ) = ZERO
00102    10          CONTINUE
00103             ELSE
00104                IY = 1
00105                DO 20 I = 1, N
00106                   Y( IY ) = ZERO
00107                   IY = IY + INCY
00108    20          CONTINUE
00109             END IF
00110 *
00111          ELSE
00112             IF( LSAME( MODE, 'V' ) ) THEN
00113                CALL ZSCAL( N, BETA, Y, INCY )
00114             ELSE IF( INCY.EQ.1 ) THEN
00115                DO 30 I = 1, N
00116                   Y( I ) = BETA * Y( I )
00117    30          CONTINUE
00118             ELSE
00119                IY = 1
00120                DO 40 I = 1, N
00121                   Y( IY ) = BETA * Y( IY )
00122                   IY = IY + INCY
00123    40          CONTINUE
00124             END IF
00125          END IF
00126 *
00127       ELSE IF( .NOT.LSAME( MODE, 'C' ) ) THEN
00128          IF( ALPHA.EQ.ONE ) THEN
00129             IF( BETA.EQ.ZERO ) THEN
00130                IF( LSAME( MODE, 'V' ) ) THEN
00131                   CALL ZCOPY( N, X, INCX, Y, INCY )
00132                ELSE IF( INCX.EQ.1 .AND. INCY.EQ.1 ) THEN
00133                   DO 50 I = 1, N
00134                      Y( I ) = X( I )
00135    50             CONTINUE
00136                ELSE
00137                   IX = 1
00138                   IY = 1
00139                   DO 60 I = 1, N
00140                      Y( IY ) = X( IX )
00141                      IX = IX + INCX
00142                      IY = IY + INCY
00143    60             CONTINUE
00144                END IF
00145 *
00146             ELSE IF( BETA.EQ.ONE ) THEN
00147                IF( INCX.EQ.1 .AND. INCY.EQ.1 ) THEN
00148                   DO 70 I = 1, N
00149                      Y( I ) = X( I ) + Y( I )
00150    70             CONTINUE
00151                ELSE
00152                   IX = 1
00153                   IY = 1
00154                   DO 80 I = 1, N
00155                      Y( IY ) = X( IX ) + Y( IY )
00156                      IX = IX + INCX
00157                      IY = IY + INCY
00158    80             CONTINUE
00159                END IF
00160 *
00161             ELSE
00162                IF( INCX.EQ.1 .AND. INCY.EQ.1 ) THEN
00163                   DO 90 I = 1, N
00164                      Y( I ) = X( I ) + BETA * Y( I )
00165    90             CONTINUE
00166                ELSE
00167                   IX = 1
00168                   IY = 1
00169                   DO 100 I = 1, N
00170                      Y( IY ) = X( IX ) + BETA * Y( IY )
00171                      IX = IX + INCX
00172                      IY = IY + INCY
00173   100             CONTINUE
00174                END IF
00175             END IF
00176 *
00177          ELSE
00178             IF( BETA.EQ.ZERO ) THEN
00179                IF( INCX.EQ.1 .AND. INCY.EQ.1 ) THEN
00180                   DO 110 I = 1, N
00181                      Y( I ) = ALPHA * X( I )
00182   110             CONTINUE
00183                ELSE
00184                   IX = 1
00185                   IY = 1
00186                   DO 120 I = 1, N
00187                      Y( IY ) = X( IX )
00188                      IX = IX + INCX
00189                      IY = IY + INCY
00190   120             CONTINUE
00191                END IF
00192 *
00193             ELSE IF( BETA.EQ.ONE ) THEN
00194                IF( LSAME( MODE, 'V' ) ) THEN
00195                   CALL ZAXPY( N, ALPHA, X, INCX, Y, INCY )
00196                ELSE IF( INCX.EQ.1 .AND. INCY.EQ.1 ) THEN
00197                   DO 130 I = 1, N
00198                      Y( I ) = ALPHA * X( I ) + Y( I )
00199   130             CONTINUE
00200                ELSE
00201                   IX = 1
00202                   IY = 1
00203                   DO 140 I = 1, N
00204                      Y( IY ) = ALPHA * X( IX ) + Y( IY )
00205                      IX = IX + INCX
00206                      IY = IY + INCY
00207   140             CONTINUE
00208                END IF
00209 *
00210             ELSE
00211                IF( INCX.EQ.1 .AND. INCY.EQ.1 ) THEN
00212                   DO 150 I = 1, N
00213                      Y( I ) = ALPHA * X( I ) + BETA * Y( I )
00214   150             CONTINUE
00215                ELSE
00216                   IX = 1
00217                   IY = 1
00218                   DO 160 I = 1, N
00219                      Y( IY ) = ALPHA * X( IX ) + BETA * Y( IY )
00220                      IX = IX + INCX
00221                      IY = IY + INCY
00222   160             CONTINUE
00223                END IF
00224             END IF
00225          END IF
00226 *
00227       ELSE
00228          IF( ALPHA.EQ.ONE ) THEN
00229             IF( BETA.EQ.ZERO ) THEN
00230                IF( INCX.EQ.1 .AND. INCY.EQ.1 ) THEN
00231                   DO 170 I = 1, N
00232                      Y( I ) = DCONJG( X( I ) )
00233   170             CONTINUE
00234                ELSE
00235                   IX = 1
00236                   IY = 1
00237                   DO 180 I = 1, N
00238                      Y( IY ) = DCONJG( X( IX ) )
00239                      IX = IX + INCX
00240                      IY = IY + INCY
00241   180             CONTINUE
00242                END IF
00243 *
00244             ELSE IF( BETA.EQ.ONE ) THEN
00245                IF( INCX.EQ.1 .AND. INCY.EQ.1 ) THEN
00246                   DO 190 I = 1, N
00247                      Y( I ) = DCONJG( X( I ) ) + Y( I )
00248   190             CONTINUE
00249                ELSE
00250                   IX = 1
00251                   IY = 1
00252                   DO 200 I = 1, N
00253                      Y( IY ) = DCONJG( X( IX ) ) + Y( IY )
00254                      IX = IX + INCX
00255                      IY = IY + INCY
00256   200             CONTINUE
00257                END IF
00258 *
00259             ELSE
00260                IF( INCX.EQ.1 .AND. INCY.EQ.1 ) THEN
00261                   DO 210 I = 1, N
00262                      Y( I ) = DCONJG( X( I ) ) + BETA * Y( I )
00263   210             CONTINUE
00264                ELSE
00265                   IX = 1
00266                   IY = 1
00267                   DO 220 I = 1, N
00268                      Y( IY ) = DCONJG( X( IX ) ) + BETA * Y( IY )
00269                      IX = IX + INCX
00270                      IY = IY + INCY
00271   220             CONTINUE
00272                END IF
00273             END IF
00274 *
00275          ELSE
00276             IF( BETA.EQ.ZERO ) THEN
00277                IF( INCX.EQ.1 .AND. INCY.EQ.1 ) THEN
00278                   DO 230 I = 1, N
00279                      Y( I ) = ALPHA * DCONJG( X( I ) )
00280   230             CONTINUE
00281                ELSE
00282                   IX = 1
00283                   IY = 1
00284                   DO 240 I = 1, N
00285                      Y( IY ) = ALPHA * DCONJG( X( IX ) )
00286                      IX = IX + INCX
00287                      IY = IY + INCY
00288   240             CONTINUE
00289                END IF
00290 *
00291             ELSE IF( BETA.EQ.ONE ) THEN
00292                IF( INCX.EQ.1 .AND. INCY.EQ.1 ) THEN
00293                   DO 250 I = 1, N
00294                      Y( I ) = ALPHA * DCONJG( X( I ) ) + Y( I )
00295   250             CONTINUE
00296                ELSE
00297                   IX = 1
00298                   IY = 1
00299                   DO 260 I = 1, N
00300                      Y( IY ) = ALPHA * DCONJG( X( IX ) ) + Y( IY )
00301                      IX = IX + INCX
00302                      IY = IY + INCY
00303   260             CONTINUE
00304                END IF
00305 *
00306             ELSE
00307                IF( INCX.EQ.1 .AND. INCY.EQ.1 ) THEN
00308                   DO 270 I = 1, N
00309                      Y( I ) = ALPHA * DCONJG( X( I ) ) + BETA * Y( I )
00310   270             CONTINUE
00311                ELSE
00312                   IX = 1
00313                   IY = 1
00314                   DO 280 I = 1, N
00315                      Y( IY ) = ALPHA * DCONJG( X(IX) ) + BETA * Y( IY )
00316                      IX = IX + INCX
00317                      IY = IY + INCY
00318   280             CONTINUE
00319                END IF
00320             END IF
00321          END IF
00322       END IF
00323 *
00324       RETURN
00325 *
00326 *     End of PBZVECADD
00327 *
00328       END