diff --git a/Tests/GroupTree/testBlockedImplicitAlgorithm.cpp b/Tests/GroupTree/testBlockedImplicitAlgorithm.cpp index 6cc3ebf15dc6655480ba5c0d94748304955201b1..507f3e76be28f2f5c06406de071f2fc44bfc3cbf 100644 --- a/Tests/GroupTree/testBlockedImplicitAlgorithm.cpp +++ b/Tests/GroupTree/testBlockedImplicitAlgorithm.cpp @@ -74,6 +74,7 @@ using namespace std; void timeAverage(int mpi_rank, int nproc, double elapsedTime); void sortParticle(FPoint * allParticlesToSort, int treeHeight, int groupSize, vector> & sizeForEachGroup, vector & distributedMortonIndex, LoaderClass& loader, int nproc); void createNodeRepartition(std::vector distributedMortonIndex, std::vector>>& nodeRepartition, int nproc, int treeHeight); +FSize getNbParticlesPerNode(FSize mpi_count, FSize mpi_rank, FSize total); int main(int argc, char* argv[]){ const FParameterNames LocalOptionBlocSize { @@ -107,18 +108,23 @@ int main(int argc, char* argv[]){ const FSize NbParticles = loader.getNumberOfParticles(); #endif - FPoint * allParticlesToSort = new FPoint[NbParticles*mpiComm.global().processCount()]; + FPoint * allParticlesToSort = new FPoint[NbParticles]; //Fill particles #ifndef LOAD_FILE - for(int i = 0; i < mpiComm.global().processCount(); ++i){ - LoaderClass loader(NbParticles, 1.0, FPoint(0,0,0), i); - FAssertLF(loader.isOpen()); - for(FSize idxPart = 0 ; idxPart < NbParticles ; ++idxPart){ - loader.fillParticle(&allParticlesToSort[(NbParticles*i) + idxPart]);//Same with file or not + { + FSize idxPart = 0; + for(int i = 0; i < mpiComm.global().processCount(); ++i){ + FSize NbParticlesPerNode = getNbParticlesPerNode(nproc, i, NbParticles); + LoaderClass loader(NbParticlesPerNode, 1.0, FPoint(0,0,0), i); + FAssertLF(loader.isOpen()); + for(FSize j= 0 ; j < NbParticlesPerNode ; ++j){ + loader.fillParticle(&allParticlesToSort[idxPart]);//Same with file or not + ++idxPart; + } } } - LoaderClass loader(NbParticles*mpiComm.global().processCount(), 1.0, FPoint(0,0,0)); + LoaderClass loader(NbParticles, 1.0, FPoint(0,0,0)); #else for(FSize idxPart = 0 ; idxPart < loader.getNumberOfParticles() ; ++idxPart){ loader.fillParticle(&allParticlesToSort[idxPart]);//Same with file or not @@ -379,3 +385,9 @@ void createNodeRepartition(std::vector distributedMortonIndex, std: } } } +FSize getNbParticlesPerNode(FSize mpi_count, FSize mpi_rank, FSize total){ + if(mpi_rank < (total%mpi_count)) + return ((total - (total%mpi_count))/mpi_count)+1; + return ((total - (total%mpi_count))/mpi_count); +} + diff --git a/Tests/GroupTree/testBlockedImplicitChebyshev.cpp b/Tests/GroupTree/testBlockedImplicitChebyshev.cpp index 135c27689eb9b50522f7a44698ef487ddc1dfa38..c386cacd8a3f693d845181e874a774ca9c317436 100644 --- a/Tests/GroupTree/testBlockedImplicitChebyshev.cpp +++ b/Tests/GroupTree/testBlockedImplicitChebyshev.cpp @@ -65,9 +65,11 @@ using namespace std; #else typedef FFmaGenericLoader LoaderClass; #endif + void timeAverage(int mpi_rank, int nproc, double elapsedTime); void sortParticle(FPoint * allParticlesToSort, int treeHeight, int groupSize, vector> & sizeForEachGroup, vector & distributedMortonIndex, LoaderClass& loader, int nproc); void createNodeRepartition(std::vector distributedMortonIndex, std::vector>>& nodeRepartition, int nproc, int treeHeight); +FSize getNbParticlesPerNode(FSize mpi_count, FSize mpi_rank, FSize total); int main(int argc, char* argv[]){ const FParameterNames LocalOptionBlocSize { @@ -101,18 +103,23 @@ int main(int argc, char* argv[]){ const FSize NbParticles = loader.getNumberOfParticles(); #endif - FPoint * allParticlesToSort = new FPoint[NbParticles*mpiComm.global().processCount()]; + FPoint * allParticlesToSort = new FPoint[NbParticles]; //Fill particles #ifndef LOAD_FILE - for(int i = 0; i < mpiComm.global().processCount(); ++i){ - LoaderClass loader(NbParticles, 1.0, FPoint(0,0,0), i); - FAssertLF(loader.isOpen()); - for(FSize idxPart = 0 ; idxPart < NbParticles ; ++idxPart){ - loader.fillParticle(&allParticlesToSort[(NbParticles*i) + idxPart]);//Same with file or not + { + FSize idxPart = 0; + for(int i = 0; i < mpiComm.global().processCount(); ++i){ + FSize NbParticlesPerNode = getNbParticlesPerNode(nproc, i, NbParticles); + LoaderClass loader(NbParticlesPerNode, 1.0, FPoint(0,0,0), i); + FAssertLF(loader.isOpen()); + for(FSize j= 0 ; j < NbParticlesPerNode ; ++j){ + loader.fillParticle(&allParticlesToSort[idxPart]);//Same with file or not + ++idxPart; + } } } - LoaderClass loader(NbParticles*mpiComm.global().processCount(), 1.0, FPoint(0,0,0)); + LoaderClass loader(NbParticles, 1.0, FPoint(0,0,0)); #else for(FSize idxPart = 0 ; idxPart < loader.getNumberOfParticles() ; ++idxPart){ loader.fillParticle(&allParticlesToSort[idxPart]);//Same with file or not @@ -414,3 +421,9 @@ void createNodeRepartition(std::vector distributedMortonIndex, std: } } +FSize getNbParticlesPerNode(FSize mpi_count, FSize mpi_rank, FSize total){ + if(mpi_rank < (total%mpi_count)) + return ((total - (total%mpi_count))/mpi_count)+1; + return ((total - (total%mpi_count))/mpi_count); +} + diff --git a/Tests/GroupTree/testBlockedMpiAlgorithm.cpp b/Tests/GroupTree/testBlockedMpiAlgorithm.cpp index 67cde1c820fada71e5b4c0ad5d6aad9d9ea13035..f9d64669acb283f434faa8bd1c25186e6eca919c 100644 --- a/Tests/GroupTree/testBlockedMpiAlgorithm.cpp +++ b/Tests/GroupTree/testBlockedMpiAlgorithm.cpp @@ -47,6 +47,7 @@ #include void timeAverage(int mpi_rank, int nproc, double elapsedTime); +FSize getNbParticlesPerNode(FSize mpi_count, FSize mpi_rank, FSize total); int main(int argc, char* argv[]){ const FParameterNames LocalOptionBlocSize { @@ -75,9 +76,9 @@ int main(int argc, char* argv[]){ FMpi mpiComm(argc, argv); // Get params const int NbLevels = FParameters::getValue(argc,argv,FParameterDefinitions::OctreeHeight.options, 5); - const FSize NbParticles = FParameters::getValue(argc,argv,FParameterDefinitions::NbParticles.options, FSize(20)); const int groupSize = FParameters::getValue(argc,argv,LocalOptionBlocSize.options, 8); - const FSize totalNbParticles = (NbParticles*mpiComm.global().processCount()); + const FSize totalNbParticles = FParameters::getValue(argc,argv,FParameterDefinitions::NbParticles.options, FSize(20)); + const FSize NbParticles = getNbParticlesPerNode(mpiComm.global().processCount(), mpiComm.global().processId(), totalNbParticles); // Load the particles FRandomLoader loader(NbParticles, 1.0, FPoint(0,0,0), mpiComm.global().processId()); FAssertLF(loader.isOpen()); @@ -178,7 +179,7 @@ int main(int argc, char* argv[]){ // Usual octree OctreeClass tree(NbLevels, 2, loader.getBoxWidth(), loader.getCenterOfBox()); for(int idxProc = 0 ; idxProc < mpiComm.global().processCount() ; ++idxProc){ - FRandomLoader loaderAll(NbParticles, 1.0, FPoint(0,0,0), idxProc); + FRandomLoader loaderAll(getNbParticlesPerNode(mpiComm.global().processCount(), idxProc, totalNbParticles), 1.0, FPoint(0,0,0), idxProc); for(FSize idxPart = 0 ; idxPart < loaderAll.getNumberOfParticles() ; ++idxPart){ FPoint pos; loaderAll.fillParticle(&pos); @@ -230,3 +231,8 @@ void timeAverage(int mpi_rank, int nproc, double elapsedTime) } MPI_Barrier(MPI_COMM_WORLD); } +FSize getNbParticlesPerNode(FSize mpi_count, FSize mpi_rank, FSize total){ + if(mpi_rank < (total%mpi_count)) + return ((total - (total%mpi_count))/mpi_count)+1; + return ((total - (total%mpi_count))/mpi_count); +} diff --git a/Tests/GroupTree/testBlockedMpiChebyshev.cpp b/Tests/GroupTree/testBlockedMpiChebyshev.cpp index e13dab62fde96b2d752c7a9567b1a493ca4f94c8..b940db930ffafb8d4a991ee65fddf4331a13a000 100644 --- a/Tests/GroupTree/testBlockedMpiChebyshev.cpp +++ b/Tests/GroupTree/testBlockedMpiChebyshev.cpp @@ -50,6 +50,7 @@ #include void timeAverage(int mpi_rank, int nproc, double elapsedTime); +FSize getNbParticlesPerNode(FSize mpi_count, FSize mpi_rank, FSize total); int main(int argc, char* argv[]){ const FParameterNames LocalOptionBlocSize { {"-bs"}, "The size of the block of the blocked tree"}; @@ -85,8 +86,8 @@ int main(int argc, char* argv[]){ const unsigned int TreeHeight = FParameters::getValue(argc, argv, FParameterDefinitions::OctreeHeight.options, 5); const unsigned int SubTreeHeight = FParameters::getValue(argc, argv, FParameterDefinitions::OctreeSubHeight.options, 2); - const FSize NbParticles = FParameters::getValue(argc,argv,FParameterDefinitions::NbParticles.options, FSize(20)); - const FSize totalNbParticles = (NbParticles*mpiComm.global().processCount()); + const FSize totalNbParticles = FParameters::getValue(argc,argv,FParameterDefinitions::NbParticles.options, FSize(20)); + const FSize NbParticles = getNbParticlesPerNode(mpiComm.global().processCount(), mpiComm.global().processId(), totalNbParticles); // init particles position and physical value struct TestParticle{ @@ -311,3 +312,8 @@ void timeAverage(int mpi_rank, int nproc, double elapsedTime) } MPI_Barrier(MPI_COMM_WORLD); } +FSize getNbParticlesPerNode(FSize mpi_count, FSize mpi_rank, FSize total){ + if(mpi_rank < (total%mpi_count)) + return ((total - (total%mpi_count))/mpi_count)+1; + return ((total - (total%mpi_count))/mpi_count); +}