V3FIT
daxpby.f
1 **********************************************************************
2 C
3 C Copyright (C) 1992 Roland W. Freund and Noel M. Nachtigal
4 C All rights reserved.
5 C
6 C This code is part of a copyrighted package. For details, see the
7 C file `cpyrit.doc' in the top-level directory.
8 C
9 C *****************************************************************
10 C ANY USE OF THIS CODE CONSTITUTES ACCEPTANCE OF THE TERMS OF THE
11 C COPYRIGHT NOTICE
12 C *****************************************************************
13 C
14 C**********************************************************************
15 C
16  SUBROUTINE daxpby (N,DZ,DA,DX,DB,DY)
17  USE stel_kinds, ONLY: rprec, dp
18  IMPLICIT NONE
19 C
20 C Purpose:
21 C This subroutine computes DZ = DA * DX + DB * DY. Several special
22 C cases are handled separately:
23 C DA = 0.0, DB = 0.0 => DZ = 0.0
24 C DA = 0.0, DB = 1.0 => DZ = DY (this is COPY)
25 C DA = 0.0, DB = -1.0 => DZ = -DY
26 C DA = 0.0, DB = DB => DZ = DB * DY (this is SCAL)
27 C DA = 1.0, DB = 0.0 => DZ = DX (this is COPY)
28 C DA = 1.0, DB = 1.0 => DZ = DX + DY
29 C DA = 1.0, DB = -1.0 => DZ = DX - DY
30 C DA = 1.0, DB = DB => DZ = DX + DB * DY (this is AXPY)
31 C DA = -1.0, DB = 0.0 => DZ = -DX
32 C DA = -1.0, DB = 1.0 => DZ = -DX + DY
33 C DA = -1.0, DB = -1.0 => DZ = -DX - DY
34 C DA = -1.0, DB = DB => DZ = -DX + DB * DY
35 C DA = DA, DB = 0.0 => DZ = DA * DX (this is SCAL)
36 C DA = DA, DB = 1.0 => DZ = DA * DX + DY (this is AXPY)
37 C DA = DA, DB = -1.0 => DZ = DA * DX - DY
38 C DA = DA, DB = DB => DZ = DA * DX + DB * DY
39 C DZ may be the same as DX or DY.
40 C
41 C Parameters:
42 C N = the dimension of the vectors (input).
43 C DZ = the vector result (output).
44 C DA = scalar multiplier for DX (input).
45 C DX = one of the vectors (input).
46 C DB = scalar multiplier for DY (input).
47 C DY = the other vector (input).
48 C
49 C Noel M. Nachtigal
50 C March 23, 1993
51 C
52 C**********************************************************************
53 C
54  INTEGER N
55  REAL(rprec), PARAMETER :: ZERO = 0, one = 1
56  REAL(rprec) DA, DB, DX(N), DY(N), DZ(N)
57 C
58 C Local variables.
59 C
60  INTEGER I
61 C
62  IF (n.LE.0) RETURN
63 C
64  IF (da.EQ.zero) THEN
65  IF (db.EQ.zero) THEN
66 C DA = 0.0, DB = 0.0 => DZ = 0.0.
67  DO 10 i = 1, n
68  dz(i) = zero
69  10 CONTINUE
70  ELSE IF (db.EQ.one) THEN
71 C DA = 0.0, DB = 1.0 => DZ = DY (this is COPY).
72  DO 20 i = 1, n
73  dz(i) = dy(i)
74  20 CONTINUE
75  ELSE IF (db.EQ.-one) THEN
76 C DA = 0.0, DB = -1.0 => DZ = -DY.
77  DO 30 i = 1, n
78  dz(i) = -dy(i)
79  30 CONTINUE
80  ELSE
81 C DA = 0.0, DB = DB => DZ = DB * DY (this is SCAL).
82  DO 40 i = 1, n
83  dz(i) = db * dy(i)
84  40 CONTINUE
85  END IF
86  ELSE IF (da.EQ.one) THEN
87  IF (db.EQ.zero) THEN
88 C DA = 1.0, DB = 0.0 => DZ = DX (this is COPY).
89  DO 50 i = 1, n
90  dz(i) = dx(i)
91  50 CONTINUE
92  ELSE IF (db.EQ.one) THEN
93 C DA = 1.0, DB = 1.0 => DZ = DX + DY.
94  DO 60 i = 1, n
95  dz(i) = dx(i) + dy(i)
96  60 CONTINUE
97  ELSE IF (db.EQ.-one) THEN
98 C DA = 1.0, DB = -1.0 => DZ = DX - DY.
99  DO 70 i = 1, n
100  dz(i) = dx(i) - dy(i)
101  70 CONTINUE
102  ELSE
103 C DA = 1.0, DB = DB => DZ = DX + DB * DY (this is AXPY).
104  DO 80 i = 1, n
105  dz(i) = dx(i) + db * dy(i)
106  80 CONTINUE
107  END IF
108  ELSE IF (da.EQ.-one) THEN
109  IF (db.EQ.zero) THEN
110 C DA = -1.0, DB = 0.0 => DZ = -DX
111  DO 90 i = 1, n
112  dz(i) = -dx(i)
113  90 CONTINUE
114  ELSE IF (db.EQ.one) THEN
115 C DA = -1.0, DB = 1.0 => DZ = -DX + DY
116  DO 100 i = 1, n
117  dz(i) = -dx(i) + dy(i)
118  100 CONTINUE
119  ELSE IF (db.EQ.-one) THEN
120 C DA = -1.0, DB = -1.0 => DZ = -DX - DY.
121  DO 110 i = 1, n
122  dz(i) = -dx(i) - dy(i)
123  110 CONTINUE
124  ELSE
125 C DA = -1.0, DB = DB => DZ = -DX + DB * DY
126  DO 120 i = 1, n
127  dz(i) = -dx(i) + db * dy(i)
128  120 CONTINUE
129  END IF
130  ELSE
131  IF (db.EQ.zero) THEN
132 C DA = DA, DB = 0.0 => DZ = DA * DX (this is SCAL).
133  DO 130 i = 1, n
134  dz(i) = da * dx(i)
135  130 CONTINUE
136  ELSE IF (db.EQ.one) THEN
137 C DA = DA, DB = 1.0 => DZ = DA * DX + DY (this is AXPY)
138  DO 140 i = 1, n
139  dz(i) = da * dx(i) + dy(i)
140  140 CONTINUE
141  ELSE IF (db.EQ.-one) THEN
142 C DA = DA, DB = -1.0 => DZ = DA * DX - DY.
143  DO 150 i = 1, n
144  dz(i) = da * dx(i) - dy(i)
145  150 CONTINUE
146  ELSE
147 C DA = DA, DB = DB => DZ = DA * DX + DB * DY.
148  DO 160 i = 1, n
149  dz(i) = da * dx(i) + db * dy(i)
150  160 CONTINUE
151  END IF
152  END IF
153 C
154  RETURN
155  END
156 C
157 C**********************************************************************