diff --git a/Tests/noDist/testAdaptiveSymChebFMM.cpp b/Tests/noDist/testAdaptiveSymChebFMM.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d9f07d05ccb138dbb2c4ce77bdd4dc6c346253bd --- /dev/null +++ b/Tests/noDist/testAdaptiveSymChebFMM.cpp @@ -0,0 +1,224 @@ +// =================================================================================== +// Copyright ScalFmm 2011 INRIA, Olivier Coulaud, Berenger Bramas, Matthias Messner +// olivier.coulaud@inria.fr, berenger.bramas@inria.fr +// This software is a computer program whose purpose is to compute the FMM. +// +// This software is governed by the CeCILL-C and LGPL licenses and +// abiding by the rules of distribution of free software. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public and CeCILL-C Licenses for more details. +// "http://www.cecill.info". +// "http://www.gnu.org/licenses". +// =================================================================================== + +// ==== CMAKE ===== +// @FUSE_BLAS +// ================ + +#include <iostream> +#include <cstdio> + + +#include "Utils/FParameters.hpp" +#include "Utils/FTic.hpp" + +#include "Containers/FOctree.hpp" +//#include "Containers/FVector.hpp" + +//#include "Components/FSimpleLeaf.hpp" + +#include "Utils/FPoint.hpp" + +#include "Files/FFmaGenericLoader.hpp" +#include "Files/FRandomLoader.hpp" + +#include "Components/FBasicKernels.hpp" +#include "Components/FSimpleIndexedLeaf.hpp" +#include "Kernels/P2P/FP2PParticleContainerIndexed.hpp" + +#include "Kernels/Interpolation/FInterpMatrixKernel.hpp" +#include "Kernels/Chebyshev/FChebCell.hpp" + +#include "AdaptiveTree/FAdaptChebSymKernel.hpp" +#include "Adaptative/FAdaptiveCell.hpp" +#include "Adaptative/FAdaptiveKernelWrapper.hpp" +#include "Adaptative/FAbstractAdaptiveKernel.hpp" +// +#include "Kernels/Interpolation/FInterpMatrixKernel.hpp" +#include "Kernels/Chebyshev/FChebCell.hpp" +#include "AdaptiveTree/FAdaptChebSymKernel.hpp" +#include "AdaptiveTree/FAdaptTools.hpp" +// +// +#include "Core/FFmmAlgorithm.hpp" +//#include "Core/FFmmAlgorithmThread.hpp" +//#include "Core/FFmmAlgorithmTask.hpp" + +/** This program show an example of use of the fmm basic algo + * it also check that each particles is impacted each other particles + */ + +void usage() { + std::cout << "Driver to obtain statistics on the octree" << std::endl; + std::cout << "Options "<< std::endl + << " -help to see the parameters " << std::endl + << " -depth the depth of the octree "<< std::endl + << " -subdepth specifies the size of the sub octree " << std::endl + << " -fin name specifies the name of the particle distribution" << std::endl + << " -sM s_min^M threshold for Multipole (l+1)^2 for Spherical harmonics"<<std::endl + << " -sL s_min^L threshold for Local (l+1)^2 for Spherical harmonics"<<std::endl; +} +// Simply create particles and try the kernels +int main(int argc, char ** argv){ + // + // accuracy + const unsigned int P = 3 ; + // typedef FTestCell CellClass; + // typedef FAdaptiveTestKernel< CellClass, ContainerClass > KernelClass; + typedef FChebCell<P> CellClass; + typedef FP2PParticleContainerIndexed<> ContainerClass; + typedef FSimpleIndexedLeaf<ContainerClass> LeafClass; + typedef FInterpMatrixKernelR MatrixKernelClass; + // + typedef FAdaptiveChebSymKernel<CellClass,ContainerClass,MatrixKernelClass,P> KernelClass; + // + // + typedef FAdaptiveCell< CellClass, ContainerClass > CellWrapperClass; + typedef FAdaptiveKernelWrapper< KernelClass, CellClass, ContainerClass > KernelWrapperClass; + typedef FOctree< CellWrapperClass, ContainerClass , LeafClass > OctreeClass; + + // FFmmAlgorithmTask FFmmAlgorithmThread + typedef FFmmAlgorithm<OctreeClass, CellWrapperClass, ContainerClass, KernelWrapperClass, LeafClass > FmmClass; + + ///////////////////////What we do///////////////////////////// + std::cout << ">> This executable has to be used to test the FMM algorithm.\n"; + ////////////////////////////////////////////////////////////// + // + const int NbLevels = FParameters::getValue(argc,argv,"-depth", 7); + const int SizeSubLevels = FParameters::getValue(argc,argv,"subdepth", 3); + const int sminM = FParameters::getValue(argc,argv,"-sM", P*P*P); + const int sminL = FParameters::getValue(argc,argv,"-sL", P*P*P); + // + + + FTic counter; + + ////////////////////////////////////////////////////////////////////////////////// + // Not Random Loader + ////////////////////////////////////////////////////////////////////////////////// + const std::string fileName(FParameters::getStr(argc,argv,"-fin", "../Data/prolate50.fma")); + FFmaGenericLoader loader(fileName); + const long int NbPart = loader.getNumberOfParticles() ; + // Random Loader + //const int NbPart = FParameters::getValue(argc,argv,"-nb", 2000000); + // FRandomLoader loader(NbPart, 1, FPoint(0.5,0.5,0.5), 1); + ////////////////////////////////////////////////////////////////////////////////// + + OctreeClass tree(NbLevels, SizeSubLevels, loader.getBoxWidth(), loader.getCenterOfBox()); + + ////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////// + + std::cout << "Creating & Inserting " << NbPart << " particles ..." << std::endl; + std::cout << "\tHeight : " << NbLevels << " \t sub-height : " << SizeSubLevels << std::endl; + std::cout << " criteria SM: "<< sminM <<std::endl + << " criteria SL: "<< sminL <<std::endl <<std::endl; + // + { + counter.tic(); + FReal L= loader.getBoxWidth(); + FmaRParticle* particles= new FmaRParticle[NbPart]; + FPoint minPos(L,L,L), maxPos(-L,-L,-L); + // + loader.fillParticle(particles,NbPart); + + for(int idxPart = 0 ; idxPart < NbPart; ++idxPart){ + const FPoint PP(particles[idxPart].getPosition() ) ; + // + minPos.setX(FMath::Min(minPos.getX(),PP.getX())) ; + minPos.setY(FMath::Min(minPos.getY(),PP.getY())) ; + minPos.setZ(FMath::Min(minPos.getZ(),PP.getZ())) ; + maxPos.setX(FMath::Max(maxPos.getX(),PP.getX())) ; + maxPos.setY(FMath::Max(maxPos.getY(),PP.getY())) ; + maxPos.setZ(FMath::Max(maxPos.getZ(),PP.getZ())) ; + // + tree.insert(PP, idxPart, particles[idxPart].getPhysicalValue()); + } + + + counter.tac(); + std::cout << "Data are inside the box delimited by "<<std::endl + << " Min corner: "<< minPos<<std::endl + << " Max corner: "<< maxPos<<std::endl <<std::endl; + std::cout << "Done " << "(@Creating and Inserting Particles = " << counter.elapsed() << " s)." << std::endl; + } + ////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////// + + std::cout << "Working on particles ..." << std::endl; + counter.tic(); + + KernelWrapperClass kernels(NbLevels, loader.getBoxWidth(), loader.getCenterOfBox());; // FTestKernels FBasicKernels + FmmClass algo(&tree,&kernels); //FFmmAlgorithm FFmmAlgorithmThread + algo.execute(); + + counter.tac(); + std::cout << "Done " << "(@Algorithm = " << counter.elapsed() << " s)." << std::endl; + + OctreeClass::Iterator octreeIterator(&tree); + std::ofstream file("aa.tree", std::ofstream::out ); + + // + //////////////////////////////////////////////////////////////////// + // Export adaptive tree in our format + //////////////////////////////////////////////////////////////////// + // + // ----------------------------------------------------- + // + // + // Set Global id + // + long int idCell = setGlobalID(tree); + ////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////// + + tree.forEachCellLeaf([&](CellWrapperClass* cell, LeafClass* leaf){ + std::cout << cell->getGlobalId( ) << " Nb particles "<< leaf->getSrc()->getNbParticles()<<std::endl; + }); + + octreeIterator.gotoTop() ; // here we are at level 1 (first child) + // octreeIterator.moveDown() ; + octreeIterator.gotoLeft(); + // octreeIterator.moveDown() ; // We are at the levell 2 + std::cout << " Number of Cells: " << idCell <<std::endl; + // + std::cout << "Top of the octree " << octreeIterator.level() << std::endl ; + for(int idxLevel = 1; idxLevel < NbLevels ; ++idxLevel){ + file << std::endl << "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"<< std::endl; + file << " Level " << idxLevel <<" Level "<< octreeIterator.level()<< " -- leave level " << std::boolalpha << octreeIterator.isAtLeafLevel() << std::endl; + do{ + if(octreeIterator.getCurrentCell()->hasDevelopment()){ + file <<*(octreeIterator.getCurrentCell())<< std::endl ; + } + } while(octreeIterator.moveRight()); + octreeIterator.moveDown() ; + octreeIterator.gotoLeft(); + } + std::cout << " END " << std::endl; + + // Check + octreeIterator.gotoBottomLeft(); + do { + std::cout << " Level " <<octreeIterator.level() <<std::endl; + }while(octreeIterator.moveUp() ); + std::cout << " RETURN 0 " << std::endl; + + return 0; +} + + + +