Hex  1.0
Hydrogen-electron collision solver
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
complex.h
Go to the documentation of this file.
1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
2  * *
3  * / / / / __ \ \ / / *
4  * / /__ / / / _ \ \ \/ / *
5  * / ___ / | |/_/ / /\ \ *
6  * / / / / \_\ / / \ \ *
7  * *
8  * Jakub Benda (c) 2014 *
9  * Charles University in Prague *
10  * *
11 \* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
12 
13 #ifndef HEX_COMPLEX
14 #define HEX_COMPLEX
15 
16 #include <complex>
17 #include <cmath>
18 
19 // shorthand for std::complex<double>
20 typedef std::complex<double> Complex;
21 typedef std::complex<long double> LComplex;
22 
23 // some missing complex and mixed arithmetic
24 template <typename C1, typename C2> auto operator * (std::complex<C1> a, std::complex<C2> b) -> std::complex<decltype(C1(0.)*C2(0.))>
25 {
26  typedef decltype(C1(0.) * C2(0.)) T;
27  return std::complex<T>(a) * std::complex<T>(b);
28 }
29 template <typename C1, typename C2> auto operator / (std::complex<C1> a, std::complex<C2> b) -> std::complex<decltype(C1(0.)/C2(0.))>
30 {
31  typedef decltype(C1(0.) * C2(0.)) T;
32  return std::complex<T>(a) / std::complex<T>(b);
33 }
34 
36 inline double sqrabs (Complex z)
37 {
38  return z.real() * z.real() + z.imag() * z.imag();
39 }
40 
42 inline bool Complex_realpart_less (Complex const & a, Complex const & b)
43 {
44  return a.real() < b.real();
45 }
46 
48 inline bool Complex_imagpart_less (Complex const & a, Complex const & b)
49 {
50  return a.imag() < b.imag();
51 }
52 
54 inline bool Complex_finite (Complex const & z)
55 {
56  return std::isfinite(z.real()) and std::isfinite(z.imag());
57 }
58 
59 #endif
NumberArray< double > sqrabs(NumberArray< Complex > const &A)
Return per-element square of absolute value.
Definition: arrays.cpp:71
bool Complex_imagpart_less(Complex const &a, Complex const &b)
Complex ordering by imaginary parts.
Definition: complex.h:48
auto operator/(std::complex< C1 > a, std::complex< C2 > b) -> std::complex< decltype(C1(0.)/C2(0.))>
Definition: complex.h:29
auto operator*(std::complex< C1 > a, std::complex< C2 > b) -> std::complex< decltype(C1(0.)*C2(0.))>
Definition: complex.h:24
bool Complex_finite(Complex const &z)
Finite check for complex number.
Definition: complex.h:54
bool Complex_realpart_less(Complex const &a, Complex const &b)
Complex ordering by real parts.
Definition: complex.h:42
std::complex< double > Complex
Definition: complex.h:20
std::complex< long double > LComplex
Definition: complex.h:21