86 static void compute(
int (&cartindex)[lmax + 1][lmax + 1][lmax + 1]) {
87 for (
unsigned int am = 0; am <= lmax; ++am) {
89 cartindex[0][0][0] = 0;
95 cartindex[4][4][0] = 0;
96 cartindex[4][0][4] = 1;
97 cartindex[4][0][0] = 2;
98 cartindex[4][3][1] = 3;
99 cartindex[4][3][0] = 4;
100 cartindex[4][1][3] = 5;
101 cartindex[4][0][3] = 6;
102 cartindex[4][1][0] = 7;
103 cartindex[4][0][1] = 8;
104 cartindex[4][2][2] = 9;
105 cartindex[4][2][0] = 10;
106 cartindex[4][0][2] = 11;
107 cartindex[4][2][1] = 12;
108 cartindex[4][1][2] = 13;
109 cartindex[4][1][1] = 14;
113 unsigned int current_index = 0;
114 unsigned int qn[3] = {0, 0, 0};
116 const int ammin = ((int)am + 2) / 3;
117 for (
int am1 = am; am1 >= ammin; --am1) {
118 for (
int xyz1 = 0; xyz1 < 3; ++xyz1) {
125 std::pair<int, int> xyz(detail::notxyz(xyz1));
128 cartindex[am][qn[0]][qn[1]] = current_index;
131 int am23 = (int)am - qn[xyz1];
132 const int maxam23 = std::min((
int)qn[xyz1], am23);
133 const int minam23 = (am23 + 1) / 2;
134 for (
int am2 = maxam23; am2 >= minam23; --am2) {
135 const int xyz2min = (am2 == qn[xyz1]) ? xyz1 + 1 : 0;
136 for (
int xyz2 = xyz2min; xyz2 < 3; ++xyz2) {
137 if (xyz1 == xyz2)
continue;
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))
145 cartindex[am][qn[0]][qn[1]] = current_index;