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
|