From f1079b463f68b95b07319de6e83c1d8233fdd8a1 Mon Sep 17 00:00:00 2001
From: bramas <berenger.bramas@inria.fr>
Date: Wed, 9 Apr 2014 16:35:24 +0200
Subject: [PATCH] update block algorithm it compiles without warning but does
 not work yet

---
 Src/GroupTree/FGroupAttachedLeaf.hpp         |  2 +-
 Src/GroupTree/FGroupSeqAlgorithm.hpp         | 76 ++++++++++----------
 Src/GroupTree/FGroupTree.hpp                 | 25 +++----
 Src/GroupTree/FP2PGroupParticleContainer.hpp | 59 +++++++++++++++
 Tests/Kernels/testBlockedTree.cpp            | 12 +++-
 5 files changed, 120 insertions(+), 54 deletions(-)
 create mode 100644 Src/GroupTree/FP2PGroupParticleContainer.hpp

diff --git a/Src/GroupTree/FGroupAttachedLeaf.hpp b/Src/GroupTree/FGroupAttachedLeaf.hpp
index 2596f2019..51dc45939 100644
--- a/Src/GroupTree/FGroupAttachedLeaf.hpp
+++ b/Src/GroupTree/FGroupAttachedLeaf.hpp
@@ -14,7 +14,7 @@ template <unsigned NbAttributesPerParticle, class AttributeClass = FReal>
 class FGroupAttachedLeaf {
 protected:
     //< Nb of particles in the current leaf
-    const int nbParticles;
+    int nbParticles;
     //< Pointers to the positions of the particles
     FReal* positionsPointers[3];
     //< Pointers to the attributes of the particles
diff --git a/Src/GroupTree/FGroupSeqAlgorithm.hpp b/Src/GroupTree/FGroupSeqAlgorithm.hpp
index e7976d4ca..57afc061f 100644
--- a/Src/GroupTree/FGroupSeqAlgorithm.hpp
+++ b/Src/GroupTree/FGroupSeqAlgorithm.hpp
@@ -9,7 +9,7 @@
 #include <list>
 #include <vector>
 
-template <class OctreeClass, class CellContainerClass, class CellClass, class KernelClass, class ParticleContainerClass>
+template <class OctreeClass, class CellContainerClass, class CellClass, class KernelClass, class ParticleGroupClass, class ParticleContainerClass>
 class FGroupSeqAlgorithm {
 protected:
     struct OutOfBlockInteraction{
@@ -51,11 +51,11 @@ public:
 
 protected:
     void bottomPass(){
-        typename std::list<ParticleContainerClass>::iterator iterParticles = tree->leavesBegin();
-        const typename std::list<ParticleContainerClass>::iterator endParticles = tree->leavesEnd();
+        typename std::list<ParticleGroupClass*>::iterator iterParticles = tree->leavesBegin();
+        const typename std::list<ParticleGroupClass*>::iterator endParticles = tree->leavesEnd();
 
-        typename std::list<CellContainerClass>::iterator iterCells = tree->cellsBegin(tree->getHeight()-1);
-        const typename std::list<CellContainerClass>::iterator endCells = tree->cellsEnd(tree->getHeight()-1);
+        typename std::list<CellContainerClass*>::iterator iterCells = tree->cellsBegin(tree->getHeight()-1);
+        const typename std::list<CellContainerClass*>::iterator endCells = tree->cellsEnd(tree->getHeight()-1);
 
         while(iterParticles != endParticles && iterCells != endCells){
             { // Can be a task(in:iterParticles, out:iterCells)
@@ -65,7 +65,7 @@ protected:
                 for(MortonIndex mindex = blockStartIdx ; mindex < blockEndIdx ; ++mindex){
                     CellClass* cell = (*iterCells)->getCell(mindex);
                     if(cell){
-                        ParticleContainerClass particles = (*iterParticles)->getLeaf(mindex);
+                        ParticleContainerClass particles = (*iterParticles)->template getLeaf<ParticleContainerClass>(mindex);
                         FAssertLF(particles.isAttachedToSomething());
                         kernels->P2M(cell, &particles);
                     }
@@ -81,11 +81,11 @@ protected:
 
     void upwardPass(){
         for(int idxLevel = tree->getHeight()-2 ; idxLevel >= 2 ; --idxLevel){
-            typename std::list<CellContainerClass>::iterator iterCells = tree->cellsBegin(idxLevel);
-            const typename std::list<CellContainerClass>::iterator endCells = tree->cellsEnd(idxLevel);
+            typename std::list<CellContainerClass*>::iterator iterCells = tree->cellsBegin(idxLevel);
+            const typename std::list<CellContainerClass*>::iterator endCells = tree->cellsEnd(idxLevel);
 
-            typename std::list<CellContainerClass>::iterator iterChildCells = tree->cellsBegin(idxLevel+1);
-            const typename std::list<CellContainerClass>::iterator endChildCells = tree->cellsEnd(idxLevel+1);
+            typename std::list<CellContainerClass*>::iterator iterChildCells = tree->cellsBegin(idxLevel+1);
+            const typename std::list<CellContainerClass*>::iterator endChildCells = tree->cellsEnd(idxLevel+1);
 
             while(iterCells != endCells && iterChildCells != endChildCells){
                 { // Can be a task(in:iterParticles, out:iterChildCells ...)
@@ -121,8 +121,8 @@ protected:
 
     void transferPass(){
         for(int idxLevel = tree->getHeight()-1 ; idxLevel >= 2 ; --idxLevel){
-            typename std::list<CellContainerClass>::iterator iterCells = tree->cellsBegin(idxLevel);
-            const typename std::list<CellContainerClass>::iterator endCells = tree->cellsEnd(idxLevel);
+            typename std::list<CellContainerClass*>::iterator iterCells = tree->cellsBegin(idxLevel);
+            const typename std::list<CellContainerClass*>::iterator endCells = tree->cellsEnd(idxLevel);
 
             while(iterCells != endCells){
                 std::vector<OutOfBlockInteraction> outsideInteractions;
@@ -139,7 +139,7 @@ protected:
                             FTreeCoordinate coord(mindex, idxLevel);
                             int counter = coord.getInteractionNeighbors(idxLevel,interactionsIndexes,interactionsPosition);
 
-                            CellClass* interactions[343];
+                            const CellClass* interactions[343];
                             memset(interactions, 0, 343*sizeof(CellClass*));
                             int counterExistingCell = 0;
 
@@ -167,11 +167,11 @@ protected:
 
 
                 // Manage outofblock interaction
-                FQuickSort<OutOfBlockInteraction, long long, int>::QsSequential(outsideInteractions.data(),outsideInteractions.size());
+                FQuickSort<OutOfBlockInteraction, long long, int>::QsSequential(outsideInteractions.data(),int(outsideInteractions.size()));
 
-                typename std::list<CellContainerClass>::iterator iterLeftCells = tree->cellsBegin(idxLevel);
+                typename std::list<CellContainerClass*>::iterator iterLeftCells = tree->cellsBegin(idxLevel);
                 int currentOutInteraction = 0;
-                while(iterLeftCells != iterCells && currentOutInteraction < outsideInteractions.size()){
+                while(iterLeftCells != iterCells && currentOutInteraction < int(outsideInteractions.size())){
                     const MortonIndex blockStartIdx = (*iterLeftCells)->getStartingIndex();
                     const MortonIndex blockEndIdx = (*iterLeftCells)->getEndingIndex();
 
@@ -180,7 +180,7 @@ protected:
                     }
 
                     int lastOutInteraction = currentOutInteraction + 1;
-                    while(lastOutInteraction < outsideInteractions.size() && outsideInteractions[lastOutInteraction].outIndex < blockEndIdx){
+                    while(lastOutInteraction < int(outsideInteractions.size()) && outsideInteractions[lastOutInteraction].outIndex < blockEndIdx){
                         lastOutInteraction += 1;
                     }
 
@@ -190,7 +190,7 @@ protected:
                             if(interCell){
                                 CellClass* cell = (*iterCells)->getCell(outsideInteractions[outInterIdx].insideIndex);
                                 FAssertLF(cell);
-                                CellClass* interactions[343];
+                                const CellClass* interactions[343];
                                 memset(interactions, 0, 343*sizeof(CellClass*));
                                 interactions[outsideInteractions[outInterIdx].outPosition] = interCell;
                                 const int counter = 1;
@@ -215,11 +215,11 @@ protected:
 
     void downardPass(){
         for(int idxLevel = 2 ; idxLevel <= tree->getHeight()-2 ; ++idxLevel){
-            typename std::list<CellContainerClass>::iterator iterCells = tree->cellsBegin(idxLevel);
-            const typename std::list<CellContainerClass>::iterator endCells = tree->cellsEnd(idxLevel);
+            typename std::list<CellContainerClass*>::iterator iterCells = tree->cellsBegin(idxLevel);
+            const typename std::list<CellContainerClass*>::iterator endCells = tree->cellsEnd(idxLevel);
 
-            typename std::list<CellContainerClass>::iterator iterChildCells = tree->cellsBegin(idxLevel+1);
-            const typename std::list<CellContainerClass>::iterator endChildCells = tree->cellsEnd(idxLevel+1);
+            typename std::list<CellContainerClass*>::iterator iterChildCells = tree->cellsBegin(idxLevel+1);
+            const typename std::list<CellContainerClass*>::iterator endChildCells = tree->cellsEnd(idxLevel+1);
 
             while(iterCells != endCells && iterChildCells != endChildCells){
                 { // Can be a task(in:iterParticles, inout:iterChildCells ...)
@@ -255,11 +255,11 @@ protected:
 
     void directPass(){
         {
-            typename std::list<ParticleContainerClass>::iterator iterParticles = tree->leavesBegin();
-            const typename std::list<ParticleContainerClass>::iterator endParticles = tree->leavesEnd();
+            typename std::list<ParticleGroupClass*>::iterator iterParticles = tree->leavesBegin();
+            const typename std::list<ParticleGroupClass*>::iterator endParticles = tree->leavesEnd();
 
-            typename std::list<CellContainerClass>::iterator iterCells = tree->cellsBegin(tree->getHeight()-1);
-            const typename std::list<CellContainerClass>::iterator endCells = tree->cellsEnd(tree->getHeight()-1);
+            typename std::list<CellContainerClass*>::iterator iterCells = tree->cellsBegin(tree->getHeight()-1);
+            const typename std::list<CellContainerClass*>::iterator endCells = tree->cellsEnd(tree->getHeight()-1);
 
             while(iterParticles != endParticles && iterCells != endCells){
                 { // Can be a task(in:iterCells, inout:iterParticles)
@@ -269,7 +269,7 @@ protected:
                     for(MortonIndex mindex = blockStartIdx ; mindex < blockEndIdx ; ++mindex){
                         CellClass* cell = (*iterCells)->getCell(mindex);
                         if(cell){
-                            ParticleContainerClass particles = (*iterParticles)->getLeaf(mindex);
+                            ParticleContainerClass particles = (*iterParticles)->template getLeaf<ParticleContainerClass>(mindex);
                             FAssertLF(particles.isAttachedToSomething());
                             kernels->P2M(cell, &particles);
                         }
@@ -283,8 +283,8 @@ protected:
             FAssertLF(iterParticles == endParticles && iterCells == endCells);
         }
         {
-            typename std::list<ParticleContainerClass>::iterator iterParticles = tree->leavesBegin();
-            const typename std::list<ParticleContainerClass>::iterator endParticles = tree->leavesEnd();
+            typename std::list<ParticleGroupClass*>::iterator iterParticles = tree->leavesBegin();
+            const typename std::list<ParticleGroupClass*>::iterator endParticles = tree->leavesEnd();
 
             while(iterParticles != endParticles){
                 typename std::vector<OutOfBlockInteraction> outsideInteractions;
@@ -294,7 +294,7 @@ protected:
                     const MortonIndex blockEndIdx = (*iterParticles)->getEndingIndex();
 
                     for(MortonIndex mindex = blockStartIdx ; mindex < blockEndIdx ; ++mindex){
-                        ParticleContainerClass particles = (*iterParticles)->getLeaf(mindex);
+                        ParticleContainerClass particles = (*iterParticles)->template getLeaf<ParticleContainerClass>(mindex);
                         if(particles.isAttachedToSomething()){
                             MortonIndex interactionsIndexes[26];
                             int interactionsPosition[26];
@@ -308,7 +308,7 @@ protected:
 
                             for(int idxInter = 0 ; idxInter < counter ; ++idxInter){
                                 if( blockStartIdx <= interactionsIndexes[idxInter] && interactionsIndexes[idxInter] < blockEndIdx ){
-                                    interactionsObjects[counterExistingCell] = (*iterParticles)->getLeaf(interactionsIndexes[idxInter]);
+                                    interactionsObjects[counterExistingCell] = (*iterParticles)->template getLeaf<ParticleContainerClass>(interactionsIndexes[idxInter]);
                                     if(interactionsObjects[counterExistingCell].isAttachedToSomething()){
                                         interactions[interactionsPosition[idxInter]] = &interactionsObjects[counterExistingCell];
                                         counterExistingCell += 1;
@@ -330,11 +330,11 @@ protected:
 
 
                 // Manage outofblock interaction
-                FQuickSort<OutOfBlockInteraction, long long, int>::QsSequential(outsideInteractions.data(),outsideInteractions.size());
+                FQuickSort<OutOfBlockInteraction, long long, int>::QsSequential(outsideInteractions.data(),int(outsideInteractions.size()));
 
-                typename std::list<ParticleContainerClass>::iterator iterLeftParticles = tree->leavesBegin();
+                typename std::list<ParticleGroupClass*>::iterator iterLeftParticles = tree->leavesBegin();
                 int currentOutInteraction = 0;
-                while(iterLeftParticles != iterParticles && currentOutInteraction < outsideInteractions.size()){
+                while(iterLeftParticles != iterParticles && currentOutInteraction < int(outsideInteractions.size())){
                     const MortonIndex blockStartIdx = (*iterLeftParticles)->getStartingIndex();
                     const MortonIndex blockEndIdx = (*iterLeftParticles)->getEndingIndex();
 
@@ -343,17 +343,17 @@ protected:
                     }
 
                     int lastOutInteraction = currentOutInteraction + 1;
-                    while(lastOutInteraction < outsideInteractions.size() && outsideInteractions[lastOutInteraction].outIndex < blockEndIdx){
+                    while(lastOutInteraction < int(outsideInteractions.size()) && outsideInteractions[lastOutInteraction].outIndex < blockEndIdx){
                         lastOutInteraction += 1;
                     }
 
                     { // Can be a task(in:currentOutInteraction, in:outsideInteractions, in:lastOutInteraction, inout:iterLeftParticles, inout:iterParticles)
                         for(int outInterIdx = currentOutInteraction ; outInterIdx < lastOutInteraction ; ++outInterIdx){
-                            ParticleContainerClass interParticles = (*iterLeftParticles)->getLeaf(outsideInteractions[outInterIdx].outIndex);
+                            ParticleContainerClass interParticles = (*iterLeftParticles)->template getLeaf<ParticleContainerClass>(outsideInteractions[outInterIdx].outIndex);
                             if(interParticles.isAttachedToSomething()){
-                                ParticleContainerClass particles = (*iterParticles)->getLeaf(outsideInteractions[outInterIdx].insideIndex);
+                                ParticleContainerClass particles = (*iterParticles)->template getLeaf<ParticleContainerClass>(outsideInteractions[outInterIdx].insideIndex);
                                 FAssertLF(particles.isAttachedToSomething());
-                                CellClass* interactions[27];
+                                ParticleContainerClass* interactions[27];
                                 memset(interactions, 0, 27*sizeof(CellClass*));
                                 interactions[outsideInteractions[outInterIdx].outPosition] = &interParticles;
                                 const int counter = 1;
diff --git a/Src/GroupTree/FGroupTree.hpp b/Src/GroupTree/FGroupTree.hpp
index 45a5e6028..12f570d2a 100644
--- a/Src/GroupTree/FGroupTree.hpp
+++ b/Src/GroupTree/FGroupTree.hpp
@@ -13,10 +13,11 @@
 #include <list>
 #include <functional>
 
-template <class CellClass, unsigned NbAttributesPerParticle, class AttributeClass = FReal>
+template <class CellClass, class GroupAttachedLeafClass, unsigned NbAttributesPerParticle, class AttributeClass = FReal>
 class FGroupTree {
 public:
-    typedef FGroupAttachedLeaf<NbAttributesPerParticle,AttributeClass> BasicAttachedClass;
+    typedef GroupAttachedLeafClass BasicAttachedClass;
+    typedef FGroupOfParticles<NbAttributesPerParticle,AttributeClass> ParticleGroupClass;
     typedef FGroupOfCells<CellClass> CellGroupClass;
 
 protected:
@@ -30,7 +31,7 @@ protected:
     //< all the blocks of the tree
     std::list<CellGroupClass*>* cellBlocksPerLevel;
     //< all the blocks of leaves
-    std::list<FGroupOfParticles<NbAttributesPerParticle,AttributeClass>*> particleBlocks;
+    std::list<ParticleGroupClass*> particleBlocks;
 
     //< the space system center
     const FPoint boxCenter;
@@ -499,7 +500,7 @@ public:
         }
         delete[] cellBlocksPerLevel;
 
-        for (FGroupOfParticles<NbAttributesPerParticle,AttributeClass>* block: particleBlocks){
+        for (ParticleGroupClass* block: particleBlocks){
             delete block;
         }
     }
@@ -515,7 +516,7 @@ public:
    */
     template<class ParticlesAttachedClass>
     void forEachLeaf(std::function<void(ParticlesAttachedClass*)> function){
-        for (FGroupOfParticles<NbAttributesPerParticle,AttributeClass>* block: particleBlocks){
+        for (ParticleGroupClass* block: particleBlocks){
             block->forEachLeaf(function);
         }
     }
@@ -555,8 +556,8 @@ public:
         typename std::list<CellGroupClass*>::iterator iterCells = cellBlocksPerLevel[treeHeight-1].begin();
         const typename std::list<CellGroupClass*>::iterator iterEndCells = cellBlocksPerLevel[treeHeight-1].end();
 
-        typename std::list<FGroupOfParticles<NbAttributesPerParticle,AttributeClass>*>::iterator iterLeaves = particleBlocks.begin();
-        const typename std::list<FGroupOfParticles<NbAttributesPerParticle,AttributeClass>*>::iterator iterEndLeaves = particleBlocks.end();
+        typename std::list<ParticleGroupClass*>::iterator iterLeaves = particleBlocks.begin();
+        const typename std::list<ParticleGroupClass*>::iterator iterEndLeaves = particleBlocks.end();
 
         while(iterCells != iterEndCells && iterLeaves != iterEndLeaves){
             (*iterCells)->forEachCell([&](CellClass* aCell){
@@ -598,7 +599,7 @@ public:
         std::cout << "There are " << particleBlocks.size() << " leaf-groups.\n";
         int idxGroup = 0;
         int totalNbParticles = 0;
-        for (const FGroupOfParticles<NbAttributesPerParticle,AttributeClass>* block: particleBlocks){
+        for (const ParticleGroupClass* block: particleBlocks){
             std::cout << "\t Group " << (idxGroup++);
             std::cout << "\t Size = " << block->getNumberOfLeavesInBlock();
             std::cout << "\t Starting Index = " << block->getStartingIndex();
@@ -639,19 +640,19 @@ public:
     }
 
 
-    typename std::list<FGroupOfParticles<NbAttributesPerParticle,AttributeClass>*>::iterator leavesBegin(){
+    typename std::list<ParticleGroupClass*>::iterator leavesBegin(){
         return particleBlocks.begin();
     }
 
-    typename std::list<FGroupOfParticles<NbAttributesPerParticle,AttributeClass>*>::const_iterator leavesBegin() const {
+    typename std::list<ParticleGroupClass*>::const_iterator leavesBegin() const {
         return particleBlocks.begin();
     }
 
-    typename std::list<FGroupOfParticles<NbAttributesPerParticle,AttributeClass>*>::iterator leavesEnd(){
+    typename std::list<ParticleGroupClass*>::iterator leavesEnd(){
         return particleBlocks.end();
     }
 
-    typename std::list<FGroupOfParticles<NbAttributesPerParticle,AttributeClass>*>::const_iterator leavesEnd() const {
+    typename std::list<ParticleGroupClass*>::const_iterator leavesEnd() const {
         return particleBlocks.end();
     }
 };
diff --git a/Src/GroupTree/FP2PGroupParticleContainer.hpp b/Src/GroupTree/FP2PGroupParticleContainer.hpp
new file mode 100644
index 000000000..6621c5ecd
--- /dev/null
+++ b/Src/GroupTree/FP2PGroupParticleContainer.hpp
@@ -0,0 +1,59 @@
+#ifndef FP2PGROUPPARTICLECONTAINER_HPP
+#define FP2PGROUPPARTICLECONTAINER_HPP
+
+#include "FGroupAttachedLeaf.hpp"
+
+template<int NRHS = 1, int NLHS = 1>
+class FP2PGroupParticleContainer : public FGroupAttachedLeaf<NRHS+4*NLHS, FReal> {
+    typedef FGroupAttachedLeaf<NRHS+4*NLHS, FReal> Parent;
+
+public:
+    FP2PGroupParticleContainer(){}
+    FP2PGroupParticleContainer(const int inNbParticles, FReal* inPositionBuffer, const size_t inLeadingPosition,
+                       FReal* inAttributesBuffer, const size_t inLeadingAttributes)
+        : Parent(inNbParticles, inPositionBuffer, inLeadingPosition, inAttributesBuffer, inLeadingAttributes) {
+
+    }
+
+    FReal* getPhysicalValues(const int idxRhs = 0){
+        return Parent::getAttribute(0+idxRhs);
+    }
+
+    const FReal* getPhysicalValues(const int idxRhs = 0) const {
+        return Parent::getAttribute(0+idxRhs);
+    }
+
+    FReal* getPotentials(const int idxLhs = 0){
+        return Parent::getAttribute(NRHS+idxLhs);
+    }
+
+    const FReal* getPotentials(const int idxLhs = 0) const {
+        return Parent::getAttribute(NRHS+idxLhs);
+    }
+
+    FReal* getForcesX(const int idxLhs = 0){
+        return Parent::getAttribute(NRHS+NLHS+idxLhs);
+    }
+
+    const FReal* getForcesX(const int idxLhs = 0) const {
+        return Parent::getAttribute(NRHS+NLHS+idxLhs);
+    }
+
+    FReal* getForcesY(const int idxLhs = 0){
+        return Parent::getAttribute(NRHS+2*NLHS+idxLhs);
+    }
+
+    const FReal* getForcesY(const int idxLhs = 0) const {
+        return Parent::getAttribute(NRHS+2*NLHS+idxLhs);
+    }
+
+    FReal* getForcesZ(const int idxLhs = 0){
+        return Parent::getAttribute(NRHS+3*NLHS+idxLhs);
+    }
+
+    const FReal* getForcesZ(const int idxLhs = 0) const {
+        return Parent::getAttribute(NRHS+3*NLHS+idxLhs);
+    }
+};
+
+#endif // FP2PGROUPPARTICLECONTAINER_HPP
diff --git a/Tests/Kernels/testBlockedTree.cpp b/Tests/Kernels/testBlockedTree.cpp
index d8327f021..7e51a6c82 100644
--- a/Tests/Kernels/testBlockedTree.cpp
+++ b/Tests/Kernels/testBlockedTree.cpp
@@ -24,6 +24,7 @@
 #include "../../Src/Files/FFmaBinLoader.hpp"
 
 #include "../../Src/GroupTree/FGroupSeqAlgorithm.hpp"
+#include "../../Src/GroupTree/FP2PGroupParticleContainer.hpp"
 
 int main(int argc, char* argv[]){
     static const int P = 9;
@@ -32,7 +33,7 @@ int main(int argc, char* argv[]){
 
     typedef FSimpleLeaf< ContainerClass >                     LeafClass;
     typedef FOctree< CellClass, ContainerClass , LeafClass >  OctreeClass;
-    typedef FGroupTree< CellClass, 4, FReal>  GroupOctreeClass;
+    typedef FGroupTree< CellClass, FP2PGroupParticleContainer<>, 4, FReal>  GroupOctreeClass;
 
     FTic counter;
     const int NbLevels      = FParameters::getValue(argc,argv,"-h", 5);
@@ -71,8 +72,13 @@ int main(int argc, char* argv[]){
 
 
 
-    typedef FRotationKernel< CellClass, ContainerClass , P>   KernelClass;
-    FGroupSeqAlgorithm<GroupOctreeClass, typename GroupOctreeClass::CellGroupClass, CellClass, KernelClass, typename GroupOctreeClass::BasicAttachedClass> algo(NULL,NULL);
+    typedef FRotationKernel< CellClass, FP2PGroupParticleContainer<> , P>   KernelClass;
+    typedef FGroupSeqAlgorithm<GroupOctreeClass, typename GroupOctreeClass::CellGroupClass, CellClass, KernelClass, typename GroupOctreeClass::ParticleGroupClass, FP2PGroupParticleContainer<> > GroupAlgorithm;
+
+    KernelClass kernel(NbLevels, loader.getBoxWidth(), loader.getCenterOfBox());
+    GroupAlgorithm algo(&groupedTree2,&kernel);
+
+    algo.execute();
 
     return 0;
 }
-- 
GitLab