**********************************************************************
C
C Copyright (C) 1992 Roland W. Freund and Noel M. Nachtigal
C All rights reserved.
C
C This code is part of a copyrighted package. For details, see the
C file `cpyrit.doc' in the top-level directory.
C
C *****************************************************************
C ANY USE OF THIS CODE CONSTITUTES ACCEPTANCE OF THE TERMS OF THE
C COPYRIGHT NOTICE
C *****************************************************************
C
C**********************************************************************
C
SUBROUTINE CAXPBY (N,CZ,CA,CX,CB,CY)
C
C Purpose:
C This subroutine computes CZ = CA * CX + CB * CY. Several special
C cases are handled separately:
C CA = 0.0, CB = 0.0 => CZ = 0.0
C CA = 0.0, CB = 1.0 => CZ = CY (this is COPY)
C CA = 0.0, CB = -1.0 => CZ = -CY
C CA = 0.0, CB = CB => CZ = CB * CY (this is SCAL)
C CA = 1.0, CB = 0.0 => CZ = CX (this is COPY)
C CA = 1.0, CB = 1.0 => CZ = CX + CY
C CA = 1.0, CB = -1.0 => CZ = CX - CY
C CA = 1.0, CB = CB => CZ = CX + CB * CY (this is AXPY)
C CA = -1.0, CB = 0.0 => CZ = -CX
C CA = -1.0, CB = 1.0 => CZ = -CX + CY
C CA = -1.0, CB = -1.0 => CZ = -CX - CY
C CA = -1.0, CB = CB => CZ = -CX + CB * CY
C CA = CA, CB = 0.0 => CZ = CA * CX (this is SCAL)
C CA = CA, CB = 1.0 => CZ = CA * CX + CY (this is AXPY)
C CA = CA, CB = -1.0 => CZ = CA * CX - CY
C CA = CA, CB = CB => CZ = CA * CX + CB * CY
C CZ may be the same as CX or CY.
C
C Parameters:
C N = the dimension of the vectors (input).
C CZ = the vector result (output).
C CA = scalar multiplier for CX (input).
C CX = one of the vectors (input).
C CB = scalar multiplier for CY (input).
C CY = the other vector (input).
C
C Noel M. Nachtigal
C March 23, 1993
C
C**********************************************************************
C
INTRINSIC AIMAG, REAL
C
INTEGER N
COMPLEX CA, CB, CX(N), CY(N), CZ(N)
C
C Local variables.
C
INTEGER I
REAL SAI, SAR, SBI, SBR
C
IF (N.LE.0) RETURN
C
SAI = AIMAG(CA)
SAR = REAL(CA)
SBI = AIMAG(CB)
SBR = REAL(CB)
IF ((SAR.EQ.0.0E0).AND.(SAI.EQ.0.0E0)) THEN
IF ((SBR.EQ.0.0E0).AND.(SBI.EQ.0.0E0)) THEN
C CA = 0.0, CB = 0.0 => CZ = 0.0.
DO 10 I = 1, N
CZ(I) = (0.0E0,0.0E0)
10 CONTINUE
ELSE IF ((SBR.EQ.1.0E0).AND.(SBI.EQ.0.0E0)) THEN
C CA = 0.0, CB = 1.0 => CZ = CY (this is COPY).
DO 20 I = 1, N
CZ(I) = CY(I)
20 CONTINUE
ELSE IF ((SBR.EQ.-1.0E0).AND.(SBI.EQ.0.0E0)) THEN
C CA = 0.0, CB = -1.0 => CZ = -CY.
DO 30 I = 1, N
CZ(I) = -CY(I)
30 CONTINUE
ELSE
C CA = 0.0, CB = CB => CZ = CB * CY (this is SCAL).
DO 40 I = 1, N
CZ(I) = CB * CY(I)
40 CONTINUE
END IF
ELSE IF ((SAR.EQ.1.0E0).AND.(SAI.EQ.0.0E0)) THEN
IF ((SBR.EQ.0.0E0).AND.(SBI.EQ.0.0E0)) THEN
C CA = 1.0, CB = 0.0 => CZ = CX (this is COPY).
DO 50 I = 1, N
CZ(I) = CX(I)
50 CONTINUE
ELSE IF ((SBR.EQ.1.0E0).AND.(SBI.EQ.0.0E0)) THEN
C CA = 1.0, CB = 1.0 => CZ = CX + CY.
DO 60 I = 1, N
CZ(I) = CX(I) + CY(I)
60 CONTINUE
ELSE IF ((SBR.EQ.-1.0E0).AND.(SBI.EQ.0.0E0)) THEN
C CA = 1.0, CB = -1.0 => CZ = CX - CY.
DO 70 I = 1, N
CZ(I) = CX(I) - CY(I)
70 CONTINUE
ELSE
C CA = 1.0, CB = CB => CZ = CX + CB * CY (this is AXPY).
DO 80 I = 1, N
CZ(I) = CX(I) + CB * CY(I)
80 CONTINUE
END IF
ELSE IF ((SAR.EQ.-1.0E0).AND.(SAI.EQ.0.0E0)) THEN
IF ((SBR.EQ.0.0E0).AND.(SBI.EQ.0.0E0)) THEN
C CA = -1.0, CB = 0.0 => CZ = -CX
DO 90 I = 1, N
CZ(I) = -CX(I)
90 CONTINUE
ELSE IF ((SBR.EQ.1.0E0).AND.(SBI.EQ.0.0E0)) THEN
C CA = -1.0, CB = 1.0 => CZ = -CX + CY
DO 100 I = 1, N
CZ(I) = -CX(I) + CY(I)
100 CONTINUE
ELSE IF ((SBR.EQ.-1.0E0).AND.(SBI.EQ.0.0E0)) THEN
C CA = -1.0, CB = -1.0 => CZ = -CX - CY.
DO 110 I = 1, N
CZ(I) = -CX(I) - CY(I)
110 CONTINUE
ELSE
C CA = -1.0, CB = CB => CZ = -CX + CB * CY
DO 120 I = 1, N
CZ(I) = -CX(I) + CB * CY(I)
120 CONTINUE
END IF
ELSE
IF ((SBR.EQ.0.0E0).AND.(SBI.EQ.0.0E0)) THEN
C CA = CA, CB = 0.0 => CZ = CA * CX (this is SCAL).
DO 130 I = 1, N
CZ(I) = CA * CX(I)
130 CONTINUE
ELSE IF ((SBR.EQ.1.0E0).AND.(SBI.EQ.0.0E0)) THEN
C CA = CA, CB = 1.0 => CZ = CA * CX + CY (this is AXPY)
DO 140 I = 1, N
CZ(I) = CA * CX(I) + CY(I)
140 CONTINUE
ELSE IF ((SBR.EQ.-1.0E0).AND.(SBI.EQ.0.0E0)) THEN
C CA = CA, CB = -1.0 => CZ = CA * CX - CY.
DO 150 I = 1, N
CZ(I) = CA * CX(I) - CY(I)
150 CONTINUE
ELSE
C CA = CA, CB = CB => CZ = CA * CX + CB * CY.
DO 160 I = 1, N
CZ(I) = CA * CX(I) + CB * CY(I)
160 CONTINUE
END IF
END IF
C
RETURN
END
C
C**********************************************************************