@@ -2745,31 +2745,6 @@ namespace OrthoTree
27452745 return true ;
27462746 }
27472747
2748-
2749- struct GridBoundary
2750- {
2751- GridID MinGridID, BeginGridID, EndGridID;
2752- };
2753- template <dim_t DIMENSION_ID>
2754- static constexpr void ConstructGridIDListRecursively (
2755- GridID gridStepNo, DimArray<GridBoundary> const & gridIDBoundaries, DimArray<GridID>& currentGridID, std::vector<DimArray<GridID>>& allGridID) noexcept
2756- {
2757- if constexpr (DIMENSION_ID == 0 )
2758- allGridID.emplace_back (currentGridID);
2759- else
2760- {
2761- auto const & [minGridID, beginGridID, endGridID] = gridIDBoundaries[DIMENSION_ID - 1 ];
2762- currentGridID[DIMENSION_ID - 1 ] = minGridID;
2763- ConstructGridIDListRecursively<DIMENSION_ID - 1 >(gridStepNo, gridIDBoundaries, currentGridID, allGridID);
2764- for (auto gridID = beginGridID; gridID < endGridID; ++gridID)
2765- {
2766- currentGridID[DIMENSION_ID - 1 ] = gridID * gridStepNo;
2767- ConstructGridIDListRecursively<DIMENSION_ID - 1 >(gridStepNo, gridIDBoundaries, currentGridID, allGridID);
2768- }
2769- }
2770- }
2771-
2772-
27732748 template <bool DO_RANGE_MUST_FULLY_CONTAIN = false >
27742749 constexpr void RangeSearchBaseCopy (
27752750 TBox const & range, TContainer const & geometryCollection, Node const & parentNode, std::vector<TEntityID>& foundEntities) const noexcept
@@ -3629,7 +3604,6 @@ namespace OrthoTree
36293604 using Base = OrthoTreeBase<DIMENSION_NO, TBox_, TVector_, TBox_, TRay_, TPlane_, TGeometry_, TAdapter_, TContainer_>;
36303605 using EntityDistance = typename Base::EntityDistance;
36313606 using BoxDistance = typename Base::BoxDistance;
3632- using GridBoundary = typename Base::GridBoundary;
36333607 template <typename T>
36343608 using DimArray = std::array<T, DIMENSION_NO>;
36353609 using IGM = typename Base::IGM;
@@ -3693,43 +3667,59 @@ namespace OrthoTree
36933667 auto const remainingDepthNo = static_cast <depth_t >(this ->m_maxDepthNo - depthID);
36943668 auto const gridStepNo = detail::pow2<depth_t , GridID>(remainingDepthNo);
36953669
3696- auto gridBoundaries = DimArray<GridBoundary>{};
3670+ struct GridSet
3671+ {
3672+ GridID BeginID;
3673+ GridID EndID;
3674+ };
3675+ auto gridBoundaries = DimArray<GridSet>{};
36973676 std::size_t boxNoByGrid = 1 ;
36983677 for (dim_t dimensionID = 0 ; dimensionID < DIMENSION_NO; ++dimensionID)
36993678 {
3700- GridID const firstGridSplit = (boxMinMaxGridID[0 ][dimensionID] / gridStepNo) + GridID{ 1 };
3701- GridID const lastGridSplit = (boxMinMaxGridID[1 ][dimensionID] / gridStepNo);
3702- GridID const gridIDNo = (lastGridSplit < firstGridSplit ? 0 : (lastGridSplit - firstGridSplit + 1 )) + 1 ;
3703- boxNoByGrid *= gridIDNo;
3679+ auto beginID = boxMinMaxGridID[0 ][dimensionID] / gridStepNo;
3680+ auto endID = 1 + boxMinMaxGridID[1 ][dimensionID] / gridStepNo;
3681+ boxNoByGrid *= endID - beginID;
37043682 if (boxNoByGrid >= SI::CHILD_NO)
37053683 return ;
37063684
3707- gridBoundaries[dimensionID] = { boxMinMaxGridID[ 0 ][dimensionID], firstGridSplit, lastGridSplit + 1 };
3685+ gridBoundaries[dimensionID] = { beginID * gridStepNo, endID * gridStepNo };
37083686 }
37093687
3710- auto gridIDs = std::vector<DimArray<GridID>>{};
3711- gridIDs.reserve (boxNoByGrid);
3712- auto temporaryGridID = DimArray<GridID>{};
3713- Base::template ConstructGridIDListRecursively<DIMENSION_NO>(gridStepNo, gridBoundaries, temporaryGridID, gridIDs);
3688+ if (boxNoByGrid < 2 )
3689+ return ;
37143690
3715- auto const boxNo = gridIDs.size ();
3691+ auto const increaseGridID = [&](DimArray<GridID>& gridID) {
3692+ for (dim_t dimensionID = 0 ; dimensionID < DIMENSION_NO; ++dimensionID)
3693+ {
3694+ gridID[dimensionID] += gridStepNo;
3695+ if (gridID[dimensionID] < gridBoundaries[dimensionID].EndID )
3696+ break ;
3697+
3698+ gridID[dimensionID] = gridBoundaries[dimensionID].BeginID ;
3699+ }
3700+ };
3701+
3702+ DimArray<GridID> gridID;
3703+ for (dim_t dimensionID = 0 ; dimensionID < DIMENSION_NO; ++dimensionID)
3704+ gridID[dimensionID] = gridBoundaries[dimensionID].BeginID ;
37163705
3717- // First element into locationID
37183706 location.DepthAndLocation .DepthID = depthID;
3719- location.DepthAndLocation .LocID = SI::Encode (gridIDs[0 ]);
3707+ location.DepthAndLocation .LocID = SI::Encode (gridID);
3708+ increaseGridID (gridID);
3709+
37203710 auto const entityID = location.EntityID ;
37213711
3722- auto const additionalBoxNo = boxNo - 1 ;
3712+ auto const additionalBoxNo = boxNoByGrid - 1 ;
37233713 auto const locationNo = additionalLocations.size ();
37243714 additionalLocations.resize (locationNo + additionalBoxNo);
37253715
3726- LOOPIVDEP
3727- for (std::size_t iBox = 0 ; iBox < additionalBoxNo; ++iBox)
3716+ for (auto locationPosition = locationNo; locationPosition < additionalLocations.size (); ++locationPosition, increaseGridID (gridID))
37283717 {
3729- auto & subLocation = additionalLocations.at (locationNo + iBox);
3718+ auto & subLocation = additionalLocations.at (locationPosition);
3719+
37303720 subLocation.EntityID = entityID;
37313721 subLocation.DepthAndLocation .DepthID = depthID;
3732- subLocation.DepthAndLocation .LocID = SI::Encode (gridIDs[iBox + 1 ] );
3722+ subLocation.DepthAndLocation .LocID = SI::Encode (gridID );
37333723 }
37343724 }
37353725
@@ -3811,9 +3801,10 @@ namespace OrthoTree
38113801 auto remainedEntityNo = entityNo;
38123802 auto tasks = std::vector<TaskData>(threadNo);
38133803 auto it = boxes.begin ();
3814- for (auto & taskData : tasks) {
3804+ for (auto & taskData : tasks)
3805+ {
38153806 auto const entityNoOnThread = std::min (entityNoPerThread, remainedEntityNo);
3816- remainedEntityNo -= entityNoOnThread;
3807+ remainedEntityNo -= entityNoOnThread;
38173808
38183809 taskData.BeginIt = it;
38193810 it = std::next (it, entityNoOnThread);
@@ -3850,14 +3841,12 @@ namespace OrthoTree
38503841
38513842 locations.resize (position);
38523843 EXEC_POL_DEF (epf2); // GCC 11.3
3853- std::for_each (
3854- EXEC_POL_ADD (epf2) tasks.begin () + 1 , tasks.end (), [&locations](auto & taskData) {
3855- if (taskData.Locations .empty ())
3856- return ;
3844+ std::for_each (EXEC_POL_ADD (epf2) tasks.begin () + 1 , tasks.end (), [&locations](auto & taskData) {
3845+ if (taskData.Locations .empty ())
3846+ return ;
38573847
3858- std::copy (
3859- taskData.Locations .begin (), taskData.Locations .end (), std::next (locations.begin (), taskData.InsertionPosition ));
3860- });
3848+ std::copy (taskData.Locations .begin (), taskData.Locations .end (), std::next (locations.begin (), taskData.InsertionPosition ));
3849+ });
38613850 }
38623851
38633852 if constexpr (IS_PARALLEL_EXEC)
0 commit comments