BubbleProfiler  0.3.0
by Peter Athron, Csaba Balazs, Michael Bardsley, Andrew Fowlie, Dylan Harries & Graham White
math_wrappers.hpp
Go to the documentation of this file.
1 /*
2  * This file is part of BubbleProfiler.
3  *
4  * BubbleProfiler is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * BubbleProfiler is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with BubbleProfiler. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #ifndef BUBBLEPROFILER_MATH_WRAPPERS_HPP_INCLUDED
19 #define BUBBLEPROFILER_MATH_WRAPPERS_HPP_INCLUDED
20 
21 #include <boost/math/constants/constants.hpp>
22 #include <boost/math/special_functions/bessel.hpp>
23 #include <boost/math/special_functions/sign.hpp>
24 
25 #include <cmath>
26 #include <complex>
27 #include <type_traits>
28 
29 namespace BubbleProfiler {
30 
31 static constexpr double Pi = boost::math::double_constants::pi;
32 
33 template <typename T>
34 T Abs(T x) noexcept
35 {
36  return std::abs(x);
37 }
38 
39 template <typename T>
40 T Abs(const std::complex<T>& z) noexcept
41 {
42  return std::abs(z);
43 }
44 
45 template <typename Order, typename Argument>
46 auto BesselI(Order v, Argument z)
47  -> decltype(boost::math::cyl_bessel_i(v, z))
48 {
49  return boost::math::cyl_bessel_i(v, z);
50 }
51 
52 template <typename Order, typename Argument>
53 auto BesselJ(Order v, Argument z)
54  -> decltype(boost::math::cyl_bessel_j(v, z))
55 {
56  return boost::math::cyl_bessel_j(v, z);
57 }
58 
59 template <typename Order, typename Argument>
60 auto BesselK(Order v, Argument z)
61  -> decltype(boost::math::cyl_bessel_k(v, z))
62 {
63  return boost::math::cyl_bessel_k(v, z);
64 }
65 
66 template <typename Order, typename Argument>
67 auto BesselY(Order v, Argument z)
68  -> decltype(boost::math::cyl_neumann(v, z))
69 {
70  return boost::math::cyl_neumann(v, z);
71 }
72 
73 template <typename T,
74  typename = typename std::enable_if<
75  std::is_floating_point<T>::value,T>::type>
76 T Exp(T x) noexcept
77 {
78  return std::exp(x);
79 }
80 
81 template <typename T,
82  typename = typename std::enable_if<
83  std::is_integral<T>::value,T>::type>
84 double Exp(T n) noexcept
85 {
86  return std::exp(n);
87 }
88 
89 template <typename T>
90 std::complex<T> Exp(const std::complex<T>& z) noexcept
91 {
92  return std::exp(z);
93 }
94 
95 template <typename T,
96  typename = typename std::enable_if<
97  std::is_floating_point<T>::value,T>::type>
98 T Log(T x) noexcept
99 {
100  return std::log(x);
101 }
102 
103 template <typename T,
104  typename = typename std::enable_if<
105  std::is_integral<T>::value,T>::type>
106 double Log(T n) noexcept
107 {
108  return std::log(n);
109 }
110 
111 template <typename T>
112 std::complex<T> Log(const std::complex<T>& z) noexcept
113 {
114  return std::log(z);
115 }
116 
117 template <typename T>
118 int Sign(const T& x)
119 {
120  return boost::math::sign(x);
121 }
122 
123 template <typename T,
124  typename = typename std::enable_if<
125  std::is_floating_point<T>::value,T>::type>
126 T Cos(T x) noexcept
127 {
128  return std::cos(x);
129 }
130 
131 template <typename T,
132  typename = typename std::enable_if<
133  std::is_integral<T>::value,T>::type>
134 double Cos(T n) noexcept
135 {
136  return std::cos(n);
137 }
138 
139 template <typename T>
140 std::complex<T> Cos(const std::complex<T>& z) noexcept
141 {
142  return std::cos(z);
143 }
144 
145 template <typename T,
146  typename = typename std::enable_if<
147  std::is_floating_point<T>::value,T>::type>
148 T Sin(T x) noexcept
149 {
150  return std::sin(x);
151 }
152 
153 template <typename T,
154  typename = typename std::enable_if<
155  std::is_integral<T>::value,T>::type>
156 double Sin(T n) noexcept
157 {
158  return std::sin(n);
159 }
160 
161 template <typename T>
162 std::complex<T> Sin(const std::complex<T>& z) noexcept
163 {
164  return std::sin(z);
165 }
166 
167 template <typename T,
168  typename = typename std::enable_if<
169  std::is_floating_point<T>::value,T>::type>
170 T Tan(T x) noexcept
171 {
172  return std::tan(x);
173 }
174 
175 template <typename T,
176  typename = typename std::enable_if<
177  std::is_integral<T>::value,T>::type>
178 double Tan(T n) noexcept
179 {
180  return std::tan(n);
181 }
182 
183 template <typename T>
184 std::complex<T> Tan(const std::complex<T>& z) noexcept
185 {
186  return std::tan(z);
187 }
188 
189 template <typename T>
190 auto Cot(T x) noexcept -> decltype(Tan(x))
191 {
192  return 1. / Tan(x);
193 }
194 
195 template <typename T>
196 auto Csc(T x) noexcept -> decltype(Sin(x))
197 {
198  return 1. / Sin(x);
199 }
200 
201 template <typename T>
202 auto Sec(T x) noexcept -> decltype(Cos(x))
203 {
204  return 1. / Cos(x);
205 }
206 
207 template <typename T,
208  typename = typename std::enable_if<
209  std::is_floating_point<T>::value,T>::type>
210 T ArcCos(T x) noexcept
211 {
212  return std::acos(x);
213 }
214 
215 template <typename T,
216  typename = typename std::enable_if<
217  std::is_integral<T>::value,T>::type>
218 double ArcCos(T n) noexcept
219 {
220  return std::acos(n);
221 }
222 
223 template <typename T>
224 std::complex<T> ArcCos(const std::complex<T>& z) noexcept
225 {
226  return std::acos(z);
227 }
228 
229 template <typename T,
230  typename = typename std::enable_if<
231  std::is_floating_point<T>::value,T>::type>
232 T ArcSin(T x) noexcept
233 {
234  return std::asin(x);
235 }
236 
237 template <typename T,
238  typename = typename std::enable_if<
239  std::is_integral<T>::value,T>::type>
240 double ArcSin(T n) noexcept
241 {
242  return std::asin(n);
243 }
244 
245 template <typename T>
246 std::complex<T> ArcSin(const std::complex<T>& z) noexcept
247 {
248  return std::asin(z);
249 }
250 
251 template <typename T,
252  typename = typename std::enable_if<
253  std::is_floating_point<T>::value,T>::type>
254 T ArcTan(T x) noexcept
255 {
256  return std::atan(x);
257 }
258 
259 template <typename T,
260  typename = typename std::enable_if<
261  std::is_integral<T>::value,T>::type>
262 double ArcTan(T n) noexcept
263 {
264  return std::atan(n);
265 }
266 
267 template <typename T>
268 std::complex<T> ArcTan(const std::complex<T>& z) noexcept
269 {
270  return std::atan(z);
271 }
272 
273 template <typename T,
274  typename = typename std::enable_if<
275  std::is_floating_point<T>::value,T>::type>
276 T Cosh(T x) noexcept
277 {
278  return std::cosh(x);
279 }
280 
281 template <typename T,
282  typename = typename std::enable_if<
283  std::is_integral<T>::value,T>::type>
284 double Cosh(T n) noexcept
285 {
286  return std::cosh(n);
287 }
288 
289 template <typename T>
290 std::complex<T> Cosh(const std::complex<T>& z) noexcept
291 {
292  return std::cosh(z);
293 }
294 
295 template <typename T,
296  typename = typename std::enable_if<
297  std::is_floating_point<T>::value,T>::type>
298 T Sinh(T x) noexcept
299 {
300  return std::sinh(x);
301 }
302 
303 template <typename T,
304  typename = typename std::enable_if<
305  std::is_integral<T>::value,T>::type>
306 double Sinh(T n) noexcept
307 {
308  return std::sinh(n);
309 }
310 
311 template <typename T>
312 std::complex<T> Sinh(const std::complex<T>& z) noexcept
313 {
314  return std::sinh(z);
315 }
316 
317 template <typename T,
318  typename = typename std::enable_if<
319  std::is_floating_point<T>::value,T>::type>
320 T Tanh(T x) noexcept
321 {
322  return std::tanh(x);
323 }
324 
325 template <typename T,
326  typename = typename std::enable_if<
327  std::is_integral<T>::value,T>::type>
328 double Tanh(T n) noexcept
329 {
330  return std::tanh(n);
331 }
332 
333 template <typename T>
334 std::complex<T> Tanh(const std::complex<T>& z) noexcept
335 {
336  return std::tanh(z);
337 }
338 
339 template <typename T>
340 auto Coth(T x) noexcept -> decltype(Tanh(x))
341 {
342  return 1. / Tanh(x);
343 }
344 
345 template <typename T>
346 auto Csch(T x) noexcept -> decltype(Sinh(x))
347 {
348  return 1. / Sinh(x);
349 }
350 
351 template <typename T>
352 auto Sech(T x) noexcept -> decltype(Cosh(x))
353 {
354  return 1. / Cosh(x);
355 }
356 
357 template <typename T,
358  typename = typename std::enable_if<
359  std::is_floating_point<T>::value,T>::type>
360 T ArcCosh(T x) noexcept
361 {
362  return std::acosh(x);
363 }
364 
365 template <typename T,
366  typename = typename std::enable_if<
367  std::is_integral<T>::value,T>::type>
368 double ArcCosh(T n) noexcept
369 {
370  return std::acosh(n);
371 }
372 
373 template <typename T>
374 std::complex<T> ArcCosh(const std::complex<T>& z) noexcept
375 {
376  return std::acosh(z);
377 }
378 
379 template <typename T,
380  typename = typename std::enable_if<
381  std::is_floating_point<T>::value,T>::type>
382 T ArcSinh(T x) noexcept
383 {
384  return std::asinh(x);
385 }
386 
387 template <typename T,
388  typename = typename std::enable_if<
389  std::is_integral<T>::value,T>::type>
390 double ArcSinh(T n) noexcept
391 {
392  return std::asinh(n);
393 }
394 
395 template <typename T>
396 std::complex<T> ArcSinh(const std::complex<T>& z) noexcept
397 {
398  return std::asinh(z);
399 }
400 
401 template <typename T,
402  typename = typename std::enable_if<
403  std::is_floating_point<T>::value,T>::type>
404 T ArcTanh(T x) noexcept
405 {
406  return std::atanh(x);
407 }
408 
409 template <typename T,
410  typename = typename std::enable_if<
411  std::is_integral<T>::value,T>::type>
412 double ArcTanh(T n) noexcept
413 {
414  return std::atanh(n);
415 }
416 
417 template <typename T>
418 std::complex<T> ArcTanh(const std::complex<T>& z) noexcept
419 {
420  return std::atanh(z);
421 }
422 
423 template <typename T,
424  typename = typename std::enable_if<
425  std::is_arithmetic<T>::value,T>::type>
426 T Im(T /* x */) noexcept
427 {
428  return 0.;
429 }
430 
431 template <typename T>
432 T Im(const std::complex<T>& z) noexcept
433 {
434  return std::imag(z);
435 }
436 
437 template <typename T,
438  typename = typename std::enable_if<
439  std::is_arithmetic<T>::value,T>::type>
440 T Re(T x) noexcept
441 {
442  return x;
443 }
444 
445 template <typename T>
446 T Re(const std::complex<T>& z) noexcept
447 {
448  return std::real(z);
449 }
450 
451 template <typename T,
452  typename = typename std::enable_if<
453  std::is_floating_point<T>::value,T>::type>
454 T Sqrt(T x) noexcept
455 {
456  return std::sqrt(x);
457 }
458 
459 template <typename T,
460  typename = typename std::enable_if<
461  std::is_integral<T>::value,T>::type>
462 double Sqrt(T n) noexcept
463 {
464  return std::sqrt(n);
465 }
466 
467 } // namespace BubbleProfiler
468 
469 #endif
T Tan(T x) noexcept
T Cosh(T x) noexcept
auto BesselK(Order v, Argument z) -> decltype(boost::math::cyl_bessel_k(v, z))
T Abs(T x) noexcept
T ArcCos(T x) noexcept
T Cos(T x) noexcept
auto Csch(T x) noexcept-> decltype(Sinh(x))
T Exp(T x) noexcept
T Log(T x) noexcept
auto BesselI(Order v, Argument z) -> decltype(boost::math::cyl_bessel_i(v, z))
T Sqrt(T x) noexcept
T Sin(T x) noexcept
auto abs(const Eigen::MatrixBase< Derived > &m) -> decltype(m.cwiseAbs())
T Re(T x) noexcept
T ArcSinh(T x) noexcept
auto BesselJ(Order v, Argument z) -> decltype(boost::math::cyl_bessel_j(v, z))
int Sign(const T &x)
auto BesselY(Order v, Argument z) -> decltype(boost::math::cyl_neumann(v, z))
T ArcSin(T x) noexcept
auto Coth(T x) noexcept-> decltype(Tanh(x))
auto Cot(T x) noexcept-> decltype(Tan(x))
T Im(T) noexcept
auto Sech(T x) noexcept-> decltype(Cosh(x))
auto Csc(T x) noexcept-> decltype(Sin(x))
auto Sec(T x) noexcept-> decltype(Cos(x))
T Tanh(T x) noexcept
T ArcTanh(T x) noexcept
T Sinh(T x) noexcept
T ArcCosh(T x) noexcept
T ArcTan(T x) noexcept