21 #ifndef _libint2_src_bin_libint_cgshellinfo_h_ 22 #define _libint2_src_bin_libint_cgshellinfo_h_ 37 inline int notxyz(
int a,
int b) {
39 int amax = std::max(a,b);
40 int amin = std::min(a,b);
41 if (amin == 0 && amax == 1)
43 if (amin == 0 && amax == 2)
45 if (amin == 1 && amax == 2)
51 inline std::pair<int,int> notxyz(
int a) {
53 case 0:
return std::make_pair(1,2);
break;
54 case 1:
return std::make_pair(0,2);
break;
55 case 2:
return std::make_pair(0,1);
break;
58 return std::make_pair(-1,-1);
64 static void compute(
int (&cartindex)[lmax+1][lmax+1][lmax+1]);
67 static void compute(
int (&cartindex)[lmax+1][lmax+1][lmax+1]) {
70 for (
unsigned int am = 0; am <= lmax; ++am) {
72 for(
int i=(am);(i)>=0;(i)--) {
73 for(
int j=(am)-(i);(j)>=0;(j)--, ++count) {
74 cartindex[am][i][j] = count;
82 static void compute(
int (&cartindex)[lmax+1][lmax+1][lmax+1]) {
84 for (
unsigned int am = 0; am <= lmax; ++am) {
87 cartindex[0][0][0] = 0;
92 cartindex[4][4][0] = 0;
93 cartindex[4][0][4] = 1;
94 cartindex[4][0][0] = 2;
95 cartindex[4][3][1] = 3;
96 cartindex[4][3][0] = 4;
97 cartindex[4][1][3] = 5;
98 cartindex[4][0][3] = 6;
99 cartindex[4][1][0] = 7;
100 cartindex[4][0][1] = 8;
101 cartindex[4][2][2] = 9;
102 cartindex[4][2][0] = 10;
103 cartindex[4][0][2] = 11;
104 cartindex[4][2][1] = 12;
105 cartindex[4][1][2] = 13;
106 cartindex[4][1][1] = 14;
110 unsigned int current_index = 0;
111 unsigned int qn[3] = { 0, 0, 0 };
113 const int ammin = ((int) am + 2) / 3;
114 for (
int am1 = am; am1 >= ammin; --am1) {
116 for (
int xyz1 = 0; xyz1 < 3; ++xyz1) {
124 std::pair<int, int> xyz(detail::notxyz( xyz1));
127 cartindex[am][qn[0]][qn[1]] = current_index;
130 int am23 = (int) am - qn[xyz1];
131 const int maxam23 = std::min((
int) qn[xyz1], am23);
132 const int minam23 = (am23 + 1) / 2;
133 for (
int am2 = maxam23; am2 >= minam23; --am2) {
134 const int xyz2min = (am2 == qn[xyz1]) ? xyz1 + 1 : 0;
135 for (
int xyz2 = xyz2min; xyz2 < 3; ++xyz2) {
139 const int xyz3 = detail::notxyz(xyz1, xyz2);
140 qn[xyz3] = am23 - am2;
141 if ((qn[xyz3] == qn[xyz1] && xyz3 < xyz1) ||
142 (qn[xyz3] == qn[xyz2] && xyz3 < xyz2)
146 cartindex[am][qn[0]][qn[1]] = current_index;
159 static void compute(
int (&cartindex)[lmax+1][lmax+1][lmax+1]) {
165 for (
unsigned int am = 0; am <= std::min(4u,lmax); ++am) {
168 cartindex[0][0][0] = 0;
172 cartindex[1][0][0] = 0;
173 cartindex[1][1][0] = 1;
174 cartindex[1][0][1] = 2;
178 cartindex[2][2][0] = 0;
179 cartindex[2][0][2] = 1;
180 cartindex[2][0][0] = 2;
181 cartindex[2][1][1] = 3;
182 cartindex[2][1][0] = 4;
183 cartindex[2][0][1] = 5;
187 cartindex[3][3][0] = 0;
188 cartindex[3][0][3] = 1;
189 cartindex[3][0][0] = 2;
190 cartindex[3][2][1] = 3;
191 cartindex[3][2][0] = 4;
192 cartindex[3][1][2] = 5;
193 cartindex[3][0][2] = 6;
194 cartindex[3][1][0] = 7;
195 cartindex[3][0][1] = 8;
196 cartindex[3][1][1] = 9;
200 cartindex[4][4][0] = 0;
201 cartindex[4][0][4] = 1;
202 cartindex[4][0][0] = 2;
203 cartindex[4][3][1] = 3;
204 cartindex[4][3][0] = 4;
205 cartindex[4][1][3] = 5;
206 cartindex[4][0][3] = 6;
207 cartindex[4][1][0] = 7;
208 cartindex[4][0][1] = 8;
209 cartindex[4][2][2] = 9;
210 cartindex[4][2][0] = 10;
211 cartindex[4][0][2] = 11;
212 cartindex[4][2][1] = 12;
213 cartindex[4][1][2] = 13;
214 cartindex[4][1][1] = 14;
364 for(
int l=0; l<=lmax; ++l) {
365 for(
int i=0; i<=l; ++i) {
366 for(
int j=0; j<=l-i; ++j) {
367 std::cout <<
"CGShellOrderingGenerator<CGShellOrdering_ORCA>: cartindex[" << l <<
"][" 368 << i <<
"][" << j <<
"] = " << cartindex[l][i][j] << std::endl;
379 static void compute(
int (&cartindex)[lmax+1][lmax+1][lmax+1]) {
381 for (
unsigned int am = 0; am <= 4u; ++am) {
384 cartindex[0][0][0] = 0;
388 cartindex[1][1][0] = 0;
389 cartindex[1][0][1] = 1;
390 cartindex[1][0][0] = 2;
394 cartindex[2][2][0] = 0;
395 cartindex[2][0][2] = 1;
396 cartindex[2][0][0] = 2;
397 cartindex[2][1][1] = 3;
398 cartindex[2][1][0] = 4;
399 cartindex[2][0][1] = 5;
403 cartindex[3][3][0] = 0;
404 cartindex[3][0][3] = 1;
405 cartindex[3][0][0] = 2;
406 cartindex[3][1][2] = 3;
407 cartindex[3][2][1] = 4;
408 cartindex[3][2][0] = 5;
409 cartindex[3][1][0] = 6;
410 cartindex[3][0][1] = 7;
411 cartindex[3][0][2] = 8;
412 cartindex[3][1][1] = 9;
416 cartindex[4][4][0] = 0;
417 cartindex[4][0][4] = 1;
418 cartindex[4][0][0] = 2;
419 cartindex[4][3][1] = 3;
420 cartindex[4][3][0] = 4;
421 cartindex[4][1][3] = 5;
422 cartindex[4][0][3] = 6;
423 cartindex[4][1][0] = 7;
424 cartindex[4][0][1] = 8;
425 cartindex[4][2][2] = 9;
426 cartindex[4][2][0] = 10;
427 cartindex[4][0][2] = 11;
428 cartindex[4][2][1] = 12;
429 cartindex[4][1][2] = 13;
430 cartindex[4][1][1] = 14;
440 Triple() : i(0), j(0), k(0) {}
441 Triple(
int ii,
int jj,
int kk) : i(ii), j(jj), k(kk) {}
449 for(
unsigned int l=0; l<=lmax; ++l) {
450 for(
unsigned int i=0; i<=l; ++i) {
451 for(
unsigned int j=0; j<=l-i; ++j) {
452 const int c = cartindex[l][i][j];
453 cartindex_to_ijk[l][c] =
Triple(i,j,l-i-j);
459 int cartindex[lmax+1][lmax+1][lmax+1];
460 Triple cartindex_to_ijk[lmax+1][(lmax+1)*(lmax+2)/2];
466 static int cartindex(
unsigned int am,
int i,
int j) {
467 return data_.cartindex[am][i][j];
470 template <
typename I1,
typename I2,
typename I3>
471 static void cartindex_to_ijk(I1 am,
476 const typename OrderingData::Triple& ijk = data_.cartindex_to_ijk[am][xyz];
483 static OrderingData data_;
490 #endif // header guard Defaults definitions for various parameters assumed by Libint.
Definition: algebra.cc:24
Definition: cgshellinfo.h:439
CartesianShellNormalization
Normalization convention for Cartesian Gaussian shells.
Definition: cgshellinfo.h:31
Definition: cgshellinfo.h:437
Definition: cgshellinfo.h:63
static void compute(int(&cartindex)[lmax+1][lmax+1][lmax+1])
Definition: cgshellinfo.h:82
provides ordering maps for up to angular momentum lmax and ordering specified by CGShellOrderingSpec
Definition: cgshellinfo.h:464