PSCF v1.4.0
VecOpCx.h
1#ifndef PSCF_CPU_VEC_OP_CX_H
2#define PSCF_CPU_VEC_OP_CX_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#include "VecOp.h"
12#include <fftw3.h>
13
14// Forward declaration
15namespace Util {
16 template <typename T> class Array;
17}
18
19namespace Pscf {
20
21 using namespace Util;
22
23 /*
24 * Functions for element-wise complex vector operations on a CPU.
25 *
26 * Naming conventions are the same as those described in the file
27 * cpu/VecOp.h, which contains declarations of analogous functions
28 * for real-valued arrays. Many operations involving complex arrays
29 * are implemented in both purely complex form, in which all inputs
30 * are complex numbers, and "mixed" form in which one or more of the
31 * inputs is a real array or a real scalar.
32 *
33 * Functions defined in this file use the complex type fftw_complex
34 * that is defined for use with the FFTW fast Fourier transform
35 * library.
36 */
37
38 namespace VecOp {
39
40 // Real and imaginary parts
41
50 void real(Array<double>& a, Array<fftw_complex> const & b);
51
60 void imag(Array<double>& a, Array<fftw_complex> const & b);
61
62 // Assignment
63
73
84 Array<double> const & b,
85 Array<double> const & c);
86
95 void eqV(Array<fftw_complex>& a, Array<double> const & b);
96
105 void eqS(Array<fftw_complex>& a, fftw_complex b);
106
115 void eqS(Array<fftw_complex>& a, double b);
116
117 // Addition
118
129 Array<fftw_complex> const & b,
130 Array<fftw_complex> const & c);
131
141 void addVV(Array<fftw_complex> & a,
142 Array<fftw_complex> const & b,
143 Array<double> const & c);
144
154 void addVS(Array<fftw_complex> & a,
155 Array<fftw_complex> const & b,
156 fftw_complex c);
157
167 void addVS(Array<fftw_complex> & a,
168 Array<fftw_complex> const & b,
169 double c);
170
171 // Subtraction
172
182 void subVV(Array<fftw_complex> & a,
183 Array<fftw_complex> const & b,
184 Array<fftw_complex> const & c);
185
195 void subVV(Array<fftw_complex> & a,
196 Array<fftw_complex> const & b,
197 Array<double> const & c);
198
208 void subVS(Array<fftw_complex> & a,
209 Array<fftw_complex> const & b,
210 fftw_complex c);
211
221 void subVS(Array<fftw_complex> & a,
222 Array<fftw_complex> const & b,
223 double c);
224
225 // Multiplication
226
236 void mulVV(Array<fftw_complex> & a,
237 Array<fftw_complex> const & b,
238 Array<fftw_complex> const & c);
239
249 void mulVV(Array<fftw_complex> & a,
250 Array<fftw_complex> const & b,
251 Array<double> const & c);
252
262 void mulVS(Array<fftw_complex> & a,
263 Array<fftw_complex> const & b,
264 fftw_complex c);
265
275 void mulVS(Array<fftw_complex> & a,
276 Array<fftw_complex> const & b,
277 double c);
278
279 // Division
280
290 void divVV(Array<fftw_complex> & a,
291 Array<fftw_complex> const & b,
292 Array<fftw_complex> const & c);
293
303 void divVV(Array<fftw_complex> & a,
304 Array<fftw_complex> const & b,
305 Array<double> const & c);
306
316 void divVS(Array<fftw_complex> & a,
317 Array<fftw_complex> const & b,
318 fftw_complex c);
319
329 void divVS(Array<fftw_complex> & a,
330 Array<fftw_complex> const & b,
331 double c);
332
333 // In-place addition
334
335 /*
336 * Vector in-place addition, a[i] += b[i] (complex).
337 *
338 * \ingroup Pscf_Cpu_VecOp_Module
339 *
340 * \param a complex array (LHS)
341 * \param b complex array (RHS)
342 */
344
345 /*
346 * Vector in-place addition, a[i] += (b[i], c[i]) (complex).
347 *
348 * This function add real array b to the real part of complex array a,
349 * and adds real array c to the imaginary part of complex array a.
350 *
351 * \ingroup Pscf_Cpu_VecOp_Module
352 *
353 * \param a complex array (LHS)
354 * \param b real array, increment of real part (RHS)
355 * \param c real array, increment of imaginary part (RHS)
356 */
357 void addEqV(Array<fftw_complex> & a,
358 Array<double> const & b,
359 Array<double> const & c);
360
361 /*
362 * Vector in-place addition, a[i] += b[i] (mixed, reall array b).
363 *
364 * \ingroup Pscf_Cpu_VecOp_Module
365 *
366 * \param a complex array (LHS)
367 * \param b real array (RHS)
368 */
369 void addEqV(Array<fftw_complex> & a, Array<double> const & b);
370
371 /*
372 * Vector-scalar in-place addition, a[i] += b (complex).
373 *
374 * \ingroup Pscf_Cpu_VecOp_Module
375 *
376 * \param a complex array (LHS)
377 * \param b complex scalar (RHS)
378 */
379 void addEqS(Array<fftw_complex> & a, fftw_complex b);
380
389 void addEqS(Array<fftw_complex> & a, double b);
390
391 // In-place subtraction
392
402
411 void subEqV(Array<fftw_complex>& a, Array<double> const & b);
412
421 void subEqS(Array<fftw_complex>& a, fftw_complex b);
422
431 void subEqS(Array<fftw_complex>& a, double b);
432
433 // In-place multiplication
434
444
453 void mulEqV(Array<fftw_complex>& a, Array<double> const & b);
454
463 void mulEqS(Array<fftw_complex>& a, fftw_complex const & b);
464
473 void mulEqS(Array<fftw_complex>& a, double b);
474
475 // In-place division
476
486
495 void divEqV(Array<fftw_complex>& a, Array<double> const & b);
496
505 void divEqS(Array<fftw_complex>& a, fftw_complex b);
506
515 void divEqS(Array<fftw_complex>& a, double b);
516
517 // Exponentiation
518
527 void expV(Array<fftw_complex> & a, Array<fftw_complex> const & b);
528
529 // Complex Square
530
539 void sqV(Array<fftw_complex> & a, Array<fftw_complex> const & b);
540
541 // Even powers of complex absolute magnitude
542
551 void sqAbsV(Array<double> & a, Array<fftw_complex> const & b);
552
561 void sqSqAbsV(Array<double> & a, Array<fftw_complex> const & b);
562
563 // Combined Operations
564
575 Array<double> const & b,
576 double const c);
577
578 } // namespace VecOp
579
580} // namespace Pscf
581#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 sqAbsV(Array< double > &a, Array< fftw_complex > const &b)
Square of absolute magnitude, a[i] = |b[i]|^2 (complex).
Definition VecOpCx.cpp:698
void imag(Array< double > &a, Array< fftw_complex > const &b)
Copy imaginary part of a complex array to a real array.
Definition VecOpCx.cpp:37
void sqSqAbsV(Array< double > &a, Array< fftw_complex > const &b)
Fourth power of absolute magnitude, a[i] = |b[i]|^4 (complex).
Definition VecOpCx.cpp:714
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 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 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 real(Array< double > &a, Array< fftw_complex > const &b)
Copy real part of a complex array to a real array.
Definition VecOpCx.cpp:24
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 divEqVc(Array< fftw_complex > &a, Array< double > const &b, double c)
Vector division in-place w/ coeff., a[i] /= (b[i] * c).
Definition VecOpCx.cpp:730
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 mulVS(Array< double > &a, Array< double > const &b, double c)
Vector-scalar multiplication, a[i] = b[i] * c (real).
Definition VecOp.cpp:140
Vector operations on GPU or CPU.
Definition VecOp.cpp:14
PSCF package top-level namespace.
Utility classes for scientific computation.