- Timestamp:
- 12/07/21 12:00:23 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/parallel_tree.cpp
r1639 r2269 18 18 19 19 // only the circle is packed, rest of node will be initialized on unpacking 20 static void packNode(Node &node, char *buffer, int& index)20 static void packNode(NodePtr node, char *buffer, int& index) 21 21 { 22 22 if (buffer == NULL) // compute size only … … 24 24 else 25 25 { 26 *(Coord *)(&buffer[index]) = node .centre;26 *(Coord *)(&buffer[index]) = node->centre; 27 27 index += sizeof(Coord); 28 28 29 *(double *)(&buffer[index]) = node .radius;29 *(double *)(&buffer[index]) = node->radius; 30 30 index += sizeof(double); 31 31 } 32 32 } 33 33 34 static void unpackNode(Node &node, char *buffer, int& index)34 static void unpackNode(NodePtr node, char *buffer, int& index) 35 35 { 36 36 Coord centre; … … 43 43 index += sizeof(double); 44 44 45 node .centre = centre;46 node .radius = r;45 node->centre = centre; 46 node->radius = r; 47 47 } 48 48 … … 95 95 } 96 96 97 static void transferRoutedNodes(CMPIRouting& MPIRoute, /*const*/ vector<Node >& nodeSend, const vector<int>& route, vector<Node>& nodeRecv)97 static void transferRoutedNodes(CMPIRouting& MPIRoute, /*const*/ vector<NodePtr>& nodeSend, const vector<int>& route, vector<NodePtr>& nodeRecv) 98 98 { 99 99 /* `route` knows what goes where */ … … 104 104 } 105 105 106 static void transferRoutedIntersections(CMPIRouting& MPIRoute, const vector<Node >& nodeSend, const vector<vector<int> >& route, vector<Node>& nodeRecv)106 static void transferRoutedIntersections(CMPIRouting& MPIRoute, const vector<NodePtr>& nodeSend, const vector<vector<int> >& route, vector<NodePtr>& nodeRecv) 107 107 { 108 108 // `route` knows what goes where … … 110 110 int nRecv = MPIRoute.getTotalSourceElement(); 111 111 nodeRecv.resize(nRecv); 112 MPIRoute.transferToTarget((Node * /*mpi wants non-const*/) &nodeSend[0], &nodeRecv[0], packNode, unpackNode);112 MPIRoute.transferToTarget((NodePtr*) &nodeSend[0], &nodeRecv[0], packNode, unpackNode); 113 113 //cout << MPIRoute.mpiRank << " ROUTE " << nRecv << ": " << nodeSend.size() << " " << nodeRecv.size() << " "; 114 114 } … … 122 122 } 123 123 124 void CParallelTree::buildSampleTreeCascade(vector<Node >& sampleNodes /*route field will be modified*/, int level)124 void CParallelTree::buildSampleTreeCascade(vector<NodePtr>& sampleNodes /*route field will be modified*/, int level) 125 125 { 126 126 buildSampleTree(treeCascade[level], sampleNodes, cascade.level[level]); … … 132 132 treeCascade[level].routeNodes(route, sampleNodes, assignLevel); 133 133 134 vector<Node > routedNodes;134 vector<NodePtr> routedNodes; 135 135 CMPIRouting mpiRoute(cascade.level[level].pg_comm); 136 136 transferRoutedNodes(mpiRoute, sampleNodes, route, routedNodes); … … 139 139 } 140 140 141 void buildSampleTree(CSampleTree& tree, const vector<Node >& node, const CCascadeLevel& comm)141 void buildSampleTree(CSampleTree& tree, const vector<NodePtr>& node, const CCascadeLevel& comm) 142 142 /* 143 143 In the beginning all the sample elements are distributed … … 175 175 for (int i = 0; i < nsend; i++) 176 176 { 177 const Node& no = node[randomArray[i]];177 const Node& no = *node[randomArray[i]]; 178 178 *((Coord *) (sendBuffer + index)) = no.centre; 179 179 index += sizeof(Coord)/sizeof(*sendBuffer); … … 210 210 randomizeArray(randomArray); 211 211 tree.leafs.resize(blocSize); 212 for(auto& it : tree.leafs) it=make_shared<Node>() ; 213 212 214 index = 0; 213 215 … … 220 222 double radius = recvBuffer[index%s]; 221 223 index++ ; 222 tree.leafs[randomArray[i]] .centre = x;223 tree.leafs[randomArray[i]] .radius = radius;224 tree.leafs[randomArray[i]]->centre = x; 225 tree.leafs[randomArray[i]]->radius = radius; 224 226 225 227 } … … 233 235 CTimer::get("buildSampleTree(local)").suspend(); 234 236 CTimer::get("buildSampleTree(local)").print(); 235 236 237 /* End gracefully if sample tree could not be constructed with desired number of nodes on assignLevel */ 237 238 int allok, ok = (tree.levelSize[assignLevel] == comm.group_size); … … 262 263 263 264 264 void CParallelTree::buildLocalTree(const vector<Node >& node, const vector<int>& route)265 void CParallelTree::buildLocalTree(const vector<NodePtr>& node, const vector<int>& route) 265 266 { 266 267 CMPIRouting MPIRoute(communicator); … … 276 277 vector<Elt*> ptElement(node.size()); 277 278 for (int i = 0; i < node.size(); i++) 278 ptElement[i] = (Elt *) (node[i] .data);279 ptElement[i] = (Elt *) (node[i]->data); 279 280 280 281 vector<Elt*> ptLocalElement(nbLocalElements); … … 297 298 elt.id.ind = i; 298 299 elt.id.rank = mpiRank; 299 localTree.leafs.push_back( Node(elt.x, cptRadius(elt), &localElements[i]));300 localTree.leafs.push_back(make_shared<Node>(elt.x, cptRadius(elt), &localElements[i])); 300 301 } 301 302 localTree.build(localTree.leafs); … … 306 307 } 307 308 308 void CParallelTree::build(vector<Node >& node, vector<Node>& node2)309 void CParallelTree::build(vector<NodePtr>& node, vector<NodePtr>& node2) 309 310 { 310 311 … … 332 333 // assert(node2.size() > nbSampleNodes); 333 334 // assert(node.size() + node2.size() > nbSampleNodes); 334 vector<Node > sampleNodes; sampleNodes.reserve(nbSampleNodes1+nbSampleNodes2);335 vector<NodePtr> sampleNodes; sampleNodes.reserve(nbSampleNodes1+nbSampleNodes2); 335 336 336 337 vector<int> randomArray1(node.size()); … … 358 359 } 359 360 */ 360 for (int i = 0; i <nbSampleNodes1; i++) sampleNodes.push_back( Node(node[randomArray1[i%nb1]].centre, node[randomArray1[i%nb1]].radius, NULL));361 for (int i = 0; i <nbSampleNodes2; i++) sampleNodes.push_back( Node(node2[randomArray2[i%nb2]].centre, node2[randomArray2[i%nb2]].radius, NULL));361 for (int i = 0; i <nbSampleNodes1; i++) sampleNodes.push_back(make_shared<Node>(node[randomArray1[i%nb1]]->centre, node[randomArray1[i%nb1]]->radius, nullptr)); 362 for (int i = 0; i <nbSampleNodes2; i++) sampleNodes.push_back(make_shared<Node>(node2[randomArray2[i%nb2]]->centre, node2[randomArray2[i%nb2]]->radius, nullptr)); 362 363 363 364 /* … … 393 394 } 394 395 395 void CParallelTree::routeNodes(vector<int>& route, vector<Node >& nodes /*route field used*/, int level)396 void CParallelTree::routeNodes(vector<int>& route, vector<NodePtr>& nodes /*route field used*/, int level) 396 397 { 397 398 treeCascade[level].routeNodes(route /*assign*/, nodes, assignLevel); … … 399 400 if (level+1 < cascade.num_levels) 400 401 { 401 vector<Node > routedNodes;402 vector<NodePtr> routedNodes; 402 403 CMPIRouting MPIRoute(cascade.level[level].pg_comm); 403 404 transferRoutedNodes(MPIRoute, nodes, route /*use*/, routedNodes); … … 438 439 } 439 440 440 void CParallelTree::routeIntersections(vector<vector<int> >& routes, vector<Node >& nodes, int level)441 void CParallelTree::routeIntersections(vector<vector<int> >& routes, vector<NodePtr>& nodes, int level) 441 442 { 442 443 treeCascade[level].routeIntersections(routes /*assign*/, nodes); … … 444 445 if (level+1 < cascade.num_levels) 445 446 { 446 vector<Node > routedNodes;447 vector<NodePtr> routedNodes; 447 448 CMPIRouting MPIRoute(cascade.level[level].pg_comm); 448 449 449 450 vector<int> flattenedRoutes1; 450 451 linearize(routes, flattenedRoutes1); 451 vector<Node > double_nodes(flattenedRoutes1.size());452 vector<NodePtr> double_nodes(flattenedRoutes1.size()); 452 453 int j = 0; 453 454 for (int i = 0; i < routes.size(); ++i) 454 455 for (int k = 0; k < routes[i].size(); ++k, ++j) 455 double_nodes[j] = nodes[i]; 456 { 457 double_nodes[j] = make_shared<Node>() ; 458 *double_nodes[j] = *nodes[i]; 459 } 456 460 transferRoutedNodes(MPIRoute, double_nodes, flattenedRoutes1 /*use*/, routedNodes); 457 461 vector<vector<int> > globalRanks(routedNodes.size());
Note: See TracChangeset
for help on using the changeset viewer.