LCOV - code coverage report
Current view: top level - include/crpropa - Common.h (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 10 10 100.0 %
Date: 2024-04-29 14:43:01 Functions: 2 2 100.0 %

          Line data    Source code
       1             : #ifndef CRPROPA_COMMON_H
       2             : #define CRPROPA_COMMON_H
       3             : 
       4             : #include <string>
       5             : #include <vector>
       6             : /**
       7             :  @file
       8             :  @brief Common helper functions
       9             :  */
      10             : 
      11             : namespace crpropa {
      12             : /**
      13             :  * \addtogroup Core
      14             :  * @{
      15             :  */
      16             : 
      17             : // Returns the full path to a CRPropa data file
      18             : std::string getDataPath(std::string filename);
      19             : 
      20             : // Returns the install prefix
      21             : std::string getInstallPrefix();
      22             : 
      23             : // Returns a certain digit from a given integer
      24             : inline int digit(const int& value, const int& d) {
      25        1304 :         return (value % (d * 10)) / d;
      26             : }
      27             : 
      28             : // Return value xclip which is the closest to x, so that lower <= xclip <= upper
      29             : template <typename T>
      30             : T clip(const T& x, const T& lower, const T& upper) {
      31      524299 :         return std::max(lower, std::min(x, upper));
      32             : }
      33             : 
      34             : // Perform linear interpolation on a set of n tabulated data points X[0 .. n-1] -> Y[0 .. n-1]
      35             : // Returns Y[0] if x < X[0] and Y[n-1] if x > X[n-1]
      36             : double interpolate(double x, const std::vector<double>& X,
      37             :                 const std::vector<double>& Y);
      38             : 
      39             : 
      40             : // Perform bilinear interpolation on a set of (n,m) tabulated data points X[0 .. n-1], Y[0 .. m-1] -> Z[0.. n-1*m-1]
      41             : // Returns 0 if x < X[0] or x > X[n-1] or y < Y[0] or y > Y[m-1]
      42             : double interpolate2d(double x, double y, const std::vector<double>& X,
      43             :                 const std::vector<double>& Y, const std::vector<double>& Z);
      44             : 
      45             : // Perform linear interpolation on equidistant tabulated data
      46             : // Returns Y[0] if x < lo and Y[n-1] if x > hi
      47             : double interpolateEquidistant(double x, double lo, double hi,
      48             :                 const std::vector<double>& Y);
      49             : 
      50             : // Find index of value in a sorted vector X that is closest to x
      51             : size_t closestIndex(double x, const std::vector<double> &X);
      52             : /** @}*/
      53             : 
      54             : 
      55             : // pow implementation as template for integer exponents pow_integer<2>(x)
      56             : // evaluates to x*x
      57             : template <unsigned int exponent>
      58             : inline double pow_integer(double base)
      59             : {
      60      166078 :   return pow_integer<(exponent >> 1)>(base*base) * (((exponent & 1) > 0) ? base : 1);
      61             : }
      62             : 
      63             : template <>
      64             : inline double pow_integer<0>(double base)
      65             : {
      66             :   return 1;
      67             : }
      68             : 
      69             : // - input:  function over which to integrate, integration limits A and B
      70             : // - output: 8-points Gauß-Legendre integral
      71             : static const double X[8] = {.0950125098, .2816035507, .4580167776, .6178762444, .7554044083, .8656312023, .9445750230, .9894009349};
      72             : static const double W[8] = {.1894506104, .1826034150, .1691565193, .1495959888, .1246289712, .0951585116, .0622535239, .0271524594};
      73             : template<typename Integrand>
      74       63808 : double gaussInt(Integrand&& integrand, double A, double B) {
      75       63808 :         const double XM = 0.5 * (B + A);
      76       63808 :         const double XR = 0.5 * (B - A);
      77             :         double SS = 0.;
      78      574281 :         for (int i = 0; i < 8; ++i) {
      79      510472 :                 double DX = XR * X[i];
      80      510472 :                 SS += W[i] * (integrand(XM + DX) + integrand(XM - DX));
      81             :         }
      82       63808 :         return XR * SS;
      83             : }
      84             : 
      85             : } // namespace crpropa
      86             : 
      87             : #endif // CRPROPA_COMMON_H

Generated by: LCOV version 1.14