20 #ifndef _libint2_src_bin_libint_cgshellinfo_h_ 21 #define _libint2_src_bin_libint_cgshellinfo_h_ 30 inline int notxyz(
int a,
int b) {
32 int amax = std::max(a,b);
33 int amin = std::min(a,b);
34 if (amin == 0 && amax == 1)
36 if (amin == 0 && amax == 2)
38 if (amin == 1 && amax == 2)
44 inline std::pair<int,int> notxyz(
int a) {
46 case 0:
return std::make_pair(1,2);
break;
47 case 1:
return std::make_pair(0,2);
break;
48 case 2:
return std::make_pair(0,1);
break;
51 return std::make_pair(-1,-1);
57 static void compute(
int (&cartindex)[lmax+1][lmax+1][lmax+1]);
60 static void compute(
int (&cartindex)[lmax+1][lmax+1][lmax+1]) {
63 for (
unsigned int am = 0; am <= lmax; ++am) {
65 for(
int i=(am);(i)>=0;(i)--) {
66 for(
int j=(am)-(i);(j)>=0;(j)--, ++count) {
67 cartindex[am][i][j] = count;
75 static void compute(
int (&cartindex)[lmax+1][lmax+1][lmax+1]) {
77 for (
unsigned int am = 0; am <= lmax; ++am) {
80 cartindex[0][0][0] = 0;
85 cartindex[4][4][0] = 0;
86 cartindex[4][0][4] = 1;
87 cartindex[4][0][0] = 2;
88 cartindex[4][3][1] = 3;
89 cartindex[4][3][0] = 4;
90 cartindex[4][1][3] = 5;
91 cartindex[4][0][3] = 6;
92 cartindex[4][1][0] = 7;
93 cartindex[4][0][1] = 8;
94 cartindex[4][2][2] = 9;
95 cartindex[4][2][0] = 10;
96 cartindex[4][0][2] = 11;
97 cartindex[4][2][1] = 12;
98 cartindex[4][1][2] = 13;
99 cartindex[4][1][1] = 14;
103 unsigned int current_index = 0;
104 unsigned int qn[3] = { 0, 0, 0 };
106 const int ammin = ((int) am + 2) / 3;
107 for (
int am1 = am; am1 >= ammin; --am1) {
109 for (
int xyz1 = 0; xyz1 < 3; ++xyz1) {
117 std::pair<int, int> xyz(detail::notxyz( xyz1));
120 cartindex[am][qn[0]][qn[1]] = current_index;
123 int am23 = (int) am - qn[xyz1];
124 const int maxam23 = std::min((
int) qn[xyz1], am23);
125 const int minam23 = (am23 + 1) / 2;
126 for (
int am2 = maxam23; am2 >= minam23; --am2) {
127 const int xyz2min = (am2 == qn[xyz1]) ? xyz1 + 1 : 0;
128 for (
int xyz2 = xyz2min; xyz2 < 3; ++xyz2) {
132 const int xyz3 = detail::notxyz(xyz1, xyz2);
133 qn[xyz3] = am23 - am2;
134 if ((qn[xyz3] == qn[xyz1] && xyz3 < xyz1) ||
135 (qn[xyz3] == qn[xyz2] && xyz3 < xyz2)
139 cartindex[am][qn[0]][qn[1]] = current_index;
152 static void compute(
int (&cartindex)[lmax+1][lmax+1][lmax+1]) {
158 for (
unsigned int am = 0; am <= std::min(4u,lmax); ++am) {
161 cartindex[0][0][0] = 0;
165 cartindex[1][0][0] = 0;
166 cartindex[1][1][0] = 1;
167 cartindex[1][0][1] = 2;
171 cartindex[2][2][0] = 0;
172 cartindex[2][0][2] = 1;
173 cartindex[2][0][0] = 2;
174 cartindex[2][1][1] = 3;
175 cartindex[2][1][0] = 4;
176 cartindex[2][0][1] = 5;
180 cartindex[3][3][0] = 0;
181 cartindex[3][0][3] = 1;
182 cartindex[3][0][0] = 2;
183 cartindex[3][2][1] = 3;
184 cartindex[3][2][0] = 4;
185 cartindex[3][1][2] = 5;
186 cartindex[3][0][2] = 6;
187 cartindex[3][1][0] = 7;
188 cartindex[3][0][1] = 8;
189 cartindex[3][1][1] = 9;
193 cartindex[4][4][0] = 0;
194 cartindex[4][0][4] = 1;
195 cartindex[4][0][0] = 2;
196 cartindex[4][3][1] = 3;
197 cartindex[4][3][0] = 4;
198 cartindex[4][1][3] = 5;
199 cartindex[4][0][3] = 6;
200 cartindex[4][1][0] = 7;
201 cartindex[4][0][1] = 8;
202 cartindex[4][2][2] = 9;
203 cartindex[4][2][0] = 10;
204 cartindex[4][0][2] = 11;
205 cartindex[4][2][1] = 12;
206 cartindex[4][1][2] = 13;
207 cartindex[4][1][1] = 14;
357 for(
int l=0; l<=lmax; ++l) {
358 for(
int i=0; i<=l; ++i) {
359 for(
int j=0; j<=l-i; ++j) {
360 std::cout <<
"CGShellOrderingGenerator<CGShellOrdering_ORCA>: cartindex[" << l <<
"][" 361 << i <<
"][" << j <<
"] = " << cartindex[l][i][j] << std::endl;
373 Triple() : i(0), j(0), k(0) {}
374 Triple(
int ii,
int jj,
int kk) : i(ii), j(jj), k(kk) {}
382 for(
unsigned int l=0; l<=lmax; ++l) {
383 for(
int i=0; i<=l; ++i) {
384 for(
int j=0; j<=l-i; ++j) {
385 const int c = cartindex[l][i][j];
386 cartindex_to_ijk[l][c] =
Triple(i,j,l-i-j);
392 int cartindex[lmax+1][lmax+1][lmax+1];
393 Triple cartindex_to_ijk[lmax+1][(lmax+1)*(lmax+2)/2];
399 static int cartindex(
unsigned int am,
int i,
int j) {
400 return data_.cartindex[am][i][j];
403 template <
typename I1,
typename I2,
typename I3>
404 static void cartindex_to_ijk(I1 am,
409 const typename OrderingData::Triple& ijk = data_.cartindex_to_ijk[am][xyz];
416 static OrderingData data_;
425 #endif // header guard Defaults definitions for various parameters assumed by Libint.
Definition: algebra.cc:23
Definition: cgshellinfo.h:372
Definition: cgshellinfo.h:370
Definition: cgshellinfo.h:56
static void compute(int(&cartindex)[lmax+1][lmax+1][lmax+1])
Definition: cgshellinfo.h:75
provides ordering maps for up to angular momentum lmax and ordering specified by CGShellOrderingSpec ...
Definition: cgshellinfo.h:397