source: XIOS/trunk/extern/remap/src/tree.cpp @ 852

Last change on this file since 852 was 694, checked in by rlacroix, 9 years ago

Fix compilation issues caused by the new "remap" library.

Use our MPI header so that C++ bindings are always disabled.

File size: 6.1 KB
Line 
1#include <cassert>
2#include "tree.hpp"
3#include "node.hpp"
4#include "elt.hpp"
5#include <iostream>
6#include "mpi.hpp"
7#include <stdlib.h>     /* srand, rand */
8#include <time.h>       /* time */
9#include <vector>
10#include <set>
11
12#include "timer.hpp"
13#include "mpi_routing.hpp"
14
15namespace sphereRemap {
16
17static const int MAX_LEVEL_SIZE = 100;
18
19double cputime();
20using namespace std;
21
22CBasicTree::CBasicTree() : ri(0), levelSize(MAX_LEVEL_SIZE), root(NULL)
23{
24}
25
26void CBasicTree::routeNodes(vector<int>& route, vector<Node>& nodes, int assignLevel)
27{
28        for (int i = 0; i < nodes.size(); i++)
29        {
30                root->routeNode(&nodes[i], assignLevel);
31                route[i] = nodes[i].route;
32        }
33}
34
35void CBasicTree::routeIntersections(vector<vector<int> >& routes, vector<Node>& nodes)
36{
37        for (int i = 0; i < nodes.size(); i++)
38                root->routeIntersection(routes[i], &nodes[i]);
39}
40
41void CBasicTree::build(vector<Node>& nodes)
42{
43        newRoot(1);
44        insertNodes(nodes);
45}
46
47void CBasicTree::output(ostream& flux, int level)
48{
49        root->output(flux,level,0) ;
50}
51void CBasicTree::slim(int nbIts)
52{
53        //if (!isSampleTree)
54        for (int i = 0; i < nbIts; i++)
55        {
56                for (int level = root->level - 1; level > 0; level--)
57                {
58      cout<<"before Slim2 Level "<<level<< "     levelSize[assignLevel] :"<<levelSize[2]<<endl ;
59                        slim2(root, level);
60      cout<<"after Slim2 Level "<<level<< "     levelSize[assignLevel] :"<<levelSize[2]<<endl ;
61                        ri = 0;
62                        emptyPool();
63      cout<<"after empty pool "<<level<< "     levelSize[assignLevel] :"<<levelSize[2]<<endl ;
64
65                }
66
67                for (int level = 2; level < root->level; level++)
68                {
69      cout<<"before Slim2 Level "<<level<< "     levelSize[assignLevel] :"<<levelSize[2]<<endl ;
70                        slim2(root, level);
71      cout<<"after Slim2 Level "<<level<< "     levelSize[assignLevel] :"<<levelSize[2]<<endl ;
72                        ri = 0;
73                        emptyPool();
74      cout<<"after empty pool "<<level<< "     levelSize[assignLevel] :"<<levelSize[2]<<endl ;
75                }
76        }
77}
78
79void CBasicTree::insertNode(NodePtr node)
80{
81        node->tree = this;
82        increaseLevelSize(0);
83        push_back(node);
84
85        NodePtr q;
86        while (pool.size())
87        {
88                q = pool.front();
89                pool.pop_front();
90                q = insert(q, root);
91                if (ri)
92                {
93                        delete q;
94                        ri = 0;
95                }
96        }
97}
98
99void CBasicTree::emptyPool(void)
100{
101        while (pool.size())
102        {
103                NodePtr q = pool.front();
104                pool.pop_front();
105                q = insert(q, root);
106                if (ri)
107                {
108                        delete q;
109                        ri = 0;
110                }
111        }
112}
113
114void CBasicTree::push_back(NodePtr node)
115{
116#ifdef DEBUG
117        node->parent = NULL; // will be overridden later, but for mem leak check better trigger leak as soon as possible
118#endif
119        pool.push_back(node);
120}
121
122void CBasicTree::push_front(NodePtr node)
123{
124#ifdef DEBUG
125        node->parent = NULL; // will be overridden later, but for mem leak check better trigger leak as soon as possible
126#endif
127        pool.push_front(node);
128}
129
130void CBasicTree::increaseLevelSize(int level)
131{
132        levelSize[level]++;
133}
134
135void CBasicTree::decreaseLevelSize(int level)
136{
137        levelSize[level]--;
138}
139
140void CBasicTree::newRoot(int level)  // newroot <- root
141{
142        root = new Node;
143        if (level > 1) cout << " newRoot level " << level << endl;
144        root->level = level;
145        root->parent = 0;
146        root->leafCount = 0;
147        root->centre = ORIGIN;
148        root->radius = 0.;
149        root->reinserted = false;
150        root->updateCount = 0;
151        root->tree = this;
152        levelSize[level]++;
153}
154
155CBasicTree::~CBasicTree()
156{
157        //FIXME uncomment the next line and figure out why it segfault sometimes
158        //root->free_descendants(); // recursively deletes all nodes in the tree
159        if (root) delete root;
160}
161
162void CTree::insertNodes(vector<Node>& nodes)
163{
164        int stepSlim = MAX_NODE_SZ*MAX_NODE_SZ*2;
165        const double ratio = 1.5;
166        for (int i = 0; i < nodes.size(); i++)
167        {
168                insertNode(&nodes[i]);
169
170                if (root->leafCount > stepSlim) // time for slim down
171                {
172                        slim();
173                        stepSlim = stepSlim * ratio;
174                }
175        }
176}
177
178
179void CSampleTree::insertNodes(vector<Node>& nodes)
180{
181        bool first1 = true;
182        bool first2 = true;
183        int stepSlim = MAX_NODE_SZ * MAX_NODE_SZ * keepNodes / 4;
184//      double ratio = 1 + (0.5 * (1 - (keepNodes - 1) / (1.0 * keepNodes))) ;
185        double ratio = 1.5 ;
186  int i ;
187 
188  cout<<"CSampleTree::insertNodes  : nb node to be inserted : "<<nodes.size()<<endl ;
189  for (i = 0; i < nodes.size(); i++)
190        {
191//    cout<<"insert new node"<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ;
192    insertNode(&nodes[i]);
193//    cout<<"new node inserted"<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ;
194
195                if (root->leafCount > stepSlim && levelSize[assignLevel] < keepNodes-2) // time for slim down
196                {
197                        slim();
198                        stepSlim = stepSlim * ratio;
199                }
200
201   
202    if (levelSize[assignLevel] == keepNodes-2 && first1)
203                {
204      cout<<"assign Level : "<<assignLevel<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ;
205      slim();
206      cout<<"assign Level : "<<assignLevel<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ;
207      slim();
208      cout<<"assign Level : "<<assignLevel<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ;
209      slim();
210      cout<<"assign Level : "<<assignLevel<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ;
211                        first1 = false;
212                }
213
214                if (levelSize[assignLevel] == keepNodes-1 && first2)
215                {
216      cout<<"assign Level : "<<assignLevel<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ;
217      slim();
218      cout<<"assign Level : "<<assignLevel<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ;
219      first2=false ;
220                }
221
222        if (levelSize[assignLevel] > keepNodes)
223                {
224      cout<<"assign Level : "<<assignLevel<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ;
225      slim();
226      cout<<"assign Level : "<<assignLevel<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ;
227                }
228    if (levelSize[assignLevel] >= keepNodes)
229                {
230      cout<<"assign Level : "<<assignLevel<< "     levelSize[assignLevel] :"<<levelSize[assignLevel]<<"   keepNodes : "<<keepNodes<<endl ;
231      break ;
232                }
233        }
234        cout << "SampleTree build : nb Node inserted : " << i << endl;
235
236}
237
238}
Note: See TracBrowser for help on using the repository browser.