LCOV - code coverage report
Current view: top level - src/grid/common - grid_common.h (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:0de0cc2) Lines: 26 26 100.0 %
Date: 2024-03-28 07:31:50 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /*----------------------------------------------------------------------------*/
       2             : /*  CP2K: A general program to perform molecular dynamics simulations         */
       3             : /*  Copyright 2000-2024 CP2K developers group <https://cp2k.org>              */
       4             : /*                                                                            */
       5             : /*  SPDX-License-Identifier: BSD-3-Clause                                     */
       6             : /*----------------------------------------------------------------------------*/
       7             : #ifndef GRID_COMMON_H
       8             : #define GRID_COMMON_H
       9             : 
      10             : #define GRID_STRINGIFY(SYMBOL) #SYMBOL
      11             : 
      12             : // GCC added the simd pragma with version 6.
      13             : #if defined(__GNUC__) && !defined(__INTEL_COMPILER) && __GNUC__ < 6
      14             : #define GRID_PRAGMA_SIMD(OBJS, N)
      15             : // Intel added the simd pragma with version 19.00.
      16             : #elif defined(__INTEL_COMPILER) && __INTEL_COMPILER < 1900
      17             : #define GRID_PRAGMA_SIMD(OBJS, N)
      18             : // All compilers support the same syntax defined by the OpenMP standard.
      19             : #else
      20             : #define GRID_PRAGMA_SIMD(OBJS, N)                                              \
      21             :   _Pragma(GRID_STRINGIFY(omp simd linear OBJS simdlen(N)))
      22             : #endif
      23             : 
      24             : // GCC added the unroll pragma with version 8 and...
      25             : #if defined(__GNUC__) && !defined(__INTEL_COMPILER) && __GNUC__ < 8
      26             : #define GRID_PRAGMA_UNROLL(N)
      27             : #define GRID_PRAGMA_UNROLL_UP_TO(N)
      28             : // ...chose a custom syntax.
      29             : #elif defined(__GNUC__) && !defined(__INTEL_COMPILER) && __GNUC__ >= 8
      30             : #define GRID_PRAGMA_UNROLL(N) _Pragma(GRID_STRINGIFY(GCC unroll N))
      31             : #define GRID_PRAGMA_UNROLL_UP_TO(N) _Pragma(GRID_STRINGIFY(GCC unroll N))
      32             : // Most other compilers support a common syntax.
      33             : #else
      34             : #define GRID_PRAGMA_UNROLL(N) _Pragma(GRID_STRINGIFY(unroll(N)))
      35             : #define GRID_PRAGMA_UNROLL_UP_TO(N) _Pragma("unroll")
      36             : #endif
      37             : 
      38             : #if defined(__CUDACC__) || defined(__HIPCC__)
      39             : #define GRID_HOST_DEVICE __host__ __device__
      40             : #else
      41             : #define GRID_HOST_DEVICE
      42             : #endif
      43             : 
      44             : /*******************************************************************************
      45             :  * \brief Factorial function, e.g. fac(5) = 5! = 120.
      46             :  * \author Ole Schuett
      47             :  ******************************************************************************/
      48  2197259578 : GRID_HOST_DEVICE static inline double fac(const int i) {
      49  2197259578 :   static const double table[] = {
      50             :       0.10000000000000000000E+01, 0.10000000000000000000E+01,
      51             :       0.20000000000000000000E+01, 0.60000000000000000000E+01,
      52             :       0.24000000000000000000E+02, 0.12000000000000000000E+03,
      53             :       0.72000000000000000000E+03, 0.50400000000000000000E+04,
      54             :       0.40320000000000000000E+05, 0.36288000000000000000E+06,
      55             :       0.36288000000000000000E+07, 0.39916800000000000000E+08,
      56             :       0.47900160000000000000E+09, 0.62270208000000000000E+10,
      57             :       0.87178291200000000000E+11, 0.13076743680000000000E+13,
      58             :       0.20922789888000000000E+14, 0.35568742809600000000E+15,
      59             :       0.64023737057280000000E+16, 0.12164510040883200000E+18,
      60             :       0.24329020081766400000E+19, 0.51090942171709440000E+20,
      61             :       0.11240007277776076800E+22, 0.25852016738884976640E+23,
      62             :       0.62044840173323943936E+24, 0.15511210043330985984E+26,
      63             :       0.40329146112660563558E+27, 0.10888869450418352161E+29,
      64             :       0.30488834461171386050E+30, 0.88417619937397019545E+31,
      65             :       0.26525285981219105864E+33};
      66  2197259578 :   return table[i];
      67             : }
      68             : 
      69             : /*******************************************************************************
      70             :  * \brief Number of Cartesian orbitals up to given angular momentum quantum.
      71             :  * \author Ole Schuett
      72             :  ******************************************************************************/
      73 18717057489 : GRID_HOST_DEVICE static inline int ncoset(const int l) {
      74 18717057489 :   static const int table[] = {0,  // l=-1, usefull for computing loop bounds
      75             :                               1,  // l=0
      76             :                               4,  // l=1
      77             :                               10, // l=2 ...
      78             :                               20,  35,  56,  84,  120, 165, 220,  286,
      79             :                               364, 455, 560, 680, 816, 969, 1140, 1330};
      80  5856009605 :   return table[l + 1];
      81             : }
      82             : 
      83             : /*******************************************************************************
      84             :  * \brief Maps three angular momentum components to a single zero based index.
      85             :  * \author Ole Schuett
      86             :  ******************************************************************************/
      87 20599937350 : GRID_HOST_DEVICE static inline int coset(int lx, int ly, int lz) {
      88 20599937350 :   const int l = lx + ly + lz;
      89 20599937350 :   if (l == 0) {
      90             :     return 0;
      91             :   } else {
      92 16308851874 :     return ncoset(l - 1) + ((l - lx) * (l - lx + 1)) / 2 + lz;
      93             :   }
      94             : }
      95             : 
      96             : /*******************************************************************************
      97             :  * \brief Returns the smaller of two given integer (missing from the C standard)
      98             :  * \author Ole Schuett
      99             :  ******************************************************************************/
     100 24584483725 : GRID_HOST_DEVICE static inline int imin(int x, int y) {
     101 24584483725 :   return (x < y ? x : y);
     102             : }
     103             : 
     104             : /*******************************************************************************
     105             :  * \brief Returns the larger of two given integer (missing from the C standard)
     106             :  * \author Ole Schuett
     107             :  ******************************************************************************/
     108  4946482067 : GRID_HOST_DEVICE static inline int imax(int x, int y) {
     109  3315778638 :   return (x > y ? x : y);
     110             : }
     111             : 
     112             : /*******************************************************************************
     113             :  * \brief Equivalent of Fortran's MODULO, which always return a positive number.
     114             :  *        https://gcc.gnu.org/onlinedocs/gfortran/MODULO.html
     115             :  * \author Ole Schuett
     116             :  ******************************************************************************/
     117  8208988821 : GRID_HOST_DEVICE static inline int modulo(int a, int m) {
     118  8208988821 :   return ((a % m + m) % m);
     119             : }
     120             : 
     121             : /*******************************************************************************
     122             :  * \brief Orbital angular momentum.
     123             :  * \author Ole Schuett
     124             :  ******************************************************************************/
     125             : typedef struct {
     126             :   int l[3];
     127             : } orbital;
     128             : 
     129             : /*******************************************************************************
     130             :  * \brief Increase i'th component of given orbital angular momentum.
     131             :  * \author Ole Schuett
     132             :  ******************************************************************************/
     133  1639935129 : GRID_HOST_DEVICE static inline orbital up(const int i, const orbital a) {
     134  1639935129 :   orbital b = a;
     135  1639935129 :   b.l[i] += 1;
     136   144495705 :   return b;
     137             : }
     138             : 
     139             : /*******************************************************************************
     140             :  * \brief Decrease i'th component of given orbital angular momentum.
     141             :  * \author Ole Schuett
     142             :  ******************************************************************************/
     143  1634846337 : GRID_HOST_DEVICE static inline orbital down(const int i, const orbital a) {
     144  1634846337 :   orbital b = a;
     145  1634846337 :   b.l[i] = imax(0, a.l[i] - 1);
     146   145271949 :   return b;
     147             : }
     148             : 
     149             : /*******************************************************************************
     150             :  * \brief Return coset index of given orbital angular momentum.
     151             :  * \author Ole Schuett
     152             :  ******************************************************************************/
     153  8079300081 : GRID_HOST_DEVICE static inline int idx(const orbital a) {
     154  1889095801 :   return coset(a.l[0], a.l[1], a.l[2]);
     155             : }
     156             : 
     157             : #endif // GRID_COMMON_H
     158             : 
     159             : // EOF

Generated by: LCOV version 1.15