PSCF v1.4.0
cpu/VecOp.h
1#ifndef PSCF_CPU_VEC_OP_H
2#define PSCF_CPU_VEC_OP_H
3
4/*
5* PSCF - Polymer Self-Consistent Field
6*
7* Copyright 2015 - 2025, The Regents of the University of Minnesota
8* Distributed under the terms of the GNU General Public License.
9*/
10
11// Forward declaration
12namespace Util {
13 template <typename T> class Array;
14}
15
16namespace Pscf {
17
18 using namespace Util;
19
62 namespace VecOp {
63
64 /*
65 * This file and VecOp.cpp only contain declarations and definitions
66 * for operations that involve only real arrays and scalars.
67 * Corresponding declarations and definitions for vector operations
68 * that involve complex-valued arrays and/or scalars are given in
69 * the files VecOpCx.h and VecOpCx.cpp, respectively.
70 */
71
72 // Assignment
73
85 void eqV(Array<double>& a, Array<double> const & b,
86 const int beginIdA, const int beginIdB, const int n);
87
96 void eqV(Array<double>& a, Array<double> const & b);
97
106 void eqS(Array<double>& a, double b);
107
108 // Addition
109
119 void addVV(Array<double>& a,
120 Array<double> const & b,
121 Array<double> const & c);
122
132 void addVS(Array<double>& a, Array<double> const & b, double c);
133
134 // Subtraction
135
145 void subVV(Array<double>& a,
146 Array<double> const & b, Array<double> const & c);
147
157 void subVS(Array<double>& a, Array<double> const & b, double c);
158
159 // Multiplication
160
170 void mulVV(Array<double>& a,
171 Array<double> const & b, Array<double> const & c);
172
182 void mulVS(Array<double>& a, Array<double> const & b, double c);
183
184 // Division
185
195 void divVV(Array<double>& a,
196 Array<double> const & b, Array<double> const & c);
197
207 void divVS(Array<double>& a, Array<double> const & b, double c);
208
218 void divSV(Array<double>& a, double b, Array<double> const & c);
219
220 // In-place addition
221
230 void addEqV(Array<double>& a, Array<double> const & b);
231
240 void addEqS(Array<double>& a, double b);
241
242 // In-place subtraction
243
252 void subEqV(Array<double>& a, Array<double> const & b);
253
262 void subEqS(Array<double>& a, double b);
263
264 // In-place multiplication
265
274 void mulEqV(Array<double>& a, Array<double> const & b);
275
284 void mulEqS(Array<double>& a, double b);
285
286 // In-place division
287
296 void divEqV(Array<double>& a, Array<double> const & b);
297
306 void divEqS(Array<double>& a, double b);
307
308 // Exponentiation
309
318 void expV(Array<double>& a, Array<double> const & b);
319
329 void expVc(Array<double>& a,
330 Array<double> const & b, const double c);
331
332 // Square
333
342 void sqV(Array<double>& a, Array<double> const & b);
343
344 // Absolute magnitude
345
354 void absV(Array<double>& a, Array<double> const & b);
355
356 // Addition of scaled vectors (linear combinations)
357
367 void addVcVc(Array<double>& a,
368 Array<double> const & b1, const double c1,
369 Array<double> const & b2, const double c2);
370
379 void addVcS(Array<double>& a,
380 Array<double> const & b, const double c,
381 const double s);
382
392 void addEqVc(Array<double>& a,
393 Array<double> const & b, double const c);
394
405 void addVcVcS(Array<double>& a,
406 Array<double> const & b1, const double c1,
407 Array<double> const & b2, const double c2,
408 const double s);
409
421 void addVcVcVc(Array<double>& a,
422 Array<double> const & b1, const double c1,
423 Array<double> const & b2, const double c2,
424 Array<double> const & b3, const double c3);
425
426 // Pair operations (two output arrays and a shared input)
427
437 void eqVPair(Array<double>& a1,
438 Array<double>& a2,
439 Array<double> const & b);
440
453 Array<double> const & b1,
454 Array<double> const & b2,
455 Array<double> const & c);
456
466 void mulEqVPair(Array<double>& a1,
467 Array<double>& a2,
468 Array<double> const & b);
469
470 } // namespace VecOp
471
472} // namespace Pscf
473#endif
Array container class template.
Definition Array.h:40
void divEqS(Array< double > &a, double b)
Vector-scalar in-place division, a[i] /= b.
Definition VecOp.cpp:292
void addEqV(Array< double > &a, Array< double > const &b)
Vector-vector in-place addition, a[i] += b[i] (real).
Definition VecOp.cpp:198
void divEqV(Array< double > &a, Array< double > const &b)
Vector-vector in-place division, a[i] /= b[i].
Definition VecOp.cpp:279
void addEqS(Array< double > &a, double b)
Vector-scalar in-place addition, a[i] += b (real).
Definition VecOp.cpp:211
void sqV(Array< double > &a, Array< double > const &b)
Vector element-wise square, a[i] = b[i]*b[i] (real).
Definition VecOp.cpp:334
void mulEqV(Array< double > &a, Array< double > const &b)
Vector-vector in-place multiplication, a[i] *= b[i] (real).
Definition VecOp.cpp:252
void eqV(Array< double > &a, Array< double > const &b, const int beginIdA, const int beginIdB, const int n)
Vector assignment, a[i] = b[i] (real, slice).
Definition VecOp.cpp:21
void mulEqS(Array< double > &a, double b)
Vector-scalar in-place multiplication, a[i] *= b (real).
Definition VecOp.cpp:265
void subVV(Array< double > &a, Array< double > const &b, Array< double > const &c)
Vector-vector subtraction, a[i] = b[i] - c[i] (real)
Definition VecOp.cpp:95
void absV(Array< double > &a, Array< double > const &b)
Element-wise absolute magnitude, a[i] = abs(b[i]) (real).
Definition VecOp.cpp:349
void expV(Array< double > &a, Array< double > const &b)
Vector exponentiation, a[i] = exp(b[i]) (real).
Definition VecOp.cpp:306
void divVS(Array< double > &a, Array< double > const &b, double c)
Vector-scalar division, a[i] = b[i] / c (real).
Definition VecOp.cpp:170
void expVc(Array< double > &a, Array< double > const &b, const double c)
Exponentiation a scaled vector, a[i] = exp(b[i]*c) (real).
Definition VecOp.cpp:319
void eqS(Array< double > &a, double b)
Vector assignment, a[i] = b (real).
Definition VecOp.cpp:50
void mulVV(Array< double > &a, Array< double > const &b, Array< double > const &c)
Vector-vector multiplication, a[i] = b[i] * c[i] (real).
Definition VecOp.cpp:125
void subVS(Array< double > &a, Array< double > const &b, double c)
Vector-scalar subtraction, a[i] = b[i] - c (real).
Definition VecOp.cpp:110
void subEqV(Array< double > &a, Array< double > const &b)
Vector-vector in-place subtraction, a[i] -= b[i] (real).
Definition VecOp.cpp:225
void addVV(Array< double > &a, Array< double > const &b, Array< double > const &c)
Vector-vector addition, a[i] = b[i] + c[i] (real)
Definition VecOp.cpp:64
void divSV(Array< double > &a, double b, Array< double > const &c)
Vector division, a[i] = b / c[i].
Definition VecOp.cpp:183
void addVS(Array< double > &a, Array< double > const &b, double c)
Vector-scalar addition, a[i] = b[i] + c (real).
Definition VecOp.cpp:79
void divVV(Array< double > &a, Array< double > const &b, Array< double > const &c)
Vector-vector division, a[i] = b[i] / c[i] (real).
Definition VecOp.cpp:155
void subEqS(Array< double > &a, double b)
Vector-scalar subtraction in-place, a[i] -= b (real).
Definition VecOp.cpp:238
void addEqVc(Array< double > &a, Array< double > const &b, const double c)
Add scaled vector in-place, a[i] += b[i]*c (real).
Definition VecOp.cpp:395
void mulVS(Array< double > &a, Array< double > const &b, double c)
Vector-scalar multiplication, a[i] = b[i] * c (real).
Definition VecOp.cpp:140
void mulVVPair(Array< double > &a1, Array< double > &a2, Array< double > const &b1, Array< double > const &b2, Array< double > const &c)
Vector multiplication in pairs, ax[i] = bx[i] * s[i], x=1,2.
Definition VecOp.cpp:463
void eqVPair(Array< double > &a1, Array< double > &a2, Array< double > const &b)
Vector assignment in pairs, ax[i] = b[i], x = 1, 2.
Definition VecOp.cpp:446
void mulEqVPair(Array< double > &a1, Array< double > &a2, Array< double > const &b)
In-place vector multiplication in pairs, ax[i] *= b[i], x=1,2.
Definition VecOp.cpp:484
Vector operations on GPU or CPU.
Definition VecOp.cpp:14
void addVcVcS(Array< double > &a, Array< double > const &b1, const double c1, Array< double > const &b2, const double c2, const double s)
Add scaled vectors + scalar, a[i] = b1[i]*c1 + b2[2]*c2 + s (real).
Definition VecOp.cpp:409
void addVcS(Array< double > &a, Array< double > const &b, const double c, const double s)
Add a scaled vector and a scalar, a[i] = b[i]*c + s (real).
Definition VecOp.cpp:380
void addVcVc(Array< double > &a, Array< double > const &b1, const double c1, Array< double > const &b2, const double c2)
Add two scaled vectors, a[i] = b1[i]*c1 + b2[2]*c2 (real).
Definition VecOp.cpp:364
void addVcVcVc(Array< double > &a, Array< double > const &b1, const double c1, Array< double > const &b2, const double c2, Array< double > const &b3, const double c3)
Add scaled vectors, a[i] = b1[i]*c1 + b2[i]*c2 + b3[i]*c3 (real).
Definition VecOp.cpp:426
PSCF package top-level namespace.
Utility classes for scientific computation.