PSCF v1.3.2
VecOp.cpp
1/*
2* PSCF - Polymer Self-Consistent Field
3*
4* Copyright 2015 - 2025, The Regents of the University of Minnesota
5* Distributed under the terms of the GNU General Public License.
6*/
7
8
9#include "VecOp.h"
10#include <util/containers/Array.h>
11#include <cmath>
12
13namespace Pscf {
14namespace Prdc {
15namespace Cpu {
16namespace VecOp {
17
18 // Assignment
19
20 /*
21 * Vector assignment, a[i] = b[i].
22 */
23 void eqV(Array<double>& a, Array<double> const & b)
24 {
25 const int n = a.capacity();
26 UTIL_CHECK(n > 0);
27 UTIL_CHECK(b.capacity() == n);
28 for (int i = 0; i < n; ++i) {
29 a[i] = b[i];
30 }
31 }
32
33 /*
34 * Vector assignment to a scalar, a[i] = b.
35 */
36 void eqS(Array<double>& a, double b)
37 {
38 const int n = a.capacity();
39 UTIL_CHECK(n > 0);
40 for (int i = 0; i < n; ++i) {
41 a[i] = b;
42 }
43 }
44
45 // Addition
46
47 /*
48 * Vector addition, a[i] = b[i] + c[i].
49 */
51 Array<double> const & b, Array<double> const & c)
52 {
53 const int n = a.capacity();
54 UTIL_CHECK(n > 0);
55 UTIL_CHECK(b.capacity() == n);
56 UTIL_CHECK(c.capacity() == n);
57 for (int i = 0; i < n; ++i) {
58 a[i] = b[i] + c[i];
59 }
60 }
61
62 /*
63 * Vector addition, a[i] = b[i] + c.
64 */
65 void addVS(Array<double>& a, Array<double> const & b, double c)
66 {
67 const int n = a.capacity();
68 UTIL_CHECK(n > 0);
69 UTIL_CHECK(b.capacity() == n);
70
71 for (int i = 0; i < n; ++i) {
72 a[i] = b[i] + c;
73 }
74 }
75
76 // Subtraction
77
78 /*
79 * Vector-vector subtraction, a[i] = b[i] - c[i].
80 */
82 Array<double> const & b, Array<double> const & c)
83 {
84 const int n = a.capacity();
85 UTIL_CHECK(n > 0);
86 UTIL_CHECK(b.capacity() == n);
87 UTIL_CHECK(c.capacity() == n);
88 for (int i = 0; i < n; ++i) {
89 a[i] = b[i] - c[i];
90 }
91 }
92
93 /*
94 * Vector-scalar subtraction, a[i] = b[i] - c.
95 */
96 void subVS(Array<double>& a, Array<double> const & b, double c)
97 {
98 const int n = a.capacity();
99 UTIL_CHECK(n > 0);
100 UTIL_CHECK(b.capacity() == n);
101 for (int i = 0; i < n; ++i) {
102 a[i] = b[i] - c;
103 }
104 }
105
106 // Multiplication
107
108 /*
109 * Vector-vector multiplication, a[i] = b[i] * c[i].
110 */
112 Array<double> const & b, Array<double> const & c)
113 {
114 const int n = a.capacity();
115 UTIL_CHECK(n > 0);
116 UTIL_CHECK(b.capacity() == n);
117 UTIL_CHECK(c.capacity() == n);
118 for (int i = 0; i < n; ++i) {
119 a[i] = b[i]*c[i];
120 }
121 }
122
123 /*
124 * Vector-scalar multiplication, a[i] = b[i] * c.
125 */
126 void mulVS(Array<double>& a, Array<double> const & b, double c)
127 {
128 const int n = a.capacity();
129 UTIL_CHECK(n > 0);
130 UTIL_CHECK(b.capacity() == n);
131 for (int i = 0; i < n; ++i) {
132 a[i] = b[i]*c;
133 }
134 }
135
136 // Division
137
138 /*
139 * Vector-vector division, a[i] = b[i] / c[i].
140 */
142 Array<double> const & b, Array<double> const & c)
143 {
144 const int n = a.capacity();
145 UTIL_CHECK(n > 0);
146 UTIL_CHECK(b.capacity() == n);
147 UTIL_CHECK(c.capacity() == n);
148 for (int i = 0; i < n; ++i) {
149 a[i] = b[i] / c[i];
150 }
151 }
152
153 /*
154 * Vector-scalar division, a[i] = b[i] / c.
155 */
156 void divVS(Array<double>& a, Array<double> const & b, double c)
157 {
158 const int n = a.capacity();
159 UTIL_CHECK(n > 0);
160 UTIL_CHECK(b.capacity() == n);
161 for (int i = 0; i < n; ++i) {
162 a[i] = b[i] / c;
163 }
164 }
165
166 /*
167 * Scalar-vector division, a[i] = b / c[i].
168 */
169 void divSV(Array<double>& a, double b, Array<double> const & c)
170 {
171 const int n = a.capacity();
172 UTIL_CHECK(n > 0);
173 UTIL_CHECK(c.capacity() == n);
174 for (int i = 0; i < n; ++i) {
175 a[i] = b/c[i];
176 }
177 }
178
179 // Exponentiation
180
181 /*
182 * Vector exponentiation, a[i] = exp(b[i]).
183 */
184 void expV(Array<double>& a, Array<double> const & b)
185 {
186 const int n = a.capacity();
187 UTIL_CHECK(n > 0);
188 UTIL_CHECK(b.capacity() == n);
189 for (int i = 0; i < n; ++i) {
190 a[i] = exp(b[i]);
191 }
192 }
193
194 // Compound addition
195
196 /*
197 * Vector-vector in-place addition, a[i] += b[i].
198 */
200 {
201 const int n = a.capacity();
202 UTIL_CHECK(n > 0);
203 UTIL_CHECK(b.capacity() == n);
204 for (int i = 0; i < n; ++i) {
205 a[i] += b[i];
206 }
207 }
208
209 /*
210 * Vector-scalar in-place addition, a[i] += b.
211 */
212 void addEqS(Array<double>& a, double b)
213 {
214 const int n = a.capacity();
215 UTIL_CHECK(n > 0);
216 for (int i = 0; i < n; ++i) {
217 a[i] += b;
218 }
219 }
220
221
222 // Compound subtraction
223
224 /*
225 * Vector-vector in-place subtraction, a[i] -= b[i].
226 */
228 {
229 const int n = a.capacity();
230 UTIL_CHECK(n > 0);
231 UTIL_CHECK(b.capacity() == n);
232 for (int i = 0; i < n; ++i) {
233 a[i] -= b[i];
234 }
235 }
236
237 /*
238 * Vector-scalar in-place subtraction, a[i] -= b.
239 */
240 void subEqS(Array<double>& a, double b)
241 {
242 const int n = a.capacity();
243 UTIL_CHECK(n > 0);
244 for (int i = 0; i < n; ++i) {
245 a[i] -= b;
246 }
247 }
248
249 // Compound multiplication
250
251 /*
252 * Vector-vector in-place multiplication, a[i] *= b[i].
253 */
255 {
256 const int n = a.capacity();
257 UTIL_CHECK(n > 0);
258 UTIL_CHECK(b.capacity() == n);
259 for (int i = 0; i < n; ++i) {
260 a[i] *= b[i];
261 }
262 }
263
264 /*
265 * Vector-scalar in-place multiplication, a[i] *= b.
266 */
267 void mulEqS(Array<double>& a, double b)
268 {
269 const int n = a.capacity();
270 UTIL_CHECK(n > 0);
271 for (int i = 0; i < n; ++i) {
272 a[i] *= b;
273 }
274 }
275
276 // Compound division
277
278 /*
279 * Vector-vector in-place division, a[i] /= b[i].
280 */
282 {
283 const int n = a.capacity();
284 UTIL_CHECK(n > 0);
285 UTIL_CHECK(b.capacity() == n);
286 for (int i = 0; i < n; ++i) {
287 a[i] /= b[i];
288 }
289 }
290
291 /*
292 * Vector-scalar in-place division, a[i] /= b.
293 */
294 void divEqS(Array<double>& a, double b)
295 {
296 const int n = a.capacity();
297 UTIL_CHECK(n > 0);
298 for (int i = 0; i < n; ++i) {
299 a[i] /= b;
300 }
301 }
302
304
305} // namespace VecOp
306} // namespace Cpu
307} // namespace Prdc
308} // namespace Pscf
309
Array container class template.
Definition Array.h:34
int capacity() const
Return allocated size.
Definition Array.h:159
#define UTIL_CHECK(condition)
Assertion macro suitable for serial or parallel production code.
Definition global.h:68
Functions that perform element-wise vector operations on the Cpu.
Definition VecOp.cpp:16
void subVV(Array< double > &a, Array< double > const &b, Array< double > const &c)
Vector subtraction, a[i] = b[i] - c[i].
Definition VecOp.cpp:81
void divSV(Array< double > &a, double b, Array< double > const &c)
Vector division, a[i] = b / c[i].
Definition VecOp.cpp:169
void mulEqV(Array< double > &a, Array< double > const &b)
Vector multiplication in-place, a[i] *= b[i].
Definition VecOp.cpp:254
void addEqV(Array< double > &a, Array< double > const &b)
Vector addition in-place, a[i] += b[i].
Definition VecOp.cpp:199
void eqV(Array< double > &a, Array< double > const &b)
Vector assignment, a[i] = b[i].
Definition VecOp.cpp:23
void mulVS(Array< double > &a, Array< double > const &b, double c)
Vector multiplication, a[i] = b[i] * c.
Definition VecOp.cpp:126
void divEqS(Array< double > &a, double b)
Vector division in-place, a[i] /= b.
Definition VecOp.cpp:294
void addEqS(Array< double > &a, double b)
Vector addition in-place, a[i] += b.
Definition VecOp.cpp:212
void addVV(Array< double > &a, Array< double > const &b, Array< double > const &c)
Vector addition, a[i] = b[i] + c[i].
Definition VecOp.cpp:50
void subVS(Array< double > &a, Array< double > const &b, double c)
Vector subtraction, a[i] = b[i] - c.
Definition VecOp.cpp:96
void divEqV(Array< double > &a, Array< double > const &b)
Vector division in-place, a[i] /= b[i].
Definition VecOp.cpp:281
void mulEqS(Array< double > &a, double b)
Vector multiplication in-place, a[i] *= b.
Definition VecOp.cpp:267
void divVS(Array< double > &a, Array< double > const &b, double c)
Vector division, a[i] = b[i] / c.
Definition VecOp.cpp:156
void divVV(Array< double > &a, Array< double > const &b, Array< double > const &c)
Vector division, a[i] = b[i] / c[i].
Definition VecOp.cpp:141
void eqS(Array< double > &a, double b)
Vector assignment, a[i] = b.
Definition VecOp.cpp:36
void addVS(Array< double > &a, Array< double > const &b, double c)
Vector addition, a[i] = b[i] + c.
Definition VecOp.cpp:65
void mulVV(Array< double > &a, Array< double > const &b, Array< double > const &c)
Vector multiplication, a[i] = b[i] * c[i].
Definition VecOp.cpp:111
void subEqV(Array< double > &a, Array< double > const &b)
Vector subtraction in-place, a[i] -= b[i].
Definition VecOp.cpp:227
void expV(Array< double > &a, Array< double > const &b)
Vector exponentiation, a[i] = exp(b[i]).
Definition VecOp.cpp:184
void subEqS(Array< double > &a, double b)
Vector subtraction in-place, a[i] -= b.
Definition VecOp.cpp:240
Fields and FFTs for periodic boundary conditions (CPU)
Definition CField.cpp:12
Periodic fields and crystallography.
Definition CField.cpp:11
PSCF package top-level namespace.