PSCF v1.4.0
arithmetic.h
1#ifndef PSCF_MATH_ARITHMETIC_H
2#define PSCF_MATH_ARITHMETIC_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 <cmath>
12#include <complex>
13//#include <iostream>
14
15namespace Pscf {
16
38
47 inline
48 void assign(double & z, double const & a)
49 { z = a; }
50
59 inline
60 void assign(float & z, float const & a)
61 { z = a; }
62
71 template <typename RT> inline
72 void assign(std::complex<RT> & z, std::complex<RT> const & a)
73 { z = a; }
74
84 template <typename RT> inline
85 void assign(std::complex<RT> & z, RT const & a, RT const & b)
86 { z = std::complex<RT>(a, b); }
87
96 template <typename RT> inline
97 void assign(std::complex<RT> & z, RT const & a)
98 { z = a; }
99
100 // Addition
101
111 inline
112 void add(double & z, double const & a, double const & b)
113 { z = a + b; }
114
124 inline
125 void add(float & z, float const & a, float const & b)
126 { z = a + b; }
127
137 template <typename RT> inline
138 void add(std::complex<RT> & z,
139 std::complex<RT> const & a, std::complex<RT> const & b)
140 { z = a + b; }
141
151 template <typename RT> inline
152 void add(std::complex<RT> & z,
153 std::complex<RT> const & a, RT const & b)
154 { z = a + b; }
155
164 inline
165 void addEq(double & a, double const & b)
166 { a += b; }
167
176 inline
177 void addEq(float & a, float const & b)
178 { a += b; }
179
188 template <typename RT> inline
189 void addEq(std::complex<RT> & a, std::complex<RT> const & b)
190 { a += b; }
191
200 template <typename RT> inline
201 void addEq(std::complex<RT> & a, RT const & b)
202 { a += b; }
203
204 // Subtraction
205
215 inline
216 void sub(double & z, double const & a, double const & b)
217 { z = a - b; }
218
228 inline
229 void sub(float & z, float const & a, float const & b)
230 { z = a - b; }
231
241 template <typename RT> inline
242 void sub(std::complex<RT> & z,
243 std::complex<RT> const & a, std::complex<RT> const & b)
244 { z = a - b; }
245
255 template <typename RT> inline
256 void sub(std::complex<RT> & z,
257 std::complex<RT> const & a, RT const & b)
258 { z = a - b; }
259
268 inline
269 void subEq(double & a, double const & b)
270 { a -= b; }
271
280 inline
281 void subEq(float & a, float const & b)
282 { a -= b; }
283
292 template <typename RT> inline
293 void subEq(std::complex<RT> & a, std::complex<RT> const & b)
294 { a -= b; }
295
304 template <typename RT> inline
305 void subEq(std::complex<RT> & a, RT const & b)
306 { a -= b; }
307
308 // Multiplication
309
319 inline
320 void mul(double & z, double const & a, double const & b)
321 { z = a * b; }
322
332 inline
333 void mul(float & z, float const & a, float const & b)
334 { z = a * b; }
335
345 template <typename RT> inline
346 void mul(std::complex<RT> & z,
347 std::complex<RT> const & a, std::complex<RT> const & b)
348 { z = a * b; }
349
359 template <typename RT> inline
360 void mul(std::complex<RT> & z,
361 std::complex<RT> const & a,
362 RT const & b)
363 { z = a * b; }
364
373 inline
374 void mulEq(double & a, double const & b)
375 { a *= b; }
376
385 inline
386 void mulEq(float & a, float const & b)
387 { a *= b; }
388
397 template <typename RT> inline
398 void square(std::complex<RT> & z, std::complex<RT> const & a)
399 { z = a * a; }
400
401 // Division
402
412 inline
413 void div(double & z, double const & a, double const & b)
414 { z = a/b; }
415
425 inline
426 void div(float & z, float const & a, float const & b)
427 { z = a / b; }
428
438 template <typename RT> inline
439 void div(std::complex<RT> & z,
440 std::complex<RT> const & a, std::complex<RT> const & b)
441 { z = a / b; }
442
452 template <typename RT> inline
453 void div(std::complex<RT> & z,
454 std::complex<RT> const & a, RT const & b)
455 { z = a / b; }
456
465 inline
466 void divEq(double & a, double const & b)
467 { a /= b; }
468
477 inline
478 void divEq(float & a, float const & b)
479 { a /= b; }
480
489 template <typename RT> inline
490 void divEq(std::complex<RT> & a, std::complex<RT> const & b)
491 { a /= b; }
492
501 template <typename RT> inline
502 void divEq(std::complex<RT> & a, RT const & b)
503 { a /= b; }
504
505 // Inversion
506
515 inline
516 void inverse(double & z, double const & a)
517 { z = 1.0/a; }
518
527 inline
528 void inverse(float & z, float const & a)
529 { z = 1.0/a; }
530
531 // Exponential function
532
541 inline
542 void assignExp(double & z, double const & a)
543 { z = std::exp(a); }
544
553 inline
554 void assignExp(float & z, float const & a)
555 { z = std::exp(a); }
556
557 // Natural logarithm function
558
567 inline
568 void assignLog(double & z, double const & a)
569 { z = std::log(a); }
570
579 inline
580 void assignLog(float & z, float const & a)
581 { z = std::log(a); }
582
583} // namespace Pscf
584#endif
void mulEq(fftw_complex &a, fftw_complex const &b)
In-place multiplication of two complex number, a *= b.
void addEq(fftw_complex &a, fftw_complex const &b)
In-place addition of fftw_complex numbers, a += b.
void square(fftw_complex &z, fftw_complex const &a)
Complex square of an fftw_complex number, z = a * a.
void div(fftw_complex &z, fftw_complex const &a, fftw_complex const &b)
Division of fftw_complex numbers, z = a / b .
void inverse(fftw_complex &z, fftw_complex const &a)
Inversion of an fftw_complex number, z = 1 / a .
void assignExp(fftw_complex &z, fftw_complex const &a)
Exponentation of a ffts_complex variable, z = exp(a).
void add(fftw_complex &z, fftw_complex const &a, fftw_complex const &b)
Addition of fftw_complex numbers, z = a + b.
void sub(fftw_complex &z, fftw_complex const &a, fftw_complex const &b)
Subtraction of fftw_complex numbers, z = a - b.
void subEq(fftw_complex &a, fftw_complex const &b)
In-place subtraction of fftw_complex numbers, a -= b.
void assign(fftw_complex &z, double const &a, double const &b)
Create an fftw_complex from real and imaginary parts, z = a + ib.
void mul(fftw_complex &z, fftw_complex const &a, fftw_complex const &b)
Multiplication of fftw_complex numbers, z = a * b.
void divEq(fftw_complex &a, fftw_complex const &b)
In-place division of fftw_complex numbers, a /= b.
void assignLog(fftw_complex &z, fftw_complex const &a)
Logarithm of an fftw_complex variable, z = log(a).
PSCF package top-level namespace.