27 for (
u32 axis = 0; axis <
N; axis++) {
28 auto a_minus_A = point[axis] - this->insertionLow[axis];
29 auto B_minus_A = this->insertionHigh[axis] - this->insertionLow[axis];
30 auto n = (
i64) this->npart - 1;
32 auto ia = n * (a_minus_A / B_minus_A);
33 auto i = std::ceil(ia);
34 auto iClamped = std::clamp(i, (
fp) 0, (
fp) this->npart);
35 itemLowIdx[axis] = iClamped;
43 const auto leafWorkArea = this->globalIcArea.intersection(tree->range);
44 if (leafWorkArea.size() == 0)
return;
46 assert(leafWorkArea.size() <= tree->range.size())
51 auto axisWiseItemCounts = itemIdxHigh - itemIdxLow;
52 decltype(axisWiseItemCounts) scales;
54 u32 itemCount = axisWiseItemCounts.prod();
56 auto *lastInsertionLeaf = tree;
58 for (
u32 itemLinearIdx = 0; itemLinearIdx < itemCount; itemLinearIdx++) {
59 auto itemIdx = itemIdxLow;
62 for (
u32 axis = 0; axis <
N; axis++) {
63 itemIdx[axis] += (
i64) (itemLinearIdx / scale) % (
i64) axisWiseItemCounts[axis];
64 scale *= axisWiseItemCounts[axis];
67 auto iDivN = itemIdx.template castAs<fp>() / (this->npart - 1);
68 auto pos = this->insertionLow + (this->insertionHigh - this->
insertionLow) * iDivN;
70 auto item = InitialConditionsCallback(pos);
71 lastInsertionLeaf = lastInsertionLeaf->insert(item);
73 assert(lastInsertionLeaf !=
nullptr)