LIBINT 2.7.2
shgshell_ordering.h
1/*
2 * Copyright (C) 2004-2021 Edward F. Valeev
3 *
4 * This file is part of Libint.
5 *
6 * Libint is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Lesser General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * Libint is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with Libint. If not, see <http://www.gnu.org/licenses/>.
18 *
19 */
20
21#ifndef _libint2_src_bin_libint_shgshellordering_h_
22#define _libint2_src_bin_libint_shgshellordering_h_
23
24#include <cmath>
25
26#include <libint2/config.h>
27
28namespace libint2 {
29
30enum SHGShellOrdering {
31 SHGShellOrdering_Standard = LIBINT_SHGSHELL_ORDERING_STANDARD,
32 SHGShellOrdering_Gaussian = LIBINT_SHGSHELL_ORDERING_GAUSSIAN,
33 SHGShellOrdering_MOLDEN // same as Gaussian
34};
35
36}
37
38//
39// Macros that define orderings
40//
41
42#if LIBINT_SHGSHELL_ORDERING == LIBINT_SHGSHELL_ORDERING_STANDARD
43
44/* Computes an index to a Cartesian function within a shell given
45 * l = total angular momentum
46 * m = real solid harmonic index (|m| = the absolute value of the projection of
47 * the angular momentum on the z axis) m runs from -l to l
48 */
49namespace libint2 {
50inline int INT_SOLIDHARMINDEX(int l, int m) { return m + l; }
51}
52LIBINT_DEPRECATED("please use libint2::INT_SOLIDHARMINDEX instead")
53inline int INT_SOLIDHARMINDEX(int l, int m) { return libint2::INT_SOLIDHARMINDEX(l, m); }
54
55/* This sets up the above loop over cartesian exponents as follows
56 * int m;
57 * FOR_SOLIDHARM(l,m)
58 * END_FOR_SOLIDHARM
59 */
60#define FOR_SOLIDHARM(l, m) for ((m) = -(l); (m) <= (l); ++(m)) {
61#define END_FOR_SOLIDHARM }
62
63#endif // Standard ordering
64
65#if LIBINT_SHGSHELL_ORDERING == LIBINT_SHGSHELL_ORDERING_GAUSSIAN
66
67/* Computes an index to a Cartesian function within a shell given
68 * l = total angular momentum
69 * m = real solid harmonic index (|m| = the absolute value of the projection of
70 * the angular momentum on the z axis) m runs as 0, +1, -1, +2, -2 ... +l, -l
71 */
72namespace libint2 {
73inline int INT_SOLIDHARMINDEX(int l, int m) {
74 return 2 * std::abs(m) + (m > 0 ? -1 : 0);
75}
76}
77LIBINT_DEPRECATED("please use libint2::INT_SOLIDHARMINDEX instead")
78inline int INT_SOLIDHARMINDEX(int l, int m) { return libint2::INT_SOLIDHARMINDEX(l, m); }
79
80/* This sets up the above loop over cartesian exponents as follows
81 * int m;
82 * FOR_SOLIDHARM(l,m)
83 * END_FOR_SOLIDHARM
84 */
85#define FOR_SOLIDHARM(l, m) \
86 for ((m) = 0; (m) != (l) + 1; (m) = ((m) > 0 ? -(m) : 1 - (m))) {
87#define END_FOR_SOLIDHARM }
88
89#endif // Gaussian ordering
90
92
93namespace libint2 {
94inline int INT_SOLIDHARMINDEX_MOLDEN(int l, int m) {
95 return 2 * std::abs(m) + (m > 0 ? -1 : 0);
96}
97}
98LIBINT_DEPRECATED("please use libint2::INT_SOLIDHARMINDEX_MOLDEN instead")
99inline int INT_SOLIDHARMINDEX_MOLDEN(int l, int m) { return libint2::INT_SOLIDHARMINDEX_MOLDEN(l, m); }
100
101#define FOR_SOLIDHARM_MOLDEN(l, m) \
102 for ((m) = 0; (m) != (l) + 1; (m) = ((m) > 0 ? -(m) : 1 - (m))) {
103#define END_FOR_SOLIDHARM_MOLDEN }
104
105#endif // _libint2_src_bin_libint_shgshellordering_h_
Defaults definitions for various parameters assumed by Libint.
Definition: algebra.cc:24