base_utility.h Source File

LibRPA: base_utility.h Source File
LibRPA
base_utility.h
1 #pragma once
2 #include <complex>
3 
4 constexpr static const double DOUBLE_EQUAL_THRES = 1e-10;
5 
6 typedef std::complex<double> cplxdb;
7 
8 // check if passed template type argument is a complex value
9 // from https://stackoverflow.com/questions/41438493/how-to-identifying-whether-a-template-argument-is-stdcomplex
10 template <typename T>
11 struct is_complex_t: public std::false_type {};
12 
13 template <typename T>
14 struct is_complex_t<std::complex<T>>: public std::true_type {};
15 
16 template <typename T>
17 bool is_complex() { return is_complex_t<T>::value; }
18 
19 template <typename T>
20 struct to_real { using type = T; };
21 template <typename T>
22 struct to_real<std::complex<T>> { using type = T; };
23 
24 template <typename T>
25 struct to_cplx { using type = std::complex<T>; };
26 template <typename T>
27 struct to_cplx<std::complex<T>> { using type = T; };
28 
29 template <typename T>
30 inline void join_re_im(T &pt, const T &re, const T &im) { pt = re; }
31 template <typename T>
32 inline void join_re_im(std::complex<T> &pt, const T &re, const T &im) { pt = std::complex<T>{re, im}; }
33 
34 template <typename T>
35 inline T get_real(const T& v) { return v; }
36 template <typename T>
37 inline T get_real(const std::complex<T>& v) { return v.real(); }
38 template <typename T>
39 inline T get_imag(const T& v) { return T(0); }
40 template <typename T>
41 inline T get_imag(const std::complex<T>& v) { return v.imag(); }
42 template <typename T>
43 inline T get_conj(const T& v) { return v; }
44 template <typename T>
45 inline std::complex<T> get_conj(const std::complex<T>& v) { return std::conj(v); }
46 
47 template <typename T, typename T1, typename T2, typename TR = typename to_real<T>::type>
48 TR norm(const T v[], const T1 &n, const T2 &power)
49 {
50  T norm = 0;
51  for (int i = 0; i < n; i++)
52  norm += std::pow(std::fabs(v[i]), power);
53  return std::pow(norm, 1./power);
54 }
55 
Definition: base_utility.h:11
Definition: base_utility.h:25
Definition: base_utility.h:20