testChebOctree.cpp 4.65 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// ===================================================================================
// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012.
// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que
// la communauté scientifique l'utilise afin de le tester et de l'évaluer.
// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation
// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation
// expresse et préalable d'Inria.
// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord
// expresse préalable d'Inria constituerait donc le délit de contrefaçon.
// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer
// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu
// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur.
// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques
// relatives à l'usage du LOGICIEL
// ===================================================================================
16

COULAUD Olivier's avatar
COULAUD Olivier committed
17 18 19 20
// ==== CMAKE =====
// @FUSE_BLAS
// ================

21 22
#include <iostream>

COULAUD Olivier's avatar
COULAUD Olivier committed
23 24
#include <cstdio>
#include <cstdlib>
25 26
#include <time.h>

27
#include "../../Src/Utils/FTic.hpp"
28

29 30
#include "../../Src/Containers/FOctree.hpp"
#include "../../Src/Containers/FVector.hpp"
31

BRAMAS Berenger's avatar
BRAMAS Berenger committed
32
#include "../../Src/Utils/FAssert.hpp"
33
#include "../../Src/Utils/FPoint.hpp"
34

35
#include "../../Src/Kernels/Chebyshev/FChebCell.hpp"
36

37

38 39
#include "../../Src/Components/FSimpleLeaf.hpp"
#include "../../Src/Kernels/P2P/FP2PParticleContainer.hpp"
40

41 42
#include "../../Src/Utils/FParameterNames.hpp"

43 44 45 46
/**
* In this file we show how to use octree
*/

47 48
int main(int argc, char ** argv){
    FHelpDescribeAndExit(argc, argv, "Test the octree with the Chebyshev kernel.");
49 50 51

	const int ORDER = 5;

52
    typedef double FReal;
53 54 55 56
    typedef FP2PParticleContainer<FReal> ContainerClass;
    typedef FSimpleLeaf<FReal, ContainerClass> LeafClass;
	typedef FChebCell<FReal,ORDER> CellClass;
    typedef FOctree<FReal, CellClass,ContainerClass,LeafClass> OctreeClass;
57 58 59 60 61 62 63
	
	///////////////////////What we do/////////////////////////////
	std::cout << ">> This executable is useless to execute.\n";
	std::cout << ">> It is only interesting to understand the code\n";
	std::cout << ">> and how to use the Octree\n";
	//////////////////////////////////////////////////////////////
	
BRAMAS Berenger's avatar
BRAMAS Berenger committed
64
    const long NbPart = 100000;
65 66
	FTic counter;
	
BRAMAS Berenger's avatar
BRAMAS Berenger committed
67
    srand48( static_cast<unsigned int>(time(NULL)) );
68

69
	const FReal BoxWidth = 1.;
70
    const FPoint<FReal> BoxCenter(.5, .5, .5);
71 72
	const unsigned int TreeHeight = 10;
	OctreeClass tree(TreeHeight, 3, BoxWidth, BoxCenter);
73 74 75 76

	// -----------------------------------------------------
	std::cout << "Creating and inserting " << NbPart << " particles ..." << std::endl;
	counter.tic();
77 78
    {
        for(long idxPart = 0 ; idxPart < NbPart ; ++idxPart){
79
            tree.insert(FPoint<FReal>(FReal(drand48()),FReal(drand48()),FReal(drand48())));
80 81 82 83 84 85
		}
	}
	counter.tac();
	std::cout << "Done  " << "(" << counter.elapsed() << ")." << std::endl;
	// -----------------------------------------------------

86 87 88 89 90

	
	// Check if particles are strictly within its containing leaf cells
	{
		const FReal BoxWidthLeaf = BoxWidth / FReal(FMath::pow(2, TreeHeight-1));
91
        tree.forEachCellLeaf([&](CellClass* LeafCell, LeafClass* leaf){
92 93
            const FPoint<FReal> Origin(BoxCenter - BoxWidth / FReal(2.));
            const FPoint<FReal> LeafCellCenter(Origin.getX() + (FReal(LeafCell->getCoordinate().getX()) + FReal(.5)) * BoxWidthLeaf,
94 95 96
																			 Origin.getY() + (FReal(LeafCell->getCoordinate().getY()) + FReal(.5)) * BoxWidthLeaf,
																			 Origin.getZ() + (FReal(LeafCell->getCoordinate().getZ()) + FReal(.5)) * BoxWidthLeaf);

97 98 99 100 101
            const ContainerClass *const Particles = leaf->getSrc();
            const FReal*const positionsX = Particles->getPositions()[0];
            const FReal*const positionsY = Particles->getPositions()[1];
            const FReal*const positionsZ = Particles->getPositions()[2];

102
            for(FSize idxPart = 0 ; idxPart < Particles->getNbParticles() ; ++idxPart){
103
                const FPoint<FReal> distance(LeafCellCenter-FPoint<FReal>(positionsX[idxPart],positionsY[idxPart],positionsZ[idxPart]));
104 105 106 107 108 109
				if (std::abs(distance.getX())>BoxWidthLeaf/FReal(2.) ||
						std::abs(distance.getY())>BoxWidthLeaf/FReal(2.) ||
						std::abs(distance.getZ())>BoxWidthLeaf/FReal(2.)) {
					std::cout << "Particle (center - particle = " << distance << " < " << BoxWidthLeaf/FReal(2.) << ") is out of cell. STOP"
										<< std::endl;
					//exit(-1);
110
                }
111
			}
112
        });
113 114
	}

115 116 117 118 119
	return 0;
}


// [--END--]