(git:1f285aa)
grid_common.h
Go to the documentation of this file.
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 GRID_HOST_DEVICE static inline double fac(const int i) {
49  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  return table[i];
67 }
68 
69 /*******************************************************************************
70  * \brief Number of Cartesian orbitals up to given angular momentum quantum.
71  * \author Ole Schuett
72  ******************************************************************************/
73 GRID_HOST_DEVICE static inline int ncoset(const int l) {
74  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  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 GRID_HOST_DEVICE static inline int coset(int lx, int ly, int lz) {
88  const int l = lx + ly + lz;
89  if (l == 0) {
90  return 0;
91  } else {
92  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 GRID_HOST_DEVICE static inline int imin(int x, int y) {
101  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 GRID_HOST_DEVICE static inline int imax(int x, int y) {
109  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 GRID_HOST_DEVICE static inline int modulo(int a, int m) {
118  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 GRID_HOST_DEVICE static inline orbital up(const int i, const orbital a) {
134  orbital b = a;
135  b.l[i] += 1;
136  return b;
137 }
138 
139 /*******************************************************************************
140  * \brief Decrease i'th component of given orbital angular momentum.
141  * \author Ole Schuett
142  ******************************************************************************/
143 GRID_HOST_DEVICE static inline orbital down(const int i, const orbital a) {
144  orbital b = a;
145  b.l[i] = imax(0, a.l[i] - 1);
146  return b;
147 }
148 
149 /*******************************************************************************
150  * \brief Return coset index of given orbital angular momentum.
151  * \author Ole Schuett
152  ******************************************************************************/
153 GRID_HOST_DEVICE static inline int idx(const orbital a) {
154  return coset(a.l[0], a.l[1], a.l[2]);
155 }
156 
157 #endif // GRID_COMMON_H
158 
159 // EOF
static GRID_HOST_DEVICE int coset(int lx, int ly, int lz)
Maps three angular momentum components to a single zero based index.
Definition: grid_common.h:87
static GRID_HOST_DEVICE int ncoset(const int l)
Number of Cartesian orbitals up to given angular momentum quantum.
Definition: grid_common.h:73
static GRID_HOST_DEVICE int imin(int x, int y)
Returns the smaller of two given integer (missing from the C standard)
Definition: grid_common.h:100
static GRID_HOST_DEVICE int imax(int x, int y)
Returns the larger of two given integer (missing from the C standard)
Definition: grid_common.h:108
#define GRID_HOST_DEVICE
Definition: grid_common.h:41
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
Definition: grid_common.h:117
static GRID_HOST_DEVICE double fac(const int i)
Factorial function, e.g. fac(5) = 5! = 120.
Definition: grid_common.h:48
static GRID_HOST_DEVICE orbital up(const int i, const orbital a)
Increase i'th component of given orbital angular momentum.
Definition: grid_common.h:133
static GRID_HOST_DEVICE int idx(const orbital a)
Return coset index of given orbital angular momentum.
Definition: grid_common.h:153
static GRID_HOST_DEVICE orbital down(const int i, const orbital a)
Decrease i'th component of given orbital angular momentum.
Definition: grid_common.h:143
static void const int const int i
real(dp), dimension(3) a
Definition: ai_eri_debug.F:31
real(dp), dimension(3) b
Definition: ai_eri_debug.F:31
Orbital angular momentum.
Definition: grid_common.h:125