LCOV - code coverage report
Current view: top level - src/grid/common - grid_common.h (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:37c9bd6) Lines: 26 26 100.0 %
Date: 2023-03-30 11:55:16 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /*----------------------------------------------------------------------------*/
       2             : /*  CP2K: A general program to perform molecular dynamics simulations         */
       3             : /*  Copyright 2000-2023 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  2182490920 : GRID_HOST_DEVICE static inline double fac(const int i) {
      49  2182490920 :   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  2182490920 :   return table[i];
      67             : }
      68             : 
      69             : /*******************************************************************************
      70             :  * \brief Number of Cartesian orbitals up to given angular momentum quantum.
      71             :  * \author Ole Schuett
      72             :  ******************************************************************************/
      73 18555212018 : GRID_HOST_DEVICE static inline int ncoset(const int l) {
      74 18555212018 :   static const int table[] = {1,  // l=0
      75             :                               4,  // l=1
      76             :                               10, // l=2 ...
      77             :                               20,  35,  56,  84,  120, 165, 220,  286,
      78             :                               364, 455, 560, 680, 816, 969, 1140, 1330};
      79  5795683683 :   return table[l];
      80             : }
      81             : 
      82             : /*******************************************************************************
      83             :  * \brief Maps three angular momentum components to a single zero based index.
      84             :  * \author Ole Schuett
      85             :  ******************************************************************************/
      86 20433398614 : GRID_HOST_DEVICE static inline int coset(int lx, int ly, int lz) {
      87 20433398614 :   const int l = lx + ly + lz;
      88 20433398614 :   if (l == 0) {
      89             :     return 0;
      90             :   } else {
      91 16176053963 :     return ncoset(l - 1) + ((l - lx) * (l - lx + 1)) / 2 + lz;
      92             :   }
      93             : }
      94             : 
      95             : /*******************************************************************************
      96             :  * \brief Returns the smaller of two given integer (missing from the C standard)
      97             :  * \author Ole Schuett
      98             :  ******************************************************************************/
      99 24042423583 : GRID_HOST_DEVICE static inline int imin(int x, int y) {
     100 24042423583 :   return (x < y ? x : y);
     101             : }
     102             : 
     103             : /*******************************************************************************
     104             :  * \brief Returns the larger of two given integer (missing from the C standard)
     105             :  * \author Ole Schuett
     106             :  ******************************************************************************/
     107  4901964560 : GRID_HOST_DEVICE static inline int imax(int x, int y) {
     108  3279168816 :   return (x > y ? x : y);
     109             : }
     110             : 
     111             : /*******************************************************************************
     112             :  * \brief Equivalent of Fortran's MODULO, which always return a positive number.
     113             :  *        https://gcc.gnu.org/onlinedocs/gfortran/MODULO.html
     114             :  * \author Ole Schuett
     115             :  ******************************************************************************/
     116  8043933486 : GRID_HOST_DEVICE static inline int modulo(int a, int m) {
     117  8043933486 :   return ((a % m + m) % m);
     118             : }
     119             : 
     120             : /*******************************************************************************
     121             :  * \brief Orbital angular momentum.
     122             :  * \author Ole Schuett
     123             :  ******************************************************************************/
     124             : typedef struct {
     125             :   int l[3];
     126             : } orbital;
     127             : 
     128             : /*******************************************************************************
     129             :  * \brief Increase i'th component of given orbital angular momentum.
     130             :  * \author Ole Schuett
     131             :  ******************************************************************************/
     132  1614893856 : GRID_HOST_DEVICE static inline orbital up(const int i, const orbital a) {
     133  1632022872 :   orbital b = a;
     134  1632022872 :   b.l[i] += 1;
     135   142689834 :   return b;
     136             : }
     137             : 
     138             : /*******************************************************************************
     139             :  * \brief Decrease i'th component of given orbital angular momentum.
     140             :  * \author Ole Schuett
     141             :  ******************************************************************************/
     142  1626938652 : GRID_HOST_DEVICE static inline orbital down(const int i, const orbital a) {
     143  1626938652 :   orbital b = a;
     144  1626938652 :   b.l[i] = imax(0, a.l[i] - 1);
     145   143466078 :   return b;
     146             : }
     147             : 
     148             : /*******************************************************************************
     149             :  * \brief Return coset index of given orbital angular momentum.
     150             :  * \author Ole Schuett
     151             :  ******************************************************************************/
     152  8024043050 : GRID_HOST_DEVICE static inline int idx(const orbital a) {
     153  1870877535 :   return coset(a.l[0], a.l[1], a.l[2]);
     154             : }
     155             : 
     156             : #endif // GRID_COMMON_H
     157             : 
     158             : // EOF

Generated by: LCOV version 1.15